import sys; sys.path.insert(0, "/private/tmp/claude-501/-Users-miltonlin-Projects-Trees/75c2c3d9-ef06-4644-b59b-d12583740b0c/scratchpad/solve/A6")
from e6_setup import *
from e6_restrict import wx_dom, wx_orbit
from fractions import Fraction as Fr
import pickle
maxnorm=int(sys.argv[1]); tval=Fr(sys.argv[2])
data=pickle.load(open('e6_restrict_%d.pkl'%maxnorm,'rb'))
mus=sorted(data, key=norm2); kappas=sorted({k for mu in mus for k in data[mu][1]})
t=tval
# columns = kappas; rows = mus: find left null vector ell with sum_k ell_k * coeff(mu,k) = 0 for all mu
rows=[[sum(cnt*t**e for e,cnt in data[mu][1].get(k,{}).items()) for k in kappas] for mu in mus]
# null space of the matrix (rows x kappas): solve rows * ell = 0
m=len(kappas); R=[r[:] for r in rows]; piv=[]; r=0
for c in range(m):
    p=next((i for i in range(r,len(R)) if R[i][c]!=0),None)
    if p is None: continue
    R[r],R[p]=R[p],R[r]; pv=R[r][c]; R[r]=[x/pv for x in R[r]]
    for i in range(len(R)):
        if i!=r and R[i][c]!=0:
            f=R[i][c]; R[i]=[x-f*y for x,y in zip(R[i],R[r])]
    piv.append(c); r+=1
free=[c for c in range(m) if c not in piv]
print('free columns (kappas):',[kappas[c] for c in free])
for fc in free:
    ell=[Fr(0)]*m; ell[fc]=Fr(1)
    for i,c in enumerate(piv): ell[c]=-R[i][fc]
    print('null functional at t=%s:'%t)
    for k,v in zip(kappas,ell):
        if v!=0: print('   ell[M_%s] = %s  (~ %.6f)'%(k,v,float(v)))
    # test: is ell of the form g -> sum over kappa of ell_k * coeff = g(y1)-g(y2) or a derivative?  Evaluate candidate: M_kappa(y)=sum_{k' in W_X kappa} u^{a'} v^{b'}
