def free_energy(eps,q,mu,samples=1000,use_annealed_approx=False): """Compute free energy for true distribution given best approximation. Return beta*free_energy,actually""" # def Q(xs): # return product(fd(ep,mu) if x else 1 - fd(ep,mu) for x,ep in zip(xs,eps)) Sq = -sum((p*log(p)+(1-p)*log(1-p) for p in probs(eps,mu))) def E(xs): """Compute energy function for P,unnormalized""" ff = falling_fac(q,sum(xs)) if ff == 0: return 1000 else: return log(ff) + sum(ep*x for (x,ep) in zip(xs,eps)) if use_annealed_approx: # to get around impossible states where E=\infty mean_E = log(mean(exp(E(rstate(eps,mu))) for i in range(samples))) # take <E(xs)>_Q else: mean_E = mean(E(rstate(eps,mu)) for i in range(samples)) # take <E(xs)>_Q return beta*mean_E - Sq
def proposal(ss): #state = [int(random.random() < p) for _ in range(len(ss))] state = rstate(eps,mu) #print "proposed state with occ:",sum(state) return state