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