"""Delay-aware admissibility rule for attachable residual modules.""" import math def critical_delay(a, gain): if gain <= a: return math.inf return math.acos(-a / gain) / math.sqrt(gain * gain - a * a) def max_admissible_gain(a, delay): if delay <= 0: return math.inf lo, hi = a * (1 + 1e-12), max(2 * a, a + 1 / delay) while critical_delay(a, hi) > delay: hi *= 2 for _ in range(100): mid = (lo + hi) / 2 if critical_delay(a, mid) > delay: lo = mid else: hi = mid return (lo + hi) / 2 def select_modules(gains, benefits, a, delay, minimum_gain=0.0): limit = max_admissible_gain(a, delay) order = sorted(range(len(gains)), key=lambda i: benefits[i] / max(gains[i], 1e-12), reverse=True) chosen, total = [], 0.0 for i in order: if total + gains[i] < limit: chosen.append(i); total += gains[i] if total < minimum_gain: return [], 0.0, limit return chosen, total, limit