-
Notifications
You must be signed in to change notification settings - Fork 2
/
Hamiltonian.py
47 lines (36 loc) · 1.4 KB
/
Hamiltonian.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import torch
# import binary_potential
from default_potential import vanilla_potential as df_poten
class hamilton_operator :
def __init__(self, potential_struct=None):
if potential_struct is None :
self.potential=df_poten()
else :
self.potential =potential_struct
return
'''Kinetic energy (assuming mass is 1'''
def kinetic_energy(self, velocity):
return 0.5 * torch.dot(velocity, velocity)
def hamiltonian_measure(self,position, velocity, pot_val=None):
"""Computes the Hamiltonian of the current position, velocity pair
H = U(x) + K(v)
U is the potential energy and is = -log_posterior(x)
Parameters
----------
position : tf.Variable
Position or state vector x (sample from the target distribution)
velocity : tf.Variable
Auxiliary velocity variable
energy_function
Function from state to position to 'energy'
= -log_posterior
Returns
-------
hamitonian : float
"""
kinetic_val = self.kinetic_energy(velocity)
if pot_val is None:
ham_val = self.potential.calc_potential_energy(position) + kinetic_val
else:
ham_val = pot_val + kinetic_val
return ham_val