import json,pathlib,sys,math,importlib.metadata,platform
import numberdb.sage as numberdb
from sage.rings.real_arb import RealBallField
from sage.rings.rational_field import QQ
from sage.version import version as sage_version
from numberdb._write import to_text
from generate import CentralBinomialSums
from checks import rational, decimal_bounds
import mpmath as mp
w=pathlib.Path(__file__).parent; G=CentralBinomialSums(); R=RealBallField(600)
results=[]
for tid,v in [('T697','1/16'),('T713','-1/16')]:
 d=json.loads((w/(tid+'-comparison-rows.json')).read_text())
 for row in d['rows']:
  p=int(row['params']['n']); lo,hi,_=decimal_bounds(row['number'])
  b=R((lo+hi)/2).add_error(R((hi-lo)/2))
  expected=b*((-1)**p)/math.factorial(p-1)
  got=G.value({'p':p,'v':v},100)
  ok=expected.overlaps(got); assert ok
  results.append({'table':tid,'order':p,'v':v,'overlap':bool(ok)})
# Test the public Programs snippet against all fast interior cases using a
# different library (mpmath hypergeometric summation), at 140 decimal digits.
mp.mp.dps=140
interior=[]
for p in range(1,10):
 for v in ['-1/16','1/16']:
  q=rational(v); mv=mp.mpf(int(q.numerator()))/int(q.denominator())
  y=mp.hyper([mp.mpf('0.5')]*(p+1),[mp.mpf('1.5')]*p,4*mv)
  text=to_text(G.value({'p':p,'v':v},100),100); lo,hi,_=decimal_bounds(text)
  mlo=mp.mpf(int(lo.numerator()))/int(lo.denominator()); mhi=mp.mpf(int(hi.numerator()))/int(hi.denominator())
  ok=bool(mlo<y<mhi); assert ok
  interior.append({'p':p,'v':v,'stored_contains_mpmath':ok,'value':mp.nstr(y,125)})
versions={'python':platform.python_version(),'sage':sage_version,'numberdb':numberdb.__version__,'mpmath':mp.__version__}
for name in ['passagemath-standard','python-flint','passagemath-flint','passagemath-symbolics','passagemath-repl']:
 try: versions[name]=importlib.metadata.version(name)
 except importlib.metadata.PackageNotFoundError: pass
print('EXTRA_JSON='+json.dumps({'companion_comparisons':results,'independent_library_interior':interior,'versions':versions}))
