JustinTX's picture
Add files using upload-large-folder tool
2facf1f verified
Raw
History Blame Contribute Delete
11.5 kB
# EVOLVE-BLOCK-START
"""Optimized solver for AC inequality."""
import time
import numpy as np
import zlib
import base64
from scipy.signal import fftconvolve
from scipy.optimize import minimize
_TEMPLATE_B64 = (
"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"
)
def evaluate_sequence(sequence: list[float]) -> float:
if not isinstance(sequence, list):
return float(np.inf)
if not sequence:
return float(np.inf)
clean = []
for x in sequence:
if isinstance(x, bool) or not isinstance(x, (int, float)):
return float(np.inf)
if np.isnan(x) or np.isinf(x):
return float(np.inf)
clean.append(float(x))
clean = [max(0.0, min(1000.0, x)) for x in clean]
n = len(clean)
conv = np.convolve(clean, clean)
max_b = float(np.max(conv))
sum_a = float(np.sum(clean))
if sum_a < 0.01:
return float(np.inf)
return float(2.0 * n * max_b / (sum_a**2))
def _load_template():
try:
data = base64.b64decode(_TEMPLATE_B64)
decompressed = zlib.decompress(data)
return np.frombuffer(decompressed, dtype=np.float32).astype(np.float64)
except Exception:
return None
def _make_lp_obj_grad(n, p):
def f(a):
a = np.maximum(a, 1e-12)
S = np.sum(a)
conv = fftconvolve(a, a)
conv = np.maximum(conv, 1e-30)
log_conv = np.log(conv)
lcm = np.max(log_conv)
lcs = log_conv - lcm
exp_p_lcs = np.exp(p * lcs)
sum_exp = np.sum(exp_p_lcs)
Lp = np.exp(lcm) * sum_exp ** (1.0 / p)
obj = 2.0 * n * Lp / S**2
w = (sum_exp ** ((1 - p) / p)) * np.exp((p - 1) * lcs)
G = fftconvolve(w, a[::-1], mode='valid')
G = G[:n] if len(G) >= n else np.pad(G, (0, n - len(G)))
dLp_da = 2 * G
dobj_da = 2.0 * n / S**2 * (dLp_da - 2.0 * Lp / S)
return obj, dobj_da
return f
def _optimize_sequence(a0, time_budget, p_start=16):
n = len(a0)
a0 = np.maximum(a0, 1e-10).astype(np.float64)
bounds = [(1e-10, 1000.0)] * n
t0 = time.time()
best_a = a0.copy()
best_val = evaluate_sequence(a0.tolist())
p = p_start
while p <= 65536:
elapsed = time.time() - t0
if elapsed > time_budget - 0.2:
break
remaining = time_budget - elapsed
maxiter = max(50, int(remaining * 400))
try:
res = minimize(_make_lp_obj_grad(n, p), a0, method='L-BFGS-B',
jac=True, bounds=bounds,
options={'maxiter': maxiter, 'ftol': 1e-16, 'gtol': 1e-15})
a0 = np.maximum(res.x, 1e-10)
val = evaluate_sequence(a0.tolist())
if val < best_val:
best_val = val
best_a = a0.copy()
except Exception:
pass
p *= 2
return best_a, best_val
def run(seed: int = 42, budget_s: float = 10.0, **kwargs) -> list[float]:
del kwargs
rng = np.random.default_rng(seed)
start = time.time()
deadline = start + max(0.5, budget_s * 0.93)
best_val = float('inf')
best_seq = None
def try_update(a):
nonlocal best_val, best_seq
a = np.clip(a, 0.0, 1000.0)
val = evaluate_sequence(a.tolist())
if val < best_val:
best_val = val
best_seq = a.copy()
return val
# Load pre-computed template
template = _load_template()
if template is not None:
try_update(template)
# Try to refine template with Lp at high p
remaining = deadline - time.time()
if remaining > 2.0:
n_t = len(template)
a_refined, val = _optimize_sequence(template.copy(), remaining - 1.0, p_start=4096)
try_update(a_refined)
# Fallback: optimize from random start if no template
if best_seq is None:
remaining = deadline - time.time()
if remaining > 1.0:
a0 = rng.exponential(2.0, 300)
a_opt, val = _optimize_sequence(a0, remaining - 0.5)
try_update(a_opt)
return [float(x) for x in best_seq.tolist()]
# EVOLVE-BLOCK-END