Skip to content

Commit 4a429bd

Browse files
authored
Refactor: Introduce TimeSeriesExpression and ExpressionTimeSeriesFlowRate (#1008)
* refactor: introduce TimeSeriesExpression and ExpressionTimeSeriesFlowRate
1 parent 443851e commit 4a429bd

19 files changed

Lines changed: 220 additions & 67 deletions

src/libecalc/domain/infrastructure/emitters/venting_emitter.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ def get_emissions(self) -> dict[str, TimeSeriesStreamDayRate]:
170170
condition_expression=emission.emission_rate.condition,
171171
)
172172
emission_rate = self._evaluate_emission_rate(emission)
173-
emission_rate = apply_condition(input_array=emission_rate, condition=condition) # type: ignore[arg-type]
173+
emission_rate = apply_condition(input_array=emission_rate, condition=condition)
174174
emissions[emission.name] = self._create_time_series(emission_rate)
175175
return emissions
176176

@@ -214,7 +214,7 @@ def get_oil_rates(self, regularity: [TimeSeriesFloat, list[float]]) -> TimeSerie
214214
condition_expression=self.volume.oil_volume_rate.condition,
215215
)
216216

217-
oil_rates = apply_condition(input_array=oil_rates, condition=condition) # type: ignore[arg-type]
217+
oil_rates = apply_condition(input_array=oil_rates, condition=condition)
218218

219219
return TimeSeriesStreamDayRate(
220220
periods=self.expression_evaluator.get_periods(),

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ def evaluate(
121121
)
122122
stream_day_rate_after_condition = apply_condition(
123123
input_array=stream_day_rate,
124-
condition=condition, # type: ignore[arg-type]
124+
condition=condition,
125125
)
126126

127127
# If the compressor model is supposed to have stages, make sure they are defined
@@ -158,7 +158,6 @@ def evaluate(
158158
periods=expression_evaluator.get_periods(),
159159
is_valid=np.asarray(compressor_train_result.is_valid),
160160
energy_function_result=compressor_train_result,
161-
condition=condition,
162161
energy_usage_before_power_loss_factor=np.asarray(compressor_train_result.energy_usage),
163162
power_loss_factor=power_loss_factor,
164163
energy_usage=apply_power_loss_factor(

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def evaluate(
8181
)
8282
if self._convert_to_stream_day
8383
else energy_usage_expression_evaluated,
84-
condition=condition, # type: ignore[arg-type]
84+
condition=condition,
8585
)
8686

8787
energy_function_result = EnergyFunctionGenericResult(
@@ -110,7 +110,6 @@ def evaluate(
110110
periods=expression_evaluator.get_periods(),
111111
is_valid=is_valid,
112112
energy_function_result=energy_function_result,
113-
condition=condition,
114113
energy_usage_before_power_loss_factor=np.asarray(energy_function_result.energy_usage),
115114
power_loss_factor=power_loss_factor,
116115
energy_usage=apply_power_loss_factor(

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

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

3-
from libecalc.common.utils.rates import Rates
43
from libecalc.common.variables import ExpressionEvaluator
54
from libecalc.domain.infrastructure.energy_components.legacy_consumer.consumer_function import (
65
ConsumerFunction,
76
ConsumerFunctionResult,
87
)
98
from libecalc.domain.infrastructure.energy_components.legacy_consumer.consumer_function.utils import (
10-
apply_condition,
119
apply_power_loss_factor,
12-
get_condition_from_expression,
1310
get_power_loss_factor_from_expression,
1411
)
1512
from libecalc.domain.process.pump.pump import PumpModel
13+
from libecalc.domain.time_series_flow_rate import TimeSeriesFlowRate
1614
from libecalc.expression import Expression
1715

1816

@@ -34,20 +32,18 @@ class PumpConsumerFunction(ConsumerFunction):
3432
def __init__(
3533
self,
3634
pump_function: PumpModel,
37-
rate_expression: Expression,
35+
rate: TimeSeriesFlowRate,
3836
suction_pressure_expression: Expression,
3937
discharge_pressure_expression: Expression,
4038
fluid_density_expression: Expression,
41-
condition_expression: Expression = None,
4239
power_loss_factor_expression: Expression = None,
4340
):
4441
self._pump_function = pump_function
45-
self._rate_expression = rate_expression
42+
self._rate = rate
4643
self._suction_pressure_expression = suction_pressure_expression
4744
self._discharge_pressure_expression = discharge_pressure_expression
4845
self._fluid_density_expression = fluid_density_expression
4946

50-
self._condition_expression = condition_expression
5147
# Typically used for power line loss subsea et.c.
5248
self._power_loss_factor_expression = power_loss_factor_expression
5349

@@ -59,26 +55,15 @@ def evaluate(
5955
"""Evaluate the pump consumer function
6056
6157
Args:
62-
variables_map: Variables map is the VariablesMap-object holding all the data to be evaluated.
58+
expression_evaluator: expression evaluator is the ExpressionEvaluator-object holding all the data to be evaluated.
6359
regularity: The regularity of the pump consumer function (same as for installation pump is part of)
6460
6561
Returns:
6662
Pump consumer function result
6763
"""
68-
condition = get_condition_from_expression(
69-
expression_evaluator=expression_evaluator,
70-
condition_expression=self._condition_expression,
71-
)
72-
calendar_day_rate = expression_evaluator.evaluate(expression=self._rate_expression)
7364

74-
# if regularity is 0 for a calendar day rate, set stream day rate to 0 for that step
75-
stream_day_rate = apply_condition(
76-
input_array=Rates.to_stream_day(
77-
calendar_day_rates=calendar_day_rate,
78-
regularity=regularity,
79-
),
80-
condition=condition, # type: ignore[arg-type]
81-
)
65+
stream_day_rate = self._rate.get_stream_day_values()
66+
8267
suction_pressure = expression_evaluator.evaluate(expression=self._suction_pressure_expression)
8368
discharge_pressure = expression_evaluator.evaluate(expression=self._discharge_pressure_expression)
8469
fluid_density = expression_evaluator.evaluate(expression=self._fluid_density_expression)
@@ -101,7 +86,6 @@ def evaluate(
10186
is_valid=np.asarray(energy_function_result.is_valid),
10287
energy_function_result=energy_function_result,
10388
energy_usage_before_power_loss_factor=np.asarray(energy_function_result.energy_usage),
104-
condition=condition,
10589
power_loss_factor=power_loss_factor,
10690
energy_usage=apply_power_loss_factor(
10791
energy_usage=np.asarray(energy_function_result.energy_usage),

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ def __init__(
3232
is_valid: NDArray,
3333
energy_usage: NDArray,
3434
energy_usage_before_power_loss_factor: NDArray | None = None,
35-
condition: NDArray | None = None,
3635
power_loss_factor: NDArray | None = None,
3736
energy_function_result: EnergyFunctionResult | list[EnergyFunctionResult] | None = None,
3837
# New! to support fuel to power rate...for e.g. compressors emulating turbine
@@ -43,7 +42,6 @@ def __init__(
4342
self.is_valid = is_valid
4443
self.energy_usage = energy_usage
4544
self.energy_usage_before_power_loss_factor = energy_usage_before_power_loss_factor
46-
self.condition = condition
4745
self.power_loss_factor = power_loss_factor
4846
self.energy_function_result = energy_function_result
4947
self.power = power
@@ -65,7 +63,6 @@ def __init__(
6563
energy_usage: NDArray,
6664
typ: Literal[ConsumerFunctionType.SINGLE] = ConsumerFunctionType.SINGLE,
6765
energy_usage_before_power_loss_factor: NDArray | None = None,
68-
condition: NDArray | None = None,
6966
power_loss_factor: NDArray | None = None,
7067
energy_function_result: EnergyFunctionResult | list[EnergyFunctionResult] | None = None,
7168
power: NDArray | None = None,
@@ -76,7 +73,6 @@ def __init__(
7673
is_valid,
7774
energy_usage,
7875
energy_usage_before_power_loss_factor,
79-
condition,
8076
power_loss_factor,
8177
energy_function_result,
8278
power,
@@ -86,7 +82,6 @@ def __init__(
8682
self.is_valid = is_valid
8783
self.energy_usage = energy_usage
8884
self.energy_usage_before_power_loss_factor = energy_usage_before_power_loss_factor
89-
self.condition = condition
9085
self.power_loss_factor = power_loss_factor
9186
self.energy_function_result = energy_function_result
9287
self.power = power

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33
import numpy as np
44
from numpy.typing import NDArray
55

6+
from libecalc.common.time_utils import Period
67
from libecalc.common.variables import ExpressionEvaluator
78
from libecalc.expression import Expression
89

910

1011
def get_condition_from_expression(
1112
expression_evaluator: ExpressionEvaluator,
12-
condition_expression: Expression | None,
13+
condition_expression: Expression | dict[Period, Expression] | None,
1314
) -> NDArray[np.int_] | None:
1415
"""Evaluate condition expression and compute resulting condition vector.
1516
@@ -29,7 +30,9 @@ def get_condition_from_expression(
2930
return np.array(condition)
3031

3132

32-
def apply_condition(input_array: NDArray[np.float64], condition: NDArray[np.float64] | None) -> NDArray[np.float64]:
33+
def apply_condition(
34+
input_array: NDArray[np.float64], condition: NDArray[np.float64] | NDArray[np.int_] | None
35+
) -> NDArray[np.float64]:
3336
"""Apply condition to input array in the following way:
3437
- Input values kept as is if condition is 1
3538
- Input values set to 0 if condition is 0

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,6 @@ def evaluate( # type: ignore[override]
167167
consumer_results=[consumer_results],
168168
cross_over_used=cross_over_used,
169169
energy_usage_before_power_loss_factor=energy_usage,
170-
condition=condition,
171170
power_loss_factor=power_loss_factor,
172171
energy_usage=apply_power_loss_factor(
173172
energy_usage=energy_usage,

src/libecalc/domain/infrastructure/energy_components/legacy_consumer/system/results.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,6 @@ def __init__(
124124
is_valid: NDArray = None,
125125
energy_usage: NDArray = None,
126126
energy_usage_before_power_loss_factor: NDArray | None = None,
127-
condition: NDArray | None = None,
128127
power_loss_factor: NDArray | None = None,
129128
energy_function_result: EnergyFunctionResult | list[EnergyFunctionResult] | None = None,
130129
power: NDArray | None = None,
@@ -135,7 +134,6 @@ def __init__(
135134
is_valid=is_valid,
136135
energy_usage=energy_usage,
137136
energy_usage_before_power_loss_factor=energy_usage_before_power_loss_factor,
138-
condition=condition,
139137
power_loss_factor=power_loss_factor,
140138
energy_function_result=energy_function_result,
141139
power=power,

src/libecalc/domain/infrastructure/energy_components/legacy_consumer/tabulated/tabular_consumer_function.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,14 +118,14 @@ def evaluate(
118118
energy_function_result.energy_usage = array_to_list(
119119
apply_condition(
120120
input_array=np.asarray(energy_function_result.energy_usage),
121-
condition=condition, # type: ignore[arg-type]
121+
condition=condition,
122122
)
123123
)
124124
energy_function_result.power = (
125125
array_to_list(
126126
apply_condition(
127127
input_array=np.asarray(energy_function_result.power),
128-
condition=condition, # type: ignore[arg-type]
128+
condition=condition,
129129
)
130130
)
131131
if energy_function_result.power is not None
@@ -141,7 +141,6 @@ def evaluate(
141141
periods=expression_evaluator.get_periods(),
142142
is_valid=np.asarray(energy_function_result.is_valid),
143143
energy_function_result=energy_function_result,
144-
condition=condition,
145144
energy_usage_before_power_loss_factor=np.asarray(energy_function_result.energy_usage),
146145
power_loss_factor=power_loss_factor,
147146
energy_usage=apply_power_loss_factor(

src/libecalc/domain/regularity.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from datetime import datetime
2+
from typing import Self
23

34
from libecalc.common.time_utils import Period
45
from libecalc.common.units import Unit
@@ -37,6 +38,10 @@ def __init__(
3738
)
3839
self.validate()
3940

41+
@property
42+
def get_values(self) -> list[float]:
43+
return self.time_series.values
44+
4045
@property
4146
def time_series(self) -> TimeSeriesFloat:
4247
"""
@@ -71,3 +76,21 @@ def validate(self):
7176
if invalid_values:
7277
msg = f"REGULARITY must evaluate to fractions between 0 and 1. " f"Invalid values: {invalid_values}"
7378
raise InvalidRegularity(message=msg)
79+
80+
def get_subset(self, start_index: int, end_index: int) -> Self:
81+
"""
82+
Returns a new Regularity object for the given index range.
83+
"""
84+
period_evaluator = self.expression_evaluator.get_subset(
85+
start_index=start_index,
86+
end_index=end_index,
87+
)
88+
periods = period_evaluator.get_periods().periods
89+
90+
new_target_period = Period(start=periods[0].start, end=periods[-1].end)
91+
92+
return self.__class__(
93+
expression_evaluator=period_evaluator,
94+
target_period=new_target_period,
95+
expression_input=self.temporal_expression.expression,
96+
)

0 commit comments

Comments
 (0)