"""Authored two-stratum counts and standardization; no causal graph learned from data."""
from fractions import Fraction as F
import json
TABLE={'easy':{1:(9,10),0:(72,90)},'hard':{1:(27,90),0:(2,10)}}
def risk(cell):return F(cell[0],cell[1])
def standardize(weights):
    assert sum(weights.values(),F(0))==1
    values={t:sum((weights[z]*risk(TABLE[z][t]) for z in TABLE),F(0)) for t in [0,1]}
    return {'weights':{z:str(w) for z,w in weights.items()},'method_1':str(values[1]),'method_0':str(values[0]),'difference_1_minus_0':str(values[1]-values[0])}
def demo():
    crude={t:F(sum(TABLE[z][t][0] for z in TABLE),sum(TABLE[z][t][1] for z in TABLE)) for t in [0,1]}
    equal=standardize({'easy':F(1,2),'hard':F(1,2)});other=standardize({'easy':F(1,5),'hard':F(4,5)})
    assert crude[1]-crude[0]==F(-19,50)
    assert equal['difference_1_minus_0']==other['difference_1_minus_0']=='1/10'
    balanced={'easy':{1:(45,50),0:(40,50)},'hard':{1:(15,50),0:(10,50)}}
    balanced_crude={t:F(sum(balanced[z][t][0] for z in balanced),sum(balanced[z][t][1] for z in balanced)) for t in [0,1]};assert balanced_crude[1]-balanced_crude[0]==F(1,10)
    return {'scenario':'fictional puzzle-solving methods; all counts authored, no experiment conducted','table':TABLE,'stratum_risks':{z:{str(t):str(risk(TABLE[z][t])) for t in [0,1]} for z in TABLE},'crude_risks':{str(t):str(v) for t,v in crude.items()},'crude_difference':str(crude[1]-crude[0]),'standardized_equal_target_population':equal,'standardized_other_target_population':other,'balanced_allocation_counterexample_same_stratum_rates':balanced,'balanced_crude_difference':str(balanced_crude[1]-balanced_crude[0]),'assumed_DAG_edges':[['Z','T'],['Z','Y'],['T','Y']],'DAG_inferred_or_verified_from_table':False,'causal_interpretation_requires':['correct assumed graph without additional unblocked confounding','consistency of defined methods and outcomes','positivity in both difficulty strata'],'DoWhy_or_causal_discovery_executed':False}
if __name__=='__main__':print(json.dumps(demo(),ensure_ascii=False,indent=2))
