"""Enumerate exact binary randomized-response distributions; not a production privacy tool."""
from fractions import Fraction as F
import itertools,math,json
def distribution(x,q):
    if x not in [0,1] or not F(1,2)<=q<=1:raise ValueError('binary domain and truth probability in [1/2,1]')
    return {y:q if y==x else 1-q for y in [0,1]}
def event_check(p0,p1):
    outputs=list(p0);ratios=[]
    for mask in range(1<<len(outputs)):
        event=[v for i,v in enumerate(outputs) if mask>>i&1];a=sum((p0[v] for v in event),F(0));b=sum((p1[v] for v in event),F(0))
        ratios.append((a/b if b else None,b/a if a else None))
    finite=[v for pair in ratios for v in pair if v is not None]
    infinite=any((sum((p0[v] for i,v in enumerate(outputs) if mask>>i&1),F(0))>0 and sum((p1[v] for i,v in enumerate(outputs) if mask>>i&1),F(0))==0) or (sum((p1[v] for i,v in enumerate(outputs) if mask>>i&1),F(0))>0 and sum((p0[v] for i,v in enumerate(outputs) if mask>>i&1),F(0))==0) for mask in range(1<<len(outputs)))
    return {'event_sets_checked':1<<len(outputs),'maximum_finite_ratio':str(max(finite)),'infinite_ratio_exists':infinite}
def demo():
    q=F(3,4);single={x:distribution(x,q) for x in [0,1]};one=event_check(single[0],single[1]);assert one['maximum_finite_ratio']=='3' and not one['infinite_ratio_exists']
    pair={x:{ys:single[x][ys[0]]*single[x][ys[1]] for ys in itertools.product([0,1],repeat=2)} for x in [0,1]}
    two=event_check(pair[0],pair[1]);assert two['maximum_finite_ratio']=='9' and not two['infinite_ratio_exists']
    zero=event_check(distribution(0,F(1,2)),distribution(1,F(1,2)));assert zero['maximum_finite_ratio']=='1'
    deterministic=event_check(distribution(0,F(1)),distribution(1,F(1)));assert deterministic['infinite_ratio_exists']
    return {'neighboring_inputs':'one person one bit; 0 and 1 differ by substitution','truth_probability':'3/4','single_distribution':{str(x):{str(y):str(p) for y,p in d.items()} for x,d in single.items()},'single_event_check':one,'epsilon':math.log(3),'delta':0,'two_independent_rerandomized_releases':{str(x):{''.join(map(str,y)):str(p) for y,p in d.items()} for x,d in pair.items()},'two_event_check':two,'two_release_epsilon_bound':2*math.log(3),'boundary_q_half':zero,'boundary_q_one':deterministic,'random_draws_executed':0,'exact_distribution_enumeration':True,'cryptographic_randomness_or_production_DP_implemented':False}
if __name__=='__main__':print(json.dumps(demo(),ensure_ascii=False,indent=2))
