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.
- 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/dslab/dataManageModel.py +43 -14
- cloudpss/dslab/dslab.py +35 -9
- cloudpss/dslab/files/curveData.py +35066 -35042
- cloudpss/dslab/files/files.py +21 -13
- cloudpss/function/functionExecution.py +74 -5
- cloudpss/ieslab/DataManageModel.py +144 -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 +222 -18
- cloudpss/ieslab/__init__.py +2 -1
- cloudpss/job/TemplateCompiler.py +273 -0
- cloudpss/job/TemplateManager.py +37 -0
- 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} +57 -14
- cloudpss/job/result/IESLabSimulationResult.py +5 -0
- cloudpss/job/result/IESLabTypicalDayResult.py +134 -0
- cloudpss/job/{view/IESView.py → result/IESResult.py} +7 -5
- cloudpss/job/{view/PowerFlowView.py → result/PowerFlowResult.py} +2 -2
- cloudpss/job/result/__init__.py +40 -0
- cloudpss/job/{view/view.py → result/result.py} +38 -8
- cloudpss/model/implements/diagram.py +140 -0
- cloudpss/model/jobDefinitions.py +6 -6
- cloudpss/model/model.py +245 -226
- cloudpss/model/revision.py +30 -35
- cloudpss/model/topology.py +26 -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 +97 -53
- cloudpss/utils/IO.py +3 -1
- cloudpss/utils/graphqlUtil.py +3 -2
- cloudpss/utils/httprequests.py +19 -10
- cloudpss/version.py +1 -1
- {cloudpss-4.1.1b7.dist-info → cloudpss-4.5.13.dist-info}/METADATA +2 -2
- cloudpss-4.5.13.dist-info/RECORD +80 -0
- cloudpss/dslab/DSLabFinancialResult.py +0 -96
- 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-4.1.1b7.dist-info/RECORD +0 -72
- /cloudpss/{utils → asyncio/utils}/AsyncIterable.py +0 -0
- {cloudpss-4.1.1b7.dist-info → cloudpss-4.5.13.dist-info}/WHEEL +0 -0
- {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
|
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:
|
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[
|
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.
|
241
|
-
|
242
|
-
|
243
|
-
|
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
|
-
|
317
|
+
if owner is None:
|
318
|
+
owner = userName()
|
319
|
+
elif owner == "*":
|
320
|
+
owner = None
|
253
321
|
variables = {
|
254
322
|
"cursor": cursor,
|
255
|
-
"limit":
|
256
|
-
"orderBy": [
|
257
|
-
|
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 =
|
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
|
-
|
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,
|
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
|
-
|
327
|
-
|
328
|
-
|
362
|
+
:params job: 调用仿真时使用的计算方案,不指定将使用算例保存时选中的计算方案
|
363
|
+
:params config: 调用仿真时使用的参数方案,不指定将使用算例保存时选中的参数方案
|
364
|
+
:params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
|
329
365
|
|
330
|
-
|
366
|
+
:return: 返回一个运行实例
|
331
367
|
|
332
|
-
|
333
|
-
|
368
|
+
>>> runner=model.run(job,config,'')
|
369
|
+
runner
|
334
370
|
|
335
371
|
"""
|
336
372
|
if job is None:
|
337
|
-
currentJob = self.context[
|
373
|
+
currentJob = self.context['currentJob']
|
338
374
|
job = self.jobs[currentJob]
|
339
375
|
if config is None:
|
340
|
-
currentConfig = self.context[
|
376
|
+
currentConfig = self.context['currentConfig']
|
341
377
|
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
|
-
)
|
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
|
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
|
446
|
+
return Model.update(self)
|
419
447
|
except:
|
420
|
-
return
|
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
|
459
|
+
return Model.create(self)
|
432
460
|
except:
|
433
461
|
raise Exception(rid + " 该资源已存在,无法重复创建,请修改 key")
|
434
462
|
|
435
|
-
return
|
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
|
-
|
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
|
-
|
464
|
-
|
465
|
-
|
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
|
-
|
488
|
-
"member":
|
489
|
-
"everyone":
|
503
|
+
"moderator": 98367,
|
504
|
+
"member": 65551,
|
505
|
+
"everyone": 0
|
490
506
|
},
|
491
507
|
}
|
492
508
|
},
|
493
509
|
)
|
494
510
|
|
495
|
-
|
496
|
-
def update(model):
|
497
|
-
return asyncio.run(Model.updateAsync(model))
|
511
|
+
|
498
512
|
|
499
513
|
@staticmethod
|
500
|
-
|
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
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
"
|
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,
|
591
|
+
return self.revision.fetchTopology(implementType, config,
|
592
|
+
maximumDepth, **kwargs)
|
584
593
|
return None
|
594
|
+
|
585
595
|
|
586
|
-
def
|
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
|
-
|
607
|
+
运行 emtp 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
|
589
608
|
|
590
|
-
|
591
|
-
|
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
|
-
|
599
|
-
|
600
|
-
|
601
|
-
|
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"] != "
|
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
|
-
|
656
|
+
|
657
|
+
return self.run(job=job, config=config,**kwargs)
|
610
658
|
|
611
|
-
def runSFEMT(self,
|
659
|
+
def runSFEMT(self,job=None,config=None,**kwargs)->Runner[EMTResult]:
|
612
660
|
"""
|
613
|
-
|
661
|
+
运行 移频电磁暂态 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
|
614
662
|
|
615
663
|
:param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
|
616
664
|
:param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
|
617
665
|
|
618
|
-
:return:
|
666
|
+
:return: Job[EMTView]
|
619
667
|
"""
|
620
668
|
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
|
669
|
+
job = self.__findJob("function/CloudPSS/sfemt")
|
627
670
|
if job is None:
|
628
671
|
raise Exception("找不到移频电磁暂态运行的计算方案")
|
629
|
-
if job["rid"] != "
|
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,
|
679
|
+
def runPowerFlow(self,job=None,config=None,**kwargs)->Runner[PowerFlowResult]:
|
637
680
|
"""
|
638
|
-
|
681
|
+
运行 潮流 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
|
639
682
|
|
640
|
-
|
641
|
-
|
683
|
+
:param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
|
684
|
+
:param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
|
642
685
|
|
643
|
-
|
686
|
+
:return: Job[EMTView]
|
644
687
|
"""
|
645
688
|
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
|
689
|
+
job = self.__findJob("function/CloudPSS/power-flow")
|
652
690
|
if job is None:
|
653
691
|
raise Exception("找不到潮流内核运行的计算方案")
|
654
|
-
if job["rid"] != "
|
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:
|
706
|
+
:return: Job[PowerFlowView]
|
669
707
|
"""
|
670
708
|
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
|
709
|
+
job = self.__findJob("function/CloudPSS/three-phase-powerFlow")
|
677
710
|
if job is None:
|
678
711
|
raise Exception("找不到三相不平衡潮流内核运行的计算方案")
|
679
|
-
if job["rid"] != "
|
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) ->
|
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:
|
726
|
+
:return: Job[IESView]
|
694
727
|
"""
|
695
728
|
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
|
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) ->
|
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:
|
746
|
+
:return: Job[IESView]
|
719
747
|
"""
|
720
748
|
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
|
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) ->
|
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:
|
766
|
+
:return: Job[IESView]
|
744
767
|
"""
|
745
768
|
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
|
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
|
+
|