from fractions import Fraction as Q def run(load,check): old={x['i']:x for x in load('C331_DATA.json')['rows']};inputs=[];rows=[] for x in load('C338_DATA.json')['rows']: inputs.append({'i':x['i'],'binding':'same-Gear MT Shem','records':{'N':x['N_SP_Noah'],'R':x['R_MT_next_restored_Flood'],'H':x['H_MT_sameGear_base_Shem'],'F':x['F_MT_sameGear_base_Flood']}}) alt=next(x for x in load('C339_DATA.json')['rows'] if x['Shem_gear']==1);inputs.append({'i':5,'binding':alt['binding'],'records':{k:alt[k] for k in ['N','R','H','F']}}) for x in inputs: i=x['i'];rec=x['records'];rec.update({k:old[i]['records'][k] for k in ['M','D']});order=['N','M','D','R','H','F'];v=[rec[k]['center'] for k in order];legs=[v[k]-v[k+1] for k in range(5)];tag=f'i{i}/{x["binding"]}';e=int(rec['N']['rail']=='companion');sigma=rec['H']['center']-(2556+2*(rec['N']['gear']-1));expect=[460-e,490+e,108,92-e-sigma,100+e+sigma] check(tag+' full source leg formula',legs==expect) check(tag+' inherited death rows',v[:4]==old[i]['coordinates']) check(tag+' invariant outer intervals',v[0]-v[2]==950 and v[0]-v[3]==1058 and v[0]-v[5]==1250 and v[2]-v[5]==300) check(tag+' interior remainder',v[2]-v[4]==200-e-sigma and v[0]-v[4]==1150-e-sigma) check(tag+' component totals',sum(legs[:2])==950 and sum(legs[:3])==1058 and sum(legs)==1250 and sum(legs[2:])==300) phases=[] for ph in [Q(-1,4),Q(1,4)]: pv=[Q(z)+ph for z in v];check(tag+str(ph)+' phases',[pv[k]-pv[k+1] for k in range(5)]==legs);phases.append([str(z) for z in pv]) rows.append({'i':i,'binding':x['binding'],'rail':rec['N']['rail'],'records':rec,'order':order,'coordinates':v,'legs':legs,'Noah_life':950,'death_to_R':108,'death_to_H':v[2]-v[4],'death_to_F':300,'Noah_to_H':v[0]-v[4],'e':e,'Shem_mode_sigma':sigma,'phase_coordinates':phases,'death_qualification':'inclusive/harmonic primary' if e==0 else 'ordinary companion'}) check('five bounded chains',len(rows)==5) return {'step':'C340','rows':rows,'primary_chain':[460,490,108,92,100],'companion_chain':[459,491,108,91,101],'named502_chain':[460,490,108,94,98],'invariant_tail_to_base_MT_Flood':300,'warning':'950+200 and950+300 are additive source dissections, not E images of the950-year lifespan alone.','new_source_nodes':False}