"""Original complete finite proposal-world expectations, not empirical sampling."""
from fractions import Fraction as F
from itertools import product
import json
def evaluate(pi,f,q):
 if any(type(a) is not list or len(a)!=3 for a in [pi,f,q]) or any(type(x) not in [int,F] for a in [pi,f,q] for x in a):raise ValueError('three exact rational states')
 p=list(map(F,pi));q=list(map(F,q));f=list(map(F,f))
 if sum(p)!=1 or sum(q)!=1 or any(x<0 for x in p+q) or any(q[i]==0 and p[i]*f[i]!=0 for i in range(3)):raise ValueError('normalized masses and support for nonzero contribution')
 target=sum(p[i]*f[i] for i in range(3));z=[p[i]*f[i]/q[i] if q[i] else F(0) for i in range(3)];mean=sum(q[i]*z[i] for i in range(3));var=sum(q[i]*(z[i]-mean)**2 for i in range(3));assert mean==target
 second=sum((p[i]*f[i])**2/q[i] for i in range(3) if q[i]);assert second-target**2==var
 return target,z,mean,var,sum(q[i]*f[i] for i in range(3))
def demo():
 p=[F(1,2),F(1,3),F(1,6)];f=[0,1,4];qs=[[F(1,3)]*3,[F(1,12),F(1,3),F(7,12)],[F(3,4),F(1,6),F(1,12)]];rows=[]
 for q in qs:
  target,z,mean,var,raw=evaluate(p,f,q);pairmean=F(0);pairsecond=F(0)
  for i,j in product(range(3),repeat=2):
   prob=q[i]*q[j];estimate=(z[i]+z[j])/2;pairmean+=prob*estimate;pairsecond+=prob*estimate**2
  assert pairmean==target and pairsecond-pairmean**2==var/2
  rows.append({'proposal_q':[str(x) for x in q],'importance_values_f_pi_over_q':[str(x) for x in z],'exact_expectation':str(mean),'variance_one_draw':str(var),'uncorrected_expectation':str(raw),'all_nine_independent_two_draw_worlds_mean':str(pairmean),'two_draw_mean_variance':str(var/2)})
 assert [r['variance_one_draw'] for r in rows]==['2/3','2/21','5']
 valid_zero=evaluate(p,f,[0,F(1,3),F(2,3)]);assert valid_zero[0]==1
 rejected=[]
 for q in [[F(1,2),F(1,2),0],[-1,1,1],[F(1,2),F(1,3),F(1,3)],[True,0,0]]:
  try:evaluate(p,f,q)
  except ValueError:rejected.append([str(x) for x in q])
  else:raise AssertionError('expected rejection')
 return {'target_pi':[str(x) for x in p],'function_f':f,'target_expectation':'1','three_proposals':rows,'zero_proposal_where_f_pi_zero_is_allowed':{'q':['0','1/3','2/3'],'expectation':str(valid_zero[2])},'rejected':rejected,'scope':'all finite worlds exactly enumerated; no random draw, self-normalized ratio, Markov chain or real model/variance-quality guarantee'}
if __name__=='__main__':print(json.dumps(demo(),ensure_ascii=True,indent=2))
