def _add_mh_correction(self, initial_position, initial_velocity, final_position, final_velocity):
""" Applies MH accept/reject correction. """
initial_energy = self._hamiltonian(initial_position, initial_velocity)
final_energy = self._hamiltonian(final_position, final_velocity)
accepted = self._metropolis_hastings_accept(initial_energy, final_energy)
accepted = tf.to_float(accepted)
# add acceptance to fetched values
self._accepted = accepted
if self.seek_step_sizes or self.fade_in_velocities:
burned_in = tf.to_float(self._burn_in_ratio == 1)
accepted = accepted * burned_in + tf.ones(shape=tf.shape(accepted)) * (1 - burned_in)
# apply MH decision
final_position = self._transpose_mul(final_position, accepted) + \
self._transpose_mul(initial_position, tf.ones(shape=tf.shape(accepted)) - accepted)
final_velocity = self._transpose_mul(final_velocity, accepted) + \
self._transpose_mul(-initial_velocity, tf.ones(shape=tf.shape(accepted)) - accepted)
return final_position, final_velocity
评论列表
文章目录