Skip to content

Commit 3eb2384

Browse files
committed
refactor(process-solver): use Solution.combine() to merge configurations and track success
1 parent ec7c355 commit 3eb2384

3 files changed

Lines changed: 32 additions & 14 deletions

File tree

src/libecalc/domain/process/process_solver/configuration.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from collections.abc import Sequence
12
from dataclasses import dataclass
23
from functools import total_ordering
34
from typing import Generic, TypeVar
@@ -47,3 +48,13 @@ def __post_init__(self):
4748

4849

4950
OperatingConfiguration = SpeedConfiguration | ChokeConfiguration | RecirculationConfiguration
51+
52+
53+
def merge_configurations(
54+
first_configurations: Sequence[Configuration[OperatingConfiguration]],
55+
second_configurations: Sequence[Configuration[OperatingConfiguration]],
56+
) -> Sequence[Configuration[OperatingConfiguration]]:
57+
"""Merge two sequences; entries in second_configurations take precedence by simulation_unit_id."""
58+
merged = {config.simulation_unit_id: config for config in first_configurations}
59+
merged.update({config.simulation_unit_id: config for config in second_configurations})
60+
return list(merged.values())

src/libecalc/domain/process/process_solver/multi_pressure_solver.py

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -85,19 +85,17 @@ def find_solution(
8585
simulation_unit_id=self._shaft_id,
8686
value=max(speed_configurations),
8787
)
88-
all_configurations: dict = {self._shaft_id: shaft_config}
88+
solution = Solution(success=True, configuration=[shaft_config])
8989

9090
current_inlet = inlet_stream
91-
overall_success = True
9291

9392
for segment, target in zip(self._segments, pressure_targets):
9493
segment.runner.apply_configuration(shaft_config)
9594

9695
segment.anti_surge_strategy.reset()
9796
anti_surge_solution = segment.anti_surge_strategy.apply(inlet_stream=current_inlet)
9897
segment.runner.apply_configurations(anti_surge_solution.configuration)
99-
for config in anti_surge_solution.configuration:
100-
all_configurations[config.simulation_unit_id] = config
98+
solution = solution.combine(anti_surge_solution)
10199

102100
outlet = segment.runner.run(inlet_stream=current_inlet)
103101

@@ -106,18 +104,12 @@ def find_solution(
106104
target_pressure=target,
107105
inlet_stream=current_inlet,
108106
)
109-
for config in pressure_control_solution.configuration:
110-
all_configurations[config.simulation_unit_id] = config
107+
solution = solution.combine(pressure_control_solution)
111108
segment.runner.apply_configurations(pressure_control_solution.configuration)
112109
outlet = segment.runner.run(inlet_stream=current_inlet)
113-
if not pressure_control_solution.success:
114-
overall_success = False
115110
elif outlet.pressure_bara < target:
116-
overall_success = False
111+
solution = Solution(success=False, configuration=solution.configuration)
117112

118113
current_inlet = outlet
119114

120-
return Solution(
121-
success=overall_success,
122-
configuration=list(all_configurations.values()),
123-
)
115+
return solution

src/libecalc/domain/process/process_solver/solver.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@
33
from dataclasses import dataclass
44
from typing import Generic, TypeVar
55

6-
from libecalc.domain.process.process_solver.configuration import Configuration, OperatingConfiguration, SimulationUnitId
6+
from libecalc.domain.process.process_solver.configuration import (
7+
Configuration,
8+
OperatingConfiguration,
9+
SimulationUnitId,
10+
merge_configurations,
11+
)
712
from libecalc.domain.process.value_objects.fluid_stream import FluidStream
813

914
TConfiguration = TypeVar("TConfiguration")
@@ -24,6 +29,16 @@ def get_configuration(
2429
return config.value # type: ignore[return-value]
2530
raise ValueError(f"No configuration found for unit {unit_id}.")
2631

32+
def combine(
33+
self: "Solution[Sequence[Configuration[OperatingConfiguration]]]",
34+
other: "Solution[Sequence[Configuration[OperatingConfiguration]]]",
35+
) -> "Solution[Sequence[Configuration[OperatingConfiguration]]]":
36+
"""Combine two solutions: merge configurations and success flags."""
37+
return Solution(
38+
success=self.success and other.success,
39+
configuration=merge_configurations(self.configuration, other.configuration),
40+
)
41+
2742

2843
class Solver(abc.ABC, Generic[TConfiguration]):
2944
@abc.abstractmethod

0 commit comments

Comments
 (0)