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