"""Run the original-model Python/JavaScript comparison. Requires Node.js."""
from pathlib import Path
import json,subprocess
import model_variants as m
ROOT=Path(__file__).resolve().parent
def main():
    js="const fs=require('fs'),vm=require('vm');const c={};vm.createContext(c);vm.runInContext(fs.readFileSync(process.argv[1],'utf8'),c);process.stdout.write(JSON.stringify([.01,.005].map(dt=>({dt,...c.HillModel.simulate({}, {dt}).results}))));"
    outputs=json.loads(subprocess.check_output(['node','-e',js,str(ROOT/'browser-model.js')]))
    rows=[]
    for x in outputs:
        p=m.simulate('drive','ratio',x['dt'])
        fields=[('probe_rms',p['probe_rms'],x['memoryProbeRMS']),('max_energy_residual',p['max_abs_energy_residual'],x['memoryMaxAbsClosureResidual'])]
        fields += [(label,p['final_state'][i],x['finalMemory'][label]) for i,label in enumerate(['q','p','m'])]
        for label,py,j in fields:
            if abs(py-j)>=1e-9: raise AssertionError((label,py,j))
            rows.append(dict(dt=x['dt'],quantity=label,python=py,javascript=j,absolute_difference=abs(py-j)))
    return dict(scope='Original model 0.2 only; same equations and inputs, separate implementations; not independent human replication.',rows=rows)
if __name__=='__main__':print(json.dumps(main(),indent=2))
