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/ieslab/IESLabPlan.py
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
import json
|
2
2
|
|
3
3
|
from cloudpss.ieslab.DataManageModel import IESPlanDataManageModel
|
4
|
-
from cloudpss.ieslab.EvaluationModel import
|
4
|
+
from cloudpss.ieslab.EvaluationModel import IESLabPlanEvaluationModel
|
5
5
|
from cloudpss.ieslab.PlanModel import IESLabPlanModel
|
6
6
|
from cloudpss.runner.IESLabTypicalDayResult import IESLabTypicalDayResult
|
7
7
|
from ..utils import request
|
8
8
|
from ..model.model import Model
|
9
9
|
from cloudpss.runner.runner import Runner
|
10
10
|
from cloudpss.runner.IESLabPlanResult import IESLabPlanResult
|
11
|
-
from cloudpss.runner.IESLabEvaluationResult import
|
11
|
+
from cloudpss.runner.IESLabEvaluationResult import IESLabPlanEvaluationResult
|
12
12
|
|
13
13
|
class IESLabPlan(object):
|
14
14
|
def __init__(self, project={}):
|
@@ -23,9 +23,9 @@ class IESLabPlan(object):
|
|
23
23
|
self.model = Model.fetch(self.__modelRid)
|
24
24
|
self.dataManageModel = IESPlanDataManageModel(self.id)
|
25
25
|
self.planModel = IESLabPlanModel(self.id)
|
26
|
-
self.evaluationModel =
|
26
|
+
self.evaluationModel = IESLabPlanEvaluationModel(self.id)
|
27
27
|
self.currentPlanResult = IESLabPlanResult(self.id)
|
28
|
-
self.currentEvaluationResult =
|
28
|
+
self.currentEvaluationResult = IESLabPlanEvaluationResult(self.id)
|
29
29
|
|
30
30
|
@staticmethod
|
31
31
|
def fetch(simulationId):
|
@@ -130,3 +130,81 @@ class IESLabPlan(object):
|
|
130
130
|
:return: Boolean
|
131
131
|
'''
|
132
132
|
return self.planModel.kill()
|
133
|
+
|
134
|
+
@staticmethod
|
135
|
+
def createProjectGroup(group_name, desc=None, createById=None):
|
136
|
+
'''
|
137
|
+
创建项目组
|
138
|
+
|
139
|
+
:params group_name: String 项目组名称
|
140
|
+
:params desc: String 项目组描述 可选参数
|
141
|
+
:params createById Int 父项目组id 可选参数,如果是从已有项目组导入的项目组,必填此项
|
142
|
+
|
143
|
+
:return: Int 返回创建的项目组id
|
144
|
+
'''
|
145
|
+
try:
|
146
|
+
if createById is None:
|
147
|
+
isImport = 0
|
148
|
+
else:
|
149
|
+
isImport = 1
|
150
|
+
payload = {
|
151
|
+
'group_name': group_name,
|
152
|
+
'desc': desc,
|
153
|
+
'isImport': isImport,
|
154
|
+
'createById': createById,
|
155
|
+
}
|
156
|
+
r = request(
|
157
|
+
'POST', 'api/ieslab-plan/rest/projectgroup/', data=json.dumps(payload))
|
158
|
+
project = json.loads(r.text)
|
159
|
+
return project.get('id', None)
|
160
|
+
except Exception as e:
|
161
|
+
raise Exception('创建项目组失败')
|
162
|
+
|
163
|
+
@staticmethod
|
164
|
+
def createProject(name, project_group, start_date, end_date, construction_cycle, desc=None, createById=None):
|
165
|
+
'''
|
166
|
+
创建项目
|
167
|
+
|
168
|
+
:params name: String 项目名称
|
169
|
+
:params project_group: Int 父项目组id
|
170
|
+
:param start_date: Int 项目开始年限,范围在[1500,3000]之间
|
171
|
+
:param end_date: Int 项目结束年限,范围在项目开始时间之后且不超过五十年
|
172
|
+
:param construction_cycle: Int 项目建设周期(年), 必须小于等于 项目结束年限 - 项目开始年限
|
173
|
+
:params desc: String 项目描述, 可选参数
|
174
|
+
:params createById Int 父项目id, 可选参数, 如果是从已有项目导入的项目,必填此项
|
175
|
+
|
176
|
+
:return: Int 返回创建的项目id
|
177
|
+
'''
|
178
|
+
try:
|
179
|
+
if start_date < 1500 or start_date > 3000:
|
180
|
+
raise Exception('项目开始年限错误,范围在[1500,3000]之间')
|
181
|
+
if end_date < start_date or end_date > start_date + 50:
|
182
|
+
raise Exception('项目结束年限错误,范围在项目开始时间之后且不超过五十年')
|
183
|
+
if construction_cycle > end_date - start_date:
|
184
|
+
raise Exception('项目建设周期错误,必须小于等于 项目结束年限 - 项目开始年限')
|
185
|
+
if createById is None:
|
186
|
+
payload = {
|
187
|
+
'name': name,
|
188
|
+
'project_group': project_group,
|
189
|
+
'start_date': start_date,
|
190
|
+
'end_date': end_date,
|
191
|
+
'construction_cycle': construction_cycle,
|
192
|
+
'desc': desc
|
193
|
+
}
|
194
|
+
else:
|
195
|
+
payload = {
|
196
|
+
'name': name,
|
197
|
+
'project_group': project_group,
|
198
|
+
'start_date': start_date,
|
199
|
+
'end_date': end_date,
|
200
|
+
'construction_cycle': construction_cycle,
|
201
|
+
'desc': desc,
|
202
|
+
'createById': createById
|
203
|
+
}
|
204
|
+
r = request(
|
205
|
+
'POST', 'api/ieslab-plan/rest/simu/', data=json.dumps(payload))
|
206
|
+
project = json.loads(r.text)
|
207
|
+
return project.get('id', None)
|
208
|
+
except Exception as e:
|
209
|
+
raise Exception('创建项目失败')
|
210
|
+
|
@@ -5,7 +5,7 @@ from .DataManageModel import IESSimulationDataManageModel
|
|
5
5
|
|
6
6
|
|
7
7
|
class IESLabSimulation(object):
|
8
|
-
def __init__(self, project={},model=None):
|
8
|
+
def __init__(self, project={},model:Model=None):
|
9
9
|
'''
|
10
10
|
初始化
|
11
11
|
'''
|
@@ -36,26 +36,7 @@ class IESLabSimulation(object):
|
|
36
36
|
return IESLabSimulation(project,model)
|
37
37
|
except:
|
38
38
|
raise Exception('未查询到当前算例')
|
39
|
-
|
40
|
-
async def fetchAsync(simulationId):
|
41
|
-
'''
|
42
|
-
获取算例信息
|
43
|
-
|
44
|
-
:params: simulationId string类型,代表数据项的算例id
|
45
|
-
|
46
|
-
:return: IESLabSimulation
|
47
|
-
'''
|
48
|
-
try:
|
49
|
-
r = request(
|
50
|
-
'GET', 'api/ieslab-simulation/rest/simu/{0}/'.format(simulationId))
|
51
|
-
project = json.loads(r.text)
|
52
|
-
modelRid = project.get('model', None)
|
53
|
-
model=None
|
54
|
-
if modelRid is not None:
|
55
|
-
model =await Model.fetchAsync(modelRid)
|
56
|
-
return IESLabSimulation(project,model)
|
57
|
-
except:
|
58
|
-
raise Exception('未查询到当前算例')
|
39
|
+
|
59
40
|
def run(self, job=None, name=None):
|
60
41
|
'''
|
61
42
|
调用仿真
|
@@ -71,19 +52,65 @@ class IESLabSimulation(object):
|
|
71
52
|
|
72
53
|
job['args']['simulationId'] = self.id
|
73
54
|
return self.model.run(job, name=name)
|
74
|
-
|
75
|
-
|
55
|
+
|
56
|
+
@staticmethod
|
57
|
+
def createProjectGroup(group_name, desc=None, createById=None):
|
76
58
|
'''
|
77
|
-
|
59
|
+
创建项目组
|
78
60
|
|
79
|
-
:params
|
80
|
-
:params
|
61
|
+
:params group_name: String 项目组名称
|
62
|
+
:params desc: String 项目组描述 可选参数
|
63
|
+
:params createById Int 父项目组id 可选参数,如果是从已有项目组导入的项目组,必填此项
|
81
64
|
|
82
|
-
:return:
|
65
|
+
:return: Int 返回创建的项目组id
|
83
66
|
'''
|
84
|
-
|
85
|
-
|
86
|
-
|
67
|
+
try:
|
68
|
+
if createById is None:
|
69
|
+
isImport = 0
|
70
|
+
else:
|
71
|
+
isImport = 1
|
72
|
+
payload = {
|
73
|
+
'group_name': group_name,
|
74
|
+
'desc': desc,
|
75
|
+
'isImport': isImport,
|
76
|
+
'createById': createById,
|
77
|
+
}
|
78
|
+
r = request(
|
79
|
+
'POST', 'api/ieslab-simulation/rest/projectgroup/', data=json.dumps(payload))
|
80
|
+
project = json.loads(r.text)
|
81
|
+
return project.get('id', None)
|
82
|
+
except Exception as e:
|
83
|
+
raise Exception('创建项目组失败')
|
87
84
|
|
88
|
-
|
89
|
-
|
85
|
+
@staticmethod
|
86
|
+
def createProject(name, project_group, desc=None, createById=None):
|
87
|
+
'''
|
88
|
+
创建项目
|
89
|
+
|
90
|
+
:params name: String 项目名称
|
91
|
+
:params project_group: Int 父项目组id,
|
92
|
+
:params desc: String 项目描述, 可选参数
|
93
|
+
:params createById Int 父项目id, 可选参数, 如果是从已有项目导入的项目,必填此项
|
94
|
+
|
95
|
+
:return: Int 返回创建的项目id
|
96
|
+
'''
|
97
|
+
try:
|
98
|
+
if createById is None:
|
99
|
+
payload = {
|
100
|
+
'name': name,
|
101
|
+
'project_group': project_group,
|
102
|
+
'desc': desc
|
103
|
+
}
|
104
|
+
else:
|
105
|
+
payload = {
|
106
|
+
'name': name,
|
107
|
+
'project_group': project_group,
|
108
|
+
'desc': desc,
|
109
|
+
'createById': createById
|
110
|
+
}
|
111
|
+
r = request(
|
112
|
+
'POST', 'api/ieslab-simulation/rest/simu/', data=json.dumps(payload))
|
113
|
+
project = json.loads(r.text)
|
114
|
+
return project.get('id', None)
|
115
|
+
except Exception as e:
|
116
|
+
raise Exception('创建项目失败')
|
cloudpss/ieslab/PlanModel.py
CHANGED
@@ -1,12 +1,15 @@
|
|
1
|
-
from cloudpss.runner.IESLabPlanResult import IESLabPlanResult
|
2
|
-
from cloudpss.runner.runner import HttpRunner,
|
1
|
+
from cloudpss.runner.IESLabPlanResult import IESLabPlanResult, IESLabOptResult
|
2
|
+
from cloudpss.runner.runner import HttpRunner, HttpOPTRunner
|
3
|
+
from cloudpss.model import Model
|
4
|
+
from cloudpss.model.revision import ModelRevision
|
3
5
|
from ..utils import request, fileLoad
|
4
6
|
import json
|
5
7
|
from enum import IntEnum, unique
|
6
8
|
|
7
9
|
|
8
10
|
class IESLabPlanModel(object):
|
9
|
-
_baseUri = 'api/ieslab-plan/
|
11
|
+
_baseUri = 'api/ieslab-plan/rest'
|
12
|
+
_runUri = 'api/ieslab-plan/taskmanager'
|
10
13
|
|
11
14
|
def __init__(self, simulationId):
|
12
15
|
'''
|
@@ -14,44 +17,83 @@ class IESLabPlanModel(object):
|
|
14
17
|
'''
|
15
18
|
self.simulationId = simulationId
|
16
19
|
self.optimizationInfo = self.GetOptimizationInfo()
|
17
|
-
self.OptimizationMode = OptimizationMode
|
20
|
+
# self.OptimizationMode = OptimizationMode
|
18
21
|
|
19
|
-
def _fetchItemData(self, url):
|
22
|
+
def _fetchItemData(self, url, params):
|
20
23
|
'''
|
21
24
|
获取当前算例的优化目标设置信息
|
22
25
|
|
23
|
-
:return:
|
26
|
+
:return: List 类型,包括优化目标和全局参数储能动作灵敏度,若没有设置则返回 []
|
24
27
|
'''
|
25
|
-
r = request('GET', url, params=
|
28
|
+
r = request('GET', url, params=params)
|
26
29
|
data = json.loads(r.text)
|
27
|
-
return data
|
30
|
+
return data['results']
|
28
31
|
|
29
32
|
def GetOptimizationInfo(self):
|
30
33
|
'''
|
31
34
|
获取当前算例的优化目标设置信息
|
32
35
|
|
33
|
-
:return:
|
36
|
+
:return: Dict 类型,例如:{'OptimizationMode': <OptimizationMode.经济性: 0>, 'StoSen': 0.1}
|
34
37
|
'''
|
35
38
|
try:
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
39
|
+
url = f'{self._baseUri}/simuOpt/'
|
40
|
+
params = {"simu_id": self.simulationId}
|
41
|
+
r = self._fetchItemData(url, params)
|
42
|
+
if (len(r) == 0):
|
43
|
+
return {
|
44
|
+
"OptimizationMode": OptimizationMode['经济性'],
|
45
|
+
"StoSen": 0.1
|
46
|
+
}
|
47
|
+
else:
|
48
|
+
value = json.loads(r[0]['opt_params'])
|
49
|
+
return {
|
50
|
+
"OptimizationMode": OptimizationMode(value['OptimizationMode']),
|
51
|
+
"StoSen": value['StoSen']
|
52
|
+
}
|
41
53
|
except:
|
42
|
-
|
54
|
+
raise Exception('获得优化目标设置失败')
|
43
55
|
|
44
|
-
def SetOptimizationInfo(self,
|
56
|
+
def SetOptimizationInfo(self, data: dict):
|
45
57
|
'''
|
46
|
-
无对应接口
|
47
58
|
设置当前算例的优化目标
|
48
59
|
|
49
|
-
:param
|
50
|
-
'''
|
51
|
-
self.optimizationInfo = optType
|
52
|
-
return True
|
60
|
+
:param data: dict 类型,例如:{'OptimizationMode': <OptimizationMode.经济性: 0>, 'StoSen': 0.1}
|
53
61
|
|
54
|
-
|
62
|
+
:return: boolean 类型,为 True 则设置成功
|
63
|
+
'''
|
64
|
+
try:
|
65
|
+
url = f'{self._baseUri}/simuOpt/'
|
66
|
+
params = {"simu_id": self.simulationId}
|
67
|
+
r = self._fetchItemData(url, params)
|
68
|
+
opt_params = {
|
69
|
+
"OptimizationMode": data.get('OptimizationMode', '').value,
|
70
|
+
"StoSen": data.get('StoSen', ''),
|
71
|
+
"ProjectPeriod": "20"
|
72
|
+
}
|
73
|
+
if(len(r) == 0):
|
74
|
+
payload = {
|
75
|
+
"simu_id": self.simulationId,
|
76
|
+
"opt_params": json.dumps(opt_params)
|
77
|
+
}
|
78
|
+
r = request('POST',
|
79
|
+
url,
|
80
|
+
data=json.dumps(payload))
|
81
|
+
return True
|
82
|
+
else:
|
83
|
+
url2 = f'{self._baseUri}/simuOpt/{r[0]["id"]}/'
|
84
|
+
payload = {
|
85
|
+
"simu_id": self.simulationId,
|
86
|
+
"opt_params": json.dumps(opt_params),
|
87
|
+
"id": r[0]["id"]
|
88
|
+
}
|
89
|
+
r = request('PUT',
|
90
|
+
url2,
|
91
|
+
data=json.dumps(payload))
|
92
|
+
return True
|
93
|
+
except:
|
94
|
+
return False
|
95
|
+
|
96
|
+
def run(self) -> HttpRunner[IESLabPlanResult]:
|
55
97
|
'''
|
56
98
|
生成方案优选算例
|
57
99
|
|
@@ -61,10 +103,12 @@ class IESLabPlanModel(object):
|
|
61
103
|
if isRunning:
|
62
104
|
raise Exception('该算例正在运行!请从浏览器算例页面点击结束运行或者调用IESPlan对象的kill接口终止计算后重试!')
|
63
105
|
else:
|
64
|
-
url = 'api/
|
65
|
-
|
66
|
-
self.optimizationInfo
|
67
|
-
|
106
|
+
url = f'api/{self._runUri}/runOptimization'
|
107
|
+
opt = {
|
108
|
+
"OptimizationMode": self.optimizationInfo.get('OptimizationMode', 0).value,
|
109
|
+
"ProjectPeriod": "20",
|
110
|
+
"StoSen": self.optimizationInfo.get('StoSen', 0.1)
|
111
|
+
}
|
68
112
|
try:
|
69
113
|
r = request('GET',
|
70
114
|
url,
|
@@ -72,17 +116,14 @@ class IESLabPlanModel(object):
|
|
72
116
|
"simuid":
|
73
117
|
self.simulationId,
|
74
118
|
"optPara":
|
75
|
-
json.dumps(
|
76
|
-
"OptimizationMode": optType,
|
77
|
-
"ProjectPeriod": "20"
|
78
|
-
})
|
119
|
+
json.dumps(opt)
|
79
120
|
})
|
80
121
|
data = json.loads(r.text)
|
81
122
|
return HttpRunner({}, self.simulationId)
|
82
123
|
except:
|
83
124
|
raise Exception('生成方案优选算例失败')
|
84
125
|
|
85
|
-
def GetRunner(self) ->
|
126
|
+
def GetRunner(self) -> HttpRunner[IESLabPlanResult]:
|
86
127
|
'''
|
87
128
|
获得运行实例
|
88
129
|
|
@@ -100,7 +141,7 @@ class IESLabPlanModel(object):
|
|
100
141
|
data = res.get('data', {})
|
101
142
|
if data is not None:
|
102
143
|
taskID = data.get('task_id', '')
|
103
|
-
url = f'
|
144
|
+
url = f'{self._runUri}/removeOptimizationTask'
|
104
145
|
try:
|
105
146
|
r = request('GET',
|
106
147
|
url,
|
@@ -128,7 +169,208 @@ class IESLabPlanModel(object):
|
|
128
169
|
status = data.get('status', '')
|
129
170
|
if status == 'stop':
|
130
171
|
isRunning = False
|
131
|
-
|
172
|
+
try:
|
173
|
+
|
174
|
+
logs = IESLabPlanResult(self.simulationId).GetLogs()
|
175
|
+
if logs is not None:
|
176
|
+
for log in logs:
|
177
|
+
if(log.get('data', '') == 'run ends'):
|
178
|
+
isRunning = False
|
179
|
+
break
|
180
|
+
except:
|
181
|
+
return False
|
182
|
+
return isRunning
|
183
|
+
|
184
|
+
|
185
|
+
|
186
|
+
class IESLabOptModel(object):
|
187
|
+
_baseUri = 'api/ieslab-opt/rest'
|
188
|
+
_runUri = 'api/ieslab-opt/taskmanager'
|
189
|
+
|
190
|
+
|
191
|
+
def __init__(self, simulationId, rid):
|
192
|
+
'''
|
193
|
+
初始化
|
194
|
+
'''
|
195
|
+
self.simulationId = simulationId
|
196
|
+
self.rid = rid
|
197
|
+
self.optimizationInfo = self.GetOptimizationInfo()
|
198
|
+
|
199
|
+
def _fetchItemData(self, url, params):
|
200
|
+
'''
|
201
|
+
获取当前算例的优化目标设置信息
|
202
|
+
|
203
|
+
:return: List 类型,包括优化目标和全局参数储能动作灵敏度,若没有设置则返回 []
|
204
|
+
'''
|
205
|
+
r = request('GET', url, params=params)
|
206
|
+
data = json.loads(r.text)
|
207
|
+
return data['results']
|
208
|
+
|
209
|
+
def GetOptimizationInfo(self):
|
210
|
+
'''
|
211
|
+
获取当前算例的优化目标设置信息
|
212
|
+
|
213
|
+
:return: Dict 类型,例如:{'OptGoal': <OptimizationMode.经济性: 0>, 'StoSen': "10", '@debug': '', 'clustering_algorithm': '0', 'num_method': '0', 'PowUnPrice': '1000', 'HeatAbandonPrice': '1000'}
|
214
|
+
'''
|
215
|
+
try:
|
216
|
+
url = f'{self._baseUri}/simuOpt/'
|
217
|
+
params = {"simu_id": self.simulationId}
|
218
|
+
r = self._fetchItemData(url, params)
|
219
|
+
if (len(r) == 0):
|
220
|
+
return {
|
221
|
+
"OptGoal": OptimizationMode['经济性'],
|
222
|
+
"StoSen": "10",
|
223
|
+
"@debug": "",
|
224
|
+
"clustering_algorithm": "0",
|
225
|
+
"num_method": "0",
|
226
|
+
"PowUnPrice": "1000",
|
227
|
+
"HeatAbandonPrice": "1000"
|
228
|
+
}
|
229
|
+
else:
|
230
|
+
value = json.loads(r[0]['opt_params'])
|
231
|
+
return {
|
232
|
+
"OptGoal": OptimizationMode(int(value['OptGoal'])),
|
233
|
+
"StoSen": value['StoSen'],
|
234
|
+
"@debug": value["@debug"],
|
235
|
+
"clustering_algorithm": value["clustering_algorithm"],
|
236
|
+
"num_method": value["num_method"],
|
237
|
+
"PowUnPrice": value["PowUnPrice"],
|
238
|
+
"HeatAbandonPrice": value["HeatAbandonPrice"]
|
239
|
+
}
|
240
|
+
except:
|
241
|
+
raise Exception('获得优化目标设置失败')
|
242
|
+
|
243
|
+
def SetOptimizationInfo(self, data: dict):
|
244
|
+
'''
|
245
|
+
设置当前算例的优化目标
|
246
|
+
|
247
|
+
:param data: dict 类型,例如:{'OptGoal': <OptimizationMode.经济性: 0>, 'StoSen': "10", '@debug': '', 'clustering_algorithm': '0', 'num_method': '0', 'PowUnPrice': '1000', 'HeatAbandonPrice': '1000'}
|
248
|
+
|
249
|
+
:return: boolean 类型,为 True 则设置成功
|
250
|
+
'''
|
251
|
+
try:
|
252
|
+
url = f'{self._baseUri}/simuOpt/'
|
253
|
+
params = {"simu_id": self.simulationId}
|
254
|
+
r = self._fetchItemData(url, params)
|
255
|
+
opt_params = {
|
256
|
+
"OptGoal": data.get('OptGoal', ''),
|
257
|
+
"StoSen": data.get('StoSen', ''),
|
258
|
+
"@debug": data.get('@debug', ''),
|
259
|
+
"clustering_algorithm": data.get('clustering_algorithm', ''),
|
260
|
+
"num_method": data.get('num_method', ''),
|
261
|
+
"PowUnPrice": data.get('PowUnPrice', ''),
|
262
|
+
"HeatAbandonPrice": data.get('HeatAbandonPrice', '')
|
263
|
+
}
|
264
|
+
if(len(r) == 0):
|
265
|
+
payload = {
|
266
|
+
"simu_id": self.simulationId,
|
267
|
+
"opt_params": json.dumps(opt_params)
|
268
|
+
}
|
269
|
+
r = request('POST',
|
270
|
+
url,
|
271
|
+
data=json.dumps(payload))
|
272
|
+
return True
|
273
|
+
else:
|
274
|
+
url2 = f'{self._baseUri}/simuOpt/{r[0]["id"]}/'
|
275
|
+
payload = {
|
276
|
+
"simu_id": self.simulationId,
|
277
|
+
"opt_params": json.dumps(opt_params),
|
278
|
+
"id": r[0]["id"]
|
279
|
+
}
|
280
|
+
r = request('PUT',
|
281
|
+
url2,
|
282
|
+
data=json.dumps(payload))
|
283
|
+
return True
|
284
|
+
except:
|
285
|
+
return False
|
286
|
+
|
287
|
+
def run(self) -> HttpOPTRunner[IESLabOptResult]:
|
288
|
+
'''
|
289
|
+
生成方案优选算例
|
290
|
+
|
291
|
+
:return: Runner[IESLabOptResult]
|
292
|
+
'''
|
293
|
+
isRunning = self.GetLastTaskResult()
|
294
|
+
if isRunning:
|
295
|
+
raise Exception('该算例正在运行!请从浏览器算例页面点击结束运行或者调用IESPlan对象的kill接口终止计算后重试!')
|
296
|
+
else:
|
297
|
+
# 通过 rid 获取 model
|
298
|
+
model = Model.fetch(self.rid)
|
299
|
+
# 通过 model 获取 revision
|
300
|
+
revision = ModelRevision.create(model.revision, model.revision.hash)
|
301
|
+
hash = revision.get('hash', '')
|
302
|
+
url = f'{self._runUri}/runOptimization'
|
303
|
+
opt = {
|
304
|
+
"OptGoal": self.optimizationInfo.get('OptGoal', 0).value,
|
305
|
+
"StoSen": self.optimizationInfo.get('StoSen', 10),
|
306
|
+
"@debug": self.optimizationInfo.get('@debug', ''),
|
307
|
+
"clustering_algorithm": self.optimizationInfo.get('clustering_algorithm', '0'),
|
308
|
+
"num_method": self.optimizationInfo.get('num_method', '0'),
|
309
|
+
"PowUnPrice": self.optimizationInfo.get('PowUnPrice', '1000'),
|
310
|
+
"HeatAbandonPrice": self.optimizationInfo.get('HeatAbandonPrice', '1000'),
|
311
|
+
}
|
312
|
+
try:
|
313
|
+
r = request('GET',
|
314
|
+
url,
|
315
|
+
params={
|
316
|
+
"simuid":
|
317
|
+
self.simulationId,
|
318
|
+
"optPara":
|
319
|
+
json.dumps(opt),
|
320
|
+
"revision": hash
|
321
|
+
})
|
322
|
+
data = json.loads(r.text)
|
323
|
+
return HttpOPTRunner({}, self.simulationId)
|
324
|
+
except:
|
325
|
+
raise Exception('生成方案优选算例失败')
|
326
|
+
|
327
|
+
def GetRunner(self) -> HttpOPTRunner[IESLabOptResult]:
|
328
|
+
'''
|
329
|
+
获得运行实例
|
330
|
+
|
331
|
+
:return: Runner[IESLabOptResult]
|
332
|
+
'''
|
333
|
+
return HttpOPTRunner({}, self.simulationId)
|
334
|
+
|
335
|
+
def kill(self) -> bool:
|
336
|
+
'''
|
337
|
+
停止并删除当前运行的优化算例
|
338
|
+
'''
|
339
|
+
res = IESLabOptResult(self.simulationId).getLastTaskResult()
|
340
|
+
error = res.get('error', 0)
|
341
|
+
if error == 0:
|
342
|
+
data = res.get('data', {})
|
343
|
+
if data is not None:
|
344
|
+
taskID = data.get('task_id', '')
|
345
|
+
url = f'{self._runUri}/removeOptimizationTask'
|
346
|
+
try:
|
347
|
+
r = request('GET',
|
348
|
+
url,
|
349
|
+
params={
|
350
|
+
"taskid": taskID,
|
351
|
+
"stopFlag": '2'
|
352
|
+
})
|
353
|
+
json.loads(r.text)
|
354
|
+
return True
|
355
|
+
except:
|
356
|
+
return False
|
357
|
+
|
358
|
+
def GetLastTaskResult(self)-> bool:
|
359
|
+
'''
|
360
|
+
获取最后一次运行的taskID的运行结果与日志
|
361
|
+
|
362
|
+
:return: boolean 类型
|
363
|
+
'''
|
364
|
+
isRunning = True
|
365
|
+
res = IESLabOptResult(self.simulationId).getLastTaskResult()
|
366
|
+
error = res.get('error', 0)
|
367
|
+
if error == 0:
|
368
|
+
data = res.get('data', {})
|
369
|
+
if data is not None:
|
370
|
+
status = data.get('status', '')
|
371
|
+
if status == 'stop':
|
372
|
+
isRunning = False
|
373
|
+
logs = IESLabOptResult(self.simulationId).GetLogs()
|
132
374
|
if logs is not None:
|
133
375
|
for log in logs:
|
134
376
|
if(log.get('data', '') == 'run ends'):
|
@@ -137,6 +379,7 @@ class IESLabPlanModel(object):
|
|
137
379
|
return isRunning
|
138
380
|
|
139
381
|
|
382
|
+
|
140
383
|
# @unique
|
141
384
|
class OptimizationMode(IntEnum):
|
142
385
|
经济性 = 0
|
cloudpss/ieslab/__init__.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
from .IESLabSimulation import IESLabSimulation
|
2
2
|
from .IESLabPlan import IESLabPlan
|
3
3
|
from .PlanModel import OptimizationMode
|
4
|
-
|
4
|
+
from .IESLabOpt import IESLabOpt
|
5
|
+
__all__ = ['IESLabSimulation','IESLabPlan', 'OptimizationMode', 'IESLabOpt']
|