From 2878ddf570b1ff0f5875e6c7d232b88a901382b6 Mon Sep 17 00:00:00 2001 From: Sebastiaan la Fleur Date: Wed, 28 Feb 2024 14:33:58 +0100 Subject: [PATCH] 34: Add new Grow workflows. --- .env-template | 2 +- dev-requirements.txt | 4 +-- pyproject.toml | 2 +- requirements.txt | 4 +-- src/grow_worker/worker.py | 10 +++++-- src/grow_worker/worker_types.py | 49 +++++++++++++++++++++++++++++++-- 6 files changed, 59 insertions(+), 12 deletions(-) diff --git a/.env-template b/.env-template index 3aa3d1a..5589359 100644 --- a/.env-template +++ b/.env-template @@ -15,7 +15,7 @@ POSTGRESQL_HOSTNAME=localhost POSTGRESQL_PORT=5432 POSTGRESQL_DATABASE=omotes_celery -# May be grow_optimizer or grow_simulator +# May be grow_optimizer, grow_simulator, grow_optimizer_no_heat_losses, grow_optimizer_no_heat_losses_discounted_capex GROW_TASK_TYPE=grow_optimizer LOG_LEVEL=INFO diff --git a/dev-requirements.txt b/dev-requirements.txt index 4e174ac..574a2fd 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -192,7 +192,7 @@ pyecore==0.12.1 # -c requirements.txt # pyesdl # rtc-tools-heat-network -pyesdl==23.11.1 +pyesdl==24.2 # via # -c requirements.txt # rtc-tools-heat-network @@ -243,7 +243,7 @@ rtc-tools-channel-flow==1.1.2 # via # -c requirements.txt # rtc-tools -rtc-tools-heat-network==0.4.5 +rtc-tools-heat-network==0.4.6 # via # -c requirements.txt # omotes-grow-worker (pyproject.toml) diff --git a/pyproject.toml b/pyproject.toml index fe4aedd..62da3ef 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,7 +24,7 @@ requires-python = ">=3.10" dependencies = [ "python-dotenv ~= 1.0.0", - "rtc-tools-heat-network ~= 0.4.5", + "rtc-tools-heat-network ~= 0.4.6", "omotes-sdk-python ~= 0.0.9" ] diff --git a/requirements.txt b/requirements.txt index 47f04bc..58a8f67 100644 --- a/requirements.txt +++ b/requirements.txt @@ -81,7 +81,7 @@ pyecore==0.12.1 # via # pyesdl # rtc-tools-heat-network -pyesdl==23.11.1 +pyesdl==24.2 # via rtc-tools-heat-network pymoca==0.9.0 # via @@ -107,7 +107,7 @@ rtc-tools==2.6.0a3 # via rtc-tools-heat-network rtc-tools-channel-flow==1.1.2 # via rtc-tools -rtc-tools-heat-network==0.4.5 +rtc-tools-heat-network==0.4.6 # via omotes-grow-worker (pyproject.toml) scipy==1.10.1 # via rtc-tools diff --git a/src/grow_worker/worker.py b/src/grow_worker/worker.py index b239ff1..7aedf2d 100644 --- a/src/grow_worker/worker.py +++ b/src/grow_worker/worker.py @@ -8,9 +8,13 @@ # from celery.signals import after_setup_logger from omotes_sdk.internal.worker.worker import initialize_worker, UpdateProgressHandler -from rtctools_heat_network.workflows import run_end_scenario_sizing -from grow_worker.worker_types import GrowTaskType, GROWProblem, get_problem_type +from grow_worker.worker_types import ( + GrowTaskType, + GROWProblem, + get_problem_type, + get_problem_function, +) logger = logging.getLogger("grow_worker") GROW_TASK_TYPE = GrowTaskType(os.environ.get("GROW_TASK_TYPE")) @@ -41,7 +45,7 @@ def grow_worker_task( f"At {influxdb_host}:{influxdb_port}" ) - solution: GROWProblem = run_end_scenario_sizing( + solution: GROWProblem = get_problem_function(GROW_TASK_TYPE)( get_problem_type(GROW_TASK_TYPE), base_folder=base_folder, esdl_string=base64.encodebytes(input_esdl.encode("utf-8")), diff --git a/src/grow_worker/worker_types.py b/src/grow_worker/worker_types.py index 1f8a36c..33432ed 100644 --- a/src/grow_worker/worker_types.py +++ b/src/grow_worker/worker_types.py @@ -1,9 +1,15 @@ from enum import Enum -from typing import Type, Union +from typing import Type, Union, Callable from rtctools_heat_network.workflows import ( EndScenarioSizingHIGHS, NetworkSimulatorHIGHSWeeklyTimeStep, + EndScenarioSizingStagedHIGHS, + EndScenarioSizingDiscountedHIGHS, +) +from rtctools_heat_network.workflows import ( + run_end_scenario_sizing, + run_end_scenario_sizing_no_heat_losses, ) @@ -13,10 +19,21 @@ class GrowTaskType(Enum): GROW_OPTIMIZER = "grow_optimizer" """Run the Grow Optimizer.""" GROW_SIMULATOR = "grow_simulator" - """Run the Grow simulator.""" + """Run the Grow Simulator.""" + GROW_OPTIMIZER_NO_HEAT_LOSSES = "grow_optimizer_no_heat_losses" + """Run the Grow Optimizer without heat losses.""" + GROW_OPTIMIZER_NO_HEAT_LOSSES_DISCOUNTED_CAPEX = ( + "grow_optimizer_no_heat_losses_discounted_capex" + ) + """Run the Grow Optimizer without heat losses and a discounted CAPEX.""" -GROWProblem = Union[Type[EndScenarioSizingHIGHS], Type[NetworkSimulatorHIGHSWeeklyTimeStep]] +GROWProblem = Union[ + Type[EndScenarioSizingHIGHS], + Type[NetworkSimulatorHIGHSWeeklyTimeStep], + Type[EndScenarioSizingStagedHIGHS], + Type[EndScenarioSizingDiscountedHIGHS], +] def get_problem_type(task_type: GrowTaskType) -> GROWProblem: @@ -30,6 +47,32 @@ def get_problem_type(task_type: GrowTaskType) -> GROWProblem: result = EndScenarioSizingHIGHS elif task_type == GrowTaskType.GROW_SIMULATOR: result = NetworkSimulatorHIGHSWeeklyTimeStep + elif task_type == GrowTaskType.GROW_OPTIMIZER_NO_HEAT_LOSSES: + result = EndScenarioSizingStagedHIGHS + elif task_type == GrowTaskType.GROW_OPTIMIZER_NO_HEAT_LOSSES_DISCOUNTED_CAPEX: + result = EndScenarioSizingDiscountedHIGHS + else: + raise RuntimeError(f"Unknown workflow type, please implement {task_type}") + + return result + + +def get_problem_function( + task_type: GrowTaskType, +) -> Callable[..., GROWProblem]: + """Convert the Grow task type to the Grow function that should be run. + + :param task_type: Grow task type. + :return: Grow problem function. + """ + result: GROWProblem + if task_type in [GrowTaskType.GROW_OPTIMIZER, GrowTaskType.GROW_SIMULATOR]: + result = run_end_scenario_sizing + elif task_type in [ + GrowTaskType.GROW_OPTIMIZER_NO_HEAT_LOSSES, + GrowTaskType.GROW_OPTIMIZER_NO_HEAT_LOSSES_DISCOUNTED_CAPEX, + ]: + result = run_end_scenario_sizing_no_heat_losses else: raise RuntimeError(f"Unknown workflow type, please implement {task_type}")