25 template <
class SimpleVector>
38 double goal_accept_rate) :
39 goal_accept_prob_(goal_accept_rate),
43 proposer_(new
Proposer(initial_covariance)),
53 proposer_->set_temperature(t);
73 gamma_ = boost::bind(Self::inverse_i_, log(C), alpha, _1);
89 gamma_ = boost::bind(Self::constant_function_, gamma, _1);
91 gamma_ = boost::bind(Self::step_function_, gamma, change_point, _1);
96 SimpleVector previous_state = in;
99 SimpleVector proposed_state;
102 accept_prob =
std::min(0.0, accept_prob);
103 accept_prob = exp(accept_prob);
104 adapt(accept_prob, previous_state, proposed_state, in);
106 if(post_callback_) post_callback_(*
this);
115 return proposer_->get_unscaled_cholesky_covariance();
123 return proposer_->get_global_scale();
126 virtual void adapt(
double accept_prob,
const SimpleVector& previous_state,
const SimpleVector& proposed_state,
const SimpleVector& accepted_state)
130 double gamma = gamma_(i_);
131 proposer_->adapt_global_scale(gamma * (accept_prob - goal_accept_prob_));
136 mu_ = previous_state;
138 SimpleVector delta = accepted_state;
139 std::transform(delta.begin(), delta.end(), mu_.begin(), delta.begin(), std::minus<double>());
142 proposer_->adapt_covariance(delta, gamma);
144 std::transform(delta.begin(), delta.end(), delta.begin(), std::bind2nd(std::multiplies<double>(), gamma));
145 std::transform(mu_.begin(), mu_.end(), delta.begin(), mu_.begin(), std::plus<double>());
181 static double inverse_i_(
double log_C,
double alpha,
double i)
183 return exp( log_C - alpha * log(i));
192 static double step_function_(
double v,
size_t change_point,
size_t i)
194 if(i < change_point)
return v;
201 static double constant_function_(
double f,
size_t)
207 double goal_accept_prob_;
210 boost::function1<double, size_t> gamma_;
213 boost::shared_ptr<Mv_gaussian_proposer<SimpleVector> > proposer_;
215 boost::function1<void, const Self&> post_callback_;
216 mutable Base_step step_;
220 template <
class Model>
226 typedef boost::function2<void, const Model&, kjb::Vector&> To_vector;
227 typedef boost::function2<void, const kjb::Vector&, Model&> From_vector;
231 struct target_wrapper
235 const From_vector& from_vector_) :
237 ,from_vector(from_vector_)
246 from_vector(v, model);
250 return target(model);
254 From_vector from_vector;
267 const To_vector& to_vector,
268 const From_vector& from_vector,
271 double goal_accept_rate) :
272 Base_step(boost::ref(target_wrapper_), initial_covariance, goal_accept_rate),
273 target_wrapper_(target, from_vector),
274 to_vector_(to_vector)
284 target_wrapper_(other.target_wrapper_),
285 to_vector_(other.to_vector_)
293 target_wrapper_.model = in;
295 target_wrapper_.called =
false;
302 assert(log.size() == 1);
304 assert(target_wrapper_.called ==
true);
307 if(log.back().accept)
309 in = target_wrapper_.model;
316 target_wrapper target_wrapper_;
317 To_vector to_vector_;
void set_temperature(double t)
Definition: sample_adaptive_mh.h:51
Generic_adaptive_mh_step(const To_vector &to_vector, const From_vector &from_vector, const Target_distribution &target, const kjb::Matrix &initial_covariance, double goal_accept_rate)
Definition: sample_adaptive_mh.h:266
void set_target(const Target_distribution &target)
Definition: sample_step.h:314
Indicates the result of an MH proposal. It is simply a pair of probabilities, forward and backward...
Definition: sample_base.h:334
Definition: sample_vector.h:251
Step_log< SimpleVector > operator()(SimpleVector &in, double lt_m)
Definition: sample_adaptive_mh.h:94
void set_constant_learning_rate(double gamma, size_t change_point=0)
Definition: sample_adaptive_mh.h:86
Definition: sample_base.h:160
This class implements vectors, in the linear-algebra sense, with real-valued elements.
Definition: m_vector.h:87
Model_evaluator< Model >::Type Target_distribution
Definition: sample_adaptive_mh.h:224
Base_step::Proposer Proposer
Definition: sample_adaptive_mh.h:264
void set_temperature(double T)
Definition: sample_step.h:333
void set_post_callback(const boost::function1< void, const Self & > &cb)
Definition: sample_adaptive_mh.h:154
Definition: sample_adaptive_mh.h:221
void set_target(const Target_distribution &t)
Definition: sample_adaptive_mh.h:171
Step_log< Model > operator()(Model &in, double lt_m)
Definition: sample_adaptive_mh.h:291
Base_step::Target_distribution Target_distribution
Definition: sample_adaptive_mh.h:32
Definition: sample_adaptive_mh.h:26
boost::function1< double, const Model & > Type
Definition: sample_base.h:214
double get_log_lambda() const
returns the log of the current scaling lambda
Definition: sample_adaptive_mh.h:166
double get_global_scale() const
Definition: sample_adaptive_mh.h:121
Int_matrix::Value_type min(const Int_matrix &mat)
Return the minimum value in this matrix.
Definition: l_int_matrix.h:1385
virtual void adapt(double accept_prob, const SimpleVector &previous_state, const SimpleVector &proposed_state, const SimpleVector &accepted_state)
Definition: sample_adaptive_mh.h:126
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
void set_inverse_learning_rate(double C, double alpha)
Definition: sample_adaptive_mh.h:71
get the indices of edges in each direction for i
Definition: APPgetLargeConnectedEdges.m:48
Simple_adaptive_mh_step(const Target_distribution &target, const kjb::Matrix &initial_covariance, double goal_accept_rate)
Definition: sample_adaptive_mh.h:35
This class implements matrices, in the linear-algebra sense, with real-valued elements.
Definition: m_matrix.h:94
Generic_adaptive_mh_step(const Generic_adaptive_mh_step &other)
Definition: sample_adaptive_mh.h:282
double get_current_gamma() const
returns the current learning rate (for debugging)
Definition: sample_adaptive_mh.h:160
Mv_gaussian_proposer< SimpleVector > Proposer
Definition: sample_adaptive_mh.h:33
const kjb::Matrix & get_cholesky_covariance() const
Definition: sample_adaptive_mh.h:113