def hmc_propose(chains, adapted_approximation, adapted_scale, maxGradient): e = 0.25 start_vectors = chains.vectors startp = chains.logps p = random.multivariate_normal( mean=zeros(chains.dimensions), cov=adapted_approximation.inv_orientation, size=chains._nChains ) start_p = p p = p - (e / 2) * (-chains.logp_grads) T = 3 for i in range(T): chains.propose(chains.vectors + e * vectorsMult(adapted_approximation.orientation, p)) if i != T - 1: p = p - e * (-chains.logp_grads) p = p - (e / 2) * (-chains.logp_grads) p = -p end_vectors = chains.vectors chains.propose(start_vectors) chains.propose(end_vectors) chains.vectors - start_vectors # ( (-startp) - (-chains.logps) + sum(start_p**2, axis =1)/2 - sum(p**2, axis =1)/2) # ( (-startp) - (-chains.logps) + kenergy(start_p, adapted_approximation.orientation) - kenergy(p, adapted_approximation.orientation)) # return sum(p**2, axis =1)/2,sum(start_p**2, axis =1) /2 return kenergy(p, adapted_approximation.orientation), kenergy(start_p, adapted_approximation.orientation)
def hmc_propose(chains, adapted_approximation, adapted_scale, maxGradient): e = .25 start_vectors = chains.vectors startp = chains.logps p = random.multivariate_normal(mean=zeros(chains.dimensions), cov=adapted_approximation.inv_orientation, size=chains._nChains) start_p = p p = p - (e / 2) * (-chains.logp_grads) T = 3 for i in range(T): chains.propose(chains.vectors + e * vectorsMult(adapted_approximation.orientation, p)) if i != T - 1: p = p - e * (-chains.logp_grads) p = p - (e / 2) * (-chains.logp_grads) p = -p end_vectors = chains.vectors chains.propose(start_vectors) chains.propose(end_vectors) chains.vectors - start_vectors #( (-startp) - (-chains.logps) + sum(start_p**2, axis =1)/2 - sum(p**2, axis =1)/2) #( (-startp) - (-chains.logps) + kenergy(start_p, adapted_approximation.orientation) - kenergy(p, adapted_approximation.orientation)) #return sum(p**2, axis =1)/2,sum(start_p**2, axis =1) /2 return kenergy(p, adapted_approximation.orientation), kenergy( start_p, adapted_approximation.orientation)
def drift(x, gradient): return vectorsMult(scaledOrientation, truncate_gradient(x, gradient,adapted_approximation, maxGradient) /2)