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.
- cloudpss/asyncio/__init__.py +8 -0
- cloudpss/asyncio/job/__init__.py +5 -0
- cloudpss/asyncio/job/job.py +116 -0
- cloudpss/asyncio/job/messageStreamReceiver.py +121 -0
- cloudpss/asyncio/job/messageStreamSender.py +45 -0
- cloudpss/asyncio/model/__init__.py +5 -0
- cloudpss/asyncio/model/model.py +257 -0
- cloudpss/asyncio/model/revision.py +41 -0
- cloudpss/asyncio/model/topology.py +34 -0
- cloudpss/asyncio/utils/__init__.py +6 -0
- cloudpss/{utils → asyncio/utils}/httpAsyncRequest.py +2 -2
- cloudpss/dslab/dslab.py +115 -21
- cloudpss/function/functionExecution.py +10 -0
- cloudpss/ieslab/DataManageModel.py +65 -16
- cloudpss/ieslab/IESLabPlan.py +78 -0
- cloudpss/ieslab/IESLabSimulation.py +59 -32
- cloudpss/ieslab/PlanModel.py +11 -7
- cloudpss/job/job.py +119 -132
- cloudpss/job/jobReceiver.py +7 -1
- cloudpss/job/messageStreamReceiver.py +42 -99
- cloudpss/job/messageStreamSender.py +5 -42
- cloudpss/job/view/EMTView.py +9 -11
- cloudpss/job/view/IESLabTypicalDayView.py +114 -5
- cloudpss/job/view/view.py +36 -7
- cloudpss/model/implements/diagram.py +113 -0
- cloudpss/model/jobDefinitions.py +6 -6
- cloudpss/model/model.py +181 -193
- cloudpss/model/revision.py +29 -34
- cloudpss/model/topology.py +12 -14
- cloudpss/runner/MessageStreamReceiver.py +2 -0
- cloudpss/utils/httprequests.py +6 -5
- cloudpss/version.py +1 -1
- {cloudpss-4.1.1b8.dist-info → cloudpss-4.1.1b9.dist-info}/METADATA +1 -1
- {cloudpss-4.1.1b8.dist-info → cloudpss-4.1.1b9.dist-info}/RECORD +37 -31
- cloudpss/job/jobMachine.py +0 -11
- cloudpss/job/jobPolicy.py +0 -129
- cloudpss/job/jobQueue.py +0 -14
- cloudpss/job/jobTres.py +0 -6
- /cloudpss/{utils → asyncio/utils}/AsyncIterable.py +0 -0
- {cloudpss-4.1.1b8.dist-info → cloudpss-4.1.1b9.dist-info}/WHEEL +0 -0
- {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
|
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:
|
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.
|
241
|
-
|
242
|
-
|
243
|
-
|
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
|
-
|
310
|
+
if owner is None:
|
311
|
+
owner = userName()
|
312
|
+
elif owner == "*":
|
313
|
+
owner = None
|
253
314
|
variables = {
|
254
315
|
"cursor": cursor,
|
255
|
-
"limit":
|
256
|
-
"orderBy": [
|
257
|
-
|
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 =
|
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
|
-
|
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
|
-
|
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
|
417
|
+
return Model.update(self)
|
419
418
|
except:
|
420
|
-
return
|
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
|
430
|
+
return Model.create(self)
|
432
431
|
except:
|
433
432
|
raise Exception(rid + " 该资源已存在,无法重复创建,请修改 key")
|
434
433
|
|
435
|
-
return
|
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
|
-
|
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 =
|
462
|
+
revision = ModelRevision.create(model.revision, model.revision.hash)
|
473
463
|
|
474
|
-
return
|
475
|
-
|
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
|
-
|
496
|
-
def update(model):
|
497
|
-
return asyncio.run(Model.updateAsync(model))
|
485
|
+
|
498
486
|
|
499
487
|
@staticmethod
|
500
|
-
|
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
|
-
|
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 =
|
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
|
537
|
-
|
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
|
-
|
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:
|
614
|
+
:return: 生成的任务
|
594
615
|
"""
|
595
616
|
if job is None:
|
596
|
-
|
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"] != "
|
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:
|
634
|
+
:return: Job[EMTView]
|
619
635
|
"""
|
620
636
|
if job is None:
|
621
|
-
|
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"] != "
|
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:
|
654
|
+
:return: Job[EMTView]
|
644
655
|
"""
|
645
656
|
if job is None:
|
646
|
-
|
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"] != "
|
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:
|
674
|
+
:return: Job[PowerFlowView]
|
669
675
|
"""
|
670
676
|
if job is None:
|
671
|
-
|
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"] != "
|
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) ->
|
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:
|
694
|
+
:return: Job[IESView]
|
694
695
|
"""
|
695
696
|
if job is None:
|
696
|
-
|
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) ->
|
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:
|
714
|
+
:return: Job[IESView]
|
719
715
|
"""
|
720
716
|
if job is None:
|
721
|
-
|
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) ->
|
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:
|
734
|
+
:return: Job[IESView]
|
744
735
|
"""
|
745
736
|
if job is None:
|
746
|
-
|
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
|
+
|