Skip to content

Commit 04b7740

Browse files
committed
refactor: direct consumer function time series power loss factor
1 parent c998adb commit 04b7740

8 files changed

Lines changed: 73 additions & 28 deletions

File tree

src/libecalc/domain/infrastructure/energy_components/legacy_consumer/consumer_function/direct_consumer_function.py

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,10 @@
77
ConsumerFunction,
88
ConsumerFunctionResult,
99
)
10-
from libecalc.domain.infrastructure.energy_components.legacy_consumer.consumer_function.utils import (
11-
apply_power_loss_factor,
12-
get_power_loss_factor_from_expression,
13-
)
1410
from libecalc.domain.process.core.results import EnergyFunctionGenericResult
1511
from libecalc.domain.time_series_flow_rate import TimeSeriesFlowRate
1612
from libecalc.domain.time_series_power import TimeSeriesPower
17-
from libecalc.expression import Expression
13+
from libecalc.domain.time_series_power_loss_factor import TimeSeriesPowerLossFactor
1814

1915

2016
class DirectConsumerFunction(ConsumerFunction):
@@ -23,12 +19,11 @@ def __init__(
2319
energy_usage_type: EnergyUsageType,
2420
fuel_rate: TimeSeriesFlowRate | None = None,
2521
load: TimeSeriesPower | None = None,
26-
power_loss_factor: Expression | None = None,
22+
power_loss_factor: TimeSeriesPowerLossFactor | None = None,
2723
):
2824
self._energy_usage = fuel_rate if energy_usage_type == EnergyUsageType.FUEL.value else load
29-
power_loss_factor_expression = power_loss_factor
3025
self._energy_usage_type = energy_usage_type
31-
self._power_loss_factor_expression = power_loss_factor_expression
26+
self._power_loss_factor = power_loss_factor
3227

3328
@property
3429
def is_electrical_consumer(self) -> bool:
@@ -67,10 +62,14 @@ def evaluate(
6762
power_unit=self.power_unit if self.is_electrical_consumer else None,
6863
)
6964

70-
power_loss_factor = get_power_loss_factor_from_expression(
71-
expression_evaluator=expression_evaluator,
72-
power_loss_factor_expression=self._power_loss_factor_expression,
73-
)
65+
if self._power_loss_factor is not None:
66+
energy_usage = self._power_loss_factor.apply(
67+
energy_usage=np.asarray(energy_function_result.energy_usage, dtype=np.float64)
68+
)
69+
power_loss_factor = self._power_loss_factor.get_values(length=len(energy_usage))
70+
else:
71+
energy_usage = energy_function_result.energy_usage
72+
power_loss_factor = None
7473

7574
is_valid = np.asarray(energy_function_result.is_valid)
7675

@@ -83,15 +82,12 @@ def evaluate(
8382
is_valid[np.asarray(energy_usage) < 0] = False
8483

8584
consumer_function_result = ConsumerFunctionResult(
86-
periods=expression_evaluator.get_periods(),
85+
periods=self._energy_usage.get_periods(),
8786
is_valid=is_valid,
8887
energy_function_result=energy_function_result,
89-
energy_usage_before_power_loss_factor=np.asarray(energy_function_result.energy_usage),
90-
power_loss_factor=power_loss_factor,
91-
energy_usage=apply_power_loss_factor(
92-
energy_usage=np.asarray(energy_function_result.energy_usage),
93-
power_loss_factor=power_loss_factor,
94-
),
88+
energy_usage_before_power_loss_factor=np.asarray(energy_function_result.energy_usage, dtype=np.float64),
89+
power_loss_factor=np.asarray(power_loss_factor, dtype=np.float64),
90+
energy_usage=np.asarray(energy_usage, dtype=np.float64),
9591
)
9692

9793
return consumer_function_result

src/libecalc/domain/infrastructure/energy_components/legacy_consumer/consumer_function/pump_consumer_function.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ def evaluate(
7676
power_loss_factor = self._power_loss_factor.get_values(length=len(energy_usage))
7777
else:
7878
energy_usage = energy_function_result.energy_usage
79-
power_loss_factor = np.zeros_like(np.asarray(energy_usage, dtype=np.float64), dtype=np.float64)
79+
power_loss_factor = None
8080

8181
pump_consumer_function_result = ConsumerFunctionResult(
8282
periods=expression_evaluator.get_periods(),

src/libecalc/domain/time_series_flow_rate.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from abc import ABC, abstractmethod
22

3+
from libecalc.common.time_utils import Periods
4+
35

46
class TimeSeriesFlowRate(ABC):
57
"""
@@ -16,3 +18,11 @@ def get_stream_day_values(self) -> list[float | None]:
1618
Returns the evaluated flow rate values for each stream day.
1719
"""
1820
pass
21+
22+
@abstractmethod
23+
def get_periods(self) -> Periods:
24+
"""
25+
Returns the periods associated with the flow rate time series.
26+
This is used to align the flow rate values with the corresponding periods.
27+
"""
28+
pass

src/libecalc/domain/time_series_power.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from abc import ABC, abstractmethod
22

3+
from libecalc.common.time_utils import Periods
4+
35

46
class TimeSeriesPower(ABC):
57
"""
@@ -16,3 +18,11 @@ def get_stream_day_values(self) -> list[float | None]:
1618
Returns the evaluated power values for each stream day.
1719
"""
1820
pass
21+
22+
@abstractmethod
23+
def get_periods(self) -> Periods:
24+
"""
25+
Returns the periods associated with the flow rate time series.
26+
This is used to align the flow rate values with the corresponding periods.
27+
"""
28+
pass

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import numpy as np
22

3-
from libecalc.common.time_utils import Period
3+
from libecalc.common.time_utils import Period, Periods
44
from libecalc.common.utils.rates import Rates, RateType
55
from libecalc.domain.infrastructure.energy_components.legacy_consumer.consumer_function.utils import (
66
apply_condition,
@@ -63,3 +63,11 @@ def get_stream_day_values(self) -> list[float | None]:
6363
)
6464

6565
return stream_day_rate.tolist()
66+
67+
def get_periods(self) -> Periods:
68+
"""
69+
Returns the periods associated with the time series expression.
70+
71+
This is used to align the flow rate values with the corresponding periods.
72+
"""
73+
return self._time_series_expression.expression_evaluator.get_periods()

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import numpy as np
22

3-
from libecalc.common.time_utils import Period
3+
from libecalc.common.time_utils import Period, Periods
44
from libecalc.common.utils.rates import Rates, RateType
55
from libecalc.domain.infrastructure.energy_components.legacy_consumer.consumer_function.utils import (
66
apply_condition,
@@ -63,3 +63,11 @@ def get_stream_day_values(self) -> list[float | None]:
6363
)
6464

6565
return stream_day_power.tolist()
66+
67+
def get_periods(self) -> Periods:
68+
"""
69+
Returns the periods associated with the time series expression.
70+
71+
This is used to align the flow rate values with the corresponding periods.
72+
"""
73+
return self._time_series_expression.expression_evaluator.get_periods()

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,9 +211,15 @@ def _map_direct(
211211
period: Period,
212212
) -> DirectConsumerFunction:
213213
period_regularity, period_evaluator = self._period_subsets[period]
214+
215+
power_loss_factor_expression = TimeSeriesExpression(
216+
expressions=model.power_loss_factor, expression_evaluator=period_evaluator
217+
)
218+
power_loss_factor = ExpressionTimeSeriesPowerLossFactor(time_series_expression=power_loss_factor_expression)
219+
214220
condition = convert_expression(_map_condition(model))
215221
consumption_rate_type = RateType((model.consumption_rate_type or ConsumptionRateType.STREAM_DAY).value)
216-
power_loss_factor = convert_expression(model.power_loss_factor)
222+
217223
if isinstance(model, YamlEnergyUsageModelDirectFuel):
218224
if consumes != ConsumptionType.FUEL:
219225
raise InvalidConsumptionType(actual=ConsumptionType.FUEL, expected=consumes)
@@ -229,7 +235,7 @@ def _map_direct(
229235
return DirectConsumerFunction(
230236
energy_usage_type=EnergyUsageType.FUEL,
231237
fuel_rate=fuel_rate,
232-
power_loss_factor=power_loss_factor, # type: ignore[arg-type]
238+
power_loss_factor=power_loss_factor,
233239
)
234240
else:
235241
assert isinstance(model, YamlEnergyUsageModelDirectElectricity)
@@ -247,7 +253,7 @@ def _map_direct(
247253
return DirectConsumerFunction(
248254
energy_usage_type=EnergyUsageType.POWER,
249255
load=load,
250-
power_loss_factor=power_loss_factor, # type: ignore[arg-type]
256+
power_loss_factor=power_loss_factor,
251257
)
252258

253259
def _map_tabular(self, model: YamlEnergyUsageModelTabulated, consumes: ConsumptionType) -> TabularConsumerFunction:

tests/libecalc/core/consumers/consumer_function/test_direct_expression_consumer_function.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717
from libecalc.domain.regularity import Regularity
1818
from libecalc.expression import Expression
1919
from libecalc.presentation.yaml.domain.expression_time_series_flow_rate import ExpressionTimeSeriesFlowRate
20+
from libecalc.presentation.yaml.domain.expression_time_series_power import ExpressionTimeSeriesPower
21+
from libecalc.presentation.yaml.domain.expression_time_series_power_loss_factor import (
22+
ExpressionTimeSeriesPowerLossFactor,
23+
)
2024
from libecalc.presentation.yaml.domain.time_series_expression import TimeSeriesExpression
2125

2226

@@ -213,10 +217,13 @@ def test_direct_expression_consumer_function(expression_evaluator_factory):
213217
fuel_rate_expression = TimeSeriesExpression(expressions="2", expression_evaluator=variables_map)
214218
fuel_rate = ExpressionTimeSeriesFlowRate(time_series_expression=fuel_rate_expression, regularity=regularity)
215219

220+
power_loss_factor_expression = TimeSeriesExpression(expressions=0.2, expression_evaluator=variables_map)
221+
power_loss_factor = ExpressionTimeSeriesPowerLossFactor(time_series_expression=power_loss_factor_expression)
222+
216223
np.testing.assert_allclose(
217224
actual=DirectConsumerFunction(
218225
fuel_rate=fuel_rate,
219-
power_loss_factor=Expression.setup_from_expression(value=0.2),
226+
power_loss_factor=power_loss_factor,
220227
energy_usage_type=libecalc.common.energy_usage_type.EnergyUsageType.FUEL,
221228
)
222229
.evaluate(
@@ -243,7 +250,7 @@ def test_direct_expression_consumer_function_consumption_rate_type(direct_variab
243250
load_expression = TimeSeriesExpression(
244251
expressions=stream_day_consumption, expression_evaluator=direct_variables_map
245252
)
246-
load_stream_day = ExpressionTimeSeriesFlowRate(
253+
load_stream_day = ExpressionTimeSeriesPower(
247254
time_series_expression=load_expression,
248255
regularity=regularity,
249256
consumption_rate_type=libecalc.common.utils.rates.RateType.STREAM_DAY,
@@ -258,7 +265,7 @@ def test_direct_expression_consumer_function_consumption_rate_type(direct_variab
258265
load_expression = TimeSeriesExpression(
259266
expressions=calendar_day_consumption, expression_evaluator=direct_variables_map
260267
)
261-
load_calendar_day = ExpressionTimeSeriesFlowRate(
268+
load_calendar_day = ExpressionTimeSeriesPower(
262269
time_series_expression=load_expression,
263270
regularity=regularity,
264271
consumption_rate_type=libecalc.common.utils.rates.RateType.CALENDAR_DAY,

0 commit comments

Comments
 (0)