"""Independent enumeration and cross-multiplication; does not import analyze.py."""
import json,itertools
from fractions import Fraction
from pathlib import Path
ROOT=Path(__file__).resolve().parents[1]
rows=json.loads((ROOT/'data/extraction.json').read_text())
result=json.loads((ROOT/'results/R1.json').read_text())
frontiers=json.loads((ROOT/'results/integer-frontiers.json').read_text())
manual=[(2157,1766,1265,1806,1486,993),(2157,1750,1301,1806,1455,1037),(2157,1848,1431,1806,1533,1113),(2250,1769,1267,1869,1490,996),(2250,1753,1304,1869,1461,1042),(2250,1853,1436,1869,1540,1120)]
pairs=0;bound_checks=0;anchor_checks=0;monotonicity_checks=0
for row,counts in zip(rows,manual):
    A,n,a,B,k,b=counts
    assert [row[arm][key] for arm in ['treatment','control'] for key in ['cohort','observed','recovered']]==list(counts)
    m,l=A-n,B-k;v=result['rows'][row['id']];observed_min=None;observed_max=None
    regions={'positive':0,'negative':0,'zero':0}
    for x in range(m+1):
        first=None
        for y in range(l+1):
            numerator=B*(a+x)-A*(b+y)
            if x<m:
                assert B*(a+x+1)-A*(b+y)-numerator==B
                monotonicity_checks+=1
            if y<l:
                assert B*(a+x)-A*(b+y+1)-numerator==-A
                monotonicity_checks+=1
            observed_min=numerator if observed_min is None else min(observed_min,numerator)
            observed_max=numerator if observed_max is None else max(observed_max,numerator)
            regions['positive' if numerator>0 else 'negative' if numerator<0 else 'zero']+=1
            if numerator<=0 and first is None:first=y
            pairs+=1
        assert first==frontiers[row['id']][x]['control_minimum_for_nonpositive'];bound_checks+=1
    assert Fraction(observed_min,A*B)==Fraction(v['exact']['lower'])
    assert Fraction(observed_max,A*B)==Fraction(v['exact']['upper'])
    assert sum(regions.values())==v['completion_pairs']
    # Independent decimal-rate calculation at the declared null anchor.
    q=float(Fraction(v['exact']['control_anchor']));t=float(Fraction(v['exact']['treatment_tipping']))
    assert abs((a+m*t)/A-(b+l*q)/B)<1e-14;anchor_checks+=1
    # Symmetry: swapping arms negates and swaps extrema.
    assert Fraction(b,B)-Fraction(a+m,A)==-Fraction(v['exact']['upper'])
    assert Fraction(b+l,B)-Fraction(a,A)==-Fraction(v['exact']['lower'])
    for q in [Fraction(0),Fraction(1,4),Fraction(1,2),Fraction(3,4),Fraction(1)]:
        d=Fraction(a,A)+Fraction(m,A)*q-Fraction(b,B)-Fraction(l,B)*q
        assert Fraction(v['exact']['common_lower'])<=d<=Fraction(v['exact']['common_upper'])
fixtures=0;fixture_pairs=0
states=[(N,n,e) for N in range(1,6) for n in range(1,N+1) for e in range(n+1)]
for (A,n,a),(B,k,b) in itertools.product(states,repeat=2):
    vals=[Fraction(a+x,A)-Fraction(b+y,B) for x in range(A-n+1) for y in range(B-k+1)]
    assert min(vals)==Fraction(a,A)-Fraction(b+B-k,B)
    assert max(vals)==Fraction(a+A-n,A)-Fraction(b,B)
    if A==n and B==k:assert len(vals)==1
    fixtures+=1;fixture_pairs+=len(vals)
summary={'passed':True,'rows_checked':len(rows),'actual_pairs_checked':pairs,'integer_frontier_rows_checked':bound_checks,'anchor_checks':anchor_checks,'monotonicity_checks':monotonicity_checks,'small_population_fixtures':fixtures,'small_completion_pairs':fixture_pairs,'manual_count_cells_checked':len(rows)*6,'independent_of_main_imports':True}
(ROOT/'results/validation.json').write_text(json.dumps(summary,indent=2)+'\n');print(json.dumps(summary))
