from fractions import Fraction as F from itertools import product def rank(a): a=[list(map(F,row)) for row in a];r=0 for c in range(len(a[0])): p=next((i for i in range(r,len(a)) if a[i][c]),None) if p is None:continue a[r],a[p]=a[p],a[r];v=a[r][c];a[r]=[x/v for x in a[r]] for i in range(len(a)): if i!=r and a[i][c]:v=a[i][c];a[i]=[x-v*y for x,y in zip(a[i],a[r])] r+=1 if r==len(a):break return r def edge(i,j): v=[0]*10;v[i]+=1;v[j]-=1;return v def run(load,check): old=load('PREVIOUS_DATA.json');out=[];roles=list(old['modes'][0]['records']['SP']);nodes=[t+':'+r for t in ['SP','MT'] for r in roles] pairs=[(i,i+1) for i in range(4)]+[(i,i+1) for i in range(5,9)]+[(i,i+5) for i in range(5)];A=[edge(i,j) for i,j in pairs];basis=A[:4]+A[8:];res=[edge(i+5,j) for i in range(5) for j in range(5)] check('rank9',rank(A)==rank(basis)==rank(A+res)==9) check('commontranslationnull',all(sum(row)==0 for row in A)) cycles=[] for i in range(4): c=[0]*13;c[i]=1;c[i+4]=-1;c[i+8]=-1;c[i+9]=1 check(f'cycle{i} zero',all(sum(c[k]*A[k][j] for k in range(13))==0 for j in range(10)));cycles.append(c) check('fourindependentcycles',rank(cycles)==4) for m in old['modes']: vals=m['chains']['SP']+m['chains']['MT'];rhs=[vals[i]-vals[j] for i,j in pairs];label=m['binding'];check(label+' augmentedrank',rank([row+[v] for row,v in zip(A,rhs)])==9) check(label+' cycles consistent',all(sum(c[k]*rhs[k] for k in range(13))==0 for c in cycles)) base=m['four_point_fields'][0]['coordinates'];terminal=m['four_point_fields'][1]['coordinates'];check(label+' 600transport',[x-y for x,y in zip(base,terminal)]==[600]*4) trials=[] for ph in product([F(-1,4),F(1,4)],repeat=10): exact=all(ph[i]==ph[j] for i,j in pairs);trials.append({'phases':list(map(str,ph)),'all13_edges_exact':exact}) check(label+' connectedphases',sum(x['all13_edges_exact'] for x in trials)==2 and all(x['all13_edges_exact']==(len(set(x['phases']))==1) for x in trials)) # Nine basis equations fix every relative node coordinate; this reconstructs existing values only. rebuiltSP=[vals[0]] for d in rhs[:4]:rebuiltSP.append(rebuiltSP[-1]-d) rebuiltMT=[x-d for x,d in zip(rebuiltSP,rhs[8:])];check(label+' basisreconstruction',rebuiltSP+rebuiltMT==vals) residual_values=[vals[i+5]-vals[j] for i in range(5) for j in range(5)];check(label+' all25residuals',residual_values==[r['residual'] for r in old['rows'] if r['binding']==label]) out.append({'binding':label,'records':m['records'],'coordinates':vals,'edge_rhs':rhs,'residual_rhs':residual_values,'rank':9,'augmented_rank':9,'cycle_rank':4,'nullity':1,'basis_edge_indices':list(range(4))+list(range(8,13)),'birth_field':base,'Flood_death_field':terminal,'transport_vector':[600]*4,'phase_trials':trials,'exact_full_components':[x for x in trials if x['all13_edges_exact']]}) return {'step':'C330','nodes':nodes,'edge_pairs':pairs,'incidence_matrix':A,'cycle_coefficients':cycles,'residual_edge_pairs':[(i+5,j) for i in range(5) for j in range(5)],'modes':out,'counts':{'nodes_per_mode':10,'edges_per_mode':13,'rank_per_mode':9,'dependent_cycles_per_mode':4,'residual_edges_per_mode':25,'residual_rank_increment':0,'phase_trials':2048,'exact_full_components':4},'scope':'Linear dependence at fixed source-labelled values, not statistical or historical independence. Common translation is a mathematical null direction, not permission to adopt an anchor.','new_source_operator':False}