Skip to content

Commit 62daf8c

Browse files
committed
chore: add process service for registration
1 parent c3212ae commit 62daf8c

7 files changed

Lines changed: 181 additions & 81 deletions

File tree

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from uuid import UUID
2+
3+
4+
class EcalcComponent:
5+
def __init__(self, id: UUID, name: str, type: str):
6+
self.id = id
7+
self.name = name
8+
self.type = type
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from abc import ABC, abstractmethod
2+
from uuid import UUID
3+
4+
from libecalc.common.time_utils import Period
5+
from libecalc.domain.ecalc_component import EcalcComponent
6+
from libecalc.domain.process.compressor.core.base import CompressorModel, CompressorWithTurbineModel
7+
from libecalc.domain.process.compressor.core.sampled import CompressorModelSampled
8+
from libecalc.domain.process.evaluation_input import CompressorEvaluationInput, PumpEvaluationInput
9+
from libecalc.domain.process.pump.pump import PumpModel
10+
from libecalc.presentation.yaml.domain.ecalc_components import ProcessSystemComponent, SimplifiedProcessUnitComponent
11+
12+
13+
class ProcessService(ABC):
14+
@abstractmethod
15+
def register_process_system(
16+
self,
17+
ecalc_component: EcalcComponent,
18+
process_system: CompressorModel,
19+
evaluation_input: CompressorEvaluationInput,
20+
): ...
21+
22+
@abstractmethod
23+
def register_simplified_process_unit(
24+
self,
25+
ecalc_component: EcalcComponent,
26+
simplified_process_unit: CompressorModelSampled | PumpModel | CompressorWithTurbineModel,
27+
evaluation_input: CompressorEvaluationInput | PumpEvaluationInput,
28+
): ...
29+
30+
@abstractmethod
31+
def map_model_to_consumer(
32+
self,
33+
consumer_id: UUID,
34+
period: Period,
35+
ecalc_component: ProcessSystemComponent | SimplifiedProcessUnitComponent,
36+
): ...
37+
38+
@abstractmethod
39+
def get_evaluation_input(self, process_system_id: UUID) -> CompressorEvaluationInput | PumpEvaluationInput: ...
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
from uuid import UUID
2+
3+
from libecalc.common.time_utils import Period
4+
from libecalc.domain.ecalc_component import EcalcComponent
5+
from libecalc.domain.process.compressor.core.base import CompressorModel, CompressorWithTurbineModel
6+
from libecalc.domain.process.compressor.core.sampled import CompressorModelSampled
7+
from libecalc.domain.process.compressor.core.train.base import CompressorTrainModel
8+
from libecalc.domain.process.evaluation_input import CompressorEvaluationInput, PumpEvaluationInput
9+
from libecalc.domain.process.process_service import ProcessService
10+
from libecalc.domain.process.pump.pump import PumpModel
11+
from libecalc.presentation.yaml.domain.ecalc_components import ProcessSystemComponent, SimplifiedProcessUnitComponent
12+
13+
14+
class DefaultProcessService(ProcessService):
15+
def __init__(self):
16+
self._process_systems: dict[UUID, CompressorTrainModel] = {}
17+
self._simplified_process_units: dict[UUID, CompressorModelSampled | PumpModel | CompressorWithTurbineModel] = {}
18+
self._evaluation_inputs: dict[UUID, CompressorEvaluationInput | PumpEvaluationInput] = {}
19+
self._consumer_to_model_map: dict[tuple[UUID, Period], UUID] = {}
20+
self._ecalc_components: dict[UUID, EcalcComponent] = {}
21+
22+
@property
23+
def evaluation_inputs(self) -> dict[UUID, CompressorEvaluationInput | PumpEvaluationInput]:
24+
return self._evaluation_inputs
25+
26+
@property
27+
def process_systems(self) -> dict[UUID, CompressorTrainModel]:
28+
return self._process_systems
29+
30+
@property
31+
def simplified_process_units(self) -> dict[UUID, CompressorModelSampled | PumpModel | CompressorWithTurbineModel]:
32+
return self._simplified_process_units
33+
34+
@property
35+
def ecalc_components(self) -> dict[UUID, EcalcComponent]:
36+
return self._ecalc_components
37+
38+
@property
39+
def consumer_to_model_map(self) -> dict[tuple[UUID, Period], UUID]:
40+
return self._consumer_to_model_map
41+
42+
def register_process_system(
43+
self,
44+
ecalc_component: EcalcComponent,
45+
process_system: CompressorModel,
46+
evaluation_input: CompressorEvaluationInput,
47+
):
48+
self._ecalc_components[ecalc_component.id] = ecalc_component
49+
self.process_systems[ecalc_component.id] = process_system
50+
self.evaluation_inputs[ecalc_component.id] = evaluation_input
51+
52+
def register_simplified_process_unit(
53+
self,
54+
ecalc_component: EcalcComponent,
55+
simplified_process_unit: CompressorModelSampled | PumpModel | CompressorWithTurbineModel,
56+
evaluation_input: CompressorEvaluationInput | PumpEvaluationInput,
57+
):
58+
self._ecalc_components[ecalc_component.id] = ecalc_component
59+
self.simplified_process_units[ecalc_component.id] = simplified_process_unit
60+
self.evaluation_inputs[ecalc_component.id] = evaluation_input
61+
62+
def map_model_to_consumer(
63+
self,
64+
consumer_id: UUID,
65+
period: Period,
66+
ecalc_component: ProcessSystemComponent | SimplifiedProcessUnitComponent,
67+
):
68+
self.consumer_to_model_map[(consumer_id, period)] = ecalc_component.id
69+
70+
def get_evaluation_input(self, model_id: UUID) -> CompressorEvaluationInput | PumpEvaluationInput:
71+
return self.evaluation_inputs.get(model_id)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from uuid import UUID
2+
3+
from libecalc.domain.ecalc_component import EcalcComponent
4+
5+
6+
class ProcessSystemComponent(EcalcComponent):
7+
def __init__(self, id: UUID, name: str, type: str):
8+
super().__init__(id=id, name=name, type=type)
9+
10+
11+
class SimplifiedProcessUnitComponent(EcalcComponent):
12+
def __init__(self, id: UUID, name: str, type: str):
13+
super().__init__(id=id, name=name, type=type)

src/libecalc/presentation/yaml/mappers/consumer_function_mapper.py

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
from libecalc.expression import Expression
6262
from libecalc.expression.expression import InvalidExpressionError
6363
from libecalc.infrastructure.neqsim_fluid_provider.neqsim_fluid_factory import NeqSimFluidFactory
64+
from libecalc.presentation.yaml.domain.ecalc_components import ProcessSystemComponent, SimplifiedProcessUnitComponent
6465
from libecalc.presentation.yaml.domain.expression_time_series_flow_rate import ExpressionTimeSeriesFlowRate
6566
from libecalc.presentation.yaml.domain.expression_time_series_fluid_density import ExpressionTimeSeriesFluidDensity
6667
from libecalc.presentation.yaml.domain.expression_time_series_power import ExpressionTimeSeriesPower
@@ -940,6 +941,7 @@ def __init__(
940941
self._period_subsets = {}
941942
self._time_adjusted_model = define_time_model_for_period(energy_usage_model, target_period=target_period)
942943
self._mapping_context = mapping_context
944+
self._process_service = mapping_context._process_service
943945
self._consumer_id = consumer_id
944946
for period in self._time_adjusted_model:
945947
start_index, end_index = period.get_period_indices(expression_evaluator.get_periods())
@@ -1105,10 +1107,11 @@ def _map_pump(
11051107
)
11061108
# Register the pump model and its evaluation input in the mapping context
11071109
model_id = uuid4()
1108-
self._mapping_context.register_simplified_process_unit(id=model_id, simplified_process_unit=pump_model)
1109-
self._mapping_context.register_evaluation_input(id=model_id, evaluation_input=evaluation_input)
1110-
# Ensure that the process system ID is associated with the correct consumer ID and period
1111-
self._mapping_context.map_model_to_consumer(consumer_id=consumer_id, period=period, model_id=model_id)
1110+
component = SimplifiedProcessUnitComponent(id=model_id, name=model.energy_function, type=model.type)
1111+
self._process_service.register_simplified_process_unit(
1112+
ecalc_component=component, simplified_process_unit=pump_model, evaluation_input=evaluation_input
1113+
)
1114+
self._process_service.map_model_to_consumer(consumer_id=consumer_id, period=period, ecalc_component=component)
11121115

11131116
return pump_model
11141117

@@ -1195,11 +1198,11 @@ def _map_multiple_streams_compressor(
11951198
)
11961199

11971200
# Register the compressor model and its evaluation input in the mapping context
1198-
self._mapping_context.register_process_system(id=process_system_id, process_system=compressor_train_model)
1199-
self._mapping_context.register_evaluation_input(id=process_system_id, evaluation_input=evaluation_input)
1200-
1201-
# Ensure that the process system ID is associated with the correct consumer ID and period
1202-
self._mapping_context.map_model_to_consumer(consumer_id=consumer_id, period=period, model_id=process_system_id)
1201+
component = ProcessSystemComponent(id=process_system_id, name=model.compressor_train_model, type=model.type)
1202+
self._process_service.register_process_system(
1203+
ecalc_component=component, process_system=compressor_train_model, evaluation_input=evaluation_input
1204+
)
1205+
self._process_service.map_model_to_consumer(consumer_id=consumer_id, period=period, ecalc_component=component)
12031206

12041207
return compressor_train_model
12051208

@@ -1286,27 +1289,36 @@ def _map_compressor(
12861289
)
12871290

12881291
model_id = uuid4()
1289-
# Register the compressor model and its evaluation input in the mapping context
1292+
# Register the compressor model and its evaluation input in the process service
12901293
# - If it is a sampled model, or a turbine model wrapping a sampled model, treat as non-process.
12911294
# - Otherwise, treat as a process model.
12921295
if isinstance(compressor_model, CompressorModelSampled):
1293-
self._mapping_context.register_simplified_process_unit(
1294-
id=model_id, simplified_process_unit=compressor_model
1296+
component = SimplifiedProcessUnitComponent(id=model_id, name=model.energy_function, type=model.type)
1297+
self._process_service.register_simplified_process_unit(
1298+
ecalc_component=component, simplified_process_unit=compressor_model, evaluation_input=evaluation_input
12951299
)
12961300
elif isinstance(compressor_model, CompressorWithTurbineModel):
12971301
if isinstance(compressor_model.compressor_model, CompressorModelSampled):
1298-
self._mapping_context.register_simplified_process_unit(
1299-
id=model_id, simplified_process_unit=compressor_model
1302+
component = SimplifiedProcessUnitComponent(id=model_id, name=model.energy_function, type=model.type)
1303+
self._process_service.register_simplified_process_unit(
1304+
ecalc_component=component,
1305+
simplified_process_unit=compressor_model,
1306+
evaluation_input=evaluation_input,
13001307
)
13011308
else:
1302-
self._mapping_context.register_process_system(id=model_id, process_system=compressor_model)
1303-
else:
1304-
self._mapping_context.register_process_system(id=model_id, process_system=compressor_model)
1309+
component = ProcessSystemComponent(id=model_id, name=model.energy_function, type=model.type)
1310+
self._process_service.register_process_system(
1311+
ecalc_component=component, process_system=compressor_model, evaluation_input=evaluation_input
1312+
)
13051313

1306-
self._mapping_context.register_evaluation_input(id=model_id, evaluation_input=evaluation_input)
1314+
else:
1315+
component = ProcessSystemComponent(id=model_id, name=model.energy_function, type=model.type)
1316+
self._process_service.register_process_system(
1317+
ecalc_component=component, process_system=compressor_model, evaluation_input=evaluation_input
1318+
)
13071319

13081320
# Ensure that the process system ID is associated with the correct consumer ID and period
1309-
self._mapping_context.map_model_to_consumer(consumer_id=consumer_id, period=period, model_id=model_id)
1321+
self._process_service.map_model_to_consumer(consumer_id=consumer_id, period=period, ecalc_component=component)
13101322

13111323
return compressor_model
13121324

src/libecalc/presentation/yaml/mappers/yaml_mapping_context.py

Lines changed: 3 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,8 @@
22

33
from libecalc.common.temporal_model import TemporalModel
44
from libecalc.common.time_utils import Period
5-
from libecalc.domain.infrastructure.energy_components.legacy_consumer.consumer_function import ConsumerFunction
6-
from libecalc.domain.process.compressor.core import CompressorModel
7-
from libecalc.domain.process.compressor.core.base import CompressorWithTurbineModel
8-
from libecalc.domain.process.compressor.core.sampled import CompressorModelSampled
9-
from libecalc.domain.process.entities.process_units.compressor.compressor import Compressor
10-
from libecalc.domain.process.entities.process_units.liquid_remover.liquid_remover import LiquidRemover
11-
from libecalc.domain.process.entities.process_units.pressure_modifier.pressure_modifier import (
12-
DifferentialPressureModifier,
13-
)
14-
from libecalc.domain.process.entities.process_units.rate_modifier.rate_modifier import RateModifier
15-
from libecalc.domain.process.entities.process_units.temperature_setter.temperature_setter import TemperatureSetter
16-
from libecalc.domain.process.entities.shaft import Shaft
17-
from libecalc.domain.process.evaluation_input import CompressorEvaluationInput, PumpEvaluationInput
18-
from libecalc.domain.process.pump.pump import PumpModel
195
from libecalc.presentation.yaml.domain.category_service import CategoryService
6+
from libecalc.presentation.yaml.domain.default_process_service import DefaultProcessService
207
from libecalc.presentation.yaml.domain.yaml_component import YamlComponent
218
from libecalc.presentation.yaml.mappers.yaml_path import YamlPath
229

@@ -25,49 +12,14 @@ class MappingContext(CategoryService):
2512
def __init__(self, target_period: Period):
2613
self._yaml_path_map: dict[YamlPath, YamlComponent] = {}
2714
self._yaml_component_map: dict[UUID, YamlComponent] = {}
28-
self._process_systems: dict[UUID, CompressorModel] = {}
29-
self._process_units: dict[
30-
UUID, Compressor | Shaft | LiquidRemover | DifferentialPressureModifier | RateModifier | TemperatureSetter
31-
] = {}
32-
self._simplified_process_units: dict[UUID, PumpModel | CompressorModelSampled | CompressorWithTurbineModel] = {}
33-
self._consumer_functions: dict[UUID, ConsumerFunction] = {}
34-
self._evaluation_input: dict[UUID, CompressorEvaluationInput] = {}
35-
self._consumer_to_model_map: dict[tuple[UUID, Period], UUID] = {}
15+
3616
self._target_period = target_period
17+
self._process_service = DefaultProcessService()
3718

3819
def register_yaml_component(self, yaml_path: YamlPath, yaml_component: YamlComponent):
3920
self._yaml_path_map[yaml_path] = yaml_component
4021
self._yaml_component_map[yaml_component.id] = yaml_component
4122

42-
def register_process_system(self, id: UUID, process_system: CompressorModel):
43-
self._process_systems[id] = process_system
44-
45-
def register_process_unit(
46-
self,
47-
id: UUID,
48-
process_unit: Compressor
49-
| Shaft
50-
| LiquidRemover
51-
| DifferentialPressureModifier
52-
| RateModifier
53-
| TemperatureSetter,
54-
):
55-
self._process_units[id] = process_unit
56-
57-
def register_simplified_process_unit(
58-
self, id: UUID, simplified_process_unit: PumpModel | CompressorModelSampled | CompressorWithTurbineModel
59-
):
60-
self._simplified_process_units[id] = simplified_process_unit
61-
62-
def register_consumer_function(self, id: UUID, consumer_function: ConsumerFunction):
63-
self._consumer_functions[id] = consumer_function
64-
65-
def register_evaluation_input(self, id: UUID, evaluation_input: CompressorEvaluationInput | PumpEvaluationInput):
66-
self._evaluation_input[id] = evaluation_input
67-
68-
def map_model_to_consumer(self, consumer_id: UUID, period: Period, model_id: UUID):
69-
self._consumer_to_model_map[(consumer_id, period)] = model_id
70-
7123
def get_component_name_from_yaml_path(self, yaml_path: YamlPath) -> str | None:
7224
component_context = self._yaml_path_map.get(yaml_path)
7325
if component_context is None:

src/libecalc/presentation/yaml/model.py

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from libecalc.dto import ResultOptions
2929
from libecalc.dto.component_graph import ComponentGraph
3030
from libecalc.presentation.yaml.domain.category_service import CategoryService
31+
from libecalc.presentation.yaml.domain.default_process_service import DefaultProcessService
3132
from libecalc.presentation.yaml.domain.reference_service import ReferenceService
3233
from libecalc.presentation.yaml.domain.time_series_collections import TimeSeriesCollections
3334
from libecalc.presentation.yaml.domain.time_series_resource import TimeSeriesResource
@@ -314,16 +315,17 @@ def _get_context(self, component_id: str) -> ComponentEnergyContext:
314315

315316
def evaluate_energy_usage(self) -> dict[str, ComponentResult]:
316317
energy_components = self.get_energy_components()
318+
process_service = self.get_process_service()
317319

318320
# Evaluate process systems.
319321
process_system_results = self.evaluate_domain_models(
320-
models=self._mapping_context._process_systems,
321-
evaluation_inputs=self._mapping_context._evaluation_input,
322+
models=process_service.process_systems,
323+
evaluation_inputs=process_service.evaluation_inputs,
322324
)
323325
# Evaluate simplified process units (e.g. CompressorModelSampled and PumpModel).
324326
simplified_process_unit_results = self.evaluate_domain_models(
325-
models=self._mapping_context._simplified_process_units,
326-
evaluation_inputs=self._mapping_context._evaluation_input,
327+
models=process_service.simplified_process_units,
328+
evaluation_inputs=process_service.evaluation_inputs,
327329
)
328330

329331
all_model_results = {**process_system_results, **simplified_process_unit_results}
@@ -382,11 +384,14 @@ def get_installations(self) -> list[Installation]:
382384
def get_category_service(self) -> CategoryService:
383385
return self._mapping_context
384386

387+
def get_process_service(self) -> DefaultProcessService:
388+
return self._mapping_context._process_service
389+
390+
@staticmethod
385391
def evaluate_domain_models(
386-
self,
387392
models: dict[UUID, Any],
388-
evaluation_inputs: dict[UUID, Any],
389-
) -> dict[UUID, CompressorTrainResult]:
393+
evaluation_inputs: dict[UUID, CompressorEvaluationInput | PumpEvaluationInput],
394+
) -> dict[UUID, CompressorTrainResult | PumpModelResult]:
390395
"""
391396
Evaluates domain models and returns a mapping: model_id -> evaluated_result.
392397
@@ -432,21 +437,21 @@ def get_consumer_energy_results_from_domain_models(
432437
Dictionary mapping consumer UUID to consumer result, containing energy results
433438
for all periods.
434439
"""
435-
440+
process_service = self.get_process_service()
436441
allowed_model_result_types = (CompressorTrainResult, PumpModelResult)
437442
assert all(
438443
isinstance(model_result, allowed_model_result_types) for model_result in model_results.values()
439444
), "All models must be of allowed types"
440445

441446
# Map from UUID to id for all energy components
442-
uuid_to_id = {component._uuid: component.id for component in self.get_energy_components()}
447+
uuid_to_id = {component.get_id(): component.id for component in self.get_energy_components()}
443448

444449
# Construct ConsumerFunctionResult objects for each consumer
445450
consumer_function_results: dict[UUID, list[ConsumerFunctionResult]] = {}
446-
for (consumer_id, _period), model_id in self._mapping_context._consumer_to_model_map.items():
451+
for (consumer_id, _period), model_id in process_service.consumer_to_model_map.items():
447452
model_result = model_results.get(model_id)
448453
if model_result is not None:
449-
evaluation_input = self._mapping_context._evaluation_input.get(model_id)
454+
evaluation_input = process_service.evaluation_inputs.get(model_id)
450455
power_loss_factor = evaluation_input.power_loss_factor if evaluation_input else None
451456
consumer_function_results.setdefault(consumer_id, []).append(
452457
ConsumerFunctionResult(

0 commit comments

Comments
 (0)