"""Two authored group-confusion-table counterexamples; no fairness certification or legal judgment."""
from fractions import Fraction as F
import json
def rates(c):
    if set(c)!=set(['tp','fp','fn','tn']) or any(type(x) is not int or x<0 for x in c.values()):raise ValueError('four nonnegative integer counts')
    n=sum(c.values());positive=c['tp']+c['fn'];negative=c['fp']+c['tn']
    return {'n':n,'reference_positive_rate':F(positive,n) if n else None,'selection_rate':F(c['tp']+c['fp'],n) if n else None,'tpr':F(c['tp'],positive) if positive else None,'fpr':F(c['fp'],negative) if negative else None,'accuracy':F(c['tp']+c['tn'],n) if n else None}
def gap(values):return max(values)-min(values) if all(v is not None for v in values) else None
def compare(groups):
    result={k:rates(v) for k,v in groups.items()};dp=gap([r['selection_rate'] for r in result.values()]);tpr=gap([r['tpr'] for r in result.values()]);fpr=gap([r['fpr'] for r in result.values()]);eo=max(tpr,fpr) if tpr is not None and fpr is not None else None
    return {'tables':groups,'group_rates':{g:{k:str(v) if isinstance(v,F) else v for k,v in r.items()} for g,r in result.items()},'selection_rate_gap':str(dp) if dp is not None else None,'tpr_gap':str(tpr) if tpr is not None else None,'fpr_gap':str(fpr) if fpr is not None else None,'equalized_odds_max_gap':str(eo) if eo is not None else None}
def demo():
    first={'A':{'tp':40,'fp':20,'fn':10,'tn':30},'B':{'tp':16,'fp':32,'fn':4,'tn':48}}
    second={'A':first['A'],'B':{'tp':12,'fp':48,'fn':8,'tn':32}}
    a,b=compare(first),compare(second);assert a['selection_rate_gap']=='3/25' and a['equalized_odds_max_gap']=='0';assert b['selection_rate_gap']=='0' and b['equalized_odds_max_gap']=='1/5'
    empty_positive={'A':first['A'],'C':{'tp':0,'fp':2,'fn':0,'tn':8}};missing=compare(empty_positive);assert missing['tpr_gap'] is None and missing['equalized_odds_max_gap'] is None
    return {'scenario':'authored groups A and B, not observed demographic or customer data','case_same_tpr_fpr_different_selection':a,'case_same_selection_different_tpr_fpr':b,'no_positive_reference_counterexample':missing,'fairlearn_executed':False,'legal_or_complete_fairness_verdict':False,'uncertainty_intervals_estimated':False}
if __name__=='__main__':print(json.dumps(demo(),ensure_ascii=False,indent=2))
