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+
2749class 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