cloudpss 4.1.1b8__py3-none-any.whl → 4.5.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. cloudpss/__init__.py +2 -3
  2. cloudpss/asyncio/__init__.py +8 -0
  3. cloudpss/asyncio/job/__init__.py +5 -0
  4. cloudpss/asyncio/job/job.py +116 -0
  5. cloudpss/asyncio/job/messageStreamReceiver.py +121 -0
  6. cloudpss/asyncio/job/messageStreamSender.py +45 -0
  7. cloudpss/asyncio/model/__init__.py +5 -0
  8. cloudpss/asyncio/model/model.py +257 -0
  9. cloudpss/asyncio/model/revision.py +41 -0
  10. cloudpss/asyncio/model/topology.py +34 -0
  11. cloudpss/asyncio/utils/__init__.py +6 -0
  12. cloudpss/{utils → asyncio/utils}/httpAsyncRequest.py +2 -2
  13. cloudpss/function/functionExecution.py +36 -3
  14. cloudpss/ieslab/DataManageModel.py +131 -9
  15. cloudpss/ieslab/EvaluationModel.py +80 -9
  16. cloudpss/ieslab/IESLabOpt.py +235 -0
  17. cloudpss/ieslab/IESLabPlan.py +82 -4
  18. cloudpss/ieslab/IESLabSimulation.py +59 -32
  19. cloudpss/ieslab/PlanModel.py +276 -33
  20. cloudpss/ieslab/__init__.py +2 -1
  21. cloudpss/job/job.py +136 -141
  22. cloudpss/job/jobReceiver.py +8 -2
  23. cloudpss/job/messageStreamReceiver.py +42 -99
  24. cloudpss/job/messageStreamSender.py +5 -42
  25. cloudpss/job/{view/EMTView.py → result/EMTResult.py} +11 -13
  26. cloudpss/job/result/IESLabSimulationResult.py +5 -0
  27. cloudpss/job/result/IESLabTypicalDayResult.py +136 -0
  28. cloudpss/job/{view/IESView.py → result/IESResult.py} +2 -2
  29. cloudpss/job/{view/PowerFlowView.py → result/PowerFlowResult.py} +2 -2
  30. cloudpss/job/result/__init__.py +39 -0
  31. cloudpss/job/{view/view.py → result/result.py} +37 -8
  32. cloudpss/model/implements/diagram.py +113 -0
  33. cloudpss/model/jobDefinitions.py +6 -6
  34. cloudpss/model/model.py +232 -209
  35. cloudpss/model/revision.py +30 -35
  36. cloudpss/model/topology.py +13 -15
  37. cloudpss/runner/IESLabEvaluationResult.py +14 -6
  38. cloudpss/runner/IESLabPlanResult.py +91 -35
  39. cloudpss/runner/IESLabTypicalDayResult.py +62 -50
  40. cloudpss/runner/MessageStreamReceiver.py +5 -100
  41. cloudpss/runner/result.py +6 -1
  42. cloudpss/runner/runner.py +77 -48
  43. cloudpss/utils/IO.py +1 -1
  44. cloudpss/utils/graphqlUtil.py +3 -2
  45. cloudpss/utils/httprequests.py +16 -8
  46. cloudpss/version.py +1 -1
  47. {cloudpss-4.1.1b8.dist-info → cloudpss-4.5.0.dist-info}/METADATA +2 -2
  48. cloudpss-4.5.0.dist-info/RECORD +70 -0
  49. cloudpss/dslab/__init__.py +0 -2
  50. cloudpss/dslab/dataManageModel.py +0 -275
  51. cloudpss/dslab/dslab.py +0 -210
  52. cloudpss/dslab/files/__init__.py +0 -2
  53. cloudpss/dslab/files/curveData.py +0 -140229
  54. cloudpss/dslab/files/files.py +0 -27
  55. cloudpss/dslab/financialAnalysisModel.py +0 -137
  56. cloudpss/job/jobMachine.py +0 -11
  57. cloudpss/job/jobPolicy.py +0 -129
  58. cloudpss/job/jobQueue.py +0 -14
  59. cloudpss/job/jobTres.py +0 -6
  60. cloudpss/job/view/IESLabSimulationView.py +0 -5
  61. cloudpss/job/view/IESLabTypicalDayView.py +0 -27
  62. cloudpss/job/view/__init__.py +0 -42
  63. cloudpss/runner/DSLabResult.py +0 -92
  64. cloudpss-4.1.1b8.dist-info/RECORD +0 -71
  65. /cloudpss/{utils → asyncio/utils}/AsyncIterable.py +0 -0
  66. {cloudpss-4.1.1b8.dist-info → cloudpss-4.5.0.dist-info}/WHEEL +0 -0
  67. {cloudpss-4.1.1b8.dist-info → cloudpss-4.5.0.dist-info}/top_level.txt +0 -0
cloudpss/model/model.py CHANGED
@@ -1,12 +1,11 @@
1
- import asyncio
2
1
  import os
3
2
  import re
4
3
  from copy import deepcopy
5
-
6
4
  from cloudpss.job.job import Job
5
+ from cloudpss.job.result import EMTResult, IESResult, PowerFlowResult
6
+ from cloudpss.job.result.result import Result
7
7
  from cloudpss.utils.IO import IO
8
- from cloudpss.utils.httpAsyncRequest import graphql_fetch
9
-
8
+ from cloudpss.utils import graphql_request
10
9
  from .revision import ModelRevision
11
10
  from .jobDefinitions import JOB_DEFINITIONS
12
11
  from ..verify import userName
@@ -36,6 +35,34 @@ class Model(object):
36
35
  context 当前项目的上下文相关信息
37
36
 
38
37
  """
38
+ __models_query="""query($input:ModelsInput!){models(input:$input){cursor total count items{rid name description owner tags updatedAt }}}"""
39
+
40
+ __model_query= """
41
+ query t($rid:ResourceId!){
42
+ model(input:{rid: $rid}) {
43
+ configs
44
+ context
45
+ description
46
+ jobs
47
+ name
48
+ rid
49
+ tags
50
+ revision {
51
+ author
52
+ documentation
53
+ graphic
54
+ hash
55
+ implements
56
+ message
57
+ parameters
58
+ pins
59
+ version
60
+ }
61
+ }
62
+ }
63
+ """
64
+ __create_model= """mutation($a:CreateModelInput!){createModel(input:$a){rid}}"""
65
+ __update_model = """mutation($a:UpdateModelInput!){updateModel(input:$a){rid}}"""
39
66
 
40
67
  context: dict
41
68
  jobs: list
@@ -68,7 +95,7 @@ class Model(object):
68
95
  model = {**self.__dict__, "revision": self.revision.toJSON()}
69
96
  return model
70
97
 
71
- def getAllComponents(self):
98
+ def getAllComponents(self)->dict:
72
99
  """
73
100
  获取实现
74
101
 
@@ -83,6 +110,46 @@ class Model(object):
83
110
  if diagramImplement is None:
84
111
  raise ValueError("不存在拓扑实现")
85
112
  return diagramImplement.getAllComponents()
113
+
114
+ def addComponent(self, definition, label, args, pins, canvas=None, position=None, size=None):
115
+ """
116
+ 创建一个
117
+
118
+ :return: Component
119
+
120
+ >>>> model.addComponent(args)
121
+ """
122
+ diagramImplement = self.revision.getImplements().getDiagram()
123
+ if diagramImplement is None:
124
+ raise ValueError("不存在拓扑实现")
125
+ return diagramImplement.addComponent(definition, label, args, pins, canvas, position, size)
126
+
127
+ def removeComponent(self, key):
128
+ """
129
+ 删除元件实现
130
+
131
+ :return: boolean
132
+
133
+ >>>> model.removeComponent(key)
134
+ """
135
+ diagramImplement = self.revision.getImplements().getDiagram()
136
+ if diagramImplement is None:
137
+ raise ValueError("不存在拓扑实现")
138
+ return diagramImplement.removeComponent(key)
139
+
140
+ def updateComponent(self, key, args):
141
+ """
142
+ 更新元件实现
143
+
144
+ :return: bool
145
+
146
+ >>>> model.updateComponent(key, args)
147
+ """
148
+ diagramImplement = self.revision.getImplements().getDiagram()
149
+ if diagramImplement is None:
150
+ raise ValueError("不存在拓扑实现")
151
+ return diagramImplement.updateComponent(key, args)
152
+
86
153
 
87
154
  def getComponentsByRid(self, rid: str):
88
155
  """
@@ -144,7 +211,7 @@ class Model(object):
144
211
 
145
212
  return jobs
146
213
 
147
- def createJob(self, jobType: str, name):
214
+ def createJob(self, jobType:str, name:str):
148
215
  """
149
216
  创建一个计算方案
150
217
  创建出的方案默认不加入到项目中,需要加入请调用 addJob
@@ -207,7 +274,8 @@ class Model(object):
207
274
  """
208
275
 
209
276
  config = deepcopy(self.configs[0])
210
- config["name"] = name
277
+ config['name'] = name
278
+ self.__updateConfigDefault(config)
211
279
  return config
212
280
 
213
281
  def addConfig(self, config):
@@ -221,14 +289,11 @@ class Model(object):
221
289
  """
222
290
 
223
291
  self.configs.append(config)
292
+ self.__updateConfigDefault(config)
224
293
  return config
225
294
 
226
295
  @staticmethod
227
- def fetchMany(name=None, cursor=[]):
228
- return asyncio.run(Model.fetchManyAsync(name, cursor))
229
-
230
- @staticmethod
231
- async def fetchManyAsync(name=None, cursor=[]):
296
+ def fetchMany(name=None, cursor=[], pageSize=10,owner=None):
232
297
  """
233
298
  获取用户可以运行的项目列表
234
299
 
@@ -237,41 +302,38 @@ class Model(object):
237
302
 
238
303
  :return: 按分页信息返回项目列表
239
304
 
240
- >>> data= await Model.fetchManyAsync()
241
- {
242
- items: [
243
- {'rid': 'model/admin/share-test', 'name': '1234', 'description': '1234'}
244
- ...
245
- ],
246
- cursor: ["1699353593000"],
247
-
248
- }
249
-
305
+ >>> data= await Model.fetchMany()
306
+ [
307
+ {'rid': 'model/demo/demo', 'name': 'demo', 'description': 'demo'}
308
+ ...
309
+ ]
250
310
 
251
311
  """
252
- query = """query($input:ModelsInput!){models(input:$input){cursor total count items{rid name description owner tags updatedAt pages{pageId resource key path mode}access{permission role}}}}"""
312
+ if owner is None:
313
+ owner = userName()
314
+ elif owner == "*":
315
+ owner = None
253
316
  variables = {
254
317
  "cursor": cursor,
255
- "limit": 10,
256
- "orderBy": ["updatedAt<"],
257
- "permissionEveryone": ["b_any", 2**16],
318
+ "limit": pageSize,
319
+ "orderBy": [
320
+ "updatedAt<",
321
+ "type",
322
+ "owner",
323
+ "key"
324
+ ],
325
+ "owner":owner,
258
326
  }
259
327
  if name is not None:
260
328
  variables["_search"] = name
261
329
 
262
- data = await graphql_fetch(query, {"input": variables})
263
-
330
+ data = graphql_request(Model.__models_query, {"input": variables})
264
331
  if "errors" in data:
265
332
  raise Exception(data["errors"][0]["message"])
266
-
267
- return data["data"]["models"]
333
+ return data["data"]["models"]['items']
268
334
 
269
335
  @staticmethod
270
336
  def fetch(rid):
271
- return asyncio.run(Model.fetchAsync(rid))
272
-
273
- @staticmethod
274
- async def fetchAsync(rid):
275
337
  """
276
338
  获取项目
277
339
 
@@ -282,72 +344,36 @@ class Model(object):
282
344
  >>> model=Model.fetch('model/Demo/test')
283
345
 
284
346
  """
285
- query = """
286
- query t($rid:ResourceId!){
287
- model(input:{rid: $rid}) {
288
- configs
289
- context
290
- description
291
- jobs
292
- name
293
- rid
294
- tags
295
-
296
- revision {
297
- author
298
- documentation
299
- graphic
300
- hash
301
- implements
302
- message
303
- parameters
304
- pins
305
- version
306
- }
307
- }
308
- }
309
- """
310
- data = await graphql_fetch(query, {"rid": rid})
347
+ data = graphql_request(Model.__model_query, {"rid": rid})
311
348
  if "errors" in data:
312
349
  raise Exception(data["errors"][0]["message"])
313
350
  return Model(data["data"]["model"])
314
351
 
315
- def run(self, job=None, config=None, name=None, policy=None,stop_on_entry=None, **kwargs):
316
-
317
- job= asyncio.run(self.runAsync(job, config, name, policy,stop_on_entry, **kwargs))
318
- job._Job__connect_legacy()
319
- return job
320
-
321
- async def runAsync(self, job=None, config=None, name=None, policy=None,stop_on_entry=None, **kwargs):
352
+ def run(self, job=None, config=None, name=None, **kwargs):
322
353
  """
323
354
 
324
- 调用仿真
355
+ 调用仿真
325
356
 
326
- :params job: 调用仿真时使用的计算方案,不指定将使用算例保存时选中的计算方案
327
- :params config: 调用仿真时使用的参数方案,不指定将使用算例保存时选中的参数方案
328
- :params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
357
+ :params job: 调用仿真时使用的计算方案,不指定将使用算例保存时选中的计算方案
358
+ :params config: 调用仿真时使用的参数方案,不指定将使用算例保存时选中的参数方案
359
+ :params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
329
360
 
330
- :return: 返回一个Job实例
361
+ :return: 返回一个运行实例
331
362
 
332
- >>> job=model.run(job,config,'')
333
- job
363
+ >>> runner=model.run(job,config,'')
364
+ runner
334
365
 
335
366
  """
336
367
  if job is None:
337
- currentJob = self.context["currentJob"]
368
+ currentJob = self.context['currentJob']
338
369
  job = self.jobs[currentJob]
339
370
  if config is None:
340
- currentConfig = self.context["currentConfig"]
371
+ currentConfig = self.context['currentConfig']
341
372
  config = self.configs[currentConfig]
342
- revision = await self.revision.run(
343
- job, config, name, self.rid, policy, **kwargs
344
- )
345
- if stop_on_entry is not None:
346
- job['args']['stop_on_entry'] = stop_on_entry
347
- return await Job.create(
348
- revision["hash"], job, config, name, self.rid, policy, **kwargs
349
- )
373
+ self.__updateConfigDefault(config)
374
+ return self.revision.run(job, config, name, rid=self.rid, **kwargs)
350
375
 
376
+
351
377
  def iesSimulationRun(self, job=None, config=None, name=None, **kwargs):
352
378
  return self.run(job=job, config=config, name=name, kwargs=kwargs)
353
379
 
@@ -369,7 +395,7 @@ class Model(object):
369
395
  if not os.path.exists(filePath):
370
396
  raise FileNotFoundError("未找到文件")
371
397
  data = IO.load(filePath, format)
372
- return Model(data)
398
+ return data
373
399
 
374
400
  @staticmethod
375
401
  def dump(model, file, format="yaml", compress="gzip"):
@@ -386,12 +412,9 @@ class Model(object):
386
412
  >>> Model.dump(model,file)
387
413
  """
388
414
 
389
- IO.dump(model, file, format, compress)
415
+ IO.dump(model.toJSON(), file, format, compress)
390
416
 
391
417
  def save(self, key=None):
392
- return asyncio.run(self.saveAsync(key))
393
-
394
- async def saveAsync(self, key=None):
395
418
  """
396
419
  保存/创建项目
397
420
 
@@ -399,7 +422,6 @@ class Model(object):
399
422
  key 为空时如果项目 rid 不存在则抛异常,需要重新设置 key。
400
423
  如果保存时,当前用户不是该项目的拥有者时,将重新创建项目,重建项目时如果参数的 key 为空将使用当前当前项目的 key 作为资源的 key ,当资源的 key 和远程冲突时保存失败
401
424
 
402
- :params: model 项目
403
425
  :params: key 资源 id 的唯一标识符,
404
426
 
405
427
  :return: 保存成功/保存失败
@@ -415,9 +437,9 @@ class Model(object):
415
437
  if matchObj:
416
438
  self.rid = "model/" + username + "/" + key
417
439
  try:
418
- return await Model.updateAsync(self)
440
+ return Model.update(self)
419
441
  except:
420
- return await Model.createAsync(self)
442
+ return Model.create(self)
421
443
  else:
422
444
  raise Exception("key 能包含字母数子和下划线")
423
445
  else:
@@ -428,18 +450,15 @@ class Model(object):
428
450
  elif owner[0] != username:
429
451
  rid = re.sub(t, username, self.rid)
430
452
  try:
431
- return await Model.createAsync(self)
453
+ return Model.create(self)
432
454
  except:
433
455
  raise Exception(rid + " 该资源已存在,无法重复创建,请修改 key")
434
456
 
435
- return await Model.updateAsync(self)
457
+ return Model.update(self)
436
458
 
437
- @staticmethod
438
- def create(model):
439
- return asyncio.run(Model.createAsync(model))
440
459
 
441
460
  @staticmethod
442
- async def createAsync(model):
461
+ def create(model):
443
462
  """
444
463
  新建项目
445
464
 
@@ -460,19 +479,13 @@ class Model(object):
460
479
  elif owner[0] != username:
461
480
  raise Exception("rid 错误,无法保存")
462
481
 
463
- modelQuery = """
464
- mutation($a:CreateModelInput!){createModel(input:$a){
465
- rid
466
- }}
467
- """
468
482
  isPublic = model.context.get("auth", "") != "private"
469
- isComponent = model.context.get("category", "") == "component"
470
483
  publicRead = model.context.get("publicRead", "") != False
471
484
  auth = (65539 if publicRead else 65537) if isPublic else 0
472
- revision = await ModelRevision.createAsync(model.revision, model.revision.hash)
485
+ revision = ModelRevision.create(model.revision, model.revision.hash)
473
486
 
474
- return await graphql_fetch(
475
- modelQuery,
487
+ return graphql_request(
488
+ Model.__create_model,
476
489
  {
477
490
  "a": {
478
491
  "rid": model.rid,
@@ -492,12 +505,10 @@ class Model(object):
492
505
  },
493
506
  )
494
507
 
495
- @staticmethod
496
- def update(model):
497
- return asyncio.run(Model.updateAsync(model))
508
+
498
509
 
499
510
  @staticmethod
500
- async def updateAsync(model):
511
+ def update(model):
501
512
  """
502
513
  更新项目
503
514
 
@@ -517,48 +528,50 @@ class Model(object):
517
528
  elif owner[0] != username:
518
529
  raise Exception("rid 错误,无法保存")
519
530
 
520
- modelQuery = """
521
- mutation($a:UpdateModelInput!){updateModel(input:$a){
522
- rid
523
- }}
524
- """
531
+
525
532
  isPublic = model.context.get("auth", "") != "private"
526
533
  isComponent = model.context.get("category", "") == "component"
527
534
  publicRead = model.context.get("publicRead", "") != False
528
535
  auth = (65539 if publicRead else 65537) if isPublic else 0
529
- revision = await ModelRevision.createAsync(model.revision, model.revision.hash)
530
-
531
- xVersion = int(float(os.environ.get("X_CLOUDPSS_VERSION", 4)))
532
- tags = {"replace": model.tags}
533
- if xVersion == 3:
534
- tags = model.tags
536
+ revision = ModelRevision.create(model.revision, model.revision.hash)
535
537
 
536
- return await graphql_fetch(
537
- modelQuery,
538
- {
539
- "a": {
540
- "rid": model.rid,
541
- "revision": revision["hash"],
542
- "context": model.context,
543
- "configs": model.configs,
544
- "jobs": model.jobs,
545
- "name": model.name,
546
- "description": model.description,
547
- "tags": tags,
538
+ xVersion = int(float(os.environ.get('X_CLOUDPSS_VERSION', 4)))
539
+ tags= {
540
+ "replace":model.tags
541
+ }
542
+ if xVersion==3:
543
+ tags=model.tags
544
+
545
+ r= graphql_request(
546
+ Model.__update_model, {
547
+ 'a': {
548
+ 'rid': model.rid,
549
+ 'revision': revision['hash'],
550
+ 'context': model.context,
551
+ 'configs': model.configs,
552
+ 'jobs': model.jobs,
553
+ 'name': model.name,
554
+ 'description': model.description,
555
+ 'tags': tags,
548
556
  "permissions": {
549
557
  "moderator": 1,
550
558
  "member": 1,
551
559
  "everyone": auth,
552
560
  },
553
561
  }
554
- },
555
- )
562
+ })
563
+ if "errors" in r:
564
+ raise Exception(r["errors"][0]["message"])
565
+ return r
566
+
556
567
 
568
+
557
569
  def fetchTopology(
558
570
  self,
559
571
  implementType=None,
560
572
  config=None,
561
573
  maximumDepth=None,
574
+ **kwargs
562
575
  ):
563
576
  """
564
577
  通过项目信息,获取当前项目对应的拓扑数据
@@ -573,132 +586,151 @@ class Model(object):
573
586
  topology=model.fetchTopology(implementType='powerFlow',config=config) # 获取潮流实现的拓扑数据
574
587
  topology=model.fetchTopology(maximumDepth=2) # 获取仅展开 2 层的拓扑数据
575
588
  """
576
-
577
589
  if self.revision is not None:
578
590
  if implementType is None:
579
591
  implementType = "emtp"
580
592
  if config is None:
581
593
  currentConfig = self.context["currentConfig"]
582
594
  config = self.configs[currentConfig]
583
- return self.revision.fetchTopology(implementType, config, maximumDepth)
595
+ return self.revision.fetchTopology(implementType, config,
596
+ maximumDepth, **kwargs)
584
597
  return None
598
+
585
599
 
586
- def runEMT(self, job=None, config=None) -> Job:
600
+ def __updateConfigDefault(self, config):
601
+ paramters = self.revision.parameters
602
+ if paramters is None:
603
+ return
604
+ for param in paramters:
605
+ for val in param['items']:
606
+ if config['args'].get(val['key'],None) is None:
607
+ config['args'][val['key']] = val['value']
608
+
609
+ def runEMT(self,job=None,config=None,**kwargs)->Runner[EMTResult]:
587
610
  """
588
- 运行 emtp 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
611
+ 运行 emtp 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
589
612
 
590
- :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
591
- :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
613
+ :params job: 调用仿真时使用的计算方案,不指定将使用算例保存时选中的计算方案
614
+ :params config: 调用仿真时使用的参数方案,不指定将使用算例保存时选中的参数方案
615
+ :params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
616
+
617
+ :return: 返回一个运行实例
618
+
619
+ >>> runner=model.run(job,config,'')
620
+ runner
592
621
 
593
- :return: job 运行结果
594
622
  """
595
623
  if job is None:
596
624
  currentJob = self.context["currentJob"]
597
625
  job = self.jobs[currentJob]
598
- if job["rid"] != "job-definition/cloudpss/emtp":
599
- for j in self.jobs:
600
- if j["rid"] == "job-definition/cloudpss/emtp":
601
- job = j
626
+ if config is None:
627
+ currentConfig = self.context["currentConfig"]
628
+ config = self.configs[currentConfig]
629
+ return self.revision.run(
630
+ job, config, name, policy, stop_on_entry,self.rid,**kwargs
631
+ )
632
+
633
+ def __findJob(self, jobType):
634
+ currentJob = self.context["currentJob"]
635
+ job = self.jobs[currentJob]
636
+ if job["rid"] != jobType:
637
+ for j in self.jobs:
638
+ if j["rid"] ==jobType:
639
+ job = j
640
+ return job
641
+
642
+ def runEMT(self, job=None, config=None,**kwargs) -> Job[EMTResult]:
643
+ """
644
+ 运行 emtp 内核,如果当前 model 没有创建 Job 时报错,默认使用算例中选中的计算方案进行仿真,如果选中的计算方案不是 EMT 方案则选第一个EMT 计算方案,如果不存在计算方案则直接报错。
645
+
646
+ :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
647
+ :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
648
+
649
+ :return: 生成的任务
650
+ """
651
+ if job is None:
652
+ job = self.__findJob("function/CloudPSS/emtps")
602
653
  if job is None:
603
654
  raise Exception("找不到电磁暂态运行的计算方案")
604
- if job["rid"] != "job-definition/cloudpss/emtp":
655
+ if job["rid"] != "function/CloudPSS/emtp" and job["rid"] != "function/CloudPSS/emtps":
605
656
  raise Exception("不是电磁暂态运行生成算法的计算方案")
606
657
  if config is None:
607
658
  currentConfig = self.context["currentConfig"]
608
659
  config = self.configs[currentConfig]
609
- return self.run(job=job, config=config)
660
+
661
+ return self.run(job=job, config=config,**kwargs)
610
662
 
611
- def runSFEMT(self, job=None, config=None) -> Job:
663
+ def runSFEMT(self,job=None,config=None,**kwargs)->Runner[EMTResult]:
612
664
  """
613
- 运行 移频电磁暂态 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
665
+ 运行 移频电磁暂态 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
614
666
 
615
667
  :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
616
668
  :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
617
669
 
618
- :return: runner Runner[EMTResult]
670
+ :return: Job[EMTView]
619
671
  """
620
672
  if job is None:
621
- currentJob = self.context["currentJob"]
622
- job = self.jobs[currentJob]
623
- if job["rid"] != "job-definition/cloudpss/sfemt":
624
- for j in self.jobs:
625
- if j["rid"] == "job-definition/cloudpss/sfemt":
626
- job = j
673
+ job = self.__findJob("function/CloudPSS/sfemt")
627
674
  if job is None:
628
675
  raise Exception("找不到移频电磁暂态运行的计算方案")
629
- if job["rid"] != "job-definition/cloudpss/sfemt":
676
+ if job["rid"] != "function/CloudPSS/sfemt":
630
677
  raise Exception("不是移频电磁暂态运行生成算法的计算方案")
631
678
  if config is None:
632
679
  currentConfig = self.context["currentConfig"]
633
680
  config = self.configs[currentConfig]
634
- return self.run(job=job, config=config)
681
+ return self.run(job=job, config=config,**kwargs)
635
682
 
636
- def runPowerFlow(self, job=None, config=None) -> Job:
683
+ def runPowerFlow(self,job=None,config=None,**kwargs)->Runner[PowerFlowResult]:
637
684
  """
638
- 运行 潮流 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
685
+ 运行 潮流 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
639
686
 
640
- :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
641
- :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
687
+ :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
688
+ :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
642
689
 
643
- :return: runner Runner[PowerFlowResult]
690
+ :return: Job[EMTView]
644
691
  """
645
692
  if job is None:
646
- currentJob = self.context["currentJob"]
647
- job = self.jobs[currentJob]
648
- if job["rid"] != "job-definition/cloudpss/power-flow":
649
- for j in self.jobs:
650
- if j["rid"] == "job-definition/cloudpss/power-flow":
651
- job = j
693
+ job = self.__findJob("function/CloudPSS/power-flow")
652
694
  if job is None:
653
695
  raise Exception("找不到潮流内核运行的计算方案")
654
- if job["rid"] != "job-definition/cloudpss/power-flow":
696
+ if job["rid"] != "function/CloudPSS/power-flow":
655
697
  raise Exception("不是潮流内核运行生成算法的计算方案")
656
698
  if config is None:
657
699
  currentConfig = self.context["currentConfig"]
658
700
  config = self.configs[currentConfig]
659
- return self.run(job=job, config=config)
701
+ return self.run(job=job, config=config,**kwargs)
660
702
 
661
- def runThreePhasePowerFlow(self, job=None, config=None) -> Job:
703
+ def runThreePhasePowerFlow(self, job=None, config=None,**kwargs) -> Job[PowerFlowResult]:
662
704
  """
663
705
  运行 三相不平衡潮流 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
664
706
 
665
707
  :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
666
708
  :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
667
709
 
668
- :return: runner Runner[PowerFlowResult]
710
+ :return: Job[PowerFlowView]
669
711
  """
670
712
  if job is None:
671
- currentJob = self.context["currentJob"]
672
- job = self.jobs[currentJob]
673
- if job["rid"] != "job-definition/cloudpss/three-phase-powerFlow":
674
- for j in self.jobs:
675
- if j["rid"] == "job-definition/cloudpss/three-phase-powerFlow":
676
- job = j
713
+ job = self.__findJob("function/CloudPSS/three-phase-powerFlow")
677
714
  if job is None:
678
715
  raise Exception("找不到三相不平衡潮流内核运行的计算方案")
679
- if job["rid"] != "job-definition/cloudpss/three-phase-powerFlow":
716
+ if job["rid"] != "function/CloudPSS/three-phase-powerFlow":
680
717
  raise Exception("不是三相不平衡潮流内核运行生成算法的计算方案")
681
718
  if config is None:
682
719
  currentConfig = self.context["currentConfig"]
683
720
  config = self.configs[currentConfig]
684
- return self.run(job=job, config=config)
721
+ return self.run(job=job, config=config,**kwargs)
685
722
 
686
- def runIESLoadPrediction(self, job=None, config=None) -> Runner[IESResult]:
723
+ def runIESLoadPrediction(self, job=None, config=None,**kwargs) -> Job[IESResult]:
687
724
  """
688
725
  运行 负荷预测方案 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
689
726
 
690
727
  :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
691
728
  :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
692
729
 
693
- :return: runner Runner[IESResult]
730
+ :return: Job[IESView]
694
731
  """
695
732
  if job is None:
696
- currentJob = self.context["currentJob"]
697
- job = self.jobs[currentJob]
698
- if job["rid"] != "job-definition/ies/ies-load-prediction":
699
- for j in self.jobs:
700
- if j["rid"] == "job-definition/ies/ies-load-prediction":
701
- job = j
733
+ job = self.__findJob("job-definition/ies/ies-load-prediction")
702
734
  if job is None:
703
735
  raise Exception("找不到负荷预测方案内核运行的计算方案")
704
736
  if job["rid"] != "job-definition/ies/ies-load-prediction":
@@ -708,22 +740,17 @@ class Model(object):
708
740
  config = self.configs[currentConfig]
709
741
  return self.run(job=job, config=config)
710
742
 
711
- def runIESPowerFlow(self, job=None, config=None) -> Runner[IESResult]:
743
+ def runIESPowerFlow(self, job=None, config=None,**kwargs) -> Job[IESResult]:
712
744
  """
713
745
  运行 时序潮流方案 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
714
746
 
715
747
  :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
716
748
  :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
717
749
 
718
- :return: runner Runner[IESResult]
750
+ :return: Job[IESView]
719
751
  """
720
752
  if job is None:
721
- currentJob = self.context["currentJob"]
722
- job = self.jobs[currentJob]
723
- if job["rid"] != "job-definition/ies/ies-power-flow":
724
- for j in self.jobs:
725
- if j["rid"] == "job-definition/ies/ies-power-flow":
726
- job = j
753
+ job = self.__findJob("job-definition/ies/ies-power-flow")
727
754
  if job is None:
728
755
  raise Exception("找不到时序潮流方案内核运行的计算方案")
729
756
  if job["rid"] != "job-definition/ies/ies-power-flow":
@@ -731,24 +758,19 @@ class Model(object):
731
758
  if config is None:
732
759
  currentConfig = self.context["currentConfig"]
733
760
  config = self.configs[currentConfig]
734
- return self.run(job=job, config=config)
761
+ return self.run(job=job, config=config,**kwargs)
735
762
 
736
- def runIESEnergyStoragePlan(self, job=None, config=None) -> Runner[IESResult]:
763
+ def runIESEnergyStoragePlan(self, job=None, config=None,**kwargs) -> Job[IESResult]:
737
764
  """
738
765
  运行 储能规划方案 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
739
766
 
740
767
  :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
741
768
  :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
742
769
 
743
- :return: runner Runner[IESResult]
770
+ :return: Job[IESView]
744
771
  """
745
772
  if job is None:
746
- currentJob = self.context["currentJob"]
747
- job = self.jobs[currentJob]
748
- if job["rid"] != "job-definition/ies/ies-energy-storage-plan":
749
- for j in self.jobs:
750
- if j["rid"] == "job-definition/ies/ies-energy-storage-plan":
751
- job = j
773
+ job = self.__findJob("job-definition/ies/ies-energy-storage-plan")
752
774
  if job is None:
753
775
  raise Exception("找不到储能规划方案内核运行的计算方案")
754
776
  if job["rid"] != "job-definition/ies/ies-energy-storage-plan":
@@ -756,4 +778,5 @@ class Model(object):
756
778
  if config is None:
757
779
  currentConfig = self.context["currentConfig"]
758
780
  config = self.configs[currentConfig]
759
- return self.run(job=job, config=config)
781
+ return self.run(job=job, config=config,**kwargs)
782
+