"""Bayes with two invented priors, fixed likelihoods, and exact arithmetic."""
from fractions import Fraction as F
import json
def posterior(prior,a,b):
    if any(not 0<=x<=1 for x in [prior,a,b]):raise ValueError('probabilities 0..1')
    evidence=prior*a+(1-prior)*b
    if evidence==0:return None,evidence
    return prior*a/evidence,evidence
if __name__=='__main__':
    rows=[];a,b=F(4,5),F(1,5)
    for prior in [F(1,10),F(1,100)]:
        post,evidence=posterior(prior,a,b)
        prior_odds=prior/(1-prior);ratio=a/b;post_odds=prior_odds*ratio
        assert post_odds/(1+post_odds)==post
        target=1000*prior;target_flagged=target*a;other_flagged=(1000-target)*b
        assert target_flagged/(target_flagged+other_flagged)==post
        rows.append({'prior':str(prior),'P_E_given_A':str(a),'P_E_given_notA':str(b),'P_E':str(evidence),'posterior':str(post),'prior_odds':str(prior_odds),'likelihood_ratio':str(ratio),'posterior_odds':str(post_odds),'constructed_population':1000,'A_count':int(target),'A_flagged':int(target_flagged),'notA_flagged':int(other_flagged)})
    assert rows[0]['posterior']=='4/13' and rows[1]['posterior']=='4/103'
    assert posterior(F(1,2),F(0),F(0))==(None,F(0))
    assert posterior(F(0),a,b)[0]==0 and posterior(F(1),a,b)[0]==1
    print(json.dumps({'cases':rows,'real_population_estimated':False,'model_recalibrated':False},indent=2))
