from fractions import Fraction as F from itertools import product def run(load,check): bios={x['gear']:x for x in load('C322_DATA.json')['biographies']};roles=bios[2]['roles'];modes=[];rows=[];phases=[] for sg,label in [(2,'Noah-bound500/100'),(1,'Arphaxad-bound502/98')]: rec={tr:{role:bios[sg if role.startswith('Shem') else 2][tr+'_records'][role] for role in roles} for tr in ['SP','MT']};ch={tr:[rec[tr][r]['center'] for r in roles] for tr in rec} for tr in rec: for role in roles:check(f'{label}/{tr}/{role}/gear',rec[tr][role]['gear']==(sg if role.startswith('Shem') else 2)) check(label+' uniform460',all(ch['SP'][i]-ch['MT'][i]==460 for i in range(5))) summaries={} for tr in ch: N,S,Fd,Nd,Sd=ch[tr];summaries[tr]={'Noah_to_Shem':N-S,'Shem_to_Flood':S-Fd,'Noah_to_Flood':N-Fd,'Noah_life':N-Nd,'Shem_life':S-Sd,'Noah_to_Shem_death':N-Sd,'Flood_to_Shem_death':Fd-Sd} check(label+' modalbiographies',summaries['SP']==summaries['MT'] and summaries['SP']['Noah_life']==950 and summaries['SP']['Shem_life']==600 and summaries['SP']['Noah_to_Flood']==600) for ar,cr in product(roles,repeat=2): A,B,C=rec['SP'][ar]['center'],rec['MT'][ar]['center'],rec['SP'][cr]['center'];d=A-C;r=B-C row={'binding':label,'Shem_gear':sg,'anchor_role':ar,'terminal_role':cr,'A_SP':A,'B_MT':B,'C_SP':C,'source_duration':d,'residual':r,'positive':r>0};rows.append(row) for ea,eb,ec in product([F(-1,4),F(1,4)],repeat=3): vals=[F(A)+ea,F(B)+eb,F(C)+ec];ds=[vals[0]-vals[1],vals[1]-vals[2],vals[0]-vals[2]];ok=ds==[460,r,d] phases.append({'binding':label,'anchor_role':ar,'terminal_role':cr,'phases':list(map(str,[ea,eb,ec])),'coordinates':list(map(str,vals)),'durations':list(map(str,ds)),'exact':ok,'positive':r>0}) fields=[] for ar,cr in [('Noah birth','Shem birth'),('Flood start','Shem death')]: v=[rec['SP'][ar]['center'],rec['MT'][ar]['center'],rec['SP'][cr]['center'],rec['MT'][cr]['center']];fields.append({'anchor_role':ar,'terminal_role':cr,'coordinates':v,'gaps':[v[i]-v[i+1] for i in range(3)],'overlap':v[1]-v[2],'outer':v[0]-v[3],'equal_interval':v[0]-v[2]}) modes.append({'binding':label,'Shem_gear':sg,'records':rec,'chains':ch,'durations':summaries,'four_point_fields':fields,'coherent_single_gear':sg==2}) check('held andalternative durations',[x['durations']['SP']['Noah_to_Shem'] for x in modes]==[500,502]) check('wholefieldchanges',[x['four_point_fields'][0]['gaps'] for x in modes]==[[460,40,460],[460,42,460]]) check('allphasecriterion',all(x['exact']==(len(set(x['phases']))==1) for x in phases)) baseline=[x for x in rows if x['Shem_gear']==2];old=[x for x in load('C327_DATA.json')['rows'] if x['gear']==2] check('C327G2baseline',all(all(x[k]==y[k] for k in ['anchor_role','terminal_role','A_SP','B_MT','C_SP','source_duration','residual']) for x,y in zip(baseline,old))) counts={'bindings':2,'annual_candidates':len(rows),'positive_annual':sum(x['positive'] for x in rows),'phase_candidates':len(phases),'exact_partitions':sum(x['exact'] for x in phases),'positive_exact':sum(x['exact'] and x['positive'] for x in phases)} changes=[y['residual']-x['residual'] for x,y in zip(rows[:25],rows[25:])];check('binding residual changes',changes.count(0)==13 and changes.count(2)==6 and changes.count(-2)==6) check('counts',counts=={'bindings':2,'annual_candidates':50,'positive_annual':12,'phase_candidates':400,'exact_partitions':100,'positive_exact':24}) return {'step':'C329','modes':modes,'rows':rows,'phase_trials':phases,'counts':counts,'binding_change':'Existing ShemG2 replaced by existing ShemG1; Noah/Flood remainG2. Named binding comparison, not coherentGear transport.','binding_residual_change_counts':{str(v):changes.count(v) for v in [-2,0,2]},'invariant_residuals':{'Noah_life':490,'Shem_life':140,'Noah_to_Flood':140},'source_selector_established':False}