cloudpss 4.1.1b8__py3-none-any.whl → 4.1.1b9__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 (41) hide show
  1. cloudpss/asyncio/__init__.py +8 -0
  2. cloudpss/asyncio/job/__init__.py +5 -0
  3. cloudpss/asyncio/job/job.py +116 -0
  4. cloudpss/asyncio/job/messageStreamReceiver.py +121 -0
  5. cloudpss/asyncio/job/messageStreamSender.py +45 -0
  6. cloudpss/asyncio/model/__init__.py +5 -0
  7. cloudpss/asyncio/model/model.py +257 -0
  8. cloudpss/asyncio/model/revision.py +41 -0
  9. cloudpss/asyncio/model/topology.py +34 -0
  10. cloudpss/asyncio/utils/__init__.py +6 -0
  11. cloudpss/{utils → asyncio/utils}/httpAsyncRequest.py +2 -2
  12. cloudpss/dslab/dslab.py +115 -21
  13. cloudpss/function/functionExecution.py +10 -0
  14. cloudpss/ieslab/DataManageModel.py +65 -16
  15. cloudpss/ieslab/IESLabPlan.py +78 -0
  16. cloudpss/ieslab/IESLabSimulation.py +59 -32
  17. cloudpss/ieslab/PlanModel.py +11 -7
  18. cloudpss/job/job.py +119 -132
  19. cloudpss/job/jobReceiver.py +7 -1
  20. cloudpss/job/messageStreamReceiver.py +42 -99
  21. cloudpss/job/messageStreamSender.py +5 -42
  22. cloudpss/job/view/EMTView.py +9 -11
  23. cloudpss/job/view/IESLabTypicalDayView.py +114 -5
  24. cloudpss/job/view/view.py +36 -7
  25. cloudpss/model/implements/diagram.py +113 -0
  26. cloudpss/model/jobDefinitions.py +6 -6
  27. cloudpss/model/model.py +181 -193
  28. cloudpss/model/revision.py +29 -34
  29. cloudpss/model/topology.py +12 -14
  30. cloudpss/runner/MessageStreamReceiver.py +2 -0
  31. cloudpss/utils/httprequests.py +6 -5
  32. cloudpss/version.py +1 -1
  33. {cloudpss-4.1.1b8.dist-info → cloudpss-4.1.1b9.dist-info}/METADATA +1 -1
  34. {cloudpss-4.1.1b8.dist-info → cloudpss-4.1.1b9.dist-info}/RECORD +37 -31
  35. cloudpss/job/jobMachine.py +0 -11
  36. cloudpss/job/jobPolicy.py +0 -129
  37. cloudpss/job/jobQueue.py +0 -14
  38. cloudpss/job/jobTres.py +0 -6
  39. /cloudpss/{utils → asyncio/utils}/AsyncIterable.py +0 -0
  40. {cloudpss-4.1.1b8.dist-info → cloudpss-4.1.1b9.dist-info}/WHEEL +0 -0
  41. {cloudpss-4.1.1b8.dist-info → cloudpss-4.1.1b9.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.view import EMTView, IESView, PowerFlowView
6
+ from cloudpss.job.view.view import View
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
@@ -224,11 +291,7 @@ class Model(object):
224
291
  return config
225
292
 
226
293
  @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=[]):
294
+ def fetchMany(name=None, cursor=[],pageSize=10,owner=None):
232
295
  """
233
296
  获取用户可以运行的项目列表
234
297
 
@@ -237,41 +300,38 @@ class Model(object):
237
300
 
238
301
  :return: 按分页信息返回项目列表
239
302
 
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
-
303
+ >>> data= await Model.fetchMany()
304
+ [
305
+ {'rid': 'model/demo/demo', 'name': 'demo', 'description': 'demo'}
306
+ ...
307
+ ]
250
308
 
251
309
  """
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}}}}"""
310
+ if owner is None:
311
+ owner = userName()
312
+ elif owner == "*":
313
+ owner = None
253
314
  variables = {
254
315
  "cursor": cursor,
255
- "limit": 10,
256
- "orderBy": ["updatedAt<"],
257
- "permissionEveryone": ["b_any", 2**16],
316
+ "limit": pageSize,
317
+ "orderBy": [
318
+ "updatedAt<",
319
+ "type",
320
+ "owner",
321
+ "key"
322
+ ],
323
+ "owner":owner,
258
324
  }
259
325
  if name is not None:
260
326
  variables["_search"] = name
261
327
 
262
- data = await graphql_fetch(query, {"input": variables})
263
-
328
+ data = graphql_request(Model.__models_query, {"input": variables})
264
329
  if "errors" in data:
265
330
  raise Exception(data["errors"][0]["message"])
266
-
267
- return data["data"]["models"]
331
+ return data["data"]["models"]['items']
268
332
 
269
333
  @staticmethod
270
334
  def fetch(rid):
271
- return asyncio.run(Model.fetchAsync(rid))
272
-
273
- @staticmethod
274
- async def fetchAsync(rid):
275
335
  """
276
336
  获取项目
277
337
 
@@ -282,72 +342,15 @@ class Model(object):
282
342
  >>> model=Model.fetch('model/Demo/test')
283
343
 
284
344
  """
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})
345
+ data = graphql_request(Model.__model_query, {"rid": rid})
311
346
  if "errors" in data:
312
347
  raise Exception(data["errors"][0]["message"])
313
348
  return Model(data["data"]["model"])
314
349
 
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):
322
- """
323
-
324
- 调用仿真
325
-
326
- :params job: 调用仿真时使用的计算方案,不指定将使用算例保存时选中的计算方案
327
- :params config: 调用仿真时使用的参数方案,不指定将使用算例保存时选中的参数方案
328
- :params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
329
-
330
- :return: 返回一个Job实例
331
-
332
- >>> job=model.run(job,config,'')
333
- job
334
-
335
- """
336
- if job is None:
337
- currentJob = self.context["currentJob"]
338
- job = self.jobs[currentJob]
339
- if config is None:
340
- currentConfig = self.context["currentConfig"]
341
- 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
- )
350
+
351
+
350
352
 
353
+
351
354
  def iesSimulationRun(self, job=None, config=None, name=None, **kwargs):
352
355
  return self.run(job=job, config=config, name=name, kwargs=kwargs)
353
356
 
@@ -389,9 +392,6 @@ class Model(object):
389
392
  IO.dump(model, file, format, compress)
390
393
 
391
394
  def save(self, key=None):
392
- return asyncio.run(self.saveAsync(key))
393
-
394
- async def saveAsync(self, key=None):
395
395
  """
396
396
  保存/创建项目
397
397
 
@@ -399,7 +399,6 @@ class Model(object):
399
399
  key 为空时如果项目 rid 不存在则抛异常,需要重新设置 key。
400
400
  如果保存时,当前用户不是该项目的拥有者时,将重新创建项目,重建项目时如果参数的 key 为空将使用当前当前项目的 key 作为资源的 key ,当资源的 key 和远程冲突时保存失败
401
401
 
402
- :params: model 项目
403
402
  :params: key 资源 id 的唯一标识符,
404
403
 
405
404
  :return: 保存成功/保存失败
@@ -415,9 +414,9 @@ class Model(object):
415
414
  if matchObj:
416
415
  self.rid = "model/" + username + "/" + key
417
416
  try:
418
- return await Model.updateAsync(self)
417
+ return Model.update(self)
419
418
  except:
420
- return await Model.createAsync(self)
419
+ return Model.create(self)
421
420
  else:
422
421
  raise Exception("key 能包含字母数子和下划线")
423
422
  else:
@@ -428,18 +427,15 @@ class Model(object):
428
427
  elif owner[0] != username:
429
428
  rid = re.sub(t, username, self.rid)
430
429
  try:
431
- return await Model.createAsync(self)
430
+ return Model.create(self)
432
431
  except:
433
432
  raise Exception(rid + " 该资源已存在,无法重复创建,请修改 key")
434
433
 
435
- return await Model.updateAsync(self)
434
+ return Model.update(self)
436
435
 
437
- @staticmethod
438
- def create(model):
439
- return asyncio.run(Model.createAsync(model))
440
436
 
441
437
  @staticmethod
442
- async def createAsync(model):
438
+ def create(model):
443
439
  """
444
440
  新建项目
445
441
 
@@ -460,19 +456,13 @@ class Model(object):
460
456
  elif owner[0] != username:
461
457
  raise Exception("rid 错误,无法保存")
462
458
 
463
- modelQuery = """
464
- mutation($a:CreateModelInput!){createModel(input:$a){
465
- rid
466
- }}
467
- """
468
459
  isPublic = model.context.get("auth", "") != "private"
469
- isComponent = model.context.get("category", "") == "component"
470
460
  publicRead = model.context.get("publicRead", "") != False
471
461
  auth = (65539 if publicRead else 65537) if isPublic else 0
472
- revision = await ModelRevision.createAsync(model.revision, model.revision.hash)
462
+ revision = ModelRevision.create(model.revision, model.revision.hash)
473
463
 
474
- return await graphql_fetch(
475
- modelQuery,
464
+ return graphql_request(
465
+ Model.__create_model,
476
466
  {
477
467
  "a": {
478
468
  "rid": model.rid,
@@ -492,12 +482,10 @@ class Model(object):
492
482
  },
493
483
  )
494
484
 
495
- @staticmethod
496
- def update(model):
497
- return asyncio.run(Model.updateAsync(model))
485
+
498
486
 
499
487
  @staticmethod
500
- async def updateAsync(model):
488
+ def update(model):
501
489
  """
502
490
  更新项目
503
491
 
@@ -517,24 +505,20 @@ class Model(object):
517
505
  elif owner[0] != username:
518
506
  raise Exception("rid 错误,无法保存")
519
507
 
520
- modelQuery = """
521
- mutation($a:UpdateModelInput!){updateModel(input:$a){
522
- rid
523
- }}
524
- """
508
+
525
509
  isPublic = model.context.get("auth", "") != "private"
526
510
  isComponent = model.context.get("category", "") == "component"
527
511
  publicRead = model.context.get("publicRead", "") != False
528
512
  auth = (65539 if publicRead else 65537) if isPublic else 0
529
- revision = await ModelRevision.createAsync(model.revision, model.revision.hash)
513
+ revision = ModelRevision.create(model.revision, model.revision.hash)
530
514
 
531
515
  xVersion = int(float(os.environ.get("X_CLOUDPSS_VERSION", 4)))
532
516
  tags = {"replace": model.tags}
533
517
  if xVersion == 3:
534
518
  tags = model.tags
535
519
 
536
- return await graphql_fetch(
537
- modelQuery,
520
+ return graphql_request(
521
+ Model.__update_model,
538
522
  {
539
523
  "a": {
540
524
  "rid": model.rid,
@@ -554,6 +538,8 @@ class Model(object):
554
538
  },
555
539
  )
556
540
 
541
+
542
+
557
543
  def fetchTopology(
558
544
  self,
559
545
  implementType=None,
@@ -582,123 +568,133 @@ class Model(object):
582
568
  config = self.configs[currentConfig]
583
569
  return self.revision.fetchTopology(implementType, config, maximumDepth)
584
570
  return None
571
+
572
+ def run(self, job=None, config=None, name=None, policy=None,stop_on_entry=None, **kwargs)-> Job[View]:
573
+
574
+ """
575
+
576
+ 运行仿真任务
577
+
578
+ :params job: 调用仿真时使用的计算方案,不指定将使用算例保存时选中的计算方案
579
+ :params config: 调用仿真时使用的参数方案,不指定将使用算例保存时选中的参数方案
580
+ :params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
581
+
582
+ :return: 返回一个运行实例
583
+
584
+ >>> runner=model.run(job,config,'')
585
+ runner
585
586
 
586
- def runEMT(self, job=None, config=None) -> Job:
587
587
  """
588
- 运行 emtp 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
588
+ if job is None:
589
+ currentJob = self.context["currentJob"]
590
+ job = self.jobs[currentJob]
591
+ if config is None:
592
+ currentConfig = self.context["currentConfig"]
593
+ config = self.configs[currentConfig]
594
+ return self.revision.run(
595
+ job, config, name, policy, stop_on_entry,self.rid,**kwargs
596
+ )
597
+
598
+ def __findJob(self, jobType):
599
+ currentJob = self.context["currentJob"]
600
+ job = self.jobs[currentJob]
601
+ if job["rid"] != jobType:
602
+ for j in self.jobs:
603
+ if j["rid"] ==jobType:
604
+ job = j
605
+ return job
606
+
607
+ def runEMT(self, job=None, config=None,**kwargs) -> Job[EMTView]:
608
+ """
609
+ 运行 emtp 内核,如果当前 model 没有创建 Job 时报错,默认使用算例中选中的计算方案进行仿真,如果选中的计算方案不是 EMT 方案则选第一个EMT 计算方案,如果不存在计算方案则直接报错。
589
610
 
590
611
  :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
591
612
  :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
592
613
 
593
- :return: job 运行结果
614
+ :return: 生成的任务
594
615
  """
595
616
  if job is None:
596
- currentJob = self.context["currentJob"]
597
- 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
617
+ job = self.__findJob("function/CloudPSS/emtps")
602
618
  if job is None:
603
619
  raise Exception("找不到电磁暂态运行的计算方案")
604
- if job["rid"] != "job-definition/cloudpss/emtp":
620
+ if job["rid"] != "function/CloudPSS/emtp" and job["rid"] != "function/CloudPSS/emtps":
605
621
  raise Exception("不是电磁暂态运行生成算法的计算方案")
606
622
  if config is None:
607
623
  currentConfig = self.context["currentConfig"]
608
624
  config = self.configs[currentConfig]
609
- return self.run(job=job, config=config)
625
+ return self.run(job=job, config=config,**kwargs)
610
626
 
611
- def runSFEMT(self, job=None, config=None) -> Job:
627
+ def runSFEMT(self, job=None, config=None,**kwargs) -> Job[EMTView]:
612
628
  """
613
629
  运行 移频电磁暂态 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
614
630
 
615
631
  :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
616
632
  :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
617
633
 
618
- :return: runner Runner[EMTResult]
634
+ :return: Job[EMTView]
619
635
  """
620
636
  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
637
+ job = self.__findJob("function/CloudPSS/sfemt")
627
638
  if job is None:
628
639
  raise Exception("找不到移频电磁暂态运行的计算方案")
629
- if job["rid"] != "job-definition/cloudpss/sfemt":
640
+ if job["rid"] != "function/CloudPSS/sfemt":
630
641
  raise Exception("不是移频电磁暂态运行生成算法的计算方案")
631
642
  if config is None:
632
643
  currentConfig = self.context["currentConfig"]
633
644
  config = self.configs[currentConfig]
634
645
  return self.run(job=job, config=config)
635
646
 
636
- def runPowerFlow(self, job=None, config=None) -> Job:
647
+ def runPowerFlow(self, job=None, config=None,**kwargs) -> Job[PowerFlowView]:
637
648
  """
638
649
  运行 潮流 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
639
650
 
640
651
  :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
641
652
  :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
642
653
 
643
- :return: runner Runner[PowerFlowResult]
654
+ :return: Job[EMTView]
644
655
  """
645
656
  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
657
+ job = self.__findJob("function/CloudPSS/power-flow")
652
658
  if job is None:
653
659
  raise Exception("找不到潮流内核运行的计算方案")
654
- if job["rid"] != "job-definition/cloudpss/power-flow":
660
+ if job["rid"] != "function/CloudPSS/power-flow":
655
661
  raise Exception("不是潮流内核运行生成算法的计算方案")
656
662
  if config is None:
657
663
  currentConfig = self.context["currentConfig"]
658
664
  config = self.configs[currentConfig]
659
- return self.run(job=job, config=config)
665
+ return self.run(job=job, config=config,**kwargs)
660
666
 
661
- def runThreePhasePowerFlow(self, job=None, config=None) -> Job:
667
+ def runThreePhasePowerFlow(self, job=None, config=None,**kwargs) -> Job[PowerFlowView]:
662
668
  """
663
669
  运行 三相不平衡潮流 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
664
670
 
665
671
  :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
666
672
  :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
667
673
 
668
- :return: runner Runner[PowerFlowResult]
674
+ :return: Job[PowerFlowView]
669
675
  """
670
676
  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
677
+ job = self.__findJob("function/CloudPSS/three-phase-powerFlow")
677
678
  if job is None:
678
679
  raise Exception("找不到三相不平衡潮流内核运行的计算方案")
679
- if job["rid"] != "job-definition/cloudpss/three-phase-powerFlow":
680
+ if job["rid"] != "function/CloudPSS/three-phase-powerFlow":
680
681
  raise Exception("不是三相不平衡潮流内核运行生成算法的计算方案")
681
682
  if config is None:
682
683
  currentConfig = self.context["currentConfig"]
683
684
  config = self.configs[currentConfig]
684
- return self.run(job=job, config=config)
685
+ return self.run(job=job, config=config,**kwargs)
685
686
 
686
- def runIESLoadPrediction(self, job=None, config=None) -> Runner[IESResult]:
687
+ def runIESLoadPrediction(self, job=None, config=None,**kwargs) -> Job[IESView]:
687
688
  """
688
689
  运行 负荷预测方案 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
689
690
 
690
691
  :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
691
692
  :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
692
693
 
693
- :return: runner Runner[IESResult]
694
+ :return: Job[IESView]
694
695
  """
695
696
  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
697
+ job = self.__findJob("job-definition/ies/ies-load-prediction")
702
698
  if job is None:
703
699
  raise Exception("找不到负荷预测方案内核运行的计算方案")
704
700
  if job["rid"] != "job-definition/ies/ies-load-prediction":
@@ -708,22 +704,17 @@ class Model(object):
708
704
  config = self.configs[currentConfig]
709
705
  return self.run(job=job, config=config)
710
706
 
711
- def runIESPowerFlow(self, job=None, config=None) -> Runner[IESResult]:
707
+ def runIESPowerFlow(self, job=None, config=None,**kwargs) -> Job[IESView]:
712
708
  """
713
709
  运行 时序潮流方案 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
714
710
 
715
711
  :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
716
712
  :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
717
713
 
718
- :return: runner Runner[IESResult]
714
+ :return: Job[IESView]
719
715
  """
720
716
  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
717
+ job = self.__findJob("job-definition/ies/ies-power-flow")
727
718
  if job is None:
728
719
  raise Exception("找不到时序潮流方案内核运行的计算方案")
729
720
  if job["rid"] != "job-definition/ies/ies-power-flow":
@@ -731,24 +722,19 @@ class Model(object):
731
722
  if config is None:
732
723
  currentConfig = self.context["currentConfig"]
733
724
  config = self.configs[currentConfig]
734
- return self.run(job=job, config=config)
725
+ return self.run(job=job, config=config,**kwargs)
735
726
 
736
- def runIESEnergyStoragePlan(self, job=None, config=None) -> Runner[IESResult]:
727
+ def runIESEnergyStoragePlan(self, job=None, config=None,**kwargs) -> Job[IESView]:
737
728
  """
738
729
  运行 储能规划方案 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
739
730
 
740
731
  :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
741
732
  :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
742
733
 
743
- :return: runner Runner[IESResult]
734
+ :return: Job[IESView]
744
735
  """
745
736
  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
737
+ job = self.__findJob("job-definition/ies/ies-energy-storage-plan")
752
738
  if job is None:
753
739
  raise Exception("找不到储能规划方案内核运行的计算方案")
754
740
  if job["rid"] != "job-definition/ies/ies-energy-storage-plan":
@@ -756,4 +742,6 @@ class Model(object):
756
742
  if config is None:
757
743
  currentConfig = self.context["currentConfig"]
758
744
  config = self.configs[currentConfig]
759
- return self.run(job=job, config=config)
745
+ return self.run(job=job, config=config,**kwargs)
746
+
747
+