Skip to content

Commit faec744

Browse files
committed
fix: clarify difference between instance and definition references
This changes instance references to be required, while definition references are optional. It also changes the instance reference from process simulation to pipeline by removing the TARGET key.
1 parent 65db5e0 commit faec744

21 files changed

Lines changed: 211 additions & 207 deletions

src/libecalc/presentation/yaml/domain/reference_service.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
YamlVariableSpeedCompressorTrainMultipleStreamsAndPressures,
2626
)
2727
from libecalc.presentation.yaml.yaml_types.process.yaml_process_pipeline import YamlProcessPipeline
28-
from libecalc.presentation.yaml.yaml_types.process.yaml_process_units import YamlProcessUnit
28+
from libecalc.presentation.yaml.yaml_types.process.yaml_process_units import YamlProcessUnitDefinition
2929
from libecalc.presentation.yaml.yaml_types.streams.yaml_inlet_stream import YamlInletStream
3030

3131

@@ -80,7 +80,7 @@ def get_tabulated_model(self, reference: str) -> YamlTabularModel: ...
8080
def get_process_pipeline(self, reference: str) -> YamlProcessPipeline: ...
8181

8282
@abc.abstractmethod
83-
def get_process_unit(self, reference: str) -> YamlProcessUnit: ...
83+
def get_process_unit(self, reference: str) -> YamlProcessUnitDefinition: ...
8484

8585
@abc.abstractmethod
8686
def get_stream(self, reference: str) -> YamlInletStream: ...

src/libecalc/presentation/yaml/mappers/process/build_sections.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
MappedSection,
44
ProcessPartitioner,
55
)
6-
from libecalc.presentation.yaml.yaml_types.process.yaml_process_references import ProcessUnitReference
6+
from libecalc.presentation.yaml.yaml_types.process.yaml_process_references import InstanceReference
77
from libecalc.presentation.yaml.yaml_types.process.yaml_process_simulation import YamlProcessConstraint
88
from libecalc.process.fluid_stream.fluid_service import FluidService
99
from libecalc.process.process_pipeline.process_unit import ProcessUnit, ProcessUnitId
@@ -25,7 +25,7 @@ def __init__(self):
2525
def partition_and_validate(
2626
self,
2727
process_unit_map: dict[ProcessUnitId, ProcessUnit],
28-
unit_name_to_id: dict[ProcessUnitReference, ProcessUnitId],
28+
unit_name_to_id: dict[InstanceReference, ProcessUnitId],
2929
pipeline_constraints: list[YamlProcessConstraint],
3030
) -> list[MappedSection]:
3131
sections = self._partitioner.partition(

src/libecalc/presentation/yaml/mappers/process/process_partitioner.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from libecalc.common.ddd import value_object
22
from libecalc.common.errors.ecalc_validation_error import EcalcValidationException
3-
from libecalc.presentation.yaml.yaml_types.process.yaml_process_references import ProcessUnitReference
3+
from libecalc.presentation.yaml.yaml_types.process.yaml_process_references import InstanceReference
44
from libecalc.presentation.yaml.yaml_types.process.yaml_process_simulation import YamlProcessConstraint
55
from libecalc.process.process_pipeline.process_unit import ProcessUnit, ProcessUnitId
66
from libecalc.process.process_units.compressor import Compressor
@@ -27,7 +27,7 @@ class ProcessPartitioner:
2727
@staticmethod
2828
def partition(
2929
process_unit_map: dict[ProcessUnitId, ProcessUnit],
30-
unit_name_to_id: dict[ProcessUnitReference, ProcessUnitId],
30+
unit_name_to_id: dict[InstanceReference, ProcessUnitId],
3131
pipeline_constraints: list[YamlProcessConstraint],
3232
) -> list[MappedSection]:
3333
process_units = list(process_unit_map.values())

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

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -45,20 +45,20 @@
4545
from libecalc.presentation.yaml.yaml_types.models.yaml_fluid import YamlCompositionFluidModel, YamlPredefinedFluidModel
4646
from libecalc.presentation.yaml.yaml_types.process.yaml_process_pipeline import YamlProcessPipeline
4747
from libecalc.presentation.yaml.yaml_types.process.yaml_process_references import (
48-
ProcessUnitReference,
48+
InstanceReference,
4949
)
5050
from libecalc.presentation.yaml.yaml_types.process.yaml_process_simulation import (
5151
YamlProcessSimulation,
5252
)
5353
from libecalc.presentation.yaml.yaml_types.process.yaml_process_units import (
54-
YamlCompressor,
54+
YamlCompressorDefinition,
5555
YamlCompressorModelChart,
56-
YamlLiquidRemover,
57-
YamlMixer,
58-
YamlPressureDropper,
59-
YamlProcessUnit,
60-
YamlSplitter,
61-
YamlTemperatureSetter,
56+
YamlLiquidRemoverDefinition,
57+
YamlMixerDefinition,
58+
YamlPressureDropperDefinition,
59+
YamlProcessUnitDefinition,
60+
YamlSplitterDefinition,
61+
YamlTemperatureSetterDefinition,
6262
)
6363
from libecalc.presentation.yaml.yaml_types.streams.yaml_inlet_stream import YamlInletStream, YamlInletStreamRate
6464
from libecalc.presentation.yaml.yaml_types.yaml_data_or_file import YamlFile
@@ -132,7 +132,7 @@ def __init__(
132132
self._resources = resources
133133
self._ecalc_event_service = ecalc_event_service
134134

135-
def _resolve_train_reference(self, ref: str | YamlProcessPipeline) -> YamlProcessPipeline:
135+
def _resolve_pipeline_reference(self, ref: str | YamlProcessPipeline) -> YamlProcessPipeline:
136136
if isinstance(ref, str):
137137
return self._reference_service.get_process_pipeline(reference=ref)
138138
else:
@@ -173,7 +173,7 @@ def _get_compressor_chart(self, yaml_compressor_model_chart: YamlCompressorModel
173173
yaml_curves, units=yaml_chart.units, control_margin=control_margin_fraction
174174
)
175175

176-
def _get_compressor(self, yaml_compressor: YamlCompressor) -> Compressor:
176+
def _get_compressor(self, yaml_compressor: YamlCompressorDefinition) -> Compressor:
177177
chart: ChartData = self._get_compressor_chart(yaml_compressor_model_chart=yaml_compressor.compressor_model)
178178
return Compressor(
179179
compressor_chart=chart,
@@ -247,7 +247,7 @@ def _map_fluid_model(self, yaml_fluid_model: YamlFluidModel) -> FluidModel:
247247
def _validate_and_map_pipeline_events(
248248
self,
249249
yaml_pipeline: YamlProcessPipeline,
250-
unit_name_to_id: dict[ProcessUnitReference, ProcessUnitId],
250+
unit_name_to_id: dict[InstanceReference, ProcessUnitId],
251251
) -> list[PipelineEvent]:
252252
"""Validate pipeline event references and map to domain objects."""
253253
events: list[PipelineEvent] = []
@@ -265,7 +265,7 @@ def _validate_and_map_pipeline_events(
265265
) from None
266266

267267
match change_to_yaml_process_unit:
268-
case YamlCompressor():
268+
case YamlCompressorDefinition():
269269
change_to_unit = self._get_compressor(change_to_yaml_process_unit)
270270
case _:
271271
raise EcalcValidationException(
@@ -307,10 +307,10 @@ def map_process_simulation(
307307
for yaml_compressor_train_item in yaml_process_simulation.targets:
308308
problem_configuration_handlers = []
309309
shaft = VariableSpeedShaft()
310-
item = self._resolve_train_reference(yaml_compressor_train_item.target)
310+
item = self._resolve_pipeline_reference(yaml_compressor_train_item)
311311
process_unit_map: dict[ProcessUnitId, ProcessUnit] = {}
312312
compressor_ids: list[ProcessUnitId] = []
313-
unit_name_to_id: dict[ProcessUnitReference, ProcessUnitId] = {}
313+
unit_name_to_id: dict[InstanceReference, ProcessUnitId] = {}
314314
problem_time_series_configurations: dict[
315315
ProcessUnitId,
316316
TimeSeriesTemperatureSetterConfiguration
@@ -319,33 +319,33 @@ def map_process_simulation(
319319
| TimeSeriesSplitterConfiguration,
320320
] = {}
321321

322-
for yaml_pipeline_item in item.items:
322+
for yaml_pipeline_item in item.process_units:
323323
yaml_process_unit = yaml_pipeline_item.target
324324
process_unit_name = yaml_pipeline_item.name
325325
if isinstance(yaml_process_unit, str):
326326
yaml_process_unit = self._reference_service.get_process_unit(yaml_process_unit)
327327

328328
match yaml_process_unit:
329-
case YamlCompressor():
329+
case YamlCompressorDefinition():
330330
unit = self._get_compressor(yaml_process_unit)
331331
compressor_ids.append(unit.get_id())
332332

333-
case YamlPressureDropper():
333+
case YamlPressureDropperDefinition():
334334
unit = PressureDropper(fluid_service=self._fluid_service)
335335
problem_time_series_configurations[unit.get_id()] = TimeSeriesPressureDropperConfiguration(
336336
pressure_drop_in_bara=self._map_pressure(yaml_process_unit.pressure_drop)
337337
)
338338

339-
case YamlTemperatureSetter():
339+
case YamlTemperatureSetterDefinition():
340340
unit = TemperatureSetter(fluid_service=self._fluid_service)
341341
problem_time_series_configurations[unit.get_id()] = TimeSeriesTemperatureSetterConfiguration(
342342
temperature_in_celsius=self._map_temperature(yaml_process_unit.temperature)
343343
)
344344

345-
case YamlLiquidRemover():
345+
case YamlLiquidRemoverDefinition():
346346
unit = LiquidRemover(fluid_service=self._fluid_service)
347347

348-
case YamlMixer():
348+
case YamlMixerDefinition():
349349
yaml_stream = self._resolve_stream_reference(yaml_process_unit.sidestream)
350350
yaml_fluid_model = self._resolve_fluid_model_reference(yaml_stream.fluid_model)
351351
unit = Mixer(fluid_service=self._fluid_service)
@@ -358,7 +358,7 @@ def map_process_simulation(
358358
)
359359
)
360360

361-
case YamlSplitter():
361+
case YamlSplitterDefinition():
362362
unit = Splitter(fluid_service=self._fluid_service)
363363
problem_time_series_configurations[unit.get_id()] = TimeSeriesSplitterConfiguration(
364364
offtake_rate=self._map_rate(yaml_process_unit.offtake_rate),
@@ -367,7 +367,7 @@ def map_process_simulation(
367367
case _:
368368
# Unreachable for valid YAML (pydantic discriminator rejects unknown types).
369369
# Guards against bypassed parsing or new union variants missing a case.
370-
allowed_types = [t.__name__ for t in get_args(get_args(YamlProcessUnit)[0])]
370+
allowed_types = [t.__name__ for t in get_args(get_args(YamlProcessUnitDefinition)[0])]
371371
raise EcalcValidationException(
372372
f"Process unit of type '{type(yaml_process_unit).__name__}' is not allowed "
373373
f"in a process pipeline. Allowed types are: {', '.join(allowed_types)}."

src/libecalc/presentation/yaml/yaml_models/pyyaml_yaml_model.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
YamlProcessSimulation,
3939
YamlPumpProcessSimulation,
4040
)
41-
from libecalc.presentation.yaml.yaml_types.process.yaml_process_units import YamlProcessUnit
41+
from libecalc.presentation.yaml.yaml_types.process.yaml_process_units import YamlProcessUnitDefinition
4242
from libecalc.presentation.yaml.yaml_types.streams.yaml_inlet_stream import YamlInletStream
4343
from libecalc.presentation.yaml.yaml_types.time_series.yaml_time_series import YamlTimeSeriesCollection
4444
from libecalc.presentation.yaml.yaml_types.yaml_default_datetime import YamlDefaultDatetime
@@ -451,13 +451,13 @@ def fluid_models(self) -> dict[str, YamlFluidModel]:
451451
return fluid_models
452452

453453
@property
454-
def process_units(self) -> dict[str, YamlProcessUnit]:
455-
process_units: dict[str, YamlProcessUnit] = {}
454+
def process_units(self) -> dict[str, YamlProcessUnitDefinition]:
455+
process_units: dict[str, YamlProcessUnitDefinition] = {}
456456
raw = self._get_yaml_dict_or_empty(_PROCESS_UNITS_KEY)
457457

458458
for name, unit_data in raw.items():
459459
try:
460-
process_units[name] = TypeAdapter(YamlProcessUnit).validate_python(unit_data)
460+
process_units[name] = TypeAdapter(YamlProcessUnitDefinition).validate_python(unit_data)
461461
except PydanticValidationError:
462462
pass
463463
return process_units

src/libecalc/presentation/yaml/yaml_models/yaml_model.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
YamlProcessSimulation,
2424
YamlPumpProcessSimulation,
2525
)
26-
from libecalc.presentation.yaml.yaml_types.process.yaml_process_units import YamlProcessUnit
26+
from libecalc.presentation.yaml.yaml_types.process.yaml_process_units import YamlProcessUnitDefinition
2727
from libecalc.presentation.yaml.yaml_types.streams.yaml_inlet_stream import YamlInletStream
2828
from libecalc.presentation.yaml.yaml_types.time_series.yaml_time_series import (
2929
YamlTimeSeriesCollection,
@@ -90,7 +90,7 @@ def inlet_streams(self) -> dict[str, YamlInletStream]:
9090

9191
@property
9292
@abc.abstractmethod
93-
def process_units(self) -> dict[str, YamlProcessUnit]:
93+
def process_units(self) -> dict[str, YamlProcessUnitDefinition]:
9494
pass
9595

9696
@property

src/libecalc/presentation/yaml/yaml_reference_service.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
YamlProcessSimulation,
3131
YamlPumpProcessSimulation,
3232
)
33-
from libecalc.presentation.yaml.yaml_types.process.yaml_process_units import YamlProcessUnit
33+
from libecalc.presentation.yaml.yaml_types.process.yaml_process_units import YamlProcessUnitDefinition
3434
from libecalc.presentation.yaml.yaml_types.streams.yaml_inlet_stream import YamlInletStream
3535

3636
logger = logging.getLogger(__name__)
@@ -44,7 +44,7 @@
4444
| YamlProcessPipeline
4545
| YamlProcessSimulation
4646
| YamlPumpProcessSimulation
47-
| YamlProcessUnit
47+
| YamlProcessUnitDefinition
4848
)
4949

5050
# Some models are referenced by other models, for example a compressor model will reference compressor chart models
@@ -218,8 +218,8 @@ def get_stream(self, reference: str) -> YamlInletStream:
218218
raise InvalidReferenceException("stream", reference)
219219
return model
220220

221-
def get_process_unit(self, reference: str) -> YamlProcessUnit:
221+
def get_process_unit(self, reference: str) -> YamlProcessUnitDefinition:
222222
model = self._resolve_yaml_reference(reference, "process unit")
223-
if not isinstance(model, get_args(get_args(YamlProcessUnit)[0])):
223+
if not isinstance(model, get_args(get_args(YamlProcessUnitDefinition)[0])):
224224
raise InvalidReferenceException("process unit", reference)
225225
return model

src/libecalc/presentation/yaml/yaml_types/components/yaml_asset.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
YamlProcessSimulation,
1515
YamlPumpProcessSimulation,
1616
)
17-
from libecalc.presentation.yaml.yaml_types.process.yaml_process_units import YamlProcessUnit
17+
from libecalc.presentation.yaml.yaml_types.process.yaml_process_units import YamlProcessUnitDefinition
1818
from libecalc.presentation.yaml.yaml_types.streams.yaml_inlet_stream import YamlInletStream
1919
from libecalc.presentation.yaml.yaml_types.time_series.yaml_time_series import YamlTimeSeriesCollection
2020
from libecalc.presentation.yaml.yaml_types.yaml_default_datetime import YamlDefaultDatetime
@@ -69,7 +69,7 @@ class YamlAsset(YamlBase):
6969
description="Defines variables used in an energy usage model by means of expressions or constants."
7070
"\n\n$ECALC_DOCS_KEYWORDS_URL/VARIABLES",
7171
)
72-
process_units: dict[str, YamlProcessUnit] = Field(
72+
process_units: dict[str, YamlProcessUnitDefinition] = Field(
7373
default_factory=dict,
7474
title="PROCESS_UNITS",
7575
description="Defines process units used in PROCESS_PIPELINES.",

src/libecalc/presentation/yaml/yaml_types/process/yaml_process_pipeline.py

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
from enum import StrEnum
2-
from typing import Annotated, Literal, TypeVar
2+
from typing import Annotated, TypeVar
33

44
from pydantic import Field
55

66
from libecalc.presentation.yaml.yaml_types import YamlBase
77
from libecalc.presentation.yaml.yaml_types.process.yaml_process_references import (
8-
ProcessEventReference,
9-
ProcessUnitReference,
8+
DefinitionReference,
9+
InstanceReference,
1010
)
1111
from libecalc.presentation.yaml.yaml_types.process.yaml_process_units import (
12-
YamlProcessUnit,
12+
YamlProcessUnitDefinition,
1313
)
1414

1515
TTarget = TypeVar("TTarget")
1616

1717

18-
class YamlItem[TTarget](YamlBase):
19-
target: TTarget | ProcessUnitReference
20-
name: str | None = None
18+
class YamlProcessUnitInstance[TTarget](YamlBase):
19+
target: TTarget | DefinitionReference
20+
name: InstanceReference | None = None
2121

2222

2323
class PipelineEventAction(StrEnum):
@@ -39,21 +39,21 @@ class YamlPipelineEvent(YamlBase):
3939
),
4040
]
4141
change_target: Annotated[
42-
ProcessUnitReference,
42+
InstanceReference,
4343
Field(
4444
title="CHANGE_TARGET",
4545
description="Name of the process unit in the pipeline to change.",
4646
),
4747
]
4848
change_from: Annotated[
49-
ProcessUnitReference,
49+
DefinitionReference,
5050
Field(
5151
title="CHANGE_FROM",
5252
description="Reference to the existing process unit template being replaced.",
5353
),
5454
]
5555
change_to: Annotated[
56-
ProcessUnitReference,
56+
DefinitionReference,
5757
Field(
5858
title="CHANGE_TO",
5959
description="Reference to the new process unit template to use.",
@@ -67,7 +67,7 @@ class YamlPipelineEvent(YamlBase):
6767
),
6868
]
6969
ref: Annotated[
70-
ProcessEventReference,
70+
InstanceReference,
7171
Field(
7272
title="REF",
7373
description="Reference to a PROCESS_EVENT by name.",
@@ -76,9 +76,8 @@ class YamlPipelineEvent(YamlBase):
7676

7777

7878
class YamlProcessPipeline(YamlBase):
79-
type: Literal["SERIAL"]
80-
name: str
81-
items: list[YamlItem[YamlProcessUnit]]
79+
name: InstanceReference
80+
process_units: list[YamlProcessUnitInstance[YamlProcessUnitDefinition]]
8281
events: Annotated[
8382
list[YamlPipelineEvent],
8483
Field(

src/libecalc/presentation/yaml/yaml_types/process/yaml_process_references.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,5 @@
22
Shared reference type aliases for YAML process types.
33
"""
44

5-
type StreamRef = str
6-
type ProcessPipelineReference = str # TODO: validate correct reference
7-
type ProcessUnitReference = str
8-
type EcalcEventReference = str
9-
type ProcessEventReference = str
10-
type PumpChartReference = str
5+
type InstanceReference = str
6+
type DefinitionReference = str

0 commit comments

Comments
 (0)