20 #ifndef SAMPLE_STEP_H_INCLUDED
21 #define SAMPLE_STEP_H_INCLUDED
49 template<typename Model, typename Proposer = typename Mh_model_proposer<Model>::Type >
76 Step_log<Model> run_step(Model&
m,
double lt_m,
double& accept_prob, boost::optional<Model&> proposed_state_out = boost::none)
const;
98 virtual double l_target(
const Model&
m)
const = 0;
119 template<
typename Model,
typename Proposer>
133 Model& m_p = *tmp_model_;
141 if(proposed_state_out)
142 *proposed_state_out = m_p;
154 lt_m_p = l_target(m_p);
158 accept_prob = (lt_m_p - lt_m + q_m - q_m_p) / get_temperature();
186 result.
extra[
"mh_p_fwd"] = lt_m_p;
187 result.
extra[
"mh_p_rev"] = lt_m;
188 result.
extra[
"mh_q_fwd"] = q_m_p;
189 result.
extra[
"mh_q_rev"] = q_m;
190 result.
extra[
"mh_accept"] = accept_prob;
197 template<
typename Model,
typename Proposer>
201 return run_step(m, lt_m, accept_prob);
218 template<typename Model, typename Proposer_type = typename Mh_model_proposer<Model>::Type >
379 template<
typename Model>
423 template<
class Model>
427 const Proposer& propose = get_proposer();
428 const Get_dimension& get_dimension = get_dimension_function();
430 int num_vars = get_dimension(m);
432 boost::optional<double> result;
433 for(
int i = 0;
i < num_vars;
i++)
435 result = propose(m,
i);
440 result = l_target(m);
459 template<
typename Model>
568 template<
typename Model,
569 bool CONSTRAINED_TARGET =
false,
570 bool INCLUDE_ACCEPT_STEP =
true,
571 bool REVERSIBLE =
true>
589 int num_dynamics_steps,
654 const bool partial_updates = (alpha > 0.0);
655 return !accept_step && !reversible && partial_updates;
660 const bool partial_updates = (alpha > 0.0);
663 return !accept_step && !(reversible && partial_updates);
802 template<
class Model,
bool CONSTRAINED_TARGET,
bool INCLUDE_ACCEPT_STEP,
bool REVERSIBLE>
816 const Gradient& compute_gradient = get_gradient();
818 const Get_step_size& get_step_size = get_step_size_function();
819 const Get_dimension& get_dimension = get_dimension_function();
822 const Get_parameter& get_parameter = get_parameter_function();
826 size_t hmc_dim = get_dimension(q);
829 if(p.get_length() !=
static_cast<int>(hmc_dim))
842 kjb::Vector grad_x_eps = -1.0 * compute_gradient(q);
843 std::transform(grad_x_eps.
begin(), grad_x_eps.
end(), epsilons.
begin(),
844 grad_x_eps.
begin(), std::multiplies<double>());
864 p_star -= grad_x_eps;
870 p_star -= grad_x_eps / 2.0;
879 for(
int i = 0;
i < m_num_dynamics_steps;
i++)
883 std::transform(epsilons.
begin(), epsilons.
end(), p_star.
begin(),
884 etp.begin(), std::multiplies<double>());
886 if(CONSTRAINED_TARGET)
889 lower_bounds = get_lower_bounds(q_star);
890 upper_bounds = get_upper_bounds(q_star);
896 for(
size_t d = 0; d < hmc_dim; d++)
899 if(!CONSTRAINED_TARGET)
911 q_d = get_parameter(q_star, d);
912 q_d_p = q_d + etp[d];
913 if(q_d_p < lower_bounds[d])
915 q_d_p = (2 * lower_bounds[d] - q_d_p);
919 if(q_d_p > upper_bounds[d])
921 q_d_p = (2 * upper_bounds[d] - q_d_p);
924 }
while(q_d_p < lower_bounds[d] || q_d_p > upper_bounds[d]);
927 move_parameter(q_star, d, mpb);
931 post_move_callback(q_star, p_star);
934 if(
i == m_num_dynamics_steps - 1 && m_last_p_ignore)
949 grad_x_eps = -1.0 * compute_gradient(q_star);
950 epsilons = get_step_size(q_star);
951 std::transform(grad_x_eps.
begin(), grad_x_eps.
end(), epsilons.
begin(),
952 grad_x_eps.
begin(), std::multiplies<double>());
957 if(
i != m_num_dynamics_steps - 1)
959 p_star -= grad_x_eps;
971 p_star -= (grad_x_eps / 2.0);
982 double U_q_star = -l_target(q_star);
987 double K_p = p.magnitude_squared() / 2.0;
989 if(INCLUDE_ACCEPT_STEP)
993 accept_prob = (U_q - U_q_star + K_p - K_p_star) / m_temperature;
1014 lt_final = -U_q_star;
1033 result.
extra[
"hmc_u_rev"] = U_q;
1034 result.
extra[
"hmc_u_fwd"] = U_q_star;
1035 result.
extra[
"hmc_k_rev"] = K_p;
1036 result.
extra[
"hmc_k_fwd"] = K_p_star;
1037 result.
extra[
"hmc_accept"] = accept_prob;
1058 template<
typename Model,
1059 bool CONSTRAINED_TARGET =
false,
1060 bool INCLUDE_ACCEPT_STEP =
true,
1061 bool REVERSIBLE =
true>
1108 int num_dynamics_steps,
1115 Parent(num_dynamics_steps, alpha),
1130 int num_dynamics_steps,
1140 Parent(num_dynamics_steps, alpha),
1251 template<
class Model,
bool REVERSIBLE = true>
const int m_num_dynamics_steps
The number of leapfrog steps in the trajectory, "choosing a suitable trajectory length is crucial if ...
Definition: sample_step.h:777
virtual const Get_dimension & get_dimension_function() const
Returns a reference to the mechanism for computing the dimension of the model.
Definition: sample_step.h:1205
virtual bool record_extra() const
Definition: sample_step.h:111
virtual const Target_distribution & get_log_target() const
Copy-constructor.
Definition: sample_step.h:515
Proposer_type & get_proposer_()
Definition: sample_step.h:349
virtual const Get_parameter & get_parameter_function() const
Returns a reference to the mechanism for getting the value of a dimension of the model.
Definition: sample_step.h:1214
virtual const Target_distribution & get_log_target() const
Returns a reference to the target distribution. Returned object must comply with the ModelEvaluator c...
Definition: sample_step.h:1197
Definition: sample_step.h:460
Parent::Get_lower_bounds Get_lower_bounds
Definition: sample_step.h:1076
Parent::Proposer Proposer
Definition: sample_step.h:466
virtual void on_reject() const
Definition: sample_step.h:103
boost::function2< void, Model &, kjb::Vector & > m_post_move_callback
Definition: sample_step.h:1240
virtual const Move_parameter & get_move_parameter() const =0
Returns a reference to the parameter-changing mechanism. Must comply with the ChangeParameter concept...
virtual bool record_extra() const =0
if true is returned, the step log will contain metadata about the step
bool is_last_p_ignored(const bool alpha, const bool accept_step, const bool reversible)
Definition: sample_step.h:658
Get_parameter m_get_parameter
Definition: sample_step.h:1236
double fwd_prob
log forward proposal probability
Definition: sample_base.h:379
virtual Mh_proposal_result propose(const Model &m, Model &m_p) const
Assignment.
Definition: sample_step.h:295
virtual Step_log< Model > operator()(Model &m, double lt_m) const
Runs a step of Gibbs on a model m.
Definition: sample_step.h:424
size_type size() const
Alias to get_length(). Required to comply with stl Container concept.
Definition: m_vector.h:510
void set_target(const Target_distribution &target)
Definition: sample_step.h:314
virtual void on_accept() const
Definition: sample_step.h:101
virtual const Get_upper_bounds & get_upper_bounds_function() const =0
Returns a reference to the mechanism for getting the upper bounds of a function.
Model_evaluator< Model >::Type Target_distribution
Definition: sample_step.h:383
BOOST_CONCEPT_ASSERT((BaseModel< Model >))
Proposer_type Proposer
Definition: sample_step.h:225
Indicates the result of an MH proposal. It is simply a pair of probabilities, forward and backward...
Definition: sample_base.h:334
Model_parameter_evaluator< Model >::Type Get_upper_bounds
Definition: sample_step.h:584
Parent::Get_upper_bounds Get_upper_bounds
Definition: sample_step.h:1077
virtual const Get_dimension & get_dimension_function() const =0
Returns a reference to the mechanism for computing the dimension of the model.
virtual const Get_dimension & get_dimension_function() const
Returns a reference to a function that is used to obtain the dimension of the model. See Model_dimension for more info.
Definition: sample_step.h:519
Model_parameter_evaluator< Model >::Type Get_step_size
Definition: sample_step.h:578
void set_post_move_callback(const boost::function2< void, Model &, kjb::Vector & > &f)
Copy-constructor.
Definition: sample_step.h:1190
void swap(Perspective_camera &cam1, Perspective_camera &cam2)
Swap two cameras.
Definition: perspective_camera.h:599
Model_evaluator< Model >::Type Target_distribution
Definition: sample_step.h:53
Model_dimension< Model >::Type Get_dimension
Definition: sample_step.h:385
Definition: sample_step.h:1062
std::map< std::string, double > extra
Definition: sample_base.h:105
boost::function2< boost::optional< double >, Model &, size_t > Type
Definition: sample_base.h:426
r
Definition: APPgetLargeConnectedEdges.m:127
Definition: sample_step.h:219
Structure for returning results of a single sampling move.
Definition: sample_base.h:55
Abstract_hmc_step(const Abstract_hmc_step &ahs)
Definition: sample_step.h:667
virtual const Get_lower_bounds & get_lower_bounds_function() const =0
Returns a reference to the mechanism for getting the lower bounds of a function.
Get_dimension m_get_dimension
Definition: sample_step.h:526
Definition: sample_base.h:160
This class implements vectors, in the linear-algebra sense, with real-valued elements.
Definition: m_vector.h:87
bool no_change
proposal didn't modify the model
Definition: sample_base.h:386
virtual const Get_upper_bounds & get_upper_bounds_function() const
Returns a reference to the mechanism for getting the upper bounds of a function.
Definition: sample_step.h:1218
double m_alpha
Amount of stochastic update to apply to momentum. Set to zero for strict HMC.
Definition: sample_step.h:783
Basic_mh_step(const Target_distribution &log_target, const Proposer_type &proposer)
Initializes target and proposer functors (or functions) to the given arguments.
Definition: sample_step.h:237
double rev_prob
log reverse proposal probability
Definition: sample_base.h:381
Vector sample(const MV_gaussian_distribution &dist)
Sample from a multivariate normal distribution.
Definition: prob_sample.cpp:42
double m_temperature
Definition: sample_step.h:796
virtual const Get_parameter & get_parameter_function() const =0
Returns a reference to the mechanism for getting the value of a dimension of the model.
virtual void post_move_callback(Model &q, kjb::Vector &p) const
Definition: sample_step.h:1220
Parent::Move_parameter Move_parameter
Definition: sample_step.h:1070
void set_temperature(double T)
Definition: sample_step.h:333
void set_temperature(const double T)
Definition: sample_step.h:729
Parent::Get_step_size Get_step_size
Definition: sample_step.h:1071
BOOST_CONCEPT_ASSERT((BaseModel< Model >))
virtual const Proposer & get_proposer() const =0
Returns a reference to the proposal mechanism. Returned object must comply with the GibbsModelPropose...
virtual const Get_lower_bounds & get_lower_bounds_function() const
Returns a reference to the mechanism for getting the lower bounds of a function.
Definition: sample_step.h:1216
virtual const Get_step_size & get_step_size_function() const =0
Returns a reference to the mechanism for choosing the neighborhoods for each parameters.
virtual ~Basic_gibbs_step()
Definition: sample_step.h:521
kjb::Vector p
Momentum.
Definition: sample_step.h:788
Target_distribution m_log_target
Definition: sample_step.h:354
Move_parameter m_move_parameter
Definition: sample_step.h:1229
virtual Step_log< Model > operator()(Model &m, double lt_m) const
Runs a step of Metropolis-Hastings on a model m.
Definition: sample_step.h:198
bool m_first_p_full
Optimization constants. Set to false for true MCMC.
Definition: sample_step.h:793
bool m_last_p_ignore
Definition: sample_step.h:794
virtual const Move_parameter & get_move_parameter() const
Returns a reference to the parameter-changing mechanism. Must comply with the ChangeParameter concept...
Definition: sample_step.h:1201
iterator end()
Definition: m_vector.h:557
Get_model_parameter< Model >::Type Get_parameter
Definition: sample_step.h:582
Definition: sample_step.h:1252
Target_distribution m_log_target
Definition: sample_step.h:524
iterator begin()
Definition: m_vector.h:537
Basic_hmc_step< Model, false, false, REVERSIBLE > Type
Definition: sample_step.h:1254
Abstract_gibbs_step< Model > Parent
Definition: sample_step.h:463
Abstract_hmc_step(int num_dynamics_steps, double alpha)
Definition: sample_step.h:588
Abstract_hmc_step< Model, CONSTRAINED_TARGET, INCLUDE_ACCEPT_STEP, REVERSIBLE > Parent
Definition: sample_step.h:1066
boost::optional< Model > tmp_model_
Definition: sample_step.h:114
Parent::Get_parameter Get_parameter
Definition: sample_step.h:1075
Model_dimension< Model >::Type Get_dimension
Definition: sample_step.h:579
Multivariate Gaussian (normal) distribution.
Definition: prob_distribution.h:619
bool is_first_p_full(const bool alpha, const bool accept_step, const bool reversible)
Definition: sample_step.h:598
bool m_record_extra
Definition: sample_step.h:1233
boost::function1< double, const Model & > Type
Definition: sample_base.h:214
void record_extra(bool enable)
Definition: sample_step.h:1155
virtual const Target_distribution & get_log_target() const =0
Returns a reference to the target distribution. Returned object must comply with the ModelEvaluator c...
Definition: sample_step.h:572
Get_upper_bounds m_get_upper_bounds
Definition: sample_step.h:1238
Move_model_parameter< Model >::Type Move_parameter
Definition: sample_step.h:577
virtual bool record_extra() const
if true is returned, the step log will contain metadata about the step
Definition: sample_step.h:1208
boost::function1< kjb::Vector, const Model & > Type
Definition: sample_base.h:317
Model_evaluator< Model >::Type Target_distribution
Definition: sample_step.h:575
void swap(kjb::Gsl_Multimin_fdf &m1, kjb::Gsl_Multimin_fdf &m2)
Swap two wrapped multimin objects.
Definition: gsl_multimin.h:693
boost::function3< void, Model &, size_t, double > Type
Definition: sample_base.h:294
Parent::Get_dimension Get_dimension
Definition: sample_step.h:467
virtual Mh_proposal_result propose(const Model &m, Model &m_p) const =0
Propose a new model.
Get_lower_bounds m_get_lower_bounds
Definition: sample_step.h:1237
Get_dimension m_get_dimension
Definition: sample_step.h:1231
Parent::Target_distribution Target_distribution
Definition: sample_step.h:465
virtual double get_temperature() const
Definition: sample_step.h:90
Proposer m_proposer
Definition: sample_step.h:525
Definition: sample_step.h:50
Gibbs_model_proposer< Model >::Type Proposer
Definition: sample_step.h:384
Sampling functionality for the different distributions defined in "prob_distributions.h".
Parent::Gradient Gradient
Definition: sample_step.h:1069
virtual const Gradient & get_gradient() const =0
Returns a reference to the mechanism to compute the gradient of the target distribution.
std::string type
Name of proposal type.
Definition: sample_base.h:383
virtual void post_move_callback(Model &, kjb::Vector &) const
Definition: sample_step.h:762
Basic_gibbs_step(const Target_distribution &log_target, const Proposer &proposer, const Get_dimension &get_dimension)
Initializes target and proposer functors (or functions) to the given arguments.
Definition: sample_step.h:480
virtual const Get_dimension & get_dimension_function() const =0
Returns a reference to a function that is used to obtain the dimension of the model. See Model_dimension for more info.
Target_distribution m_log_target
Definition: sample_step.h:1227
virtual Step_log< Model > operator()(Model &q, double lt_q) const
Runs a step of Hybrid Monte-Carlo (HMC) on a model m.
Definition: sample_step.h:803
double m_temperature
Definition: sample_step.h:356
Parent::Target_distribution Target_distribution
Definition: sample_step.h:1068
Parent::Target_distribution Target_distribution
Definition: sample_step.h:224
Step_log< Model > run_step(Model &m, double lt_m, double &accept_prob, boost::optional< Model & > proposed_state_out=boost::none) const
Runs a step of Metropolis-Hastings on a model m.
Definition: sample_step.h:120
Proposer_type m_proposer
Definition: sample_step.h:355
get the indices of edges in each direction for i
Definition: APPgetLargeConnectedEdges.m:48
bool m_record_extra
Definition: sample_step.h:358
boost::math::uniform Uniform_distribution
Definition: prob_distribution.h:70
for m
Definition: APPgetLargeConnectedEdges.m:64
Abstract_mh_step< Model, Proposer_type > Parent
Definition: sample_step.h:222
Support for error handling exception classes in libKJB.
Parent::Get_dimension Get_dimension
Definition: sample_step.h:1072
boost::function2< double, const Model &, size_t > Type
Definition: sample_base.h:270
virtual double l_target(const Model &m) const =0
Evaluate the log-target distribution for the given model.
Definition: sample_concept.h:41
Value_type magnitude_squared() const
Return this vector's squared magnitude.
Definition: m_vector.h:1501
virtual const Target_distribution & get_log_target() const =0
Returns a reference to the target distribution. Returned object must comply with the ModelEvaluator c...
virtual ~Abstract_gibbs_step()
Definition: sample_step.h:417
Model_parameter_evaluator< Model >::Type Gradient
Definition: sample_step.h:576
Basic_hmc_step(const Target_distribution &log_target, int num_dynamics_steps, const Gradient &gradient, const Move_parameter &move_parameter, const Get_step_size &get_step_size, const Get_dimension &get_dimension, double alpha=0.0)
Creates a Basic_hmc_step by initializing target and proposer functors (or functions) to the given arg...
Definition: sample_step.h:1106
void record_extra(bool enable)
Definition: sample_step.h:324
BOOST_CONCEPT_ASSERT((BaseModel< Model >))
virtual ~Abstract_mh_step()
Definition: sample_step.h:92
virtual const Get_step_size & get_step_size_function() const
Returns a reference to the mechanism for choosing the neighborhoods for each parameters.
Definition: sample_step.h:1203
Model_parameter_evaluator< Model >::Type Get_lower_bounds
Definition: sample_step.h:583
boost::function1< size_t, const Model & > Type
Definition: sample_base.h:305
virtual double l_target(const Model &m) const
Evaluate the log-target distribution for the given model.
Definition: sample_step.h:301
virtual bool record_extra() const
Definition: sample_step.h:344
Gradient m_gradient
Definition: sample_step.h:1228
Get_step_size m_get_step_size
Definition: sample_step.h:1230
virtual ~Basic_mh_step()
Initializes target and proposer functors (or functions) to the given arguments.
Definition: sample_step.h:277
virtual double get_temperature() const
Definition: sample_step.h:338
virtual const Proposer & get_proposer() const
Returns a reference to the proposal mechanism. Returned object must comply with the GibbsModelPropose...
Definition: sample_step.h:517
virtual ~Abstract_hmc_step()
Definition: sample_step.h:768
virtual ~Basic_hmc_step()
Definition: sample_step.h:1195
Definition: sample_step.h:380
virtual const Gradient & get_gradient() const
Returns a reference to the mechanism to compute the gradient of the target distribution.
Definition: sample_step.h:1199