"""Fresh two-configuration computation and local checks for T618.
Run: sage -python compute.py. JSON records are printed for retained evidence.
"""
import json,time
from generate import INDICES,background,coefficient,LaneEmdenMassRadius
from sage.rings.rational_field import QQ
from sage.rings.real_mpfr import RealField
import numberdb.sage as numberdb

def main():
    result={}
    for n in INDICES:
        start=time.monotonic();lo=coefficient(n,150);hi=coefficient(n,210)
        F=hi.parent();nn=F(QQ(n));x,q,meta=background(n,210)
        rel=abs(F(lo)-hi)/abs(hi);assert rel<F(10)**-120
        if n=='1':assert abs(hi-2/F.pi())<F(10)**-190
        # Independently eliminate a and rho_c through physical scale equations.
        scale_errors=[]
        for a,rho in [(F(1),F(1)),(F(2),F(3))]:
            R=a*x;M=4*F.pi()*a**3*rho
            M*=q
            K=4*F.pi()*a*a*rho**(1-1/nn)/(nn+1) # G=1
            recovered=K/(M**((nn-1)/nn)*R**((3-nn)/nn))
            err=abs(recovered-hi)/hi; assert err<F(10)**-195;scale_errors.append(str(err))
        C=x**3/(3*q);W=x**4/(4*F.pi()*(nn+1)*q*q)
        assert abs(W*(4*F.pi()/(3*C))**(1+1/nn)/hi-1)<F(10)**-195
        row={'n':n,'coefficient_150':str(lo),'coefficient_210':str(hi),
             'radius_210':str(x),'mass_210':str(q),'relative_difference':str(rel),
             'scale_errors':scale_errors,'runs':[background(n,150)[2],meta],
             'seconds':time.monotonic()-start}
        result[n]=row;print(json.dumps(row),flush=True)
    print('SUMMARY '+json.dumps({'max_relative_difference':max(float(r['relative_difference']) for r in result.values()),'entries':len(result)}),flush=True)
    # Use the campaign's maintained checks; cache avoids duplicate integrations.
    import dry_run
    assert dry_run.main([__import__('generate').__file__])==0
    return result
if __name__=='__main__':main()
