cloudpss 3.5.0a1__tar.gz → 4.0.0a3__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.
Files changed (60) hide show
  1. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/PKG-INFO +1 -1
  2. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/__init__.py +5 -4
  3. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/ieslab/DataManageModel.py +5 -5
  4. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/ieslab/EvaluationModel.py +12 -6
  5. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/ieslab/IESLabPlan.py +19 -6
  6. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/ieslab/IESLabSimulation.py +2 -0
  7. cloudpss-4.0.0a3/cloudpss/ieslab/PlanModel.py +143 -0
  8. cloudpss-4.0.0a3/cloudpss/ieslab/__init__.py +4 -0
  9. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/model/jobDefinitions.py +34 -0
  10. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/model/model.py +94 -18
  11. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/model/revision.py +2 -3
  12. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/runner/IESLabEvaluationResult.py +27 -22
  13. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/runner/IESLabPlanResult.py +57 -10
  14. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/runner/IESLabTypicalDayResult.py +12 -9
  15. cloudpss-4.0.0a3/cloudpss/runner/__init__.py +8 -0
  16. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/runner/receiver.py +0 -2
  17. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/runner/result.py +1 -1
  18. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/runner/runner.py +35 -103
  19. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/utils/__init__.py +1 -5
  20. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/utils/graphqlUtil.py +0 -1
  21. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/utils/httprequests.py +10 -11
  22. cloudpss-4.0.0a3/cloudpss/utils/yamlLoader.py +81 -0
  23. cloudpss-4.0.0a3/cloudpss/version.py +1 -0
  24. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss.egg-info/PKG-INFO +1 -1
  25. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss.egg-info/SOURCES.txt +4 -3
  26. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss.egg-info/requires.txt +0 -1
  27. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/setup.py +2 -2
  28. cloudpss-4.0.0a3/test/test.py +29 -0
  29. cloudpss-4.0.0a3/test/testSend.py +39 -0
  30. cloudpss-4.0.0a3/test/test_in_new_web_1.py +118 -0
  31. cloudpss-3.5.0a1/cloudpss/ieslab/PlanModel.py +0 -94
  32. cloudpss-3.5.0a1/cloudpss/ieslab/__init__.py +0 -3
  33. cloudpss-3.5.0a1/cloudpss/runner/MessageStreamReceiver.py +0 -193
  34. cloudpss-3.5.0a1/cloudpss/runner/__init__.py +0 -10
  35. cloudpss-3.5.0a1/cloudpss/utils/IO.py +0 -153
  36. cloudpss-3.5.0a1/cloudpss/utils/yamlLoader.py +0 -80
  37. cloudpss-3.5.0a1/test/test.py +0 -74
  38. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/README.md +0 -0
  39. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/function/__init__.py +0 -0
  40. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/function/function.py +0 -0
  41. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/function/functionExecution.py +0 -0
  42. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/function/job.py +0 -0
  43. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/model/__init__.py +0 -0
  44. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/model/implements/__init__.py +0 -0
  45. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/model/implements/component.py +0 -0
  46. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/model/implements/diagram.py +0 -0
  47. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/model/implements/implement.py +0 -0
  48. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/model/topology.py +0 -0
  49. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/project/__init__.py +0 -0
  50. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/project/project.py +0 -0
  51. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/runner/storage.py +0 -0
  52. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/runner/transform.py +0 -0
  53. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/utils/dataEncoder.py +0 -0
  54. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/utils/matlab.py +0 -0
  55. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss/verify.py +0 -0
  56. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss.egg-info/dependency_links.txt +0 -0
  57. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/cloudpss.egg-info/top_level.txt +0 -0
  58. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/setup.cfg +0 -0
  59. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/test/test-sdk.py +0 -0
  60. {cloudpss-3.5.0a1 → cloudpss-4.0.0a3}/test/test-snapshot.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cloudpss
3
- Version: 3.5.0a1
3
+ Version: 4.0.0a3
4
4
  Summary: cloudpss sdk
5
5
  Home-page: https://www.cloudpss.net
6
6
  Author: cloudpss
@@ -6,18 +6,19 @@ 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 .function import FunctionExecution
10
9
 
10
+ from .function import FunctionExecution
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__'
15
16
  ]
16
- __version__ = '3.5.0-alpha.1'
17
+
17
18
 
18
19
 
19
20
  def currentJob():
20
21
  """
21
22
  获取当前的 currentExecution 实例
22
23
  """
23
- return FunctionExecution.current()
24
+ return FunctionExecution.current()
@@ -146,19 +146,19 @@ class DataManageModel(object):
146
146
  if r['timeid'] is not None:
147
147
  del r['timeid']
148
148
  try:
149
- ret = self._saveItemData(self._kindUrlMap[kind], r)
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].append(dataList)
157
- return dataList[len(dataList) - 1]['id']
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].append(dataList)
161
- return dataList[len(dataList) - 1]['id']
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 GetFinancialParas(self, planID):
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": 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=type)
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'] != 'job-definition/ies/ies-gmm' or job['rid'] != 'job-definition/cloudpss/ieslab-gmm':
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 job['rid'] == 'job-definition/cloudpss/ieslab-gmm':
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'] != 'job-definition/ies/ies-gmm'or job['rid'] != 'job-definition/cloudpss/ieslab-gmm':
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,4 @@
1
+ from .IESLabSimulation import IESLabSimulation
2
+ from .IESLabPlan import IESLabPlan
3
+ from .PlanModel import OptimizationMode
4
+ __all__ = ['IESLabSimulation','IESLabPlan', 'OptimizationMode']
@@ -112,5 +112,39 @@ JOB_DEFINITIONS = {
112
112
  "SkipPF": "0",
113
113
  "MaxIteration": "30"
114
114
  }
115
+ },
116
+ "iesLoadPrediction": {
117
+ "name": "负荷预测方案 1",
118
+ "rid": "job-definition/ies/ies-load-prediction",
119
+ "arcs": {
120
+ "startTime": "2022 -01-01 00:00:00",
121
+ "endTime": "2022 -12-31 23:00:00",
122
+ "layer_forcast": "0",
123
+ "forcast_algorithm": "0",
124
+ "ratio_sub": [],
125
+ "ratio_feeder": [],
126
+ "ratio_trans": []
127
+ }
128
+ },
129
+ "iesPowerFlow": {
130
+ "name": "时序潮流方案 1",
131
+ "rid": "job-definition/ies/ies-power-flow",
132
+ "arcs": {
133
+ "startTime": "2022 -01-01 00:00:00",
134
+ "endTime": "2022 -12-31 23:00:00",
135
+ "solveMethod": "0",
136
+ "maxIteration": "30"
137
+ }
138
+ },
139
+ "iesEnergyStoragePlan": {
140
+ "name": "储能规划方案 1",
141
+ "rid": "job-definition/ies/ies-energy-storage-plan",
142
+ "arcs": {
143
+ "Planyear": "15",
144
+ "NetConfig": [],
145
+ "SourceConfig": [],
146
+ "LoadConfig": []
147
+ }
115
148
  }
149
+
116
150
  }
@@ -11,8 +11,8 @@ from .jobDefinitions import JOB_DEFINITIONS
11
11
  from ..utils import request, fileLoad, graphql_request
12
12
  from ..verify import userName
13
13
 
14
- from cloudpss.runner.result import PowerFlowResult, EMTResult, Result, IESResult
15
- from cloudpss.runner.runner import Runner
14
+ from cloudpss.runner.result import PowerFlowResult, EMTResult, Result, IESResult
15
+ from cloudpss.runner.runner import Runner
16
16
 
17
17
 
18
18
  class Model(object):
@@ -46,12 +46,7 @@ class Model(object):
46
46
  """
47
47
  for k, v in model.items():
48
48
  if k == 'revision':
49
- if 'version' in v and v['version'] == 3:
50
- self.revision = ModelRevision(v)
51
- else:
52
- raise Exception(
53
- '当前SDK版本(ver 3.X.X)不兼容该项目文件,请先升级项目文件。具体方法:将该项目文件导入至XStudio 3.X.X平台后重新保存至本地后即可。'
54
- )
49
+ self.revision = ModelRevision(v)
55
50
 
56
51
  else:
57
52
  self.__dict__[k] = v
@@ -297,7 +292,7 @@ class Model(object):
297
292
  raise Exception(data['errors'][0]['message'])
298
293
  return Model(data['data']['model'])
299
294
 
300
- def run(self, job=None, config=None, name=None, policy=None, **kwargs):
295
+ def run(self, job=None, config=None, name=None, **kwargs):
301
296
  """
302
297
 
303
298
  调用仿真
@@ -318,7 +313,7 @@ class Model(object):
318
313
  if config is None:
319
314
  currentConfig = self.context['currentConfig']
320
315
  config = self.configs[currentConfig]
321
- return self.revision.run(job, config, name, self.rid, policy, **kwargs)
316
+ return self.revision.run(job, config, name, self.rid, **kwargs)
322
317
 
323
318
  def iesSimulationRun(self, job=None, config=None, name=None, **kwargs):
324
319
  return self.run(job=job, config=config, name=name, kwargs=kwargs)
@@ -490,6 +485,13 @@ class Model(object):
490
485
  auth = (65539 if publicRead else 65537) if isPublic else 0
491
486
  revision = ModelRevision.create(model.revision, model.revision.hash)
492
487
 
488
+ xVersion = int(os.environ.get('X_CLOUDPSS_VERSION', 4))
489
+ tags= {
490
+ "replace":model.tags
491
+ }
492
+ if xVersion==3:
493
+ tags=model.tags
494
+
493
495
  return graphql_request(
494
496
  modelQuery, {
495
497
  'a': {
@@ -500,7 +502,7 @@ class Model(object):
500
502
  'jobs': model.jobs,
501
503
  'name': model.name,
502
504
  'description': model.description,
503
- 'tags': model.tags,
505
+ 'tags': tags,
504
506
  "permissions": {
505
507
  "moderator": 1,
506
508
  "member": 1,
@@ -536,10 +538,10 @@ class Model(object):
536
538
  currentConfig = self.context['currentConfig']
537
539
  config = self.configs[currentConfig]
538
540
  return self.revision.fetchTopology(implementType, config,
539
- maximumDepth)
541
+ maximumDepth)
540
542
  return None
541
543
 
542
- def runEMT(self, job=None, config=None) -> Runner[EMTResult]:
544
+ def runEMT(self,job=None,config=None)->Runner[EMTResult]:
543
545
  '''
544
546
  运行 emtp 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
545
547
 
@@ -564,7 +566,7 @@ class Model(object):
564
566
  config = self.configs[currentConfig]
565
567
  return self.run(job=job, config=config)
566
568
 
567
- def runSFEMT(self, job=None, config=None) -> Runner[EMTResult]:
569
+ def runSFEMT(self,job=None,config=None)->Runner[EMTResult]:
568
570
  '''
569
571
  运行 移频电磁暂态 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
570
572
 
@@ -589,7 +591,7 @@ class Model(object):
589
591
  config = self.configs[currentConfig]
590
592
  return self.run(job=job, config=config)
591
593
 
592
- def runPowerFlow(self, job=None, config=None) -> Runner[PowerFlowResult]:
594
+ def runPowerFlow(self,job=None,config=None)->Runner[PowerFlowResult]:
593
595
  '''
594
596
  运行 潮流 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
595
597
 
@@ -614,9 +616,7 @@ class Model(object):
614
616
  config = self.configs[currentConfig]
615
617
  return self.run(job=job, config=config)
616
618
 
617
- def runThreePhasePowerFlow(self,
618
- job=None,
619
- config=None) -> Runner[PowerFlowResult]:
619
+ def runThreePhasePowerFlow(self,job=None,config=None)->Runner[PowerFlowResult]:
620
620
  '''
621
621
  运行 三相不平衡潮流 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
622
622
 
@@ -640,3 +640,79 @@ class Model(object):
640
640
  currentConfig = self.context['currentConfig']
641
641
  config = self.configs[currentConfig]
642
642
  return self.run(job=job, config=config)
643
+
644
+ def runIESLoadPrediction(self,job=None,config=None)->Runner[IESResult]:
645
+ '''
646
+ 运行 负荷预测方案 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
647
+
648
+ :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
649
+ :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
650
+
651
+ :return: runner Runner[IESResult]
652
+ '''
653
+ if job is None:
654
+ currentJob = self.context['currentJob']
655
+ job = self.jobs[currentJob]
656
+ if job['rid'] != 'job-definition/ies/ies-load-prediction':
657
+ for j in self.jobs:
658
+ if j['rid'] == 'job-definition/ies/ies-load-prediction':
659
+ job = j
660
+ if job is None:
661
+ raise Exception("找不到负荷预测方案内核运行的计算方案")
662
+ if job['rid'] != 'job-definition/ies/ies-load-prediction':
663
+ raise Exception("不是负荷预测方案内核运行生成算法的计算方案")
664
+ if config is None:
665
+ currentConfig = self.context['currentConfig']
666
+ config = self.configs[currentConfig]
667
+ return self.run(job=job, config=config)
668
+
669
+ def runIESPowerFlow(self,job=None,config=None)->Runner[IESResult]:
670
+ '''
671
+ 运行 时序潮流方案 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
672
+
673
+ :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
674
+ :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
675
+
676
+ :return: runner Runner[IESResult]
677
+ '''
678
+ if job is None:
679
+ currentJob = self.context['currentJob']
680
+ job = self.jobs[currentJob]
681
+ if job['rid'] != 'job-definition/ies/ies-power-flow':
682
+ for j in self.jobs:
683
+ if j['rid'] == 'job-definition/ies/ies-power-flow':
684
+ job = j
685
+ if job is None:
686
+ raise Exception("找不到时序潮流方案内核运行的计算方案")
687
+ if job['rid'] != 'job-definition/ies/ies-power-flow':
688
+ raise Exception("不是时序潮流方案内核运行生成算法的计算方案")
689
+ if config is None:
690
+ currentConfig = self.context['currentConfig']
691
+ config = self.configs[currentConfig]
692
+ return self.run(job=job, config=config)
693
+
694
+ def runIESEnergyStoragePlan(self,job=None,config=None)->Runner[IESResult]:
695
+ '''
696
+ 运行 储能规划方案 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
697
+
698
+ :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
699
+ :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
700
+
701
+ :return: runner Runner[IESResult]
702
+ '''
703
+ if job is None:
704
+ currentJob = self.context['currentJob']
705
+ job = self.jobs[currentJob]
706
+ if job['rid'] != 'job-definition/ies/ies-energy-storage-plan':
707
+ for j in self.jobs:
708
+ if j['rid'] == 'job-definition/ies/ies-energy-storage-plan':
709
+ job = j
710
+ if job is None:
711
+ raise Exception("找不到储能规划方案内核运行的计算方案")
712
+ if job['rid'] != 'job-definition/ies/ies-energy-storage-plan':
713
+ raise Exception("不是储能规划方案内核运行生成算法的计算方案")
714
+ if config is None:
715
+ currentConfig = self.context['currentConfig']
716
+ config = self.configs[currentConfig]
717
+ return self.run(job=job, config=config)
718
+
@@ -21,7 +21,6 @@ class ModelRevision(object):
21
21
 
22
22
 
23
23
  """
24
-
25
24
  def __init__(self, revision: dict = {}):
26
25
  """
27
26
  初始化
@@ -55,7 +54,7 @@ class ModelRevision(object):
55
54
 
56
55
  return self.implements
57
56
 
58
- def run(self, job, config, name=None, rid='', policy=None, **kwargs):
57
+ def run(self, job, config, name=None, rid='', **kwargs):
59
58
  """
60
59
  运行某个指定版本的项目
61
60
 
@@ -69,7 +68,7 @@ class ModelRevision(object):
69
68
  >>> revision.run(revision,job,config,'')
70
69
  """
71
70
  revision = ModelRevision.create(self)
72
- return Runner.create(revision['hash'], job, config, name, rid, policy,
71
+ return Runner.create(revision['hash'], job, config, name, rid,
73
72
  **kwargs)
74
73
 
75
74
  @staticmethod