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.
Files changed (67) hide show
  1. cloudpss/__init__.py +2 -3
  2. cloudpss/asyncio/__init__.py +8 -0
  3. cloudpss/asyncio/job/__init__.py +5 -0
  4. cloudpss/asyncio/job/job.py +116 -0
  5. cloudpss/asyncio/job/messageStreamReceiver.py +121 -0
  6. cloudpss/asyncio/job/messageStreamSender.py +45 -0
  7. cloudpss/asyncio/model/__init__.py +5 -0
  8. cloudpss/asyncio/model/model.py +257 -0
  9. cloudpss/asyncio/model/revision.py +41 -0
  10. cloudpss/asyncio/model/topology.py +34 -0
  11. cloudpss/asyncio/utils/__init__.py +6 -0
  12. cloudpss/{utils → asyncio/utils}/httpAsyncRequest.py +2 -2
  13. cloudpss/function/functionExecution.py +36 -3
  14. cloudpss/ieslab/DataManageModel.py +131 -9
  15. cloudpss/ieslab/EvaluationModel.py +80 -9
  16. cloudpss/ieslab/IESLabOpt.py +235 -0
  17. cloudpss/ieslab/IESLabPlan.py +82 -4
  18. cloudpss/ieslab/IESLabSimulation.py +59 -32
  19. cloudpss/ieslab/PlanModel.py +276 -33
  20. cloudpss/ieslab/__init__.py +2 -1
  21. cloudpss/job/job.py +136 -141
  22. cloudpss/job/jobReceiver.py +8 -2
  23. cloudpss/job/messageStreamReceiver.py +42 -99
  24. cloudpss/job/messageStreamSender.py +5 -42
  25. cloudpss/job/{view/EMTView.py → result/EMTResult.py} +11 -13
  26. cloudpss/job/result/IESLabSimulationResult.py +5 -0
  27. cloudpss/job/result/IESLabTypicalDayResult.py +136 -0
  28. cloudpss/job/{view/IESView.py → result/IESResult.py} +2 -2
  29. cloudpss/job/{view/PowerFlowView.py → result/PowerFlowResult.py} +2 -2
  30. cloudpss/job/result/__init__.py +39 -0
  31. cloudpss/job/{view/view.py → result/result.py} +37 -8
  32. cloudpss/model/implements/diagram.py +113 -0
  33. cloudpss/model/jobDefinitions.py +6 -6
  34. cloudpss/model/model.py +232 -209
  35. cloudpss/model/revision.py +30 -35
  36. cloudpss/model/topology.py +13 -15
  37. cloudpss/runner/IESLabEvaluationResult.py +14 -6
  38. cloudpss/runner/IESLabPlanResult.py +91 -35
  39. cloudpss/runner/IESLabTypicalDayResult.py +62 -50
  40. cloudpss/runner/MessageStreamReceiver.py +5 -100
  41. cloudpss/runner/result.py +6 -1
  42. cloudpss/runner/runner.py +77 -48
  43. cloudpss/utils/IO.py +1 -1
  44. cloudpss/utils/graphqlUtil.py +3 -2
  45. cloudpss/utils/httprequests.py +16 -8
  46. cloudpss/version.py +1 -1
  47. {cloudpss-4.1.1b8.dist-info → cloudpss-4.5.0.dist-info}/METADATA +2 -2
  48. cloudpss-4.5.0.dist-info/RECORD +70 -0
  49. cloudpss/dslab/__init__.py +0 -2
  50. cloudpss/dslab/dataManageModel.py +0 -275
  51. cloudpss/dslab/dslab.py +0 -210
  52. cloudpss/dslab/files/__init__.py +0 -2
  53. cloudpss/dslab/files/curveData.py +0 -140229
  54. cloudpss/dslab/files/files.py +0 -27
  55. cloudpss/dslab/financialAnalysisModel.py +0 -137
  56. cloudpss/job/jobMachine.py +0 -11
  57. cloudpss/job/jobPolicy.py +0 -129
  58. cloudpss/job/jobQueue.py +0 -14
  59. cloudpss/job/jobTres.py +0 -6
  60. cloudpss/job/view/IESLabSimulationView.py +0 -5
  61. cloudpss/job/view/IESLabTypicalDayView.py +0 -27
  62. cloudpss/job/view/__init__.py +0 -42
  63. cloudpss/runner/DSLabResult.py +0 -92
  64. cloudpss-4.1.1b8.dist-info/RECORD +0 -71
  65. /cloudpss/{utils → asyncio/utils}/AsyncIterable.py +0 -0
  66. {cloudpss-4.1.1b8.dist-info → cloudpss-4.5.0.dist-info}/WHEEL +0 -0
  67. {cloudpss-4.1.1b8.dist-info → cloudpss-4.5.0.dist-info}/top_level.txt +0 -0
@@ -1,12 +1,11 @@
1
- import asyncio
2
- from cloudpss.utils.httpAsyncRequest import graphql_fetch
1
+ from cloudpss.job.job import Job
3
2
  from .topology import ModelTopology
4
3
  from .implements import ModelImplement
5
- from ..utils import request, graphql_request
6
- from ..runner import Runner
4
+ from ..utils import graphql_request
7
5
 
8
6
 
9
7
  class ModelRevision(object):
8
+
10
9
  """
11
10
  表示一个项目的版本数据
12
11
 
@@ -23,6 +22,12 @@ class ModelRevision(object):
23
22
 
24
23
 
25
24
  """
25
+
26
+ __createModelRevisionQuery = """
27
+ mutation($a:CreateModelRevisionInput!){createModelRevision(input:$a){
28
+ hash
29
+ }}
30
+ """
26
31
 
27
32
  def __init__(self, revision: dict = {}):
28
33
  """
@@ -56,21 +61,27 @@ class ModelRevision(object):
56
61
  """
57
62
 
58
63
  return self.implements
59
-
60
- async def run(self, job, config, name=None, rid='', policy=None, **kwargs):
64
+
65
+ def run(self, job, config, name=None, policy=None,stop_on_entry=None,rid=None, **kwargs):
61
66
  """
62
- 运行某个指定版本的项目
67
+ 运行当前版本
63
68
 
64
69
  :params job: 调用仿真时使用的计算方案,为空时使用项目的第一个计算方案
65
70
  :params config: 调用仿真时使用的参数方案,为空时使用项目的第一个参数方案
66
71
  :params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
67
72
  :params rid: 项目rid,可为空
68
73
 
69
- :return: 返回一个ModelRevision
74
+ :return: 返回一个运行实例
70
75
 
71
76
  >>> revision.run(revision,job,config,'')
72
77
  """
73
- return await ModelRevision.createAsync(self)
78
+ revision= ModelRevision.create(self)
79
+ if stop_on_entry is not None:
80
+ job['args']['stop_on_entry'] = stop_on_entry
81
+ return Job.create(
82
+ revision["hash"], job, config, name=name, rid=rid, policy=policy, **kwargs
83
+ )
84
+
74
85
 
75
86
  @staticmethod
76
87
  def create(revision, parentHash=None):
@@ -85,36 +96,19 @@ class ModelRevision(object):
85
96
  {hash:'4043acbddb9ce0c6174be65573c0380415bc48186c74a459f88865313743230c'}
86
97
  """
87
98
 
88
- return asyncio.run(ModelRevision.createAsync(revision, parentHash))
89
-
90
- @staticmethod
91
- async def createAsync(revision, parentHash=None):
92
- """
93
- 创建一个新版本
94
-
95
- :params: revision 版本数据
96
-
97
- :return: 项目版本hash
98
-
99
- >>> ModelRevision.create(model.revision)
100
- {hash:'4043acbddb9ce0c6174be65573c0380415bc48186c74a459f88865313743230c'}
101
- """
102
-
103
- query = """
104
- mutation($a:CreateModelRevisionInput!){createModelRevision(input:$a){
105
- hash
106
- }}
107
- """
108
99
  r = revision.toJSON()
109
- del r['hash']
100
+ if 'hash' in r:
101
+ del r['hash']
110
102
  variables = {'a': {**r, 'parent': parentHash}}
111
-
112
- r = await graphql_fetch(query, variables)
103
+ r = graphql_request(ModelRevision.__createModelRevisionQuery, variables)
113
104
  if 'errors' in r:
114
105
  raise Exception(r['errors'])
106
+
115
107
  return r['data']['createModelRevision']
108
+
109
+
116
110
 
117
- async def fetchTopology(self, implementType, config, maximumDepth):
111
+ def fetchTopology(self, implementType, config, maximumDepth, **kwargs):
118
112
  """
119
113
  获取当前项目版本的拓扑数据
120
114
 
@@ -131,6 +125,7 @@ class ModelRevision(object):
131
125
  """
132
126
 
133
127
  if self.hash is not None:
134
- return await ModelTopology.fetch(self.hash, implementType, config,
135
- maximumDepth)
128
+ return ModelTopology.fetch(self.hash, implementType, config,
129
+ maximumDepth, **kwargs)
136
130
  return None
131
+
@@ -1,7 +1,6 @@
1
1
  import asyncio
2
2
  import json
3
3
 
4
- from cloudpss.utils.httpAsyncRequest import graphql_fetch
5
4
  from ..utils import request, graphql_request
6
5
 
7
6
 
@@ -19,6 +18,13 @@ class ModelTopology():
19
18
 
20
19
 
21
20
  """
21
+ __modelTopologyQuery = """
22
+ query($a:ModelTopologyInput!){
23
+ modelTopology(input:$a){
24
+ components
25
+ mappings
26
+ }}
27
+ """
22
28
  __All__ = ['ModelTopology']
23
29
 
24
30
  def __init__(self, topology: dict = {}):
@@ -47,11 +53,7 @@ class ModelTopology():
47
53
  f.close()
48
54
 
49
55
  @staticmethod
50
- def fetch(hash, implementType, config, maximumDepth=None):
51
- return asyncio.run(ModelTopology.fetchAsync(hash, implementType, config, maximumDepth))
52
-
53
- @staticmethod
54
- async def fetchAsync(hash, implementType, config, maximumDepth=None):
56
+ def fetch(hash, implementType, config, maximumDepth=None, **kwargs):
55
57
  """
56
58
  获取拓扑
57
59
 
@@ -66,14 +68,6 @@ class ModelTopology():
66
68
 
67
69
  """
68
70
  args = {} if config is None else config['args']
69
- query = """
70
- query($a:ModelTopologyInput!){
71
- modelTopology(input:$a){
72
- components
73
- mappings
74
- }}
75
- """
76
-
77
71
  variables = {
78
72
  "a": {
79
73
  'hash': hash,
@@ -82,8 +76,12 @@ class ModelTopology():
82
76
  'maximumDepth': maximumDepth
83
77
  }
84
78
  }
85
- data = await graphql_fetch(query, variables)
79
+ data = graphql_request(ModelTopology.__modelTopologyQuery, variables, **kwargs)
86
80
  if 'errors' in data:
87
81
  raise Exception(data['errors'][0]['message'])
88
82
 
89
83
  return ModelTopology(data['data']['modelTopology'])
84
+
85
+
86
+
87
+
@@ -3,7 +3,7 @@ from ..utils.httprequests import request
3
3
 
4
4
 
5
5
  class IESLabEvaluationResult(object):
6
- _baseUri = 'api/ieslab-plan/taskmanager/'
6
+ _baseUri = ''
7
7
  _kindNameMap = {
8
8
  "利润与利润分配": "getEconomyResult",
9
9
  "财务计划现金": "getFinancialPlanCashFlowResult",
@@ -77,7 +77,7 @@ class IESLabEvaluationResult(object):
77
77
  '''
78
78
  assert (resultType in self._kindNameMap), "数据类型不存在"
79
79
  kind = self._kindNameMap.get(resultType, resultType)
80
- url = self._baseUri + kind
80
+ url = self._baseUri + '/' + kind
81
81
  list = self._fetchItemData(url, planID)
82
82
  dict_result = dict()
83
83
  for val in list['results']:
@@ -93,7 +93,7 @@ class IESLabEvaluationResult(object):
93
93
  :return: array类型,代表该方案对应的概览结果
94
94
  '''
95
95
  r = request('GET',
96
- "api/ieslab-plan/taskmanager/getOverviewResult",
96
+ f"{self._baseUri}/getOverviewResult",
97
97
  params={
98
98
  "simu_id": self.simulationId,
99
99
  "planId": planID,
@@ -112,7 +112,7 @@ class IESLabEvaluationResult(object):
112
112
  :return: array类型,代表该方案对应的能效评价结果
113
113
  '''
114
114
  r = request('GET',
115
- "api/ieslab-plan/taskmanager/getEnergyEvaluation",
115
+ f"{self._baseUri}/getEnergyEvaluation",
116
116
  params={
117
117
  "simu_id": self.simulationId,
118
118
  "planId": planID,
@@ -131,7 +131,7 @@ class IESLabEvaluationResult(object):
131
131
  :return: array类型,代表该方案对应的环保评价结果
132
132
  '''
133
133
  r = request('GET',
134
- "api/ieslab-plan/taskmanager/getEnvironmentalEvaluation",
134
+ f"{self._baseUri}/getEnvironmentalEvaluation",
135
135
  params={
136
136
  "simu_id": self.simulationId,
137
137
  "planId": planID,
@@ -140,4 +140,12 @@ class IESLabEvaluationResult(object):
140
140
  result = json.loads(r.text)
141
141
  if len(result['results']) > 0 and len(result['results'][0]['data']) > 0:
142
142
  return result['results'][0]['data']
143
- return []
143
+ return []
144
+
145
+
146
+ class IESLabPlanEvaluationResult(IESLabEvaluationResult):
147
+ _baseUri = 'api/ieslab-plan/taskmanager'
148
+
149
+
150
+ class IESLabOptEvaluationResult(IESLabEvaluationResult):
151
+ _baseUri = 'api/ieslab-opt/taskmanager'
@@ -1,22 +1,24 @@
1
1
  import json
2
2
  from math import fabs
3
3
  from ..utils.httprequests import request
4
+ # from .result import IESResult
4
5
 
5
6
 
6
- class IESLabPlanResult(object):
7
+ class IESLabResult(object):
8
+ _baseUri = ''
7
9
  taskId = None
8
10
 
9
- def __init__(self, simulationId, taskId=None, **kwargs) -> None:
11
+ def __init__(self, simulationId, taskId=None) -> None:
10
12
  """
11
13
  初始化
12
14
  获得taskId
13
15
  """
16
+
14
17
  self.simulationId = simulationId
15
18
  if taskId is not None:
16
19
  self.taskId = taskId
17
20
  else:
18
21
  self.taskId = self.__getLastTask()
19
- pass
20
22
 
21
23
  def __getLastTask(self):
22
24
  '''
@@ -25,7 +27,7 @@ class IESLabPlanResult(object):
25
27
  :return: string 类型
26
28
  '''
27
29
  try:
28
- r=request('GET','api/ieslab-plan/taskmanager/getSimuLastTasks',params={
30
+ r=request('GET',f'{self._baseUri}/getSimuLastTasks',params={
29
31
  'simuid':self.simulationId
30
32
  })
31
33
  result= json.loads(r.text)
@@ -54,7 +56,7 @@ class IESLabPlanResult(object):
54
56
  if self.taskId is None:
55
57
  raise Exception('未开始运行')
56
58
  r = request('GET',
57
- 'api/ieslab-plan/taskmanager/getOptimizationLog',
59
+ f'{self._baseUri}/getOptimizationLog',
58
60
  params={
59
61
  'simuid': self.simulationId,
60
62
  'taskid': self.taskId
@@ -64,14 +66,14 @@ class IESLabPlanResult(object):
64
66
 
65
67
  def GetPlanNum(self):
66
68
  '''
67
- 获取当前result实例对应的优化方案数量
69
+ 获取当前 result 实例对应的优化方案数量
68
70
 
69
71
  :return: int类型,代表优化方案的数量
70
72
  '''
71
73
  if self.taskId is None:
72
74
  raise Exception('未开始运行')
73
75
  r = request('GET',
74
- 'api/ieslab-plan/taskmanager/getOptimizationResult',
76
+ f'{self._baseUri}/getOptimizationResult',
75
77
  params={
76
78
  'simuid': self.simulationId,
77
79
  'taskid': self.taskId,
@@ -84,39 +86,46 @@ class IESLabPlanResult(object):
84
86
  '''
85
87
  获取planID对应的优化方案的基础信息
86
88
 
87
- :param: planID int类型,表示优化方案的ID,数值位于 0~优化方案数量 之间
89
+ :param: planID int 类型,表示优化方案的 ID,数值位于 0~优化方案数量 之间
88
90
 
89
- :return: dict类型,代表该方案的基础信息,包括投资、运行成本、负荷总量等信息
91
+ :return: dict 类型,代表该方案的基础信息,包括投资、运行成本、负荷总量等信息
90
92
  '''
91
93
  if self.taskId is None:
92
94
  raise Exception('未开始运行')
95
+ length = self.GetPlanNum()
96
+ if int(planID) > length:
97
+ raise Exception('计算方案id未产生')
93
98
  r = request('GET',
94
- 'api/ieslab-plan/taskmanager/getOptimizationResult',
99
+ f'{self._baseUri}/getOptimizationResult',
95
100
  params={
96
101
  'simuid': self.simulationId,
97
102
  'taskid': self.taskId,
98
103
  'resultType': 0
99
104
  })
100
105
  data = json.loads(r.text).get('data', [])
101
- result = data[planID].get('data', {}).get('data', [])[0]
102
- header = data[planID].get('data', {}).get('headerDesc', [])
103
- dict_result = {val.get('hearderName', ''): result.get(val.get('key', ''), '') for val in header}
104
- return dict_result
106
+ filtered_data = [item for item in data if item['id'] == planID]
107
+ if filtered_data:
108
+ result = filtered_data[0].get('data', {}).get('data', [])[0]
109
+ header = filtered_data[0].get('data', {}).get('headerDesc', [])
110
+ dict_result = {val.get('hearderName', ''): result.get(val.get('key', ''), '') for val in header}
111
+ return dict_result
112
+ else:
113
+ raise Exception('未查询到该方案id数据')
105
114
 
106
115
 
107
116
  def GetPlanConfiguration(self, planID):
108
117
  '''
109
118
  获取planID对应的优化方案的配置信息
110
119
 
111
- :param: planID int类型,表示优化方案的ID,数值位于 0~优化方案数量 之间
120
+ :param: planID int 类型,表示优化方案的ID,数值位于 0~优化方案数量 之间
112
121
 
113
- :return: dict类型,代表该方案的配置信息,包括每种设备的选型配置、容量配置、成本等相关信息
122
+ :return: dict 类型,代表该方案的配置信息,包括每种设备的选型配置、容量配置、成本等相关信息
114
123
  '''
115
- len = self.GetPlanNum()
116
- if int(planID) > len:
124
+ length = self.GetPlanNum()
125
+ if int(planID) > length:
117
126
  raise Exception('计算方案id未产生')
118
127
  r = request('GET',
119
- 'api/ieslab-plan/taskmanager/getOptimizationResult',
128
+ f'{self._baseUri}/getOptimizationResult',
120
129
  params={
121
130
  'simuid': self.simulationId,
122
131
  'taskid': self.taskId,
@@ -124,10 +133,13 @@ class IESLabPlanResult(object):
124
133
  'resultType': 1
125
134
  })
126
135
  d = json.loads(r.text)
127
- result = {}
128
- for val in d['data']:
129
- result[val['u_name']] = val['data']['data']
130
- return result
136
+ if len(d['data']) == 0:
137
+ raise Exception('未查询到该方案id数据')
138
+ else:
139
+ result = {}
140
+ for val in d['data']:
141
+ result[val['u_name']] = val['data']['data']
142
+ return result
131
143
 
132
144
  def GetComponentResult(self, planID, componentID, typicalDayName=''):
133
145
  '''
@@ -139,11 +151,11 @@ class IESLabPlanResult(object):
139
151
 
140
152
  :return: dict类型,代表该元件在不同典型日下的运行信息
141
153
  '''
142
- len = self.GetPlanNum()
143
- if int(planID) > len:
154
+ length = self.GetPlanNum()
155
+ if int(planID) > length:
144
156
  raise Exception('计算方案id未产生')
145
157
  r = request('GET',
146
- 'api/ieslab-plan/taskmanager/getOptimizationResult',
158
+ f'{self._baseUri}/getOptimizationResult',
147
159
  params={
148
160
  'simuid': self.simulationId,
149
161
  'taskid': self.taskId,
@@ -153,13 +165,45 @@ class IESLabPlanResult(object):
153
165
  'u_name': componentID
154
166
  })
155
167
  d = json.loads(r.text)
156
- dict_result = dict()
157
- for val in d['data']:
158
- for k, v in val.items():
159
- dict_result[k] = v
160
- return dict_result
168
+ if len(d['data']) == 0:
169
+ raise Exception('未查询到该方案id对应的优化方案下componentID对应元件数据')
170
+ else:
171
+ dict_result = dict()
172
+ for val in d['data']:
173
+ for k, v in val.items():
174
+ dict_result[k] = v
175
+ return dict_result
176
+
177
+ def GetEnergyBalanceResult(self, planID, typicalDayName=''):
178
+ '''
179
+ 获取planID对应的优化方案下能量平衡图数据
180
+
181
+ :param: planID int 类型,表示优化方案的ID,数值位于 0~优化方案数量 之间
182
+ :param typicalDayName str 类型,代表典型日的名称
183
+
184
+ :return: dict类型,代表该元件在不同典型日下的运行信息
185
+
186
+ '''
187
+ length = self.GetPlanNum()
188
+ if int(planID) > length:
189
+ raise Exception('计算方案id未产生')
190
+ try:
191
+ r = request('GET',
192
+ f'{self._baseUri}/getOptimizationResult',
193
+ params={
194
+ 'simuid': self.simulationId,
195
+ 'taskid': self.taskId,
196
+ 'resultType': 4,
197
+ 'typicalDay': typicalDayName,
198
+ "planId": planID,
199
+ "u_name": "systemData"
200
+ })
201
+ return json.loads(r.text)
202
+ except:
203
+ raise Exception('运行失败')
204
+
161
205
 
162
- def GetComponentTypiDays(self, planId, componentID):
206
+ def GetComponentTypiDays(self, planID, componentID):
163
207
  '''
164
208
  获取当前result实例对应的优化方案数量
165
209
 
@@ -170,12 +214,15 @@ class IESLabPlanResult(object):
170
214
  '''
171
215
  if self.taskId is None:
172
216
  raise Exception('未开始运行')
217
+ length = self.GetPlanNum()
218
+ if int(planID) > length:
219
+ raise Exception('计算方案id未产生')
173
220
  r = request('GET',
174
- 'api/ieslab-plan/taskmanager/getOptimizationResult',
221
+ f'{self._baseUri}/getOptimizationResult',
175
222
  params={
176
223
  'simuid': self.simulationId,
177
224
  'taskid': self.taskId,
178
- "planId": planId,
225
+ "planId": planID,
179
226
  'u_name': componentID,
180
227
  'resultType': 2
181
228
  })
@@ -188,8 +235,17 @@ class IESLabPlanResult(object):
188
235
 
189
236
  :return: dict 类型
190
237
  '''
191
- r=request('GET','api/ieslab-plan/taskmanager/getSimuLastTasks',params={
238
+ r=request('GET',f'{self._baseUri}/getSimuLastTasks',params={
192
239
  'simuid':self.simulationId
193
240
  })
194
241
  result= json.loads(r.text)
195
242
  return result
243
+
244
+
245
+ class IESLabPlanResult(IESLabResult):
246
+ _baseUri = 'api/ieslab-plan/taskmanager'
247
+
248
+
249
+ class IESLabOptResult(IESLabResult):
250
+ _baseUri = 'api/ieslab-opt/taskmanager'
251
+