cloudpss 3.5.0a1__tar.gz → 4.0.0__tar.gz
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-3.5.0a1 → cloudpss-4.0.0}/PKG-INFO +1 -1
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/__init__.py +4 -4
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/function/functionExecution.py +1 -1
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/ieslab/DataManageModel.py +5 -5
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/ieslab/EvaluationModel.py +12 -6
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/ieslab/IESLabPlan.py +19 -6
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/ieslab/IESLabSimulation.py +2 -0
- cloudpss-4.0.0/cloudpss/ieslab/PlanModel.py +143 -0
- cloudpss-4.0.0/cloudpss/ieslab/__init__.py +4 -0
- cloudpss-4.0.0/cloudpss/job/__init__.py +5 -0
- cloudpss-4.0.0/cloudpss/job/job.py +277 -0
- cloudpss-4.0.0/cloudpss/job/jobMachine.py +11 -0
- cloudpss-4.0.0/cloudpss/job/jobPolicy.py +129 -0
- cloudpss-4.0.0/cloudpss/job/jobQueue.py +14 -0
- cloudpss-4.0.0/cloudpss/job/jobReceiver.py +33 -0
- cloudpss-4.0.0/cloudpss/job/jobTres.py +6 -0
- cloudpss-4.0.0/cloudpss/job/messageStreamReceiver.py +120 -0
- cloudpss-4.0.0/cloudpss/job/messageStreamSender.py +74 -0
- cloudpss-4.0.0/cloudpss/job/view/EMTView.py +216 -0
- cloudpss-4.0.0/cloudpss/job/view/IESLabSimulationView.py +5 -0
- cloudpss-4.0.0/cloudpss/job/view/IESLabTypicalDayView.py +27 -0
- cloudpss-4.0.0/cloudpss/job/view/IESView.py +103 -0
- cloudpss-4.0.0/cloudpss/job/view/PowerFlowView.py +80 -0
- cloudpss-4.0.0/cloudpss/job/view/__init__.py +42 -0
- cloudpss-4.0.0/cloudpss/job/view/view.py +122 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/model/jobDefinitions.py +34 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/model/model.py +114 -22
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/model/revision.py +2 -4
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/runner/IESLabEvaluationResult.py +27 -22
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/runner/IESLabPlanResult.py +57 -10
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/runner/IESLabTypicalDayResult.py +12 -9
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/runner/result.py +1 -1
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/runner/runner.py +20 -15
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/utils/IO.py +18 -7
- cloudpss-4.0.0/cloudpss/utils/httprequests.py +44 -0
- cloudpss-4.0.0/cloudpss/verify.py +57 -0
- cloudpss-4.0.0/cloudpss/version.py +1 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss.egg-info/PKG-INFO +1 -1
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss.egg-info/SOURCES.txt +25 -1
- cloudpss-4.0.0/test/test.py +29 -0
- cloudpss-4.0.0/test/testAsync.py +33 -0
- cloudpss-4.0.0/test/testEvent.py +46 -0
- cloudpss-4.0.0/test/testRt copy.py +107 -0
- cloudpss-4.0.0/test/testRt.py +150 -0
- cloudpss-4.0.0/test/testSend.py +39 -0
- cloudpss-4.0.0/test/test_in_new_web_1.py +118 -0
- cloudpss-4.0.0/test/testb.py +18 -0
- cloudpss-3.5.0a1/cloudpss/ieslab/PlanModel.py +0 -94
- cloudpss-3.5.0a1/cloudpss/ieslab/__init__.py +0 -3
- cloudpss-3.5.0a1/cloudpss/utils/httprequests.py +0 -40
- cloudpss-3.5.0a1/cloudpss/verify.py +0 -43
- cloudpss-3.5.0a1/test/test.py +0 -74
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/README.md +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/function/__init__.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/function/function.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/function/job.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/model/__init__.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/model/implements/__init__.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/model/implements/component.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/model/implements/diagram.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/model/implements/implement.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/model/topology.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/project/__init__.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/project/project.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/runner/MessageStreamReceiver.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/runner/__init__.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/runner/receiver.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/runner/storage.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/runner/transform.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/utils/__init__.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/utils/dataEncoder.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/utils/graphqlUtil.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/utils/matlab.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss/utils/yamlLoader.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss.egg-info/dependency_links.txt +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss.egg-info/requires.txt +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/cloudpss.egg-info/top_level.txt +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/setup.cfg +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/setup.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/test/test-sdk.py +0 -0
- {cloudpss-3.5.0a1 → cloudpss-4.0.0}/test/test-snapshot.py +0 -0
@@ -6,18 +6,18 @@ from .model import Model, ModelRevision, ModelTopology
|
|
6
6
|
from .project import Project
|
7
7
|
from .utils import MatlabDataEncoder, DateTimeEncode
|
8
8
|
from . import function
|
9
|
+
from .job import Job
|
9
10
|
from .function import FunctionExecution
|
10
|
-
|
11
|
+
from .version import __version__
|
11
12
|
__all__ = [
|
12
13
|
'setToken', 'Model', 'ModelRevision', 'ModelTopology', 'Runner', 'Result',
|
13
14
|
'PowerFlowResult', 'EMTResult', 'MatlabDataEncoder', 'DateTimeEncode',
|
14
|
-
'function', 'Project', 'currentJob', 'IESLabSimulation', 'IESLabPlan'
|
15
|
+
'function', 'Project', 'currentJob', 'IESLabSimulation', 'IESLabPlan','__version__','Job'
|
15
16
|
]
|
16
|
-
__version__ = '3.5.0-alpha.1'
|
17
17
|
|
18
18
|
|
19
19
|
def currentJob():
|
20
20
|
"""
|
21
21
|
获取当前的 currentExecution 实例
|
22
22
|
"""
|
23
|
-
return FunctionExecution.current()
|
23
|
+
return FunctionExecution.current()
|
@@ -163,7 +163,7 @@ class FunctionExecution(object):
|
|
163
163
|
sys.exit(code)
|
164
164
|
|
165
165
|
def print(self, data):
|
166
|
-
print(json.dumps(data, cls=MatlabDataEncoder), flush=True)
|
166
|
+
print(json.dumps(data, cls=MatlabDataEncoder)+'\n', flush=True)
|
167
167
|
|
168
168
|
def log(self, content, level='info', html=False, key=None):
|
169
169
|
'''
|
@@ -146,19 +146,19 @@ class DataManageModel(object):
|
|
146
146
|
if r['timeid'] is not None:
|
147
147
|
del r['timeid']
|
148
148
|
try:
|
149
|
-
|
149
|
+
self._saveItemData(self._kindUrlMap[kind], r)
|
150
150
|
self._kindIdMap[str(data['timeid'])]=kind
|
151
151
|
self._kindIdMap[str(data['id'])]=kind
|
152
152
|
self._itemDataMap[str(data['timeid'])]=data
|
153
153
|
self._itemDataMap[str(data['id'])]=data
|
154
154
|
if kind in ['thermalLoads', 'electricLoads', 'fuels']:
|
155
155
|
dataList = self._fetchItemData(self._kindUrlMap[kind], None)
|
156
|
-
self._kindItemDataMap[kind]
|
157
|
-
return dataList[
|
156
|
+
self._kindItemDataMap[kind] = dataList
|
157
|
+
return dataList[-1]['id']
|
158
158
|
else:
|
159
159
|
dataList = self._fetchItemData(self._kindUrlMap[kind], kind)
|
160
|
-
self._kindItemDataMap[kind]
|
161
|
-
return dataList[
|
160
|
+
self._kindItemDataMap[kind] = dataList
|
161
|
+
return dataList[-1]['id']
|
162
162
|
except Exception as e:
|
163
163
|
raise Exception(str(e))
|
164
164
|
|
@@ -5,7 +5,6 @@ from ..utils import request
|
|
5
5
|
import json
|
6
6
|
from enum import IntEnum, unique
|
7
7
|
|
8
|
-
|
9
8
|
class IESLabEvaluationModel(object):
|
10
9
|
_baseUri = 'api/ieslab-plan/rest/'
|
11
10
|
_taskUri = 'api/ieslab-plan/taskmanager/getSimuLastTasks'
|
@@ -58,6 +57,12 @@ class IESLabEvaluationModel(object):
|
|
58
57
|
}
|
59
58
|
}
|
60
59
|
|
60
|
+
# 评价基础参数接口默认值
|
61
|
+
_evaluationType = {
|
62
|
+
"环保评价": "environmentalEvaluation",
|
63
|
+
"能效评价": "energyEvaluation"
|
64
|
+
}
|
65
|
+
|
61
66
|
def __init__(self, simulationId):
|
62
67
|
'''
|
63
68
|
初始化
|
@@ -91,7 +96,7 @@ class IESLabEvaluationModel(object):
|
|
91
96
|
data = json.loads(r.text)
|
92
97
|
return data
|
93
98
|
|
94
|
-
def
|
99
|
+
def GetFinancialParams(self, planID):
|
95
100
|
'''
|
96
101
|
获取planID对应的优化方案下财务评估模块的基础信息
|
97
102
|
:param planID int类型,表示优化方案的ID,数值位于0~优化方案数量之间
|
@@ -128,6 +133,7 @@ class IESLabEvaluationModel(object):
|
|
128
133
|
:return: Runner[IESLabEvaluationResult]
|
129
134
|
'''
|
130
135
|
url = 'api/ieslab-plan/taskmanager/saveDataToclickhouse'
|
136
|
+
CMD_TYPE = type if type is None else self._evaluationType[type]
|
131
137
|
try:
|
132
138
|
timeId = int(time.time() * 1000)
|
133
139
|
r = request('GET',
|
@@ -135,20 +141,20 @@ class IESLabEvaluationModel(object):
|
|
135
141
|
params={
|
136
142
|
"simuid": self.simulationId,
|
137
143
|
"planId": planID,
|
138
|
-
"CMD_TYPE":
|
144
|
+
"CMD_TYPE": CMD_TYPE
|
139
145
|
})
|
140
146
|
data = json.loads(r.text)
|
141
147
|
return HttpRunner({'rid': 'function/ieslab/evaluation'},
|
142
148
|
self.simulationId,
|
143
149
|
timeId=timeId,
|
144
150
|
planId=planID,
|
145
|
-
cmdType=
|
151
|
+
cmdType=CMD_TYPE)
|
146
152
|
except:
|
147
153
|
raise Exception('方案评估开始计算失败')
|
148
154
|
|
149
155
|
def EnvironmentalEvaluationRun(self, planID):
|
150
156
|
'''
|
151
|
-
|
157
|
+
运行环保评价方案评估
|
152
158
|
|
153
159
|
:param planID int类型,表示优化方案的ID,数值位于0~优化方案数量之间
|
154
160
|
|
@@ -158,7 +164,7 @@ class IESLabEvaluationModel(object):
|
|
158
164
|
|
159
165
|
def EnergyEvaluationRun(self, planID):
|
160
166
|
'''
|
161
|
-
|
167
|
+
运行能效评价方案评估
|
162
168
|
|
163
169
|
:param planID int类型,表示优化方案的ID,数值位于0~优化方案数量之间
|
164
170
|
|
@@ -7,6 +7,8 @@ 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
|
+
from cloudpss.runner.IESLabPlanResult import IESLabPlanResult
|
11
|
+
from cloudpss.runner.IESLabEvaluationResult import IESLabEvaluationResult
|
10
12
|
|
11
13
|
class IESLabPlan(object):
|
12
14
|
def __init__(self, project={}):
|
@@ -22,6 +24,8 @@ class IESLabPlan(object):
|
|
22
24
|
self.dataManageModel = IESPlanDataManageModel(self.id)
|
23
25
|
self.planModel = IESLabPlanModel(self.id)
|
24
26
|
self.evaluationModel = IESLabEvaluationModel(self.id)
|
27
|
+
self.currentPlanResult = IESLabPlanResult(self.id)
|
28
|
+
self.currentEvaluationResult = IESLabEvaluationResult(self.id)
|
25
29
|
|
26
30
|
@staticmethod
|
27
31
|
def fetch(simulationId):
|
@@ -52,7 +56,6 @@ class IESLabPlan(object):
|
|
52
56
|
if job is None:
|
53
57
|
currentJob = self.model.context['currentJob']
|
54
58
|
job = self.model.jobs[currentJob]
|
55
|
-
|
56
59
|
job['args']['simulationId'] = self.id
|
57
60
|
return self.model.run(job, name=name)
|
58
61
|
|
@@ -68,26 +71,28 @@ class IESLabPlan(object):
|
|
68
71
|
if job is None:
|
69
72
|
currentJob = self.model.context['currentJob']
|
70
73
|
job = self.model.jobs[currentJob]
|
71
|
-
if job['rid'] != '
|
74
|
+
if job['rid'] != 'function/CloudPSS/ieslab-gmm':
|
72
75
|
for j in self.model.jobs:
|
73
|
-
if j['rid'] == 'job-definition/ies/ies-gmm' or
|
76
|
+
if j['rid'] == 'job-definition/ies/ies-gmm' or j['rid'] == 'job-definition/cloudpss/ieslab-gmm':
|
77
|
+
j['rid'] = 'function/CloudPSS/ieslab-gmm'
|
74
78
|
job = j
|
75
79
|
if job is None:
|
76
80
|
raise Exception("找不到默认的综合能源系统规划典型日生成算法的计算方案")
|
77
|
-
if job['rid'] != '
|
81
|
+
if job['rid'] != 'function/CloudPSS/ieslab-gmm':
|
78
82
|
raise Exception("不是综合能源系统规划典型日生成算法的计算方案")
|
79
83
|
return self.__run(job=job, name=name)
|
80
84
|
|
81
|
-
def iesLabEvaluationRun(self, planId):
|
85
|
+
def iesLabEvaluationRun(self, planId, type=None):
|
82
86
|
'''
|
83
87
|
运行方案评估
|
84
88
|
|
85
89
|
:param planID int类型,表示优化方案的ID,数值位于0~优化方案数量之间
|
90
|
+
:param type string类型,表示评估类型,可选值为:能效评价、环保评价
|
86
91
|
|
87
92
|
:return: 方案评估运行实例
|
88
93
|
|
89
94
|
'''
|
90
|
-
return self.evaluationModel.run(planId)
|
95
|
+
return self.evaluationModel.run(planId, type)
|
91
96
|
|
92
97
|
def iesLabEnergyEvaluationRun(self, planId):
|
93
98
|
'''
|
@@ -117,3 +122,11 @@ class IESLabPlan(object):
|
|
117
122
|
:return: 方案优选运行实例
|
118
123
|
'''
|
119
124
|
return self.planModel.run()
|
125
|
+
|
126
|
+
def iesLabPlanKill(self):
|
127
|
+
'''
|
128
|
+
停止并删除方案优选算例
|
129
|
+
|
130
|
+
:return: Boolean
|
131
|
+
'''
|
132
|
+
return self.planModel.kill()
|
@@ -30,6 +30,7 @@ class IESLabSimulation(object):
|
|
30
30
|
r = request(
|
31
31
|
'GET', 'api/ieslab-simulation/rest/simu/{0}/'.format(simulationId))
|
32
32
|
project = json.loads(r.text)
|
33
|
+
print(project)
|
33
34
|
return IESLabSimulation(project)
|
34
35
|
except:
|
35
36
|
raise Exception('未查询到当前算例')
|
@@ -48,5 +49,6 @@ class IESLabSimulation(object):
|
|
48
49
|
job = self.model.jobs[currentJob]
|
49
50
|
|
50
51
|
job['args']['simulationId'] = self.id
|
52
|
+
print(job)
|
51
53
|
return self.model.run(job, name=name)
|
52
54
|
|
@@ -0,0 +1,143 @@
|
|
1
|
+
from cloudpss.runner.IESLabPlanResult import IESLabPlanResult
|
2
|
+
from cloudpss.runner.runner import HttpRunner, Runner
|
3
|
+
from ..utils import request, fileLoad
|
4
|
+
import json
|
5
|
+
from enum import IntEnum, unique
|
6
|
+
|
7
|
+
|
8
|
+
class IESLabPlanModel(object):
|
9
|
+
_baseUri = 'api/ieslab-plan/taskmanager/getSimuLastTasks'
|
10
|
+
|
11
|
+
def __init__(self, simulationId):
|
12
|
+
'''
|
13
|
+
初始化
|
14
|
+
'''
|
15
|
+
self.simulationId = simulationId
|
16
|
+
self.optimizationInfo = self.GetOptimizationInfo()
|
17
|
+
self.OptimizationMode = OptimizationMode
|
18
|
+
|
19
|
+
def _fetchItemData(self, url):
|
20
|
+
'''
|
21
|
+
获取当前算例的优化目标设置信息
|
22
|
+
|
23
|
+
:return: enum 类型,代表经济性优化和环保性优化的类型
|
24
|
+
'''
|
25
|
+
r = request('GET', url, params={"simuid": self.simulationId})
|
26
|
+
data = json.loads(r.text)
|
27
|
+
return data
|
28
|
+
|
29
|
+
def GetOptimizationInfo(self):
|
30
|
+
'''
|
31
|
+
获取当前算例的优化目标设置信息
|
32
|
+
|
33
|
+
:return: enum 类型,代表经济性优化和环保性优化的类型
|
34
|
+
'''
|
35
|
+
try:
|
36
|
+
data = self._fetchItemData(self._baseUri)
|
37
|
+
for e in OptimizationMode:
|
38
|
+
if (e.value == data['data']['optimizationpara']
|
39
|
+
['OptimizationMode']):
|
40
|
+
return e
|
41
|
+
except:
|
42
|
+
return OptimizationMode['经济性']
|
43
|
+
|
44
|
+
def SetOptimizationInfo(self, optType):
|
45
|
+
'''
|
46
|
+
无对应接口
|
47
|
+
设置当前算例的优化目标
|
48
|
+
|
49
|
+
:param optType: enum 类型,代表经济性优化和环保性优化的类型
|
50
|
+
'''
|
51
|
+
self.optimizationInfo = optType
|
52
|
+
return True
|
53
|
+
|
54
|
+
def run(self) -> Runner[IESLabPlanResult]:
|
55
|
+
'''
|
56
|
+
生成方案优选算例
|
57
|
+
|
58
|
+
:return: Runner[IESLabPlanResult]
|
59
|
+
'''
|
60
|
+
isRunning = self.GetLastTaskResult()
|
61
|
+
if isRunning:
|
62
|
+
raise Exception('该算例正在运行!请从浏览器算例页面点击结束运行或者调用IESPlan对象的kill接口终止计算后重试!')
|
63
|
+
else:
|
64
|
+
url = 'api/ieslab-plan/taskmanager/runOptimization'
|
65
|
+
if self.optimizationInfo is None:
|
66
|
+
self.optimizationInfo = OptimizationMode['经济性']
|
67
|
+
optType = self.optimizationInfo.value or 0
|
68
|
+
try:
|
69
|
+
r = request('GET',
|
70
|
+
url,
|
71
|
+
params={
|
72
|
+
"simuid":
|
73
|
+
self.simulationId,
|
74
|
+
"optPara":
|
75
|
+
json.dumps({
|
76
|
+
"OptimizationMode": optType,
|
77
|
+
"ProjectPeriod": "20"
|
78
|
+
})
|
79
|
+
})
|
80
|
+
data = json.loads(r.text)
|
81
|
+
return HttpRunner({}, self.simulationId)
|
82
|
+
except:
|
83
|
+
raise Exception('生成方案优选算例失败')
|
84
|
+
|
85
|
+
def GetRunner(self) -> Runner[IESLabPlanResult]:
|
86
|
+
'''
|
87
|
+
获得运行实例
|
88
|
+
|
89
|
+
:return: Runner[IESLabPlanResult]
|
90
|
+
'''
|
91
|
+
return HttpRunner({}, self.simulationId)
|
92
|
+
|
93
|
+
def kill(self) -> bool:
|
94
|
+
'''
|
95
|
+
停止并删除当前运行的优化算例
|
96
|
+
'''
|
97
|
+
res = IESLabPlanResult(self.simulationId).getLastTaskResult()
|
98
|
+
error = res.get('error', 0)
|
99
|
+
if error == 0:
|
100
|
+
data = res.get('data', {})
|
101
|
+
if data is not None:
|
102
|
+
taskID = data.get('task_id', '')
|
103
|
+
url = f'api/ieslab-plan/taskmanager/removeOptimizationTask'
|
104
|
+
try:
|
105
|
+
r = request('GET',
|
106
|
+
url,
|
107
|
+
params={
|
108
|
+
"taskid": taskID,
|
109
|
+
"stopFlag": '2'
|
110
|
+
})
|
111
|
+
json.loads(r.text)
|
112
|
+
return True
|
113
|
+
except:
|
114
|
+
return False
|
115
|
+
|
116
|
+
def GetLastTaskResult(self)-> bool:
|
117
|
+
'''
|
118
|
+
获取最后一次运行的taskID的运行结果与日志
|
119
|
+
|
120
|
+
:return: boolean 类型
|
121
|
+
'''
|
122
|
+
isRunning = True
|
123
|
+
res = IESLabPlanResult(self.simulationId).getLastTaskResult()
|
124
|
+
error = res.get('error', 0)
|
125
|
+
if error == 0:
|
126
|
+
data = res.get('data', {})
|
127
|
+
if data is not None:
|
128
|
+
status = data.get('status', '')
|
129
|
+
if status == 'stop':
|
130
|
+
isRunning = False
|
131
|
+
logs = IESLabPlanResult(self.simulationId).GetLogs()
|
132
|
+
if logs is not None:
|
133
|
+
for log in logs:
|
134
|
+
if(log.get('data', '') == 'run ends'):
|
135
|
+
isRunning = False
|
136
|
+
break
|
137
|
+
return isRunning
|
138
|
+
|
139
|
+
|
140
|
+
# @unique
|
141
|
+
class OptimizationMode(IntEnum):
|
142
|
+
经济性 = 0
|
143
|
+
环保性 = 1
|
@@ -0,0 +1,277 @@
|
|
1
|
+
import random
|
2
|
+
import re
|
3
|
+
import time
|
4
|
+
from .view import getViewClass
|
5
|
+
|
6
|
+
from cloudpss.utils.IO import IO
|
7
|
+
from .messageStreamReceiver import MessageStreamReceiver
|
8
|
+
|
9
|
+
from cloudpss.utils.graphqlUtil import graphql_request
|
10
|
+
from .jobPolicy import JobPolicy
|
11
|
+
from .jobMachine import JobMachine
|
12
|
+
from .messageStreamSender import MessageStreamSender
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
class Job(object):
|
17
|
+
"""docstring for Job"""
|
18
|
+
|
19
|
+
def __init__(self, id, args, createTime, startTime, endTime, status,
|
20
|
+
context, user, priority, policy, machine, input, output,
|
21
|
+
position):
|
22
|
+
super(Job, self).__init__()
|
23
|
+
self.id = id
|
24
|
+
self.args = args
|
25
|
+
self.createTime = createTime
|
26
|
+
self.startTime = startTime
|
27
|
+
self.endTime = endTime
|
28
|
+
self.status = status
|
29
|
+
self.context = context
|
30
|
+
self.user = user
|
31
|
+
self.priority = priority
|
32
|
+
self.policy = policy # type: ignore
|
33
|
+
self.machine = JobMachine(**machine) # type: ignore
|
34
|
+
self.input = input
|
35
|
+
self.output = output
|
36
|
+
self.position = position
|
37
|
+
self.__receiver = None
|
38
|
+
self.__sender = None
|
39
|
+
|
40
|
+
@staticmethod
|
41
|
+
def fetch(id):
|
42
|
+
"""
|
43
|
+
获取job信息
|
44
|
+
"""
|
45
|
+
if id is None:
|
46
|
+
raise Exception('id is None')
|
47
|
+
query = '''query($_a:JobInput!){
|
48
|
+
job(input:$_a){
|
49
|
+
id
|
50
|
+
args
|
51
|
+
createTime
|
52
|
+
startTime
|
53
|
+
endTime
|
54
|
+
status
|
55
|
+
context
|
56
|
+
user
|
57
|
+
priority
|
58
|
+
policy {
|
59
|
+
name
|
60
|
+
queue
|
61
|
+
tres {
|
62
|
+
cpu
|
63
|
+
ecpu
|
64
|
+
mem
|
65
|
+
}
|
66
|
+
priority
|
67
|
+
maxDuration
|
68
|
+
}
|
69
|
+
machine {
|
70
|
+
id
|
71
|
+
name
|
72
|
+
tres {
|
73
|
+
cpu
|
74
|
+
ecpu
|
75
|
+
mem
|
76
|
+
}
|
77
|
+
}
|
78
|
+
input
|
79
|
+
output
|
80
|
+
position
|
81
|
+
}
|
82
|
+
}'''
|
83
|
+
variables = {"_a": {"id": id}}
|
84
|
+
r = graphql_request(query, variables)
|
85
|
+
if 'errors' in r:
|
86
|
+
raise Exception(r['errors'])
|
87
|
+
return Job(**r['data']['job'])
|
88
|
+
|
89
|
+
@staticmethod
|
90
|
+
def fetchMany(input):
|
91
|
+
"""
|
92
|
+
批量获取任务信息
|
93
|
+
"""
|
94
|
+
if input is None:
|
95
|
+
raise Exception('input is None')
|
96
|
+
query = '''query($_a:JobsInput!){
|
97
|
+
jobs(input:$_a){
|
98
|
+
item {
|
99
|
+
id
|
100
|
+
args
|
101
|
+
createTime
|
102
|
+
startTime
|
103
|
+
endTime
|
104
|
+
status
|
105
|
+
context
|
106
|
+
user
|
107
|
+
priority
|
108
|
+
policy {
|
109
|
+
id
|
110
|
+
name
|
111
|
+
users
|
112
|
+
functions
|
113
|
+
tres {
|
114
|
+
cpu
|
115
|
+
ecpu
|
116
|
+
mem
|
117
|
+
}
|
118
|
+
minPriority
|
119
|
+
maxPriority
|
120
|
+
maxDuration
|
121
|
+
createTime
|
122
|
+
updateTime
|
123
|
+
visibility
|
124
|
+
queue
|
125
|
+
}
|
126
|
+
machine {
|
127
|
+
id
|
128
|
+
name
|
129
|
+
tres {
|
130
|
+
cpu
|
131
|
+
ecpu
|
132
|
+
mem
|
133
|
+
}
|
134
|
+
valid
|
135
|
+
}
|
136
|
+
input
|
137
|
+
output
|
138
|
+
position
|
139
|
+
}
|
140
|
+
cursor
|
141
|
+
count
|
142
|
+
total
|
143
|
+
}
|
144
|
+
}'''
|
145
|
+
variables = {"_a": input}
|
146
|
+
r = graphql_request(query, variables)
|
147
|
+
if 'errors' in r:
|
148
|
+
raise Exception(r['errors'])
|
149
|
+
jobs = []
|
150
|
+
for job in r['data']['jobs']['item']:
|
151
|
+
jobs.append(Job(**job))
|
152
|
+
return jobs
|
153
|
+
|
154
|
+
@staticmethod
|
155
|
+
def create(revisionHash,
|
156
|
+
job,
|
157
|
+
config,
|
158
|
+
name=None,
|
159
|
+
rid='',
|
160
|
+
policy=None,
|
161
|
+
**kwargs):
|
162
|
+
'''
|
163
|
+
创建一个运行任务
|
164
|
+
|
165
|
+
:params: revision 项目版本号
|
166
|
+
:params: job 调用仿真时使用的计算方案,为空时使用项目的第一个计算方案
|
167
|
+
:params: config 调用仿真时使用的参数方案,为空时使用项目的第一个参数方案
|
168
|
+
:params: name 任务名称,为空时使用项目的参数方案名称和计算方案名称
|
169
|
+
:params: rid 项目rid,可为空
|
170
|
+
|
171
|
+
:return: 返回一个运行实例
|
172
|
+
|
173
|
+
>>> runner = Runner.runRevision(revision,job,config,'')
|
174
|
+
'''
|
175
|
+
|
176
|
+
#处理policy字段
|
177
|
+
if policy is None:
|
178
|
+
policy = {}
|
179
|
+
if policy.get('tres', None) is None:
|
180
|
+
policy['tres'] = {}
|
181
|
+
policy['queue'] = job['args'].get('@queue', 1)
|
182
|
+
policy['priority'] = job['args'].get('@priority', 0)
|
183
|
+
tres = {'cpu': 1, 'ecpu': 0, 'mem': 0}
|
184
|
+
tresStr = job['args'].get('@tres', '')
|
185
|
+
for t in re.split('\s+', tresStr):
|
186
|
+
if t == '':
|
187
|
+
continue
|
188
|
+
k, v = t.split('=')
|
189
|
+
tres[k] = float(v) #type: ignore
|
190
|
+
policy['tres'] = tres
|
191
|
+
|
192
|
+
query = '''mutation($input:CreateJobInput!){job:createJob(input:$input){id input output status position}}'''
|
193
|
+
function = job['rid'].replace('job-definition/cloudpss/',
|
194
|
+
'function/CloudPSS/')
|
195
|
+
variables = {
|
196
|
+
'input': {
|
197
|
+
"args": {
|
198
|
+
**job['args'], '_ModelRevision': revisionHash,
|
199
|
+
'_ModelArgs': config['args']
|
200
|
+
},
|
201
|
+
"context": [
|
202
|
+
function,
|
203
|
+
rid,
|
204
|
+
f"model/@sdk/{str(int(time.time() * random.random()))}"
|
205
|
+
],
|
206
|
+
"policy":
|
207
|
+
policy,
|
208
|
+
}
|
209
|
+
}
|
210
|
+
r = graphql_request(query, variables)
|
211
|
+
if 'errors' in r:
|
212
|
+
raise Exception(r['errors'])
|
213
|
+
id = r['data']['job']['id']
|
214
|
+
return Job.fetch(id)
|
215
|
+
|
216
|
+
@staticmethod
|
217
|
+
def abort(id, timeout):
|
218
|
+
"""
|
219
|
+
结束当前运行的算例
|
220
|
+
|
221
|
+
"""
|
222
|
+
query = '''mutation ($input: AbortJobInput!) {
|
223
|
+
job: abortJob(input: $input) {
|
224
|
+
id
|
225
|
+
status
|
226
|
+
}
|
227
|
+
}
|
228
|
+
'''
|
229
|
+
variables = {'input': {'id': id, 'timeout': timeout}}
|
230
|
+
graphql_request(query, variables)
|
231
|
+
|
232
|
+
@staticmethod
|
233
|
+
def load(file, format='yaml'):
|
234
|
+
return IO.load(file, format)
|
235
|
+
|
236
|
+
@staticmethod
|
237
|
+
def dump(job, file, format='yaml', compress='gzip'):
|
238
|
+
return IO.dump(job, file, format, compress)
|
239
|
+
|
240
|
+
def read(self, receiver=None, dev=False, **kwargs):
|
241
|
+
"""
|
242
|
+
使用接收器获取当前运行实例的输出
|
243
|
+
"""
|
244
|
+
if receiver is not None:
|
245
|
+
self.__sender = receiver
|
246
|
+
if self.__receiver is None:
|
247
|
+
self.__receiver = MessageStreamReceiver(self, dev)
|
248
|
+
self.__receiver.connect(**kwargs)
|
249
|
+
return self.__receiver
|
250
|
+
|
251
|
+
def write(self,sender=None, dev=False, **kwargs)->MessageStreamSender:
|
252
|
+
"""
|
253
|
+
使用发送器为当前运行实例输入
|
254
|
+
"""
|
255
|
+
|
256
|
+
if sender is not None:
|
257
|
+
self.__sender = sender
|
258
|
+
if self.__sender is None:
|
259
|
+
self.__sender =MessageStreamSender(self,dev)
|
260
|
+
self.__sender.connect(**kwargs)
|
261
|
+
return self.__sender
|
262
|
+
|
263
|
+
@property
|
264
|
+
def result(self):
|
265
|
+
"""
|
266
|
+
获取当前运行实例的输出
|
267
|
+
"""
|
268
|
+
viewType = getViewClass(self.context[0])
|
269
|
+
return self.view(viewType)
|
270
|
+
|
271
|
+
def view(self, viewType):
|
272
|
+
"""
|
273
|
+
获取当前运行实例的输出
|
274
|
+
"""
|
275
|
+
receiver = self.read()
|
276
|
+
sender=self.write()
|
277
|
+
return viewType(receiver,sender)
|