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.
- cloudpss/__init__.py +2 -3
- 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/function/functionExecution.py +36 -3
- cloudpss/ieslab/DataManageModel.py +131 -9
- cloudpss/ieslab/EvaluationModel.py +80 -9
- cloudpss/ieslab/IESLabOpt.py +235 -0
- cloudpss/ieslab/IESLabPlan.py +82 -4
- cloudpss/ieslab/IESLabSimulation.py +59 -32
- cloudpss/ieslab/PlanModel.py +276 -33
- cloudpss/ieslab/__init__.py +2 -1
- cloudpss/job/job.py +136 -141
- cloudpss/job/jobReceiver.py +8 -2
- cloudpss/job/messageStreamReceiver.py +42 -99
- cloudpss/job/messageStreamSender.py +5 -42
- cloudpss/job/{view/EMTView.py → result/EMTResult.py} +11 -13
- cloudpss/job/result/IESLabSimulationResult.py +5 -0
- cloudpss/job/result/IESLabTypicalDayResult.py +136 -0
- cloudpss/job/{view/IESView.py → result/IESResult.py} +2 -2
- cloudpss/job/{view/PowerFlowView.py → result/PowerFlowResult.py} +2 -2
- cloudpss/job/result/__init__.py +39 -0
- cloudpss/job/{view/view.py → result/result.py} +37 -8
- cloudpss/model/implements/diagram.py +113 -0
- cloudpss/model/jobDefinitions.py +6 -6
- cloudpss/model/model.py +232 -209
- cloudpss/model/revision.py +30 -35
- cloudpss/model/topology.py +13 -15
- cloudpss/runner/IESLabEvaluationResult.py +14 -6
- cloudpss/runner/IESLabPlanResult.py +91 -35
- cloudpss/runner/IESLabTypicalDayResult.py +62 -50
- cloudpss/runner/MessageStreamReceiver.py +5 -100
- cloudpss/runner/result.py +6 -1
- cloudpss/runner/runner.py +77 -48
- cloudpss/utils/IO.py +1 -1
- cloudpss/utils/graphqlUtil.py +3 -2
- cloudpss/utils/httprequests.py +16 -8
- cloudpss/version.py +1 -1
- {cloudpss-4.1.1b8.dist-info → cloudpss-4.5.0.dist-info}/METADATA +2 -2
- cloudpss-4.5.0.dist-info/RECORD +70 -0
- cloudpss/dslab/__init__.py +0 -2
- cloudpss/dslab/dataManageModel.py +0 -275
- cloudpss/dslab/dslab.py +0 -210
- cloudpss/dslab/files/__init__.py +0 -2
- cloudpss/dslab/files/curveData.py +0 -140229
- cloudpss/dslab/files/files.py +0 -27
- cloudpss/dslab/financialAnalysisModel.py +0 -137
- 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/job/view/IESLabSimulationView.py +0 -5
- cloudpss/job/view/IESLabTypicalDayView.py +0 -27
- cloudpss/job/view/__init__.py +0 -42
- cloudpss/runner/DSLabResult.py +0 -92
- cloudpss-4.1.1b8.dist-info/RECORD +0 -71
- /cloudpss/{utils → asyncio/utils}/AsyncIterable.py +0 -0
- {cloudpss-4.1.1b8.dist-info → cloudpss-4.5.0.dist-info}/WHEEL +0 -0
- {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
|
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
|
@@ -207,7 +274,8 @@ class Model(object):
|
|
207
274
|
"""
|
208
275
|
|
209
276
|
config = deepcopy(self.configs[0])
|
210
|
-
config[
|
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.
|
241
|
-
|
242
|
-
|
243
|
-
|
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
|
-
|
312
|
+
if owner is None:
|
313
|
+
owner = userName()
|
314
|
+
elif owner == "*":
|
315
|
+
owner = None
|
253
316
|
variables = {
|
254
317
|
"cursor": cursor,
|
255
|
-
"limit":
|
256
|
-
"orderBy": [
|
257
|
-
|
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 =
|
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
|
-
|
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,
|
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
|
-
|
327
|
-
|
328
|
-
|
357
|
+
:params job: 调用仿真时使用的计算方案,不指定将使用算例保存时选中的计算方案
|
358
|
+
:params config: 调用仿真时使用的参数方案,不指定将使用算例保存时选中的参数方案
|
359
|
+
:params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
|
329
360
|
|
330
|
-
|
361
|
+
:return: 返回一个运行实例
|
331
362
|
|
332
|
-
|
333
|
-
|
363
|
+
>>> runner=model.run(job,config,'')
|
364
|
+
runner
|
334
365
|
|
335
366
|
"""
|
336
367
|
if job is None:
|
337
|
-
currentJob = self.context[
|
368
|
+
currentJob = self.context['currentJob']
|
338
369
|
job = self.jobs[currentJob]
|
339
370
|
if config is None:
|
340
|
-
currentConfig = self.context[
|
371
|
+
currentConfig = self.context['currentConfig']
|
341
372
|
config = self.configs[currentConfig]
|
342
|
-
|
343
|
-
|
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
|
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
|
440
|
+
return Model.update(self)
|
419
441
|
except:
|
420
|
-
return
|
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
|
453
|
+
return Model.create(self)
|
432
454
|
except:
|
433
455
|
raise Exception(rid + " 该资源已存在,无法重复创建,请修改 key")
|
434
456
|
|
435
|
-
return
|
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
|
-
|
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 =
|
485
|
+
revision = ModelRevision.create(model.revision, model.revision.hash)
|
473
486
|
|
474
|
-
return
|
475
|
-
|
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
|
-
|
496
|
-
def update(model):
|
497
|
-
return asyncio.run(Model.updateAsync(model))
|
508
|
+
|
498
509
|
|
499
510
|
@staticmethod
|
500
|
-
|
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
|
-
|
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 =
|
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
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
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,
|
595
|
+
return self.revision.fetchTopology(implementType, config,
|
596
|
+
maximumDepth, **kwargs)
|
584
597
|
return None
|
598
|
+
|
585
599
|
|
586
|
-
def
|
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
|
-
|
611
|
+
运行 emtp 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
|
589
612
|
|
590
|
-
|
591
|
-
|
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
|
-
|
599
|
-
|
600
|
-
|
601
|
-
|
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"] != "
|
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
|
-
|
660
|
+
|
661
|
+
return self.run(job=job, config=config,**kwargs)
|
610
662
|
|
611
|
-
def runSFEMT(self,
|
663
|
+
def runSFEMT(self,job=None,config=None,**kwargs)->Runner[EMTResult]:
|
612
664
|
"""
|
613
|
-
|
665
|
+
运行 移频电磁暂态 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
|
614
666
|
|
615
667
|
:param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
|
616
668
|
:param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
|
617
669
|
|
618
|
-
:return:
|
670
|
+
:return: Job[EMTView]
|
619
671
|
"""
|
620
672
|
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
|
673
|
+
job = self.__findJob("function/CloudPSS/sfemt")
|
627
674
|
if job is None:
|
628
675
|
raise Exception("找不到移频电磁暂态运行的计算方案")
|
629
|
-
if job["rid"] != "
|
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,
|
683
|
+
def runPowerFlow(self,job=None,config=None,**kwargs)->Runner[PowerFlowResult]:
|
637
684
|
"""
|
638
|
-
|
685
|
+
运行 潮流 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
|
639
686
|
|
640
|
-
|
641
|
-
|
687
|
+
:param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
|
688
|
+
:param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
|
642
689
|
|
643
|
-
|
690
|
+
:return: Job[EMTView]
|
644
691
|
"""
|
645
692
|
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
|
693
|
+
job = self.__findJob("function/CloudPSS/power-flow")
|
652
694
|
if job is None:
|
653
695
|
raise Exception("找不到潮流内核运行的计算方案")
|
654
|
-
if job["rid"] != "
|
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:
|
710
|
+
:return: Job[PowerFlowView]
|
669
711
|
"""
|
670
712
|
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
|
713
|
+
job = self.__findJob("function/CloudPSS/three-phase-powerFlow")
|
677
714
|
if job is None:
|
678
715
|
raise Exception("找不到三相不平衡潮流内核运行的计算方案")
|
679
|
-
if job["rid"] != "
|
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) ->
|
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:
|
730
|
+
:return: Job[IESView]
|
694
731
|
"""
|
695
732
|
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
|
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) ->
|
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:
|
750
|
+
:return: Job[IESView]
|
719
751
|
"""
|
720
752
|
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
|
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) ->
|
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:
|
770
|
+
:return: Job[IESView]
|
744
771
|
"""
|
745
772
|
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
|
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
|
+
|