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