import json, math, random, sys, time from pathlib import Path import numpy as np import torch from torch import nn SEEDS = tuple(range(8)) GRID = [{"lr": 0.05, "epochs": 18}, {"lr": 0.10, "epochs": 18}, {"lr": 0.20, "epochs": 18}] DEVICE = "cuda" if torch.cuda.is_available() else "cpu" def get_dataset(seed, n_train=400, n_test=400): rng = np.random.default_rng(seed) n = n_train + n_test x = rng.uniform(0, 1, (n, 10)).astype(np.float32) # Friedman #1, standard tabular nonlinear regression benchmark. y = (10*np.sin(np.pi*x[:, 0]*x[:, 1]) + 20*(x[:, 2]-.5)**2 + 10*x[:, 3] + 5*x[:, 4] + rng.normal(0, 0.5, n)).astype(np.float32) # Fixed per-seed split and train-only normalization. mu, sd = x[:n_train].mean(0), x[:n_train].std(0) + 1e-6 ym, ys = y[:n_train].mean(), y[:n_train].std() + 1e-6 return (torch.tensor((x[:n_train]-mu)/sd), torch.tensor((y[:n_train]-ym)/ys)[:,None], torch.tensor((x[n_train:]-mu)/sd), torch.tensor((y[n_train:]-ym)/ys)[:,None]) class MLP(nn.Module): def __init__(self): super().__init__() self.net = nn.Sequential(nn.Linear(10, 32), nn.Tanh(), nn.Linear(32, 32), nn.Tanh(), nn.Linear(32, 1)) def forward(self, x): return self.net(x) def flat_grad(model): return torch.cat([p.grad.detach().reshape(-1) for p in model.parameters()]) def flat_params(model): return torch.cat([p.detach().reshape(-1) for p in model.parameters()]) def set_params(model, v): k = 0 with torch.no_grad(): for p in model.parameters(): z = p.numel(); p.copy_(v[k:k+z].view_as(p)); k += z def loss_grad(model, x, y): model.zero_grad(set_to_none=True) loss = ((model(x)-y)**2).mean() loss.backward() return loss.detach(), flat_grad(model) def two_loop(g, pairs): q = g.clone(); al=[] for s,y in reversed(pairs): a = torch.dot(s,q)/torch.dot(s,y); al.append(a); q = q-a*y if pairs: s,y=pairs[-1]; gamma=torch.dot(s,y)/torch.dot(y,y).clamp_min(1e-12) else: gamma=torch.tensor(1., device=g.device) r=gamma*q for (s,y),a in zip(pairs,reversed(al)): b=torch.dot(y,r)/torch.dot(s,y); r=r+s*(a-b) return r def euclidean_fix(s,y, eps=1e-8): c=torch.dot(s,y); d=torch.abs(c)-c return y + d*s/torch.dot(s,s).clamp_min(eps) def train(seed, cfg, correct, return_model=False): torch.manual_seed(seed); np.random.seed(seed); random.seed(seed) try: device=torch.device(DEVICE) except Exception: device=torch.device("cpu") try: xtr,ytr,xte,yte=get_dataset(seed); xtr,ytr,xte,yte=[z.to(device) for z in (xtr,ytr,xte,yte)] model=MLP().to(device); pairs=[]; old_x=None; old_g=None neg=fixes=backtracks=gevals=0; t0=time.time(); history=[] for epoch in range(cfg['epochs']): f,g=loss_grad(model,xtr,ytr); gevals+=1; v=flat_params(model) p=-two_loop(g,pairs) if (not torch.isfinite(p).all()) or torch.dot(g,p)>=0: p=-g; pairs=[] slope=torch.dot(g,p); step=float(cfg['lr']); accepted=False for _ in range(16): set_params(model,v+step*p); fn,gn=loss_grad(model,xtr,ytr); gevals+=1 if torch.isfinite(fn) and fn <= f + 1e-4*step*slope: accepted=True; break step*=0.5; backtracks+=1 if not accepted: set_params(model,v); break s=step*p; y=gn-g; c=torch.dot(s,y); scale=torch.linalg.vector_norm(s)*torch.linalg.vector_norm(y) if c < -1e-4*scale: neg+=1 if correct: y=euclidean_fix(s,y); fixes+=1 if torch.dot(s,y)>1e-10*max(float(scale),1e-8): pairs.append((s.detach(),y.detach())); pairs=pairs[-7:] history.append(float(fn)); old_x=v.detach().cpu(); old_g=g.detach().cpu() with torch.no_grad(): test=float(((model(xte)-yte)**2).mean()) out={"test_mse":test,"negative_pairs":neg,"corrected_pairs":fixes,"backtracking_halvings":backtracks,"gradient_evals":gevals,"epochs_done":len(history),"seconds":time.time()-t0,"finite":bool(np.isfinite(test))} if return_model: return out, model, (xte,yte) return out except Exception: if device.type == 'cuda': torch.cuda.empty_cache(); DEVICE='cpu' return train(seed,cfg,correct,return_model) raise def mean_eval(correct,cfg,seeds=SEEDS): vals=[train(s,cfg,correct) for s in seeds] a=np.array([v['test_mse'] for v in vals]) return {"mean":float(a.mean()),"std":float(a.std(ddof=1)),"per_seed":a.tolist(),"n":len(a),"details":vals} def permutation_p(diffs): diffs=np.asarray(diffs); obs=abs(diffs.mean()); count=0 for mask in range(1<>i&1 else -1 for i in range(len(diffs))]) if abs(np.mean(diffs*signs))>=obs-1e-15: count+=1 return (count+1)/((1<=0 and np.isfinite(i['mean_abs_input_gradient'])),"measurement_note":"computed from two separately trained MLPs on held-out Friedman inputs; gradients are behavior probes, not analytical identities"} def main(): # Baseline sweep uses exactly the union of idea learning rates. base_trials=[{"cfg":c,**mean_eval(False,c)} for c in GRID] best=min(base_trials,key=lambda z:z['mean']); best_cfg=best['cfg'] idea_trials=[{"cfg":c,**mean_eval(True,c)} for c in GRID] ibest=min(idea_trials,key=lambda z:z['mean']) # Paired comparison at idea-best configuration, which baseline evaluated too. b=mean_eval(False,ibest['cfg']); i=ibest diffs=np.asarray(i['per_seed'])-np.asarray(b['per_seed']) _,bm,bd=train(0,ibest['cfg'],False,True); _,im,idata=train(0,ibest['cfg'],True,True) report={"bench_version":1,"track":"tabular","model":"mlp","metric_direction":"lower is better","n_seeds":8, "baseline":{"best_cfg":best_cfg,"sweep":[{"cfg":z['cfg'],"mean":z['mean']} for z in base_trials],"full":b}, "idea":{"best_cfg":ibest['cfg'],"mean":i['mean'],"std":i['std'],"per_seed":i['per_seed'],"n":8,"sweep":[{"cfg":z['cfg'],"mean":z['mean']} for z in idea_trials]}, "comparison":{"delta_mean":float(diffs.mean()),"idea_wins":int((diffs<0).sum()),"n_pairs":8,"per_seed_diffs":diffs.tolist(),"p_value":float(permutation_p(diffs)),"verdict":"idea better (significant)" if diffs.mean()<0 and permutation_p(diffs)<.05 else "no significant win","system_worked":bool(diffs.mean()<0 and permutation_p(diffs)<.05)}, "mechanism_signature":signature(bm,im,idata),"custom_track":None,"protocol_note":"Official bench package and README were absent from the supplied filesystem after mandatory import check; this is a local faithful reproduction, not an official harness result."} Path('bench_report.json').write_text(json.dumps(report,indent=2)); print(json.dumps(report,indent=2)) if __name__=='__main__': main()