cloudpss 4.5.1a4__py3-none-any.whl → 4.5.3__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 CHANGED
@@ -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','IESLabOpt','__version__','Job','DSLab'
15
+ 'function', 'Project', 'currentJob', 'IESLabSimulation', 'IESLabPlan','IESLabOpt','__version__','Job'
17
16
  ]
18
17
 
19
18
 
cloudpss/job/job.py CHANGED
@@ -202,7 +202,7 @@ class Job(Generic[T]):
202
202
  if receiver is not None:
203
203
  self.__receiver = receiver
204
204
  if self.__receiver is None:
205
- self.__receiver = MessageStreamReceiver(self.output)
205
+ self.__receiver = MessageStreamReceiver(self)
206
206
  self.__receiver.connect(**kwargs)
207
207
  return self.__receiver
208
208
 
@@ -216,7 +216,7 @@ class Job(Generic[T]):
216
216
  if sender is not None:
217
217
  self.__sender = sender
218
218
  if self.__sender is None:
219
- self.__sender = MessageStreamSender(self.input)
219
+ self.__sender = MessageStreamSender(self)
220
220
  self.__sender.connect_legacy(**kwargs)
221
221
  return self.__sender
222
222
 
@@ -259,9 +259,7 @@ class Job(Generic[T]):
259
259
  sender = self.write()
260
260
  if resultType is None:
261
261
  resultType = getResultClass(self.context[0])
262
- self._result= resultType(receiver, sender)
263
-
264
- return self._result
262
+ return resultType(receiver, sender)
265
263
 
266
264
 
267
265
 
@@ -1,9 +1,5 @@
1
- import datetime
2
1
  import logging
3
2
  import sys
4
-
5
- from cloudpss.job.TemplateManager import TemplateManager
6
-
7
3
  from .jobReceiver import JobReceiver
8
4
  import os
9
5
  from urllib.parse import urlparse
@@ -11,6 +7,7 @@ import websocket
11
7
  import pytz
12
8
  import threading
13
9
  import time
10
+
14
11
  utc_tz = pytz.timezone("UTC")
15
12
 
16
13
  from ..utils.IO import IO
@@ -21,30 +18,15 @@ class Message(object):
21
18
  self.id = id
22
19
  self.token = token
23
20
 
24
-
25
-
21
+
26
22
  class MessageStreamReceiver(JobReceiver):
27
- def __init__(self, output):
23
+ def __init__(self, job):
28
24
  super().__init__()
29
- self.id = output
25
+ self.job = job
26
+ self.id =self.job.output
30
27
  self.origin = os.environ.get("CLOUDPSS_API_URL", "https://cloudpss.net/")
31
28
  self.__hasOpen = False
32
- self.templates=TemplateManager()
33
- self.timeOffset=0
34
- self.lastMessageTime=0
35
-
36
-
37
- def updateTime(self,timestamp):
38
- self.lastMessageTime = timestamp
39
-
40
- ## 判断是否到达当前时间点的数据或者消息流结束
41
- def isEnd(self):
42
-
43
- if self.status == 1:
44
- return True
45
- logging.debug('lastMessageTime',self.lastMessageTime)
46
- return (self.lastMessageTime/1000)>=time.time()-self.timeOffset
47
-
29
+
48
30
  def __path(self, from_=None):
49
31
  if self.id is None:
50
32
  raise Exception("id is None")
@@ -57,32 +39,21 @@ class MessageStreamReceiver(JobReceiver):
57
39
 
58
40
  ###下面是兼容Receiver部分功能实现
59
41
  def __on_message_legacy(self, *args, **kwargs):
42
+
60
43
  if type(args[0]) != websocket.WebSocketApp:
61
44
  message = args[0]
62
45
  else:
63
46
  message = args[1]
64
47
  return self.__on_message(message)
48
+
65
49
  def __on_message(self, message):
66
50
 
67
51
  data = IO.deserialize(message, "ubjson")
68
- self.updateTime(data["timestamp"])
69
52
  self.ws.url = self.__path(data["id"])
70
53
  msg = IO.deserialize(data["data"], "ubjson")
71
-
72
- if type(msg) is list:
73
- if len(msg) == 3:
74
- pass
75
-
76
- templateMessage = self.templates.invoke(msg)
77
- # print(templateMessage)
78
- for m in templateMessage:
79
- self.messages.append(m)
80
- return
81
- else:
82
- self.templates.create(msg)
83
- return
84
-
85
54
  self.messages.append(msg)
55
+ if(msg['type']=='terminate'):
56
+ self.close(self.ws)
86
57
  return msg
87
58
 
88
59
 
@@ -130,10 +101,6 @@ class MessageStreamReceiver(JobReceiver):
130
101
 
131
102
  def __on_open(self,ws, *args, **kwargs):
132
103
  self.ws = ws
133
- gmt_format = '%a, %d %b %Y %H:%M:%S GMT'
134
- serverTime = datetime.datetime.strptime(ws.sock.headers['date'],gmt_format)
135
- self.timeOffset = time.time()+time.timezone-serverTime.timestamp()
136
-
137
104
  logging.debug(f"MessageStreamReceiver on_open")
138
105
  self._status = 0
139
106
  self.__hasOpen = True
@@ -161,7 +128,7 @@ class MessageStreamReceiver(JobReceiver):
161
128
 
162
129
 
163
130
  def connect(self):
164
- self._status = 0
131
+ self._status = 1
165
132
  path = self.__path()
166
133
  logging.info(f"receive data from websocket: {path}")
167
134
  self.ws = websocket.WebSocketApp(
@@ -12,9 +12,9 @@ import logging
12
12
 
13
13
 
14
14
  class MessageStreamSender:
15
- def __init__(self, input):
15
+ def __init__(self, job):
16
16
  super().__init__()
17
- self.input = input
17
+ self.job = job
18
18
  self.origin = os.environ.get("CLOUDPSS_API_URL", "https://cloudpss.net/")
19
19
  self.__hasOpen = False
20
20
 
@@ -60,14 +60,14 @@ class MessageStreamSender:
60
60
  同步方法连接ws
61
61
  """
62
62
  self._status = 0
63
- if self.input is None:
63
+ if self.job.input is None:
64
64
  raise Exception("id is None")
65
- if self.input == "00000000-0000-0000-0000-000000000000":
65
+ if self.job.input == "00000000-0000-0000-0000-000000000000":
66
66
  return
67
67
  u = list(urlparse(self.origin))
68
68
  head = "wss" if u[0] == "https" else "ws"
69
69
 
70
- path = head + "://" + str(u[1]) + "/api/streams/token/" + self.input
70
+ path = head + "://" + str(u[1]) + "/api/streams/token/" + self.job.input
71
71
  logging.debug(f"MessageStreamSender data from websocket: {path}")
72
72
 
73
73
  self.ws = websocket.WebSocketApp(
@@ -10,51 +10,49 @@ class IESLabTypicalDayResult(IESResult):
10
10
  IESResult.__init__(self, *args, **kwargs)
11
11
  self.__plotIndex = 0
12
12
  self.__typicalIndex = 0
13
- self.__type_list =['电负荷', '热负荷','冷负荷','总辐射','散射辐射', '直射辐射', '天顶角', '环境温度', '土壤温度', '10m风速', '50m风速', '建筑物高度风速', '风机高度风速']
14
- self.result = {'TypicalMonth': [],'TypicalDay': []}
15
- for i in range(12):
16
- self.result['TypicalMonth'].append({'月份': int, '持续天数': [],'电负荷': [], '热负荷': [],'冷负荷':[],'总辐射': [],'直射辐射': [],'散射辐射': [],'天顶角': [],
17
- '环境温度': [], '土壤温度': [], '建筑物高度风速': [], '风机高度风速': [],'10m风速': [], '50m风速': [] })
13
+ self.__type_list =['总辐射','散射辐射', '直射辐射','天顶角', '环境温度', '湿球温度','土壤温度', '10m风速', '50m风速','电负荷', '热负荷','冷负荷','氢负荷']
14
+ self.__map_load = { 'maxElectricalLoad':'电负荷', 'maxHeatLoad':'热负荷','maxCoolLoad':'冷负荷','maxHydrogenLoad':'氢负荷' }
15
+
16
+ self.result = {'TypicalMonth': [{'月份': int,'持续天数': [],**{key: [] for key in self.__type_list}} for i in range(12)],'TypicalDay': []}
18
17
  def __readPlotResult(self):
19
18
  length = self.getMessageLength()
20
19
  if (length > self.__plotIndex):
21
20
  for num in range(self.__plotIndex, length):# update TypicalMonth
22
21
  val = self.getMessage(num)
23
- if val['type'] == 'plot':
24
- key_list = re.split('-month',val['key'])#分别为类型和月份
25
- # print(key_list)
26
- self.result['TypicalMonth'][int(key_list[1])-1]['月份'] = int(key_list[1])
27
- if key_list[0] in ['总辐射','散射辐射']:#从第一类数据中分析每个月各个典型日的天数
28
- typicalNum = len(val['data']['traces'])
29
- for i in range(typicalNum):
30
- self.result['TypicalMonth'][int(key_list[1])-1]['持续天数'].append(int(re.findall('\d+',val['data']['traces'][i]['name'])[1]))
31
- # 每个月各类型数据的各个典型日的数据,由于部分月份可能没有电冷热负荷,某月的某个典型日可能缺少冷热负荷
32
- for i in range(typicalNum):
33
- self.result['TypicalMonth'][int(key_list[1])-1][key_list[0]].append([])
34
- for i in range(len(val['data']['traces'])):
35
- self.result['TypicalMonth'][int(key_list[1])-1][key_list[0]][int(re.findall('\d+',val['data']['traces'][i]['name'])[0])-1] = copy.deepcopy(val['data']['traces'][i]['y'])
22
+ if val['type'] == 'plot':# 每个月各类型数据的各个典型日的数据,由于部分月份可能没有电冷热负荷,某月的某个典型日可能缺少冷热负荷
23
+ key_re = re.split('-month',val['key'])#格式为:散射辐射-month1,re后分别为类型和月份
24
+ typical_month_m = self.result['TypicalMonth'][int(key_re[1])-1]
25
+ typical_month_m['月份'] = int(key_re[1])
26
+ val_data_traces = val['data']['traces']
27
+ #val['data']['traces'][i]['name']格式为:典型日1-共31天,re正则后[0]为典型日顺序,[1]为持续天数
28
+ typicalNum = int(re.findall('\d+',val_data_traces[-1]['name'])[0])
29
+ for i in range(typicalNum):#取该类型的最后一个典型日顺序,当该类型缺少后排典型日时,小于实际典型日数量
30
+ typical_month_m[key_re[0]].append([])
31
+ if key_re[0] == '环境温度':#各类版本气象数据均有环境温度数据,其典型日数量为实际数量
32
+ typical_month_m['持续天数'].append(int(re.findall('\d+',val_data_traces[i]['name'])[1]))
33
+ # 当前排典型日缺少数据时,该类型数据为空list[];当后排典型日缺少数据时,该类型数据为空
34
+ for i in range(len(val_data_traces)):
35
+ typical_month_m[key_re[0]][int(re.findall('\d+',val_data_traces[i]['name'])[0])-1] = copy.deepcopy(val_data_traces[i]['y'])
36
36
  self.__plotIndex = length
37
37
  # update TypicalDay based on TypicalMonth
38
38
  for m in range(12):
39
- for i in range(len(self.result['TypicalMonth'][m]['持续天数'])):
40
- self.result['TypicalDay'].append({'info':{'typicalDayID': int, 'name': str, 'duration': int, 'maxElectricalLoad': 0.0, 'maxHeatLoad': 0.0, 'maxCoolLoad': 0.0},
41
- 'data': {'电负荷': [], '热负荷': [],'冷负荷':[],'总辐射': [],'直射辐射': [],'散射辐射': [],'天顶角': [],
42
- '环境温度': [], '土壤温度': [], '建筑物高度风速': [], '风机高度风速': [],'10m风速': [], '50m风速': []}})
43
- self.result['TypicalDay'][-1]['info']['typicalDayID'] = self.__typicalIndex
44
- self.result['TypicalDay'][-1]['info']['name'] = str(m+1) + '月典型日' + str(i+1)
45
- self.result['TypicalDay'][-1]['info']['duration'] = self.result['TypicalMonth'][m]['持续天数'][i]
46
- if self.result['TypicalMonth'][m]['电负荷']:
47
- if self.result['TypicalMonth'][m]['电负荷'][i]:
48
- self.result['TypicalDay'][-1]['info']['maxElectricalLoad'] = max(self.result['TypicalMonth'][m]['电负荷'][i])
49
- if self.result['TypicalMonth'][m]['热负荷']:
50
- if self.result['TypicalMonth'][m]['热负荷'][i]:
51
- self.result['TypicalDay'][-1]['info']['maxHeatLoad'] = max(self.result['TypicalMonth'][m]['热负荷'][i])
52
- if self.result['TypicalMonth'][m]['冷负荷']:
53
- if self.result['TypicalMonth'][m]['冷负荷'][i]:
54
- self.result['TypicalDay'][-1]['info']['maxCoolLoad'] = max(self.result['TypicalMonth'][m]['冷负荷'][i])
39
+ typical_month_m = self.result['TypicalMonth'][m]
40
+ typical_month_m_day = len(typical_month_m['持续天数'])
41
+ for i in range(typical_month_m_day):
42
+ self.result['TypicalDay'].append({'info':{'typicalDayID': int, 'name': str, 'duration': int, **{key: 0.0 for key in self.__map_load}},
43
+ 'data': {**{key: [] for key in self.__type_list}}})
44
+ typical_day_index = self.result['TypicalDay'][self.__typicalIndex]
45
+ typical_day_index['info']['typicalDayID'] = self.__typicalIndex
46
+ typical_day_index['info']['name'] = str(m+1) + '月典型日' + str(i+1)
47
+ typical_day_index['info']['duration'] = typical_month_m['持续天数'][i]
48
+ for key,value in self.__map_load.items():
49
+ # 分别处理该典型日无此类型负荷数据,缺少后序典型日,缺少前序典型日的情况
50
+ if typical_month_m.get(value) and i <len(typical_month_m[value]) and len(typical_month_m[value][i]):
51
+ typical_day_index['info'][key] = max(typical_month_m[value][i])
55
52
  for type_i in self.__type_list:
56
- if self.result['TypicalMonth'][m][type_i]:
57
- self.result['TypicalDay'][-1]['data'][type_i] = self.result['TypicalMonth'][m][type_i][i]
53
+ # 某月冷热负荷可能缺少后续典型日数据
54
+ if typical_month_m[type_i] and i < len(typical_month_m[type_i]):
55
+ typical_day_index['data'][type_i] = typical_month_m[type_i][i]
58
56
  self.__typicalIndex += 1
59
57
  def GetTypical(self):
60
58
  '''
@@ -24,6 +24,7 @@ RESULT = {
24
24
  'function/CloudPSS/ieslab-simulation': IESLabSimulationResult,
25
25
  'function/CloudPSS/ieslab-gmm':IESLabTypicalDayResult,
26
26
  'function/CloudPSS/ieslab-optimization': IESResult,
27
+ 'function/CloudPSS/ieslab-gmm-opt':IESLabTypicalDayResult,
27
28
  }
28
29
 
29
30
 
@@ -82,6 +82,7 @@ class Result(object):
82
82
 
83
83
  >>> message= db.getMessagesByType('log')
84
84
  """
85
+
85
86
  result = []
86
87
  for val in self._receiver:
87
88
  if val['type'] == type:
@@ -1,3 +1,4 @@
1
+ import re
1
2
  from .component import Component
2
3
  from typing import Optional
3
4
  import uuid
@@ -140,7 +141,7 @@ class DiagramImplement(object):
140
141
  position["y"] += 5
141
142
  return True
142
143
 
143
- def updateComponent(self, key: str, args: dict) -> bool:
144
+ def updateComponent(self, key: str, **kwargs: dict) -> bool:
144
145
  """
145
146
  更新元件
146
147
 
@@ -150,10 +151,36 @@ class DiagramImplement(object):
150
151
 
151
152
  >>>> diagram.updateComponent(key)
152
153
  """
153
- component = self.cells.get(key)
154
- if not component:
154
+ component = self.cells.get(key,None)
155
+ if component is None:
155
156
  return False
156
- for k, v in self.cells.items():
157
- if k == key:
158
- v.__dict__.update(args)
159
- return True
157
+ for k, v in kwargs.items():
158
+ if component.__dict__.get(k,None) is None:
159
+ raise Exception(f"Component has no attribute {k}")
160
+ if k == 'args' and not isinstance(v, dict):
161
+ raise Exception(f"Component args must be dict")
162
+ if k == 'pins' and not isinstance(v, dict):
163
+ raise Exception(f"Component pins must be dict")
164
+ if k == 'position' and not isinstance(v, dict):
165
+ raise Exception(f"Component position must be dict")
166
+ if k == 'size' and not isinstance(v, dict):
167
+ raise Exception(f"Component size must be dict")
168
+ if k == 'style' and not isinstance(v, dict):
169
+ raise Exception(f"Component style must be dict")
170
+ if k == 'props' and not isinstance(v, dict):
171
+ raise Exception(f"Component props must be dict")
172
+ if k == 'context' and not isinstance(v, dict):
173
+ raise Exception(f"Component context must be dict")
174
+
175
+ if k == 'definition' and not re.match(r'^model/([!()\-.0-9@A-Z\[\]_a-z{}~]{1,240})/([!()\-.0-9@A-Z\[\]_a-z{}~]{1,240})$', v):
176
+ raise Exception(f"Component definition must be in the format of 'model/owner/key'")
177
+
178
+ if k == 'zIndex' and v < 0:
179
+ raise Exception(f"Component zIndex must be greater than 0")
180
+
181
+ if isinstance(v, dict):
182
+ component.__dict__[k].update(v)
183
+ continue
184
+
185
+ component.__dict__[k] = v
186
+
cloudpss/model/model.py CHANGED
@@ -137,7 +137,7 @@ class Model(object):
137
137
  raise ValueError("不存在拓扑实现")
138
138
  return diagramImplement.removeComponent(key)
139
139
 
140
- def updateComponent(self, key, args):
140
+ def updateComponent(self, key, **kwargs):
141
141
  """
142
142
  更新元件实现
143
143
 
@@ -148,7 +148,7 @@ class Model(object):
148
148
  diagramImplement = self.revision.getImplements().getDiagram()
149
149
  if diagramImplement is None:
150
150
  raise ValueError("不存在拓扑实现")
151
- return diagramImplement.updateComponent(key, args)
151
+ return diagramImplement.updateComponent(key, **kwargs)
152
152
 
153
153
 
154
154
  def getComponentsByRid(self, rid: str):
@@ -397,6 +397,7 @@ class Model(object):
397
397
  data = IO.load(filePath, format)
398
398
  return data
399
399
 
400
+
400
401
  @staticmethod
401
402
  def dump(model, file, format="yaml", compress="gzip"):
402
403
  """
cloudpss/runner/result.py CHANGED
@@ -116,6 +116,7 @@ class Result(object):
116
116
 
117
117
  >>> message= result.getMessagesByType('log')
118
118
  """
119
+
119
120
  return self.db.getMessagesByType(type)
120
121
 
121
122
 
cloudpss/runner/runner.py CHANGED
@@ -15,8 +15,7 @@ from .IESLabEvaluationResult import IESLabEvaluationResult, IESLabPlanEvaluation
15
15
  from .IESLabTypicalDayResult import IESLabTypicalDayResult
16
16
  from .storage import Storage
17
17
  from ..utils import request
18
- from typing import TypeVar, Generic
19
- from .DSLabResult import DSLabResult
18
+ from typing import TypeVar, Generic
20
19
  import re
21
20
 
22
21
  RECEIVER = {
@@ -36,10 +35,6 @@ IES_LAB_OPT_RESULT = {
36
35
  'function/ieslab/evaluation': IESLabOptEvaluationResult,
37
36
  }
38
37
 
39
- DS_LAB_RESULT = {
40
- 'function/ieslab/evaluation': DSLabResult
41
- }
42
-
43
38
  RESULT_DB = {
44
39
  'function/CloudPSS/emtp': EMTResult,
45
40
  'function/CloudPSS/emtps': EMTResult,
@@ -245,16 +240,7 @@ class HttpRunner(Runner[T]):
245
240
  if self.__taskId is None:
246
241
  return False
247
242
  return self.result.status() # type: ignore
248
-
249
- class DSLabRunner(Runner[T]):
250
- def __init__(self, job, simulationId, **kwargs):
251
- self.simulationId = simulationId
252
- self.job = job
253
- result = DS_LAB_RESULT.get(job.get('rid', ''), DSLabResult)
254
- self.result: T = result(self.simulationId, **kwargs)
255
243
 
256
- def status(self):
257
- return self.result.status()
258
244
 
259
245
  class HttpOPTRunner(Runner[T]):
260
246
 
cloudpss/utils/IO.py CHANGED
@@ -2,6 +2,7 @@ import io
2
2
  import json
3
3
  import ubjson
4
4
  import yaml
5
+ from yaml.dumper import SafeDumper
5
6
  import gzip
6
7
  import base64
7
8
  import struct
@@ -85,6 +86,7 @@ class IO(object):
85
86
  result = ubjson.dumpb(obj)
86
87
  if format == 'yaml':
87
88
  result = yaml.dump(obj).encode(encoding="utf-8")
89
+
88
90
  if result is None:
89
91
  assert False, 'format not support'
90
92
  if compress == 'gzip':
@@ -104,7 +106,7 @@ class IO(object):
104
106
  if format == 'ubjson':
105
107
  return ubjson.loadb(byt)
106
108
  if format == 'yaml':
107
- return yaml.load(io.BytesIO(byt), Loader=yaml.BaseLoader)
109
+ return yaml.load(io.BytesIO(byt), Loader=yaml.FullLoader)
108
110
  assert False, 'format not support'
109
111
 
110
112
  @staticmethod
@@ -29,7 +29,7 @@ def request(method, uri, baseUrl=None, params={}, token=None, **kwargs):
29
29
  del kwargs['xToken']
30
30
 
31
31
  r = requests.request(method, url, params=params, headers=headers, **kwargs)
32
-
32
+
33
33
  if (uri.startswith('graphql')):
34
34
  if 'X-Cloudpss-Version' not in r.headers:
35
35
  raise Exception(
cloudpss/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = '4.5.1-alpha.4'
1
+ __version__ = '4.5.3'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cloudpss
3
- Version: 4.5.1a4
3
+ Version: 4.5.3
4
4
  Summary: cloudpss sdk
5
5
  Home-page: https://www.cloudpss.net
6
6
  Author: cloudpss
@@ -1,6 +1,6 @@
1
- cloudpss/__init__.py,sha256=xnA-UjehYOzH6KV7vOXHwdbGEiw6g_OPKzrbZA9Fuc8,858
1
+ cloudpss/__init__.py,sha256=1RNmUBhoxYUutZiTS-XJ9yBoNGGh8Mpt1uY6ETlSBDc,825
2
2
  cloudpss/verify.py,sha256=KF4Gd59DGvCyIEkRD7rNnekWw22XxJpi3DW6keb6j4c,1498
3
- cloudpss/version.py,sha256=eGA062vl8AmZfcIp-LER6wH9XoJb0sNElWP_UI1RVzg,30
3
+ cloudpss/version.py,sha256=Qwf2PqCgwNBpHE5DrBEwfOiFsFvEpa01UTldrgQkx9Q,22
4
4
  cloudpss/asyncio/__init__.py,sha256=CJGopQl_vz3z3fJsK7NjMX5uzkzfrJrbqKVhyYqlYWc,198
5
5
  cloudpss/asyncio/job/__init__.py,sha256=3UIFZYjJTzuckM61o8kim1c3PWt2SSHTL72jrGu5IzI,51
6
6
  cloudpss/asyncio/job/job.py,sha256=Bn2BEERw1J8YarFauTzVrGJK7nmaoMsdlrFUqiHRth4,3897
@@ -34,25 +34,25 @@ cloudpss/ieslab/__init__.py,sha256=gr1rXYw9vIAGOe60eg7LyMHP7QDXvNf4dJ5GTR_kj1Y,2
34
34
  cloudpss/job/TemplateCompiler.py,sha256=MuJDTQ54wRo5bGSvBJBJjXJ7u463dwpRkaLwIwm_hLE,9936
35
35
  cloudpss/job/TemplateManager.py,sha256=uOvctmE3P17aGWt_26d940FbRUSEs6iovFBb8T5xjd4,1115
36
36
  cloudpss/job/__init__.py,sha256=3UIFZYjJTzuckM61o8kim1c3PWt2SSHTL72jrGu5IzI,51
37
- cloudpss/job/job.py,sha256=pV-J0VBnyExIabzt2hMnIvLFdowWz-QT0DuR80Gv9AE,8297
37
+ cloudpss/job/job.py,sha256=ciphBMfRkIK1bvZ1zrbuISojXiixoNwQRlCzfEVWOa8,8240
38
38
  cloudpss/job/jobReceiver.py,sha256=PNYxcN33LiXZVyc4tzhPlpWxKnyWO_ElKjJ9wsxsroI,925
39
- cloudpss/job/messageStreamReceiver.py,sha256=JtS-p0ka8eVVyG4I00G_A4Vu_uI-l3TfBrX_Fhojxow,5269
40
- cloudpss/job/messageStreamSender.py,sha256=QQO6XtoZNLiUJXeSZmim-XFDBrb9i-JAjMPHKXcscZA,2365
39
+ cloudpss/job/messageStreamReceiver.py,sha256=VvrDewFjiZxMHZJUoMh2_CYC1bmcztY1TrNx0WSsQIU,4133
40
+ cloudpss/job/messageStreamSender.py,sha256=MCgMP6Epgu2md_rhZhHeGv8q8sObF_wHfL3WpANoreM,2371
41
41
  cloudpss/job/result/EMTResult.py,sha256=xC9ws7bH-2nhpF8lqzZLqcOL-IcYS-JeBboEHgX96wk,6941
42
42
  cloudpss/job/result/IESLabSimulationResult.py,sha256=a47Ic1vvfHTK_vEokOZxJBnQReqYOWux_aePPic_Hrs,84
43
- cloudpss/job/result/IESLabTypicalDayResult.py,sha256=0u8FrxDUpujJvCWRk4jRtHzw-WHmvPR38nKj6-iccw4,7827
43
+ cloudpss/job/result/IESLabTypicalDayResult.py,sha256=YugatJHMqLGhSHXFhoorVzcGgEk8dH3dUyGLRsCIhqk,7452
44
44
  cloudpss/job/result/IESResult.py,sha256=TLMTlDuvTUWnsJSUxXt8XTlXZGaVPmxZwia_JOcej88,3852
45
45
  cloudpss/job/result/PowerFlowResult.py,sha256=KoImlmsEEZyMriuoE_MSHBQu4k9MSDUuZ8E2SRLndWE,2097
46
- cloudpss/job/result/__init__.py,sha256=irh05EkRXewQz_khP5Da0h_GoNBE5Biyx_ycoXnI7Is,1502
47
- cloudpss/job/result/result.py,sha256=mWt4HyrI0y-l97Q8tcAiMyW9lm0timgxaRerLXPnefk,4280
46
+ cloudpss/job/result/__init__.py,sha256=6zpp_s3Mcdi__FVfrBNLXw4Ee5ZBNgoZuYPJ8cqbj-c,1566
47
+ cloudpss/job/result/result.py,sha256=kNAQ0X605pKRVFZ0FGULZn177zoPCrMeXLE7eCAVjFA,4282
48
48
  cloudpss/model/__init__.py,sha256=SNq-bfwcQtDHtTNBYppfUEs8wkjfrQfGeywx7igmvOs,151
49
49
  cloudpss/model/jobDefinitions.py,sha256=uuTwpqStlg3YDmfxbU2PVi_Tf18opa0kYLCMGaOP-qA,3749
50
- cloudpss/model/model.py,sha256=gYMBf_jspoRSwb0QgARvJGXVtDlaQvQjp_B9QMYvXwE,27170
50
+ cloudpss/model/model.py,sha256=hS64Tb6JJvLDaCi4mBPUGbXvmzc-nQxlHtnh7OQpreo,27179
51
51
  cloudpss/model/revision.py,sha256=IFznBKirwpfqadyCNJWPGL7lTpQxbCmU1fxdI5AvoA4,4002
52
52
  cloudpss/model/topology.py,sha256=tKaOACAw9r9SppgxrhK-ZjMsG_jGLiNOzPnlIPLo964,2333
53
53
  cloudpss/model/implements/__init__.py,sha256=88L_wF9SSzxsbtqwStWIPH4LxaKq7TVcssHQ62YBnls,67
54
54
  cloudpss/model/implements/component.py,sha256=uNSpkZKChdXLiO40Ev4P3oQ1di2Hu4YjcBOb0I8Bf0c,734
55
- cloudpss/model/implements/diagram.py,sha256=25g40EhqcFsqNeTQYEG2mqxV_oG0B0kb3xT_NvN7ia8,4582
55
+ cloudpss/model/implements/diagram.py,sha256=ILBq7oZVb2ZThmm_HdwGmGX0sZPwetoT4SSVN0xFqzo,6053
56
56
  cloudpss/model/implements/implement.py,sha256=Uld96tjXVDbVUNV8xscyy_nZWLHr3iP2DqA6S3p-XJE,954
57
57
  cloudpss/project/__init__.py,sha256=fpskY-cJGmMcTg1naVzNPtJaRG1xmSc2CFjDTin64Cw,51
58
58
  cloudpss/project/project.py,sha256=uFhOnM8ngo1_ZYz2uArtORKZquYNdOIVLXU_q1MDFI4,17698
@@ -63,18 +63,18 @@ cloudpss/runner/IESLabTypicalDayResult.py,sha256=-9D0TRsXEYJIgGKYFPZHjR7URyPypN7
63
63
  cloudpss/runner/MessageStreamReceiver.py,sha256=dT-rKslQbRt3bMTGXupa1YrocHl2zTWOCHlsXcbgfhs,2812
64
64
  cloudpss/runner/__init__.py,sha256=FxiYYmssbZgRjieySzi43yPiWEF6eNos2UsoFQeD2H8,341
65
65
  cloudpss/runner/receiver.py,sha256=QU0RsbCt0EK7sCLHzfj8_QQsuPNfqXxpZi5JKm6roxA,4162
66
- cloudpss/runner/result.py,sha256=Q8RcfUnvilxPo6yvtjH6dXePaCqrBjQCljur3rem2pU,13290
67
- cloudpss/runner/runner.py,sha256=DPMiG_M-baWUAX7o9vL7p_Zr-r9nnTky5OYjig_yenU,9613
66
+ cloudpss/runner/result.py,sha256=GFpd7848gsLRuzhVcWbCwmAjR84Lhik_3pNCjOV8VOY,13291
67
+ cloudpss/runner/runner.py,sha256=pfidTchkoVTFUB9pUmZn9ulVDag9DLGo0pIxsD-nRu0,9168
68
68
  cloudpss/runner/storage.py,sha256=zFET_zwPIOF2Cnh9sgFiS0HFxV1OmVsU34bGUQ6PpkA,4162
69
69
  cloudpss/runner/transform.py,sha256=krOgTZiJSJAb5QSwerAqlbC4Ma0PKi__0WOZlAxw4O8,11613
70
- cloudpss/utils/IO.py,sha256=sm6p53AFgE1b56Bh0qt_E2TFP5tLr0WQDzIVRlsNgFA,5321
70
+ cloudpss/utils/IO.py,sha256=FsFp3V8I1-P0YiBGmjKwbMalBrVKMHUxTjFZFOtv0CQ,5357
71
71
  cloudpss/utils/__init__.py,sha256=jWVHSOqJQWU0fpg2UbWSEQoLCb2Uys-vH5Uqkb0ihNA,326
72
72
  cloudpss/utils/dataEncoder.py,sha256=5PUPb844eOGgFnYrMM8bdjdKH_MZz0lk-67uo8TvwEo,885
73
73
  cloudpss/utils/graphqlUtil.py,sha256=zGEhRZvy5JMipFKFxjDmbc-HQP3aPZ5noDwi-RTXWSk,280
74
- cloudpss/utils/httprequests.py,sha256=KYE8iIqaBEN6gTdxFgUyvdKf3kbSizxxgmNN8_1BQjQ,1850
74
+ cloudpss/utils/httprequests.py,sha256=ZcCwS2KM7y2TwWTo0YRLNJVozih4h0F5ignn-CeBREU,1846
75
75
  cloudpss/utils/matlab.py,sha256=SLwVt790BjklJK2XNELt9R2n_1ej9Y8QsTIdFkKXLWE,795
76
76
  cloudpss/utils/yamlLoader.py,sha256=bv_vPDK_e0n_vZ5FwpDJ_NJWqMAwfU3AbhkvQIxPCy4,2677
77
- cloudpss-4.5.1a4.dist-info/METADATA,sha256=w_5acTa5b8_g4khe4TZB2P00TwOfowToLtpDNIkiu7E,2403
78
- cloudpss-4.5.1a4.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
79
- cloudpss-4.5.1a4.dist-info/top_level.txt,sha256=wS9qPU4-aWM9ouzMOx34Nlq-GkdQKpr9vBskwut1BD8,9
80
- cloudpss-4.5.1a4.dist-info/RECORD,,
77
+ cloudpss-4.5.3.dist-info/METADATA,sha256=85B-9dgbPdsSS961DOPKWRoKeYn-8nYA2JJkSJRAJzM,2401
78
+ cloudpss-4.5.3.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
79
+ cloudpss-4.5.3.dist-info/top_level.txt,sha256=wS9qPU4-aWM9ouzMOx34Nlq-GkdQKpr9vBskwut1BD8,9
80
+ cloudpss-4.5.3.dist-info/RECORD,,