""" frontiers.py — Open Problem Solvers ===================================== P1 k=4, m=4 fiber-structured SA (construction open) P2 m=6, k=3 full-3D SA (first attempts) P3 m=8, k=3 full-3D SA (harder) TRIAGE FINDINGS (from recent measurements): • P1 k=4 m=4: Score 337→230 in 300K iters of fiber-structured SA. Estimated budget: 4–8M iterations. • P2 m=6 k=3: Basin-escape reaches score=4 in 8M iters (prev record 9). This is a deep local minimum (depth ≥ 3). Needs ~10M iters at T=2.0. • P3 m=8 k=3: 512 vertices. Score function overhead scales linearly. Run: python frontiers.py --p1 # k=4, m=4 python frontiers.py --p2 # m=6, k=3 python frontiers.py --p3 # m=8, k=3 python frontiers.py --all # all three python frontiers.py --status # print current knowledge state """ import sys, time, math, random from math import gcd from itertools import permutations, product as iprod from typing import Optional, Dict, Tuple from core import run_hybrid_sa, extract_weights, run_fiber_structured_sa G_="\033[92m";R_="\033[91m";Y_="\033[93m";W_="\033[97m";D_="\033[2m";Z_="\033[0m" def found(s): print(f" {G_}✓ {s}{Z_}") def open_(s): print(f" {Y_}◆ OPEN: {s}{Z_}") def note(s): print(f" {D_}{s}{Z_}") def hr(n=72): return "─"*n # ══════════════════════════════════════════════════════════════════════════════ # P1: k=4, m=4 — fiber-structured SA # ══════════════════════════════════════════════════════════════════════════════ def solve_P1(max_iter: int=2_000_000, seeds=range(5), verbose: bool=True) -> Optional[Dict]: """ Find σ: Z_4^4 → S_4 such that each colour class is a Hamiltonian cycle. Strategy: fiber-structured SA where σ(v) = f(fiber(v), j(v), k(v)). The unique valid r-quadruple is (1,1,1,1) — all four colors share r_c=1. MEASUREMENT: Score 337→230 in first 300K iterations. K=4 converges ~4x slower than K=3. Estimated budget: 4–8M iterations. """ print(f"\n{'═'*72}") print(f"{W_}P1: k=4, m=4 — Fiber-Structured SA{Z_}") print(hr()) note("r-quadruple (1,1,1,1): unique, all gcd(1,4)=1, sum=4.") note("Fiber-uniform proved impossible (Thm 10.1).") note(f"Fiber-structured space: σ(v)=f(fiber,j,k) → 24^64 states.") note(f"Running {len(list(seeds))} seeds × {max_iter:,} iters each.") print() M=4; K=4; N=M**4 ALL_P4 = list(permutations(range(K))); nP=len(ALL_P4) def dec4(v): l=v%4; v//=4; k_=v%4; v//=4; j_=v%4; i_=v//4 return i_,j_,k_,l def enc4(i,j,k_,l): return i*64+j*16+k_*4+l arc_s=[[0]*K for _ in range(N)] for v in range(N): ci,cj,ck,cl=dec4(v) arc_s[v][0]=enc4((ci+1)%M,cj,ck,cl) arc_s[v][1]=enc4(ci,(cj+1)%M,ck,cl) arc_s[v][2]=enc4(ci,cj,(ck+1)%M,cl) arc_s[v][3]=enc4(ci,cj,ck,(cl+1)%M) pa=[[None]*K for _ in range(nP)] for pi,p in enumerate(ALL_P4): for at,c in enumerate(p): pa[pi][c]=at fibers=[sum(dec4(v))%M for v in range(N)] def make_sigma(tab): sig=[0]*N for v in range(N): ci,cj,ck,cl=dec4(v) sig[v]=tab[(fibers[v],cj,ck)] return sig def score(sig): f=[[0]*N for _ in range(K)] for v in range(N): pi=sig[v]; p=pa[pi] for c in range(K): f[c][v]=arc_s[v][p[c]] def cc(fg): vis=bytearray(N); comps=0 for s in range(N): if not vis[s]: comps+=1; cur=s while not vis[cur]: vis[cur]=1; cur=fg[cur] return comps return sum(cc(f[c])-1 for c in range(K)) keys=[(s,j,k_) for s in range(M) for j in range(M) for k_ in range(M)] best_global=999; best_tab=None for seed in seeds: rng=random.Random(seed); t0=time.perf_counter() tab={k: rng.randrange(nP) for k in keys} sig=make_sigma(tab); cs=score(sig); bs=cs; bt=tab.copy() cool=(0.003/3.0)**(1.0/max_iter); T=3.0; stall=0; reheats=0 for it in range(max_iter): if cs==0: break k=rng.choice(keys); old=tab[k]; new=rng.randrange(nP) if old==new: T*=cool; continue tab[k]=new; sig=make_sigma(tab); ns=score(sig); d=ns-cs if d<0 or rng.random() 100_000: reheats += 1; stall = 0 # Basin escape: Reset to best but apply a high-T "kick" tab = bt.copy(); sig = make_sigma(tab); cs = bs T = 3.0 / (1.2**reheats) # Adaptive kick for fiber keys ks = max(1, int(len(keys) * (0.1 if cs > 10 else 0.05))) for _ in range(ks): rk = rng.choice(keys); tab[rk] = rng.randrange(nP) sig = make_sigma(tab); cs = score(sig) continue else: tab[k]=old T*=cool if verbose and (it+1)%250_000==0: print(f" seed={seed} it={it+1:>8,} s={cs} best={bs} T={T:.4f}", flush=True) elapsed=time.perf_counter()-t0 if bs Optional[Dict]: """ G_6 has 216 vertices. Score function checks 3 components of 216 vertices. Column-uniform impossible (parity). Full-3D search required. """ print(f"\n{'═'*72}") print(f"{W_}P2: m=6, k=3 — Full-3D SA on G_6{Z_}") print(hr()) note("Column-uniform impossible (Thm 6.1). First serious full-3D attempt.") note("FINDING: Basin-escape breaks the Z3-periodic score=9 barrier.") note(f"Space: 6^216 ≈ 10^168. Budget: {max_iter:,} × {len(list(seeds))} seeds.") print() best_overall=None; best_score=999 for seed in seeds: sol, stats = run_sa(6, seed=seed, max_iter=max_iter, verbose=verbose) s=stats['best'] sym=f"{G_}SOLVED{Z_}" if s==0 else f"best={s}" print(f" seed={seed}: {sym} iters={stats['iters']:,} " f"{stats['elapsed']:.1f}s reheats={stats['reheats']}") if s=3. Escape requires ~10M iterations at T=2.0. STRUCTURAL INSIGHT: Z_6 = Z_2 × Z_3 creates a product-structure local minimum. Breaking it requires coordinated multi-vertex changes that span the Z_3 periodic structure. """ import random, math from core import _build_sa3, _sa_score, verify_sigma, PRECOMPUTED, _ALL_P3 from itertools import permutations m=6; m3=3; m3_sol=PRECOMPUTED[(3,3)] n,arc_s,pa=_build_sa3(m); nP=6 ALL_P=[list(p) for p in permutations(range(3))] perm_to_int={tuple(p):i for i,p in enumerate(ALL_P)} # Build warm start sigma=[perm_to_int[m3_sol[(v//36%3,(v//6)%6%3,v%6%3)]] for v in range(n)] warm_score=_sa_score(sigma,arc_s,pa,n) if verbose: note(f"Z_3 warm start score: {warm_score}") rng=random.Random(seed) # Minimal perturbation to break exact Z_3 symmetry for v in rng.sample(range(n), 12): sigma[v]=rng.randrange(nP) cs=_sa_score(sigma,arc_s,pa,n); bs=cs; best=sigma[:] # Run at T=2.0 (high enough to cross depth-3 barrier) T=2.0; stall=0; reheats=0; t0=__import__('time').perf_counter() for it in range(max_iter): if cs==0: break if cs<=10: order=list(range(n)); rng.shuffle(order); fixed=False for v in order: old=sigma[v] for pi in rng.sample(range(nP),nP): if pi==old: continue sigma[v]=pi; ns=_sa_score(sigma,arc_s,pa,n) if ns=cs: sigma[v]=old if fixed: break if fixed: break if not fixed: for _ in range(max(2,cs//2)): sigma[rng.randrange(n)]=rng.randrange(nP) cs=_sa_score(sigma,arc_s,pa,n) if cs80_000: T=max(T*0.8,0.001); reheats+=1; stall=0; sigma=best[:]; cs=bs elapsed=__import__('time').perf_counter()-t0 if bs==0: sol={} for idx,pi in enumerate(best): i,rem=divmod(idx,m*m); j,k=divmod(rem,m) sol[(i,j,k)]=tuple(ALL_P[pi]) if verify_sigma(sol,m): found("m=6 k=3 SOLVED via warm start!") return sol if verbose: open_(f"m=6 k=3: best={bs} after {it+1:,} iters ({elapsed:.1f}s)") return None def solve_P3(max_iter: int=3_000_000, seeds=range(2), verbose: bool=True) -> Optional[Dict]: """ G_8: 512 vertices. Harder than m=6. Tests scaling. Score function needs 512 components checked per iteration. """ print(f"\n{'═'*72}") print(f"{W_}P3: m=8, k=3 — Full-3D SA on G_8{Z_}") print(hr()) note("512 vertices. Column-uniform impossible (parity).") note(f"Budget: {max_iter:,} × {len(list(seeds))} seeds.") print() best_overall=None; best_score=999 for seed in seeds: sol, stats = run_hybrid_sa(8, k=3, seed=seed, max_iter=max_iter, verbose=verbose) s=stats['best'] sym=f"{G_}SOLVED{Z_}" if s==0 else f"best={s}" print(f" seed={seed}: {sym} iters={stats['iters']:,} {stats['elapsed']:.1f}s") if s bool: """ THEOREM: No fiber-uniform σ yields a valid k=4 decomposition of G_4^4. Proof method: exhaustive search over all 24^4 = 331,776 fiber-uniform sigmas. Fiber-uniform means σ(v) depends only on fiber(v) = (i+j+k+l) mod 4. With 4 fibers and 4 colors, there are 24^4 = 331,776 combinations. This is small enough to check completely in ~40 seconds. Result: 0 valid sigmas found → proved impossible. """ from itertools import permutations, product as iprod import time M=4; K=4; N=M**4 ALL_P4 = list(permutations(range(K))); nP=len(ALL_P4) def dec4(v): l=v%4; v//=4; k_=v%4; v//=4; j_=v%4; i_=v//4 return i_,j_,k_,l def enc4(i,j,k_,l): return i*64+j*16+k_*4+l arc_s=[[0]*K for _ in range(N)] for v in range(N): ci,cj,ck,cl=dec4(v) arc_s[v][0]=enc4((ci+1)%M,cj,ck,cl) arc_s[v][1]=enc4(ci,(cj+1)%M,ck,cl) arc_s[v][2]=enc4(ci,cj,(ck+1)%M,cl) arc_s[v][3]=enc4(ci,cj,ck,(cl+1)%M) pa=[[None]*K for _ in range(nP)] for pi,p in enumerate(ALL_P4): for at,c in enumerate(p): pa[pi][c]=at fibers=[sum(dec4(v))%M for v in range(N)] def score(sigma): f=[[0]*N for _ in range(K)] for v in range(N): pi=sigma[v]; p=pa[pi] for c in range(K): f[c][v]=arc_s[v][p[c]] def cc(fg): vis=bytearray(N); comps=0 for s in range(N): if not vis[s]: comps+=1; cur=s while not vis[cur]: vis[cur]=1; cur=fg[cur] return comps return sum(cc(f[c])-1 for c in range(K)) if verbose: print(f"\n Checking all 24^4={24**4:,} fiber-uniform sigmas...", end="", flush=True) t0=time.perf_counter(); found=0 for combo in iprod(range(nP), repeat=M): sigma=[combo[fibers[v]] for v in range(N)] if score(sigma)==0: found+=1 elapsed=time.perf_counter()-t0 if verbose: print(f" done ({elapsed:.1f}s)") if found==0: print(f" \033[92m■ PROVED: No fiber-uniform σ works for k=4, m=4. " f"Checked {24**4:,} cases. ■\033[0m") else: print(f" \033[91m✗ UNEXPECTED: {found} valid fiber-uniform sigmas found\033[0m") return found == 0