import math
means=[0.0,4.0]
sigmas=[1.0,1.0]
def responsibilities(x,weights=(0.5,0.5)):
    logs=[math.log(weight)-math.log(sigma*math.sqrt(2*math.pi))
          -0.5*((x-mu)/sigma)**2
          for weight,mu,sigma in zip(weights,means,sigmas)]
    top=max(logs)
    values=[math.exp(z-top) for z in logs]
    total=sum(values)
    return [v/total for v in values]
for x in [1.0,2.0,3.0]:
    print(x,[round(v,6) for v in responsibilities(x)])
print('changed prior at x=2',responsibilities(2.0,(0.8,0.2)))
assert abs(responsibilities(1)[0]-0.9820137900379085)<1e-12
assert responsibilities(2)==[0.5,0.5]
assert abs(responsibilities(2,(0.8,0.2))[0]-0.8)<1e-12
assert all(abs(sum(responsibilities(x))-1)<1e-12 for x in [1,2,3])
