Skip to content

Commit 68c72cd

Browse files
committed
Add _get_nearest_possible_power function
And refactor the _calc_targets method to use the new function to eliminate code duplication. Signed-off-by: Sahas Subramanian <[email protected]>
1 parent 802508c commit 68c72cd

File tree

1 file changed

+25
-23
lines changed

1 file changed

+25
-23
lines changed

src/frequenz/sdk/microgrid/_power_managing/_shifting_matryoshka.py

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,28 @@
3838
_logger = logging.getLogger(__name__)
3939

4040

41+
def _get_nearest_possible_power(
42+
power: Power,
43+
lower_bound: Power,
44+
upper_bound: Power,
45+
exclusion_bounds: Bounds[Power] | None,
46+
) -> Power:
47+
match _bounds.clamp_to_bounds(
48+
power,
49+
lower_bound,
50+
upper_bound,
51+
exclusion_bounds,
52+
):
53+
case (None, p) | (p, None) if p:
54+
return p
55+
case (low, high) if low and high:
56+
if high - power < power - low:
57+
return high
58+
return low
59+
case _:
60+
return Power.zero()
61+
62+
4163
class ShiftingMatryoshka(BaseAlgorithm):
4264
"""The ShiftingMatryoshka algorithm."""
4365

@@ -47,7 +69,7 @@ def __init__(self, max_proposal_age: timedelta) -> None:
4769
self._component_buckets: dict[frozenset[int], set[Proposal]] = {}
4870
self._target_power: dict[frozenset[int], Power] = {}
4971

50-
def _calc_targets( # pylint: disable=too-many-locals,too-many-branches
72+
def _calc_targets(
5173
self,
5274
proposals: set[Proposal],
5375
system_bounds: SystemBounds,
@@ -116,45 +138,25 @@ def _calc_targets( # pylint: disable=too-many-locals,too-many-branches
116138
if proposal_power is not None:
117139
if top_pri_bounds is None and proposal_power != Power.zero():
118140
top_pri_bounds = Bounds[Power](lower=lower_bound, upper=upper_bound)
119-
clamped = _bounds.clamp_to_bounds(
141+
proposal_power = _get_nearest_possible_power(
120142
proposal_power,
121143
lower_bound,
122144
upper_bound,
123145
None,
124146
)
125-
match clamped:
126-
case (None, None):
127-
proposal_power = Power.zero()
128-
case (None, power) | (power, None) if power:
129-
proposal_power = power
130-
case (power_low, power_high) if power_low and power_high:
131-
if power_high - proposal_power < proposal_power - power_low:
132-
proposal_power = power_high
133-
else:
134-
proposal_power = power_low
135147
lower_bound = lower_bound - proposal_power
136148
upper_bound = upper_bound - proposal_power
137149
target_power += proposal_power
138150

139151
if top_pri_bounds is not None:
140152
available_bounds = top_pri_bounds
141153

142-
clamped = _bounds.clamp_to_bounds(
154+
target_power = _get_nearest_possible_power(
143155
target_power,
144156
available_bounds.lower,
145157
available_bounds.upper,
146158
system_bounds.exclusion_bounds,
147159
)
148-
match clamped:
149-
case (None, None):
150-
target_power = Power.zero()
151-
case (None, power) | (power, None) if power:
152-
target_power = power
153-
case (power_low, power_high) if power_low and power_high:
154-
if power_high - target_power < target_power - power_low:
155-
target_power = power_high
156-
else:
157-
target_power = power_low
158160

159161
return target_power, Bounds[Power](lower=lower_bound, upper=upper_bound)
160162

0 commit comments

Comments
 (0)