cloudpss 4.1.1b9__py3-none-any.whl → 4.5.1__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 (46) hide show
  1. cloudpss/__init__.py +2 -3
  2. cloudpss/asyncio/job/job.py +2 -2
  3. cloudpss/function/functionExecution.py +26 -3
  4. cloudpss/ieslab/DataManageModel.py +119 -46
  5. cloudpss/ieslab/EvaluationModel.py +80 -9
  6. cloudpss/ieslab/IESLabOpt.py +235 -0
  7. cloudpss/ieslab/IESLabPlan.py +4 -4
  8. cloudpss/ieslab/PlanModel.py +271 -32
  9. cloudpss/ieslab/__init__.py +2 -1
  10. cloudpss/job/job.py +27 -19
  11. cloudpss/job/jobReceiver.py +2 -2
  12. cloudpss/job/{view/EMTView.py → result/EMTResult.py} +2 -2
  13. cloudpss/job/result/IESLabSimulationResult.py +5 -0
  14. cloudpss/job/{view/IESLabTypicalDayView.py → result/IESLabTypicalDayResult.py} +3 -3
  15. cloudpss/job/{view/IESView.py → result/IESResult.py} +2 -2
  16. cloudpss/job/{view/PowerFlowView.py → result/PowerFlowResult.py} +2 -2
  17. cloudpss/job/result/__init__.py +39 -0
  18. cloudpss/job/{view/view.py → result/result.py} +1 -1
  19. cloudpss/model/model.py +82 -47
  20. cloudpss/model/revision.py +3 -3
  21. cloudpss/model/topology.py +2 -2
  22. cloudpss/runner/IESLabEvaluationResult.py +14 -6
  23. cloudpss/runner/IESLabPlanResult.py +91 -35
  24. cloudpss/runner/IESLabTypicalDayResult.py +62 -50
  25. cloudpss/runner/MessageStreamReceiver.py +5 -102
  26. cloudpss/runner/result.py +6 -1
  27. cloudpss/runner/runner.py +77 -48
  28. cloudpss/utils/IO.py +1 -1
  29. cloudpss/utils/graphqlUtil.py +3 -2
  30. cloudpss/utils/httprequests.py +11 -4
  31. cloudpss/version.py +1 -1
  32. {cloudpss-4.1.1b9.dist-info → cloudpss-4.5.1.dist-info}/METADATA +2 -2
  33. cloudpss-4.5.1.dist-info/RECORD +70 -0
  34. cloudpss/dslab/__init__.py +0 -2
  35. cloudpss/dslab/dataManageModel.py +0 -275
  36. cloudpss/dslab/dslab.py +0 -304
  37. cloudpss/dslab/files/__init__.py +0 -2
  38. cloudpss/dslab/files/curveData.py +0 -140229
  39. cloudpss/dslab/files/files.py +0 -27
  40. cloudpss/dslab/financialAnalysisModel.py +0 -137
  41. cloudpss/job/view/IESLabSimulationView.py +0 -5
  42. cloudpss/job/view/__init__.py +0 -42
  43. cloudpss/runner/DSLabResult.py +0 -92
  44. cloudpss-4.1.1b9.dist-info/RECORD +0 -77
  45. {cloudpss-4.1.1b9.dist-info → cloudpss-4.5.1.dist-info}/WHEEL +0 -0
  46. {cloudpss-4.1.1b9.dist-info → cloudpss-4.5.1.dist-info}/top_level.txt +0 -0
cloudpss/__init__.py CHANGED
@@ -1,5 +1,5 @@
1
1
  # coding=UTF-8
2
- from cloudpss.ieslab import IESLabSimulation, IESLabPlan
2
+ from cloudpss.ieslab import IESLabSimulation, IESLabPlan, IESLabOpt
3
3
  from .verify import setToken
4
4
  from .runner import Runner, Result, EMTResult, PowerFlowResult
5
5
  from .model import Model, ModelRevision, ModelTopology
@@ -9,11 +9,10 @@ from . import function
9
9
  from .job import Job
10
10
  from .function import FunctionExecution
11
11
  from .version import __version__
12
- from .dslab import DSLab
13
12
  __all__ = [
14
13
  'setToken', 'Model', 'ModelRevision', 'ModelTopology', 'Runner', 'Result',
15
14
  'PowerFlowResult', 'EMTResult', 'MatlabDataEncoder', 'DateTimeEncode',
16
- 'function', 'Project', 'currentJob', 'IESLabSimulation', 'IESLabPlan','__version__','Job','DSLab'
15
+ 'function', 'Project', 'currentJob', 'IESLabSimulation', 'IESLabPlan','IESLabOpt','__version__','Job'
17
16
  ]
18
17
 
19
18
 
@@ -72,13 +72,13 @@ class Job(JobBase):
72
72
  variables = {"input": {"id": id, "timeout": timeout}}
73
73
  await graphql_request(query, variables)
74
74
 
75
- async def view(self, viewType:F)->F:
75
+ async def result(self, resultType:F)->F:
76
76
  """
77
77
  获取当前运行实例的输出
78
78
  """
79
79
  receiver = await self.read()
80
80
  sender = await self.write()
81
- self._result= viewType(receiver, sender)
81
+ self._result= resultType(receiver, sender)
82
82
  return self._result
83
83
 
84
84
  async def write(self, sender=None, dev=False, **kwargs) -> MessageStreamSender:
@@ -99,6 +99,26 @@ class FunctionExecution(object):
99
99
  self._args = val
100
100
 
101
101
  @staticmethod
102
+ def __listObj2Array(data):
103
+ arr=[]
104
+ for item in data:
105
+ if type(item) is list:
106
+ arr.append(FunctionExecution.__listObj2Array(item))
107
+ elif type(item) is dict and ('ɵid' in item or '?id' in item ):
108
+ a = list(range(len(item)-1))
109
+ for k, v in item.items():
110
+ if k == 'ɵid' or k == '?id':
111
+ continue
112
+ k = int(k)
113
+ if type(v) is list:
114
+ a[k] = FunctionExecution.__listObj2Array(v)
115
+ else:
116
+ a[k] = v
117
+ arr.append(a)
118
+ else:
119
+ arr.append(item)
120
+ return arr
121
+ @staticmethod
102
122
  def __loadArgs():
103
123
  """加载当前任务参数
104
124
 
@@ -110,9 +130,12 @@ class FunctionExecution(object):
110
130
  if k.startswith('CLOUDPSS_JOB_ARG-'):
111
131
  s = k.split('-')
112
132
  key = bytes.decode(bytes.fromhex(s[1]))
113
- # print(key, v, flush=True)
114
-
115
- args[key] = json.loads(v)
133
+ data = json.loads(v)
134
+
135
+ if type(data) is list:
136
+ data = FunctionExecution.__listObj2Array(data)
137
+
138
+ args[key] = data
116
139
  return args
117
140
 
118
141
  def feedDog(self):
@@ -83,46 +83,21 @@ class DataManageModel(object):
83
83
 
84
84
  :return: 无
85
85
  '''
86
- try:
87
- r = request('GET',
88
- self._dataManageUrl,
89
- params={
90
- "simulationId": self.simulationId
91
- ,
92
- })
93
- data = json.loads(r.text)
94
- info = data['info']
95
- for kind,value in info.items():
96
- if kind =='Weather':
97
- continue
98
-
99
- for k,data in value.items():
100
- self._kindItemDataMap[k]=value
101
- for val in data:
102
- self._itemDataMap[str(val['timeid'])]=val
103
- self._itemDataMap[str(val['id'])]=val
104
- self._kindIdMap[str(val['timeid'])]=k
105
- self._kindIdMap[str(val['id'])]=k
106
- except Exception as e:
107
- print('获取数据失败',e)
108
- pass
109
-
110
- # list = ['thermalLoads', 'electricLoads', 'fuels', 'typhoon', 'rainfall', 'earthquake', 'extremeCold']
111
- # for kind,value in self._kindUrlMap.items():
112
- # try:
113
-
114
- # if kind in list:
115
- # dataList = self._fetchItemData(self._kindUrlMap[kind], None)
116
- # else:
117
- # dataList = self._fetchItemData(self._kindUrlMap[kind], kind)
118
- # except Exception as e:
119
- # pass
120
- # self._kindItemDataMap[kind]=dataList
121
- # for val in dataList:
122
- # self._itemDataMap[str(val['timeid'])]=val
123
- # self._itemDataMap[str(val['id'])]=val
124
- # self._kindIdMap[str(val['timeid'])]=kind
125
- # self._kindIdMap[str(val['id'])]=kind
86
+ list = ['thermalLoads', 'heatingLoad', 'coolingLoad', 'electricLoads', 'fuels', 'typhoon', 'rainfall', 'earthquake', 'extremeCold', 'HydrogenLoad']
87
+ for kind,value in self._kindUrlMap.items():
88
+ try:
89
+ if kind in list:
90
+ dataList = self._fetchItemData(self._kindUrlMap[kind], None)
91
+ else:
92
+ dataList = self._fetchItemData(self._kindUrlMap[kind], kind)
93
+ except Exception as e:
94
+ pass
95
+ self._kindItemDataMap[kind]=dataList
96
+ for val in dataList:
97
+ self._itemDataMap[str(val['timeid'])]=val
98
+ self._itemDataMap[str(val['id'])]=val
99
+ self._kindIdMap[str(val['timeid'])]=kind
100
+ self._kindIdMap[str(val['id'])]=kind
126
101
 
127
102
  def GetDataItem(self, ID: str):
128
103
  '''
@@ -132,6 +107,7 @@ class DataManageModel(object):
132
107
 
133
108
  :return: dict类型,为源数据的引用,返回该数据项的信息
134
109
  '''
110
+
135
111
  data = self._itemDataMap.get(str(ID),None)
136
112
 
137
113
  assert (data is not None), "找不到数据"
@@ -175,7 +151,7 @@ class DataManageModel(object):
175
151
  self._kindIdMap[str(data['id'])]=kind
176
152
  self._itemDataMap[str(data['timeid'])]=data
177
153
  self._itemDataMap[str(data['id'])]=data
178
- if kind in ['thermalLoads', 'electricLoads', 'fuels']:
154
+ if kind in ['thermalLoads', 'heatingLoad','coolingLoad', 'electricLoads', 'fuels']:
179
155
  dataList = self._fetchItemData(self._kindUrlMap[kind], None)
180
156
  self._kindItemDataMap[kind] = dataList
181
157
  return dataList[-1]['id']
@@ -362,7 +338,7 @@ class IESSimulationDataManageModel(DataManageModel):
362
338
  "台风灾害": "typhoon",
363
339
  "降雨灾害": "rainfall",
364
340
  "地震灾害": "earthquake",
365
- "极寒灾害": "extremeCold"
341
+ "极寒灾害": "extremeCold",
366
342
  }
367
343
  _kindUrlMap = {
368
344
  "PhotovoltaicSys": "api/ieslab-simulation/rest/dpcs/",
@@ -392,7 +368,7 @@ class IESSimulationDataManageModel(DataManageModel):
392
368
  "typhoon": "api/ieslab-simulation/rest/typhoon/",
393
369
  "rainfall": "api/ieslab-simulation/rest/rainfall/",
394
370
  "earthquake": "api/ieslab-simulation/rest/earthquake/",
395
- "extremeCold": "api/ieslab-simulation/rest/extremeCold/"
371
+ "extremeCold": "api/ieslab-simulation/rest/extremeCold/",
396
372
  }
397
373
  pass
398
374
 
@@ -412,6 +388,7 @@ class IESPlanDataManageModel(DataManageModel):
412
388
  "吸收式制冷机": "AbsorptionChiller",
413
389
  "蓄电池": "Battery",
414
390
  "储水罐": "WaterTank",
391
+ "蓄冰空调": "IceStorageAC",
415
392
  "变压器": "Transformer",
416
393
  "传输线": "TransferLine",
417
394
  "模块化多电平变流器": "MMC",
@@ -429,7 +406,8 @@ class IESPlanDataManageModel(DataManageModel):
429
406
  "台风灾害": "typhoon",
430
407
  "降雨灾害": "rainfall",
431
408
  "地震灾害": "earthquake",
432
- "极寒灾害": "extremeCold"
409
+ "极寒灾害": "extremeCold",
410
+ "换热器": "HeatExchanger",
433
411
  }
434
412
  _kindUrlMap = {
435
413
  "PhotovoltaicSys": "api/ieslab-plan/rest/dpcs/",
@@ -438,10 +416,11 @@ class IESPlanDataManageModel(DataManageModel):
438
416
  "HeatPump": "api/ieslab-plan/rest/dhscs/",
439
417
  "GasBoiler": "api/ieslab-plan/rest/dhscs/",
440
418
  "HPSolarCollector": "api/ieslab-plan/rest/dhscs/",
441
- "CompRefrg": "api/ieslab-plan/rest/dhscs/",
419
+ "CompRefrg": "api/ieslab-simulation/rest/dhscs/",
442
420
  "AbsorptionChiller": "api/ieslab-plan/rest/dhscs/",
443
421
  "Battery": "api/ieslab-plan/rest/escs/",
444
422
  "WaterTank": "api/ieslab-plan/rest/escs/",
423
+ "IceStorageAC": "api/ieslab-plan/rest/escs/",
445
424
  "Transformer": "api/ieslab-plan/rest/dstcs/",
446
425
  "TransferLine": "api/ieslab-plan/rest/dstcs/",
447
426
  "MMC": "api/ieslab-plan/rest/dstcs/",
@@ -459,6 +438,100 @@ class IESPlanDataManageModel(DataManageModel):
459
438
  "typhoon": "api/ieslab-plan/rest/typhoon/",
460
439
  "rainfall": "api/ieslab-plan/rest/rainfall/",
461
440
  "earthquake": "api/ieslab-plan/rest/earthquake/",
462
- "extremeCold": "api/ieslab-plan/rest/extremeCold/"
441
+ "extremeCold": "api/ieslab-plan/rest/extremeCold/",
442
+ "HeatExchanger": "api/ieslab-plan/rest/hstcs/",
443
+ }
444
+ pass
445
+
446
+ class IESOptDataManageModel(DataManageModel):
447
+ _baseUri = 'api/ieslab-opt/'
448
+ _weatherUrl = 'api/ieslab-opt/rest/weather_data/'
449
+ _kindNameMap = {
450
+ "光伏": "PhotovoltaicSys",
451
+ "风机": "WindPowerGenerator",
452
+ "燃料发电机组": "GasTurbine",
453
+ "空气源热泵": "HeatPump",
454
+ "燃气锅炉": "GasBoiler",
455
+ "太阳能集热器": "HPSolarCollector",
456
+ "单工况制冷机": "SingleConChiller",
457
+ "双工况制冷机": "DualConChiller",
458
+ "吸收式制冷机": "AbsorptionChiller",
459
+ "蓄电池": "Battery",
460
+ "蓄冰槽": "IceStorageAC",
461
+ "变压器": "Transformer",
462
+ "传输线": "TransferLine",
463
+ "模块化多电平变流器": "MMC",
464
+ "离心泵": "CentrifugalPump",
465
+ "管道": "Pipe",
466
+ "热负荷": "heatingLoad",
467
+ "冷负荷": "coolingLoad",
468
+ "电负荷": "electricLoads",
469
+ "燃料": "fuels",
470
+ "热": "HVACHeating",
471
+ "冷": "HVACCooling",
472
+ "常数电价": "常数电价",
473
+ "分时电价": "分时电价",
474
+ "阶梯电价": "阶梯电价",
475
+ "分时阶梯电价": "分时阶梯电价",
476
+ "台风灾害": "typhoon",
477
+ "降雨灾害": "rainfall",
478
+ "地震灾害": "earthquake",
479
+ "极寒灾害": "extremeCold",
480
+ "PEM燃料电池": "PEMF",
481
+ "SOFC": "SOFC",
482
+ "碱性电解槽": "ALK",
483
+ "PEM电解槽": "PEME",
484
+ "SOEC": "SOEC",
485
+ "储氢罐": "HydrogenTank",
486
+ "储热罐": "HeatStoTank",
487
+ "换热器": "HeatExchanger",
488
+ "氢气压缩设备": "HydrogenCompression",
489
+ "氢负荷": "HydrogenLoad",
490
+ "氢": "HydrogenProductionFuels",
491
+ "运氢槽车": "HydrogenTanker"
492
+ }
493
+ _kindUrlMap = {
494
+ "PhotovoltaicSys": "api/ieslab-opt/rest/dpcs/",
495
+ "WindPowerGenerator": "api/ieslab-opt/rest/dpcs/",
496
+ "GasTurbine": "api/ieslab-opt/rest/dpcs/",
497
+ "HeatPump": "api/ieslab-opt/rest/dhscs/",
498
+ "GasBoiler": "api/ieslab-opt/rest/dhscs/",
499
+ "HPSolarCollector": "api/ieslab-opt/rest/dhscs/",
500
+ "SingleConChiller": "api/ieslab-opt/rest/dhscs/",
501
+ "DualConChiller": "api/ieslab-opt/rest/dhscs/",
502
+ "AbsorptionChiller": "api/ieslab-opt/rest/dhscs/",
503
+ "Battery": "api/ieslab-opt/rest/escs/",
504
+ "IceStorageAC": "api/ieslab-opt/rest/escs/",
505
+ "Transformer": "api/ieslab-opt/rest/dstcs/",
506
+ "TransferLine": "api/ieslab-opt/rest/dstcs/",
507
+ "MMC": "api/ieslab-opt/rest/dstcs/",
508
+ "CentrifugalPump": "api/ieslab-opt/rest/hstcs/",
509
+ "Pipe": "api/ieslab-opt/rest/hstcs/",
510
+ "heatingLoad": "api/ieslab-opt/rest/heatingLoad/",
511
+ "coolingLoad": "api/ieslab-opt/rest/coolingLoad/",
512
+ "electricLoads": "api/ieslab-opt/rest/electricLoads/",
513
+ "fuels": "api/ieslab-opt/rest/fuels/",
514
+ "HVACHeating": "api/ieslab-opt/rest/hots/",
515
+ "HVACCooling": "api/ieslab-opt/rest/colds/",
516
+ "常数电价": "api/ieslab-opt/rest/elects/",
517
+ "分时电价": "api/ieslab-opt/rest/elects/",
518
+ "阶梯电价": "api/ieslab-opt/rest/elects/",
519
+ "分时阶梯电价": "api/ieslab-opt/rest/elects/",
520
+ "typhoon": "api/ieslab-opt/rest/typhoon/",
521
+ "rainfall": "api/ieslab-opt/rest/rainfall/",
522
+ "earthquake": "api/ieslab-opt/rest/earthquake/",
523
+ "extremeCold": "api/ieslab-opt/rest/extremeCold/",
524
+ "HydrogenTank": "api/ieslab-opt/rest/escs/",
525
+ "HeatStoTank": "api/ieslab-opt/rest/escs/",
526
+ "HeatExchanger": "api/ieslab-opt/rest/hstcs/",
527
+ "HydrogenCompression": "api/ieslab-opt/rest/hsec/",
528
+ "HydrogenLoad": "api/ieslab-opt/rest/hydrogenLoad/",
529
+ "HydrogenProductionFuels": "api/ieslab-opt/rest/hydrogen/",
530
+ "HydrogenTanker": "api/ieslab-opt/rest/hydrogen/",
531
+ "PEMF": "api/ieslab-opt/rest/dhscs/",
532
+ "SOFC": "api/ieslab-opt/rest/dhscs/",
533
+ "ALK": "api/ieslab-opt/rest/hpc/",
534
+ "PEME": "api/ieslab-opt/rest/hpc/",
535
+ "SOEC": "api/ieslab-opt/rest/hpc/",
463
536
  }
464
537
  pass
@@ -1,13 +1,14 @@
1
1
  import time
2
- from cloudpss.runner.runner import HttpRunner, Runner
3
- from cloudpss.runner.IESLabEvaluationResult import IESLabEvaluationResult
2
+ from cloudpss.runner.runner import HttpRunner, Runner, HttpOPTRunner
3
+ from cloudpss.runner.IESLabEvaluationResult import IESLabPlanEvaluationResult, IESLabOptEvaluationResult
4
4
  from ..utils import request
5
5
  import json
6
6
  from enum import IntEnum, unique
7
7
 
8
8
  class IESLabEvaluationModel(object):
9
- _baseUri = 'api/ieslab-plan/rest/'
10
- _taskUri = 'api/ieslab-plan/taskmanager/getSimuLastTasks'
9
+ _baseUri = ''
10
+ _taskUri = ''
11
+ _runUri = ''
11
12
  _kindNameMap = {
12
13
  "投资组成": "investmentbanchandproportion",
13
14
  "资金来源": "capitalsource",
@@ -123,16 +124,16 @@ class IESLabEvaluationModel(object):
123
124
  dict_result[v] = list['results']
124
125
  return dict_result
125
126
 
126
- def run(self, planID, type=None) -> Runner[IESLabEvaluationResult]:
127
+ def run(self, planID, type=None) -> HttpRunner[IESLabPlanEvaluationResult]:
127
128
  '''
128
129
  运行方案评估
129
130
 
130
131
  :param planID int类型,表示优化方案的ID,数值位于0~优化方案数量之间
131
132
  :params type: string类型,任务类型:环保评价/能效评价
132
133
 
133
- :return: Runner[IESLabEvaluationResult]
134
+ :return: Runner[IESLabPlanEvaluationResult]
134
135
  '''
135
- url = 'api/ieslab-plan/taskmanager/saveDataToclickhouse'
136
+ url = self._runUri
136
137
  CMD_TYPE = type if type is None else self._evaluationType[type]
137
138
  try:
138
139
  timeId = int(time.time() * 1000)
@@ -172,7 +173,7 @@ class IESLabEvaluationModel(object):
172
173
  '''
173
174
  return self.run(planID, 'energyEvaluation')
174
175
 
175
- def GetRunner(self, planID) -> Runner[IESLabEvaluationResult]:
176
+ def GetRunner(self, planID) -> Runner[IESLabPlanEvaluationResult]:
176
177
  '''
177
178
  获得运行实例
178
179
 
@@ -186,4 +187,74 @@ class IESLabEvaluationModel(object):
186
187
  @unique
187
188
  class OptimizationMode(IntEnum):
188
189
  经济性 = 0
189
- 环保性 = 1
190
+ 环保性 = 1
191
+
192
+
193
+ class IESLabPlanEvaluationModel(IESLabEvaluationModel):
194
+ _baseUri = 'api/ieslab-plan/rest/'
195
+ _taskUri = 'api/ieslab-plan/taskmanager/getSimuLastTasks'
196
+ _runUri = 'api/ieslab-plan/taskmanager/saveDataToclickhouse'
197
+
198
+ def run(self, planID, type=None) -> HttpRunner[IESLabPlanEvaluationResult]:
199
+ '''
200
+ 运行方案评估
201
+
202
+ :param planID int类型,表示优化方案的ID,数值位于0~优化方案数量之间
203
+ :params type: string类型,任务类型:环保评价/能效评价
204
+
205
+ :return: HttpRunner[IESLabEvaluationResult]
206
+ '''
207
+ url = self._runUri
208
+ CMD_TYPE = type if type is None else self._evaluationType[type]
209
+ try:
210
+ timeId = int(time.time() * 1000)
211
+ r = request('GET',
212
+ url,
213
+ params={
214
+ "simuid": self.simulationId,
215
+ "planId": planID,
216
+ "CMD_TYPE": CMD_TYPE
217
+ })
218
+ data = json.loads(r.text)
219
+ return HttpRunner({'rid': 'function/ieslab/evaluation'},
220
+ self.simulationId,
221
+ timeId=timeId,
222
+ planId=planID,
223
+ cmdType=CMD_TYPE)
224
+ except:
225
+ raise Exception('方案评估开始计算失败')
226
+
227
+
228
+ class IESLabOptEvaluationModel(IESLabEvaluationModel):
229
+ _baseUri = 'api/ieslab-opt/rest/'
230
+ _taskUri = 'api/ieslab-opt/taskmanager/getSimuLastTasks'
231
+ _runUri = 'api/ieslab-opt/taskmanager/saveDataToclickhouse'
232
+
233
+ def run(self, planID, type=None) -> HttpOPTRunner[IESLabOptEvaluationResult]:
234
+ '''
235
+ 运行方案评估
236
+
237
+ :param planID int类型,表示优化方案的ID,数值位于0~优化方案数量之间
238
+ :params type: string类型,任务类型:环保评价/能效评价
239
+
240
+ :return: HttpRunner[IESLabEvaluationResult]
241
+ '''
242
+ url = self._runUri
243
+ CMD_TYPE = type if type is None else self._evaluationType[type]
244
+ try:
245
+ timeId = int(time.time() * 1000)
246
+ r = request('GET',
247
+ url,
248
+ params={
249
+ "simuid": self.simulationId,
250
+ "planId": planID,
251
+ "CMD_TYPE": CMD_TYPE
252
+ })
253
+ data = json.loads(r.text)
254
+ return HttpOPTRunner({'rid': 'function/ieslab/evaluation'},
255
+ self.simulationId,
256
+ timeId=timeId,
257
+ planId=planID,
258
+ cmdType=CMD_TYPE)
259
+ except:
260
+ raise Exception('方案评估开始计算失败')
@@ -0,0 +1,235 @@
1
+ import json
2
+
3
+ from cloudpss.ieslab.DataManageModel import IESOptDataManageModel
4
+ from cloudpss.ieslab.EvaluationModel import IESLabOptEvaluationModel
5
+ from cloudpss.ieslab.PlanModel import IESLabOptModel
6
+ from cloudpss.runner.IESLabTypicalDayResult import IESLabTypicalDayResult
7
+ from ..utils import request
8
+ from ..model.model import Model
9
+ from cloudpss.runner.runner import Runner
10
+ from cloudpss.runner.IESLabPlanResult import IESLabOptResult
11
+ from cloudpss.runner.IESLabEvaluationResult import IESLabOptEvaluationResult
12
+
13
+ class IESLabOpt(object):
14
+ def __init__(self, project={}):
15
+ '''
16
+ 初始化
17
+ '''
18
+ self.id = project.get('id', None)
19
+ self.name = project.get('name', None)
20
+ self.__modelRid = project.get('model', None)
21
+ self.project_group = project.get('project_group', None)
22
+ self.start_date = project.get('start_date', None)
23
+ self.end_date = project.get('end_date', None)
24
+ if self.__modelRid is not None:
25
+ self.model = Model.fetch(self.__modelRid)
26
+ self.dataManageModel = IESOptDataManageModel(self.id)
27
+ self.planModel = IESLabOptModel(self.id, self.model.rid)
28
+ self.evaluationModel = IESLabOptEvaluationModel(self.id)
29
+ self.currentPlanResult = IESLabOptResult(self.id)
30
+ self.currentEvaluationResult = IESLabOptEvaluationResult(self.id)
31
+
32
+ @staticmethod
33
+ def fetch(simulationId):
34
+ '''
35
+ 获取算例信息
36
+
37
+ :params: simulationId string类型,代表数据项的算例id
38
+
39
+ :return: IESLabOpt
40
+ '''
41
+ try:
42
+ r = request('GET',
43
+ 'api/ieslab-opt/rest/simu/{0}/'.format(simulationId))
44
+ project = json.loads(r.text)
45
+ return IESLabOpt(project)
46
+ except:
47
+ raise Exception('未查询到当前算例')
48
+
49
+ def __run(self, job=None, name=None):
50
+ '''
51
+ 调用仿真
52
+
53
+ :params job: 调用仿真时使用的计算方案,不指定将使用算例保存时选中的计算方案
54
+ :params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
55
+
56
+ :return: 返回一个运行实例
57
+ '''
58
+ if job is None:
59
+ currentJob = self.model.context['currentJob']
60
+ job = self.model.jobs[currentJob]
61
+ job['args']['simulationId'] = self.id
62
+ return self.model.run(job, name=name)
63
+
64
+ def iesLabTypicalDayRun(self, job=None, name=None, **kwargs)->Runner[IESLabTypicalDayResult]:
65
+ '''
66
+ 运行典型日计算
67
+
68
+ :params job: 调用仿真时使用的计算方案,不指定将使用算例保存时选中的计算方案
69
+ :params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
70
+
71
+ :return: Runner[IESLabTypicalDayResult]
72
+ '''
73
+ if job is None:
74
+ currentJob = self.model.context['currentJob']
75
+ job = self.model.jobs[currentJob]
76
+ if job['rid'] != 'function/CloudPSS/ieslab-gmm-opt':
77
+ for j in self.model.jobs:
78
+ if j['rid'] == 'job-definition/ies/ies-gmm-opt' or j['rid'] == 'job-definition/cloudpss/ieslab-gmm-opt':
79
+ j['rid'] = 'function/CloudPSS/ieslab-gmm-opt'
80
+ job = j
81
+ if job is None:
82
+ raise Exception("找不到默认的综合能源系统规划典型日生成算法的计算方案")
83
+ if job['rid'] != 'function/CloudPSS/ieslab-gmm-opt':
84
+ raise Exception("不是综合能源系统规划典型日生成算法的计算方案")
85
+ return self.__run(job=job, name=name)
86
+
87
+ def iesLabEvaluationRun(self, planId, type=None):
88
+ '''
89
+ 运行方案评估
90
+
91
+ :param planID int类型,表示优化方案的ID,数值位于0~优化方案数量之间
92
+ :param type string类型,表示评估类型,可选值为:能效评价、环保评价
93
+
94
+ :return: 方案评估运行实例
95
+
96
+ '''
97
+ return self.evaluationModel.run(planId, type)
98
+
99
+ def iesLabEnergyEvaluationRun(self, planId):
100
+ '''
101
+ 运行能效评价
102
+
103
+ :param planID int类型,表示优化方案的ID,数值位于0~优化方案数量之间
104
+
105
+ :return: 能效评价运行实例
106
+
107
+ '''
108
+ return self.evaluationModel.EnergyEvaluationRun(planId)
109
+
110
+ def iesLabEnvironmentalEvaluationRun(self, planId):
111
+ '''
112
+ 运行环保评价
113
+
114
+ :param planID int类型,表示优化方案的ID,数值位于0~优化方案数量之间
115
+
116
+ :return: 环保评价运行实例
117
+ '''
118
+ return self.evaluationModel.EnvironmentalEvaluationRun(planId)
119
+
120
+ def iesLabOptRun(self):
121
+ '''
122
+ 生成方案优选算例
123
+
124
+ :return: 方案优选运行实例
125
+ '''
126
+ return self.planModel.run()
127
+
128
+ def iesLabOptKill(self):
129
+ '''
130
+ 停止并删除方案优选算例
131
+
132
+ :return: Boolean
133
+ '''
134
+ return self.planModel.kill()
135
+
136
+ def createProjectGroup(self, name):
137
+ '''
138
+ 创建项目组
139
+
140
+ :params name: 项目组名称
141
+
142
+ :return: 返回一个创建的项目组
143
+ '''
144
+
145
+ @staticmethod
146
+ def createProjectGroup(group_name, desc=None, createById=None):
147
+ '''
148
+ 创建项目组
149
+
150
+ :params group_name: String 项目组名称
151
+ :params desc: String 项目组描述 可选参数
152
+ :params createById Int 父项目组id 可选参数,如果是从已有项目组导入的项目组,必填此项
153
+
154
+ :return: Int 返回创建的项目组id
155
+ '''
156
+ try:
157
+ if createById is None:
158
+ isImport = 0
159
+ else:
160
+ isImport = 1
161
+ payload = {
162
+ 'group_name': group_name,
163
+ 'desc': desc,
164
+ 'isImport': isImport,
165
+ 'createById': createById,
166
+ }
167
+ r = request(
168
+ 'POST', 'api/ieslab-opt/rest/projectgroup/', data=json.dumps(payload))
169
+ project = json.loads(r.text)
170
+ return project.get('id', None)
171
+ except Exception as e:
172
+ raise Exception('创建项目组失败')
173
+
174
+ @staticmethod
175
+ def createProject(name, project_group, start_date, end_date, construction_cycle, desc=None, createById=None):
176
+ '''
177
+ 创建项目
178
+
179
+ :params name: String 项目名称
180
+ :params project_group: Int 父项目组id
181
+ :param start_date: Int 项目开始年限,范围在[1500,3000]之间
182
+ :param end_date: Int 项目结束年限,范围在项目开始时间之后且不超过五十年
183
+ :param construction_cycle: Int 项目建设周期(年), 必须小于等于 项目结束年限 - 项目开始年限
184
+ :params desc: String 项目描述, 可选参数
185
+ :params createById Int 父项目id, 可选参数, 如果是从已有项目导入的项目,必填此项
186
+
187
+ :return: Int 返回创建的项目id
188
+ '''
189
+ try:
190
+ if start_date < 1500 or start_date > 3000:
191
+ raise Exception('项目开始年限错误,范围在[1500,3000]之间')
192
+ if end_date < start_date or end_date > start_date + 50:
193
+ raise Exception('项目结束年限错误,范围在项目开始时间之后且不超过五十年')
194
+ if construction_cycle > end_date - start_date:
195
+ raise Exception('项目建设周期错误,必须小于等于 项目结束年限 - 项目开始年限')
196
+ if createById is None:
197
+ payload = {
198
+ 'name': name,
199
+ 'project_group': project_group,
200
+ 'start_date': start_date,
201
+ 'end_date': end_date,
202
+ 'construction_cycle': construction_cycle,
203
+ 'desc': desc
204
+ }
205
+ else:
206
+ payload = {
207
+ 'name': name,
208
+ 'project_group': project_group,
209
+ 'start_date': start_date,
210
+ 'end_date': end_date,
211
+ 'construction_cycle': construction_cycle,
212
+ 'desc': desc,
213
+ 'createById': createById
214
+ }
215
+ r = request(
216
+ 'POST', 'api/ieslab-opt/rest/simu/', data=json.dumps(payload))
217
+ project = json.loads(r.text)
218
+ return project.get('id', None)
219
+ except Exception as e:
220
+ raise Exception('创建项目失败')
221
+
222
+
223
+ @staticmethod
224
+ def getProjectList():
225
+ '''
226
+ 获取项目组列表
227
+
228
+ :return: 返回项目组列表
229
+ '''
230
+ try:
231
+ r = request('GET', 'api/ieslab-opt/rest/projectgroup/?mode=simu')
232
+ project = json.loads(r.text)
233
+ return project
234
+ except Exception as e:
235
+ raise Exception('获取项目组列表失败')