#!/usr/bin/env python3

import numpy as np

# ***
# *** global variables
# ***
trueBias = 0.3                             # true coin bias
nX       = 11                              # numerical discretization
xx = [i*1.0/(nX-1.0) for i in range(nX)]   
pp = [1.0/nX  for _ in range(nX)]          # starting prior

# ***
# *** Baysian updating
# ***
def updatePrior():
  """Bayesian inference for coin flips;
     marginal correspond to normalization of posterior"""
#
  evidence = 0.0 if (np.random.uniform()>trueBias) else 1.0   # coin flip
  for iX in range(nX):     
    prior = pp[iX]
    likelihood = xx[iX] if (evidence==1) else 1.0-xx[iX]
    pp[iX] = likelihood*prior              # Bayes theorem
#
  norm = sum(pp)
  for iX in range(nX):                     # normalization of posterior
    pp[iX] = pp[iX]/norm
#
  return evidence
    
# ***
# *** main
# ***

ee = 0.0
for _ in range(200):                      # iteration over observations
  for iX in range(nX):     
    print(f'{pp[iX]:6.3f}', end="")
  print(f' | {ee:3.1f}')
  ee = updatePrior()                     
#
for iX in range(nX):                      # support points
  print(f'{xx[iX]:4.1f}  ', end="")
print()
