Skip to content

Commit 07b1c1b

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 5caf4ae commit 07b1c1b

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
@@ -24,6 +24,28 @@
2424
_logger = logging.getLogger(__name__)
2525

2626

27+
def _get_nearest_possible_power(
28+
power: Power,
29+
lower_bound: Power,
30+
upper_bound: Power,
31+
exclusion_bounds: Bounds[Power] | None,
32+
) -> Power:
33+
match _bounds.clamp_to_bounds(
34+
power,
35+
lower_bound,
36+
upper_bound,
37+
exclusion_bounds,
38+
):
39+
case (None, p) | (p, None) if p:
40+
return p
41+
case (low, high) if low and high:
42+
if high - power < power - low:
43+
return high
44+
return low
45+
case _:
46+
return Power.zero()
47+
48+
2749
class ShiftingMatryoshka(BaseAlgorithm):
2850
"""The ShiftingMatryoshka algorithm.
2951
@@ -39,7 +61,7 @@ def __init__(self, max_proposal_age: timedelta) -> None:
3961
self._component_buckets: dict[frozenset[int], set[Proposal]] = {}
4062
self._target_power: dict[frozenset[int], Power] = {}
4163

42-
def _calc_targets( # pylint: disable=too-many-locals,too-many-branches
64+
def _calc_targets(
4365
self,
4466
proposals: set[Proposal],
4567
system_bounds: SystemBounds,
@@ -108,45 +130,25 @@ def _calc_targets( # pylint: disable=too-many-locals,too-many-branches
108130
if proposal_power is not None:
109131
if top_pri_bounds is None and proposal_power != Power.zero():
110132
top_pri_bounds = Bounds[Power](lower=lower_bound, upper=upper_bound)
111-
clamped = _bounds.clamp_to_bounds(
133+
proposal_power = _get_nearest_possible_power(
112134
proposal_power,
113135
lower_bound,
114136
upper_bound,
115137
None,
116138
)
117-
match clamped:
118-
case (None, None):
119-
proposal_power = Power.zero()
120-
case (None, power) | (power, None) if power:
121-
proposal_power = power
122-
case (power_low, power_high) if power_low and power_high:
123-
if power_high - proposal_power < proposal_power - power_low:
124-
proposal_power = power_high
125-
else:
126-
proposal_power = power_low
127139
lower_bound = lower_bound - proposal_power
128140
upper_bound = upper_bound - proposal_power
129141
target_power += proposal_power
130142

131143
if top_pri_bounds is not None:
132144
available_bounds = top_pri_bounds
133145

134-
clamped = _bounds.clamp_to_bounds(
146+
target_power = _get_nearest_possible_power(
135147
target_power,
136148
available_bounds.lower,
137149
available_bounds.upper,
138150
system_bounds.exclusion_bounds,
139151
)
140-
match clamped:
141-
case (None, None):
142-
target_power = Power.zero()
143-
case (None, power) | (power, None) if power:
144-
target_power = power
145-
case (power_low, power_high) if power_low and power_high:
146-
if power_high - target_power < target_power - power_low:
147-
target_power = power_high
148-
else:
149-
target_power = power_low
150152

151153
return target_power, Bounds[Power](lower=lower_bound, upper=upper_bound)
152154

0 commit comments

Comments
 (0)