From 45fff72bbf6e5753b1a6b281642bc6b2e222c3c8 Mon Sep 17 00:00:00 2001 From: Ben Date: Fri, 6 Mar 2020 18:19:39 -0500 Subject: [PATCH 01/16] Made it so that the decomposition of the inverse dense metric is done once each time the inverse metric is set (instead of every sample, Issue #2881). This involved switching to setter/getters for interfacing with dense_e_point so I made the change for diag_e_point as well. Also changed set_metric verbage to set_inv_metric. --- .../mcmc/hmc/hamiltonians/dense_e_metric.hpp | 6 ++-- .../mcmc/hmc/hamiltonians/dense_e_point.hpp | 33 ++++++++++++++++--- .../mcmc/hmc/hamiltonians/diag_e_metric.hpp | 6 ++-- .../mcmc/hmc/hamiltonians/diag_e_point.hpp | 14 ++++++-- src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp | 7 ++-- src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp | 9 +++-- src/stan/mcmc/hmc/nuts/base_nuts.hpp | 8 ++--- .../hmc/static/adapt_dense_e_static_hmc.hpp | 6 ++-- .../hmc/static/adapt_diag_e_static_hmc.hpp | 5 ++- src/stan/mcmc/hmc/static/base_static_hmc.hpp | 8 ++--- src/stan/services/sample/hmc_nuts_dense_e.hpp | 2 +- .../sample/hmc_nuts_dense_e_adapt.hpp | 2 +- src/stan/services/sample/hmc_nuts_diag_e.hpp | 2 +- .../services/sample/hmc_nuts_diag_e_adapt.hpp | 2 +- .../services/sample/hmc_static_dense_e.hpp | 2 +- .../sample/hmc_static_dense_e_adapt.hpp | 2 +- .../services/sample/hmc_static_diag_e.hpp | 2 +- .../sample/hmc_static_diag_e_adapt.hpp | 2 +- .../hmc/hamiltonians/dense_e_metric_test.cpp | 2 +- 19 files changed, 83 insertions(+), 37 deletions(-) diff --git a/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp b/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp index 3f177b5a13e..7d99ae65e22 100644 --- a/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp @@ -20,7 +20,7 @@ class dense_e_metric : public base_hamiltonian { : base_hamiltonian(model) {} double T(dense_e_point& z) { - return 0.5 * z.p.transpose() * z.inv_e_metric_ * z.p; + return 0.5 * z.p.transpose() * z.get_inv_metric() * z.p; } double tau(dense_e_point& z) { return T(z); } @@ -35,7 +35,7 @@ class dense_e_metric : public base_hamiltonian { return Eigen::VectorXd::Zero(this->model_.num_params_r()); } - Eigen::VectorXd dtau_dp(dense_e_point& z) { return z.inv_e_metric_ * z.p; } + Eigen::VectorXd dtau_dp(dense_e_point& z) { return z.get_inv_metric() * z.p; } Eigen::VectorXd dphi_dq(dense_e_point& z, callbacks::logger& logger) { return z.g; @@ -51,7 +51,7 @@ class dense_e_metric : public base_hamiltonian { for (idx_t i = 0; i < u.size(); ++i) u(i) = rand_dense_gaus(); - z.p = z.inv_e_metric_.llt().matrixU().solve(u); + z.p = z.get_transpose_llt_inv_metric().triangularView().solve(u); } }; diff --git a/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp b/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp index 3b811e280e3..ca96eced6eb 100644 --- a/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp @@ -11,11 +11,13 @@ namespace mcmc { * Euclidean manifold with dense metric */ class dense_e_point : public ps_point { - public: +private: /** * Inverse mass matrix. */ Eigen::MatrixXd inv_e_metric_; + Eigen::MatrixXd inv_e_metric_llt_matrixU_; +public: /** * Construct a dense point in n-dimensional phase space @@ -23,17 +25,40 @@ class dense_e_point : public ps_point { * * @param n number of dimensions */ - explicit dense_e_point(int n) : ps_point(n), inv_e_metric_(n, n) { + explicit dense_e_point(int n) : ps_point(n), + inv_e_metric_(n, n), + inv_e_metric_llt_matrixU_(n, n) { inv_e_metric_.setIdentity(); + inv_e_metric_llt_matrixU_.setIdentity(); } /** - * Set elements of mass matrix + * Set inverse metric * * @param inv_e_metric initial mass matrix */ - void set_metric(const Eigen::MatrixXd& inv_e_metric) { + void set_inv_metric(const Eigen::MatrixXd& inv_e_metric) { inv_e_metric_ = inv_e_metric; + inv_e_metric_llt_matrixU_ = inv_e_metric_.llt().matrixU(); + } + + /** + * Get inverse metric + * + * @return reference to the inverse metric + */ + const Eigen::MatrixXd& get_inv_metric() { + return inv_e_metric_; + } + + /** + * Get the transpose of the lower Cholesky factor + * of the inverse metric + * + * @return reference to transpose of Cholesky factor + */ + const Eigen::MatrixXd& get_transpose_llt_inv_metric() { + return inv_e_metric_llt_matrixU_; } /** diff --git a/src/stan/mcmc/hmc/hamiltonians/diag_e_metric.hpp b/src/stan/mcmc/hmc/hamiltonians/diag_e_metric.hpp index 98bfee84294..2762899f765 100644 --- a/src/stan/mcmc/hmc/hamiltonians/diag_e_metric.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/diag_e_metric.hpp @@ -18,7 +18,7 @@ class diag_e_metric : public base_hamiltonian { : base_hamiltonian(model) {} double T(diag_e_point& z) { - return 0.5 * z.p.dot(z.inv_e_metric_.cwiseProduct(z.p)); + return 0.5 * z.p.dot(z.get_inv_metric().cwiseProduct(z.p)); } double tau(diag_e_point& z) { return T(z); } @@ -34,7 +34,7 @@ class diag_e_metric : public base_hamiltonian { } Eigen::VectorXd dtau_dp(diag_e_point& z) { - return z.inv_e_metric_.cwiseProduct(z.p); + return z.get_inv_metric().cwiseProduct(z.p); } Eigen::VectorXd dphi_dq(diag_e_point& z, callbacks::logger& logger) { @@ -46,7 +46,7 @@ class diag_e_metric : public base_hamiltonian { rand_diag_gaus(rng, boost::normal_distribution<>()); for (int i = 0; i < z.p.size(); ++i) - z.p(i) = rand_diag_gaus() / sqrt(z.inv_e_metric_(i)); + z.p(i) = rand_diag_gaus() / sqrt(z.get_inv_metric()(i)); } }; diff --git a/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp b/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp index eb2c2d9f5d5..af136812afd 100644 --- a/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp @@ -11,12 +11,13 @@ namespace mcmc { * Euclidean manifold with diagonal metric */ class diag_e_point : public ps_point { - public: +private: /** * Vector of diagonal elements of inverse mass matrix. */ Eigen::VectorXd inv_e_metric_; +public: /** * Construct a diag point in n-dimensional phase space * with vector of ones for diagonal elements of inverse mass matrix. @@ -32,10 +33,19 @@ class diag_e_point : public ps_point { * * @param inv_e_metric initial mass matrix */ - void set_metric(const Eigen::VectorXd& inv_e_metric) { + void set_inv_metric(const Eigen::VectorXd& inv_e_metric) { inv_e_metric_ = inv_e_metric; } + /** + * Get inverse metric + * + * @return reference to the inverse metric + */ + const Eigen::VectorXd& get_inv_metric() { + return inv_e_metric_; + } + /** * Write elements of mass matrix to string and handoff to writer. * diff --git a/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp b/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp index 05b6c80523f..e78f9440cd6 100644 --- a/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp +++ b/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp @@ -29,12 +29,15 @@ class adapt_dense_e_nuts : public dense_e_nuts, this->stepsize_adaptation_.learn_stepsize(this->nom_epsilon_, s.accept_stat()); - bool update = this->covar_adaptation_.learn_covariance( - this->z_.inv_e_metric_, this->z_.q); + Eigen::MatrixXd inv_metric; + + bool update = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); + this->z_.set_inv_metric(inv_metric); + this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); } diff --git a/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp b/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp index 45e92380f57..94a05abc70a 100644 --- a/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp +++ b/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp @@ -29,12 +29,15 @@ class adapt_diag_e_nuts : public diag_e_nuts, this->stepsize_adaptation_.learn_stepsize(this->nom_epsilon_, s.accept_stat()); - bool update = this->var_adaptation_.learn_variance(this->z_.inv_e_metric_, - this->z_.q); - + Eigen::VectorXd inv_metric; + + bool update = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); + if (update) { this->init_stepsize(logger); + this->z_.set_inv_metric(inv_metric); + this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); } diff --git a/src/stan/mcmc/hmc/nuts/base_nuts.hpp b/src/stan/mcmc/hmc/nuts/base_nuts.hpp index 7b08ff8ce5d..a495a06754a 100644 --- a/src/stan/mcmc/hmc/nuts/base_nuts.hpp +++ b/src/stan/mcmc/hmc/nuts/base_nuts.hpp @@ -58,12 +58,12 @@ class base_nuts : public base_hmc { ~base_nuts() {} - void set_metric(const Eigen::MatrixXd& inv_e_metric) { - this->z_.set_metric(inv_e_metric); + void set_inv_metric(const Eigen::MatrixXd& inv_e_metric) { + this->z_.set_inv_metric(inv_e_metric); } - void set_metric(const Eigen::VectorXd& inv_e_metric) { - this->z_.set_metric(inv_e_metric); + void set_inv_metric(const Eigen::VectorXd& inv_e_metric) { + this->z_.set_inv_metric(inv_e_metric); } void set_max_depth(int d) { diff --git a/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp b/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp index 7691fc6f6e2..957c96ee390 100644 --- a/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp +++ b/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp @@ -32,12 +32,14 @@ class adapt_dense_e_static_hmc : public dense_e_static_hmc, s.accept_stat()); this->update_L_(); - bool update = this->covar_adaptation_.learn_covariance( - this->z_.inv_e_metric_, this->z_.q); + Eigen::MatrixXd inv_metric; + + bool update = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); this->update_L_(); + this->z_.set_inv_metric(inv_metric); this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); diff --git a/src/stan/mcmc/hmc/static/adapt_diag_e_static_hmc.hpp b/src/stan/mcmc/hmc/static/adapt_diag_e_static_hmc.hpp index a2098ef95f0..8f443b01cc3 100644 --- a/src/stan/mcmc/hmc/static/adapt_diag_e_static_hmc.hpp +++ b/src/stan/mcmc/hmc/static/adapt_diag_e_static_hmc.hpp @@ -32,12 +32,15 @@ class adapt_diag_e_static_hmc : public diag_e_static_hmc, s.accept_stat()); this->update_L_(); - bool update = this->var_adaptation_.learn_variance(this->z_.inv_e_metric_, + Eigen::VectorXd inv_metric; + + bool update = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); this->update_L_(); + this->z_.set_inv_metric(inv_metric); this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); diff --git a/src/stan/mcmc/hmc/static/base_static_hmc.hpp b/src/stan/mcmc/hmc/static/base_static_hmc.hpp index 4dab52ad9b6..7d30447138f 100644 --- a/src/stan/mcmc/hmc/static/base_static_hmc.hpp +++ b/src/stan/mcmc/hmc/static/base_static_hmc.hpp @@ -30,12 +30,12 @@ class base_static_hmc ~base_static_hmc() {} - void set_metric(const Eigen::MatrixXd& inv_e_metric) { - this->z_.set_metric(inv_e_metric); + void set_inv_metric(const Eigen::MatrixXd& inv_e_metric) { + this->z_.set_inv_metric(inv_e_metric); } - void set_metric(const Eigen::VectorXd& inv_e_metric) { - this->z_.set_metric(inv_e_metric); + void set_inv_metric(const Eigen::VectorXd& inv_e_metric) { + this->z_.set_inv_metric(inv_e_metric); } sample transition(sample& init_sample, callbacks::logger& logger) { diff --git a/src/stan/services/sample/hmc_nuts_dense_e.hpp b/src/stan/services/sample/hmc_nuts_dense_e.hpp index f57466503db..671763279b7 100644 --- a/src/stan/services/sample/hmc_nuts_dense_e.hpp +++ b/src/stan/services/sample/hmc_nuts_dense_e.hpp @@ -73,7 +73,7 @@ int hmc_nuts_dense_e(Model& model, const stan::io::var_context& init, stan::mcmc::dense_e_nuts sampler(model, rng); - sampler.set_metric(inv_metric); + sampler.set_inv_metric(inv_metric); sampler.set_nominal_stepsize(stepsize); sampler.set_stepsize_jitter(stepsize_jitter); diff --git a/src/stan/services/sample/hmc_nuts_dense_e_adapt.hpp b/src/stan/services/sample/hmc_nuts_dense_e_adapt.hpp index cb644a346c6..2c071d9199f 100644 --- a/src/stan/services/sample/hmc_nuts_dense_e_adapt.hpp +++ b/src/stan/services/sample/hmc_nuts_dense_e_adapt.hpp @@ -81,7 +81,7 @@ int hmc_nuts_dense_e_adapt( stan::mcmc::adapt_dense_e_nuts sampler(model, rng); - sampler.set_metric(inv_metric); + sampler.set_inv_metric(inv_metric); sampler.set_nominal_stepsize(stepsize); sampler.set_stepsize_jitter(stepsize_jitter); diff --git a/src/stan/services/sample/hmc_nuts_diag_e.hpp b/src/stan/services/sample/hmc_nuts_diag_e.hpp index 3932a870dba..dc1f19724c0 100644 --- a/src/stan/services/sample/hmc_nuts_diag_e.hpp +++ b/src/stan/services/sample/hmc_nuts_diag_e.hpp @@ -73,7 +73,7 @@ int hmc_nuts_diag_e(Model& model, const stan::io::var_context& init, stan::mcmc::diag_e_nuts sampler(model, rng); - sampler.set_metric(inv_metric); + sampler.set_inv_metric(inv_metric); sampler.set_nominal_stepsize(stepsize); sampler.set_stepsize_jitter(stepsize_jitter); sampler.set_max_depth(max_depth); diff --git a/src/stan/services/sample/hmc_nuts_diag_e_adapt.hpp b/src/stan/services/sample/hmc_nuts_diag_e_adapt.hpp index 8d03373e1a5..87211e6f2b2 100644 --- a/src/stan/services/sample/hmc_nuts_diag_e_adapt.hpp +++ b/src/stan/services/sample/hmc_nuts_diag_e_adapt.hpp @@ -81,7 +81,7 @@ int hmc_nuts_diag_e_adapt( stan::mcmc::adapt_diag_e_nuts sampler(model, rng); - sampler.set_metric(inv_metric); + sampler.set_inv_metric(inv_metric); sampler.set_nominal_stepsize(stepsize); sampler.set_stepsize_jitter(stepsize_jitter); sampler.set_max_depth(max_depth); diff --git a/src/stan/services/sample/hmc_static_dense_e.hpp b/src/stan/services/sample/hmc_static_dense_e.hpp index 5ddb3d224eb..eead72689d9 100644 --- a/src/stan/services/sample/hmc_static_dense_e.hpp +++ b/src/stan/services/sample/hmc_static_dense_e.hpp @@ -70,7 +70,7 @@ int hmc_static_dense_e( stan::mcmc::dense_e_static_hmc sampler(model, rng); - sampler.set_metric(inv_metric); + sampler.set_inv_metric(inv_metric); sampler.set_nominal_stepsize_and_T(stepsize, int_time); sampler.set_stepsize_jitter(stepsize_jitter); diff --git a/src/stan/services/sample/hmc_static_dense_e_adapt.hpp b/src/stan/services/sample/hmc_static_dense_e_adapt.hpp index 979e5ded1b8..6eec480bc6d 100644 --- a/src/stan/services/sample/hmc_static_dense_e_adapt.hpp +++ b/src/stan/services/sample/hmc_static_dense_e_adapt.hpp @@ -82,7 +82,7 @@ int hmc_static_dense_e_adapt( stan::mcmc::adapt_dense_e_static_hmc sampler(model, rng); - sampler.set_metric(inv_metric); + sampler.set_inv_metric(inv_metric); sampler.set_nominal_stepsize_and_T(stepsize, int_time); sampler.set_stepsize_jitter(stepsize_jitter); diff --git a/src/stan/services/sample/hmc_static_diag_e.hpp b/src/stan/services/sample/hmc_static_diag_e.hpp index 57109395f5d..b1aa63465e7 100644 --- a/src/stan/services/sample/hmc_static_diag_e.hpp +++ b/src/stan/services/sample/hmc_static_diag_e.hpp @@ -75,7 +75,7 @@ int hmc_static_diag_e(Model& model, const stan::io::var_context& init, stan::mcmc::diag_e_static_hmc sampler(model, rng); - sampler.set_metric(inv_metric); + sampler.set_inv_metric(inv_metric); sampler.set_nominal_stepsize_and_T(stepsize, int_time); sampler.set_stepsize_jitter(stepsize_jitter); diff --git a/src/stan/services/sample/hmc_static_diag_e_adapt.hpp b/src/stan/services/sample/hmc_static_diag_e_adapt.hpp index f374f205c62..86a4896988c 100644 --- a/src/stan/services/sample/hmc_static_diag_e_adapt.hpp +++ b/src/stan/services/sample/hmc_static_diag_e_adapt.hpp @@ -82,7 +82,7 @@ int hmc_static_diag_e_adapt( stan::mcmc::adapt_diag_e_static_hmc sampler(model, rng); - sampler.set_metric(inv_metric); + sampler.set_inv_metric(inv_metric); sampler.set_nominal_stepsize_and_T(stepsize, int_time); sampler.set_stepsize_jitter(stepsize_jitter); diff --git a/src/test/unit/mcmc/hmc/hamiltonians/dense_e_metric_test.cpp b/src/test/unit/mcmc/hmc/hamiltonians/dense_e_metric_test.cpp index 2340609aebe..50dd3227f5a 100644 --- a/src/test/unit/mcmc/hmc/hamiltonians/dense_e_metric_test.cpp +++ b/src/test/unit/mcmc/hmc/hamiltonians/dense_e_metric_test.cpp @@ -25,7 +25,7 @@ TEST(McmcDenseEMetric, sample_p) { stan::mcmc::dense_e_metric metric(model); stan::mcmc::dense_e_point z(2); - z.set_metric(m_inv); + z.set_inv_metric(m_inv); int n_samples = 1000; From 7582ccea8335eca19e6bf1cc3c473f8d18caabdc Mon Sep 17 00:00:00 2001 From: Ben Date: Sun, 15 Mar 2020 19:04:49 -0400 Subject: [PATCH 02/16] Applying suggested changes from review (Issue #2881) --- src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp | 4 ++-- src/stan/mcmc/hmc/hamiltonians/diag_e_metric.hpp | 5 +++-- src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp b/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp index ca96eced6eb..0f3f3f685dd 100644 --- a/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp @@ -47,7 +47,7 @@ class dense_e_point : public ps_point { * * @return reference to the inverse metric */ - const Eigen::MatrixXd& get_inv_metric() { + const Eigen::MatrixXd& get_inv_metric() const { return inv_e_metric_; } @@ -57,7 +57,7 @@ class dense_e_point : public ps_point { * * @return reference to transpose of Cholesky factor */ - const Eigen::MatrixXd& get_transpose_llt_inv_metric() { + const Eigen::MatrixXd& get_transpose_llt_inv_metric() const { return inv_e_metric_llt_matrixU_; } diff --git a/src/stan/mcmc/hmc/hamiltonians/diag_e_metric.hpp b/src/stan/mcmc/hmc/hamiltonians/diag_e_metric.hpp index 2762899f765..33f1bca1e48 100644 --- a/src/stan/mcmc/hmc/hamiltonians/diag_e_metric.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/diag_e_metric.hpp @@ -45,8 +45,9 @@ class diag_e_metric : public base_hamiltonian { boost::variate_generator > rand_diag_gaus(rng, boost::normal_distribution<>()); - for (int i = 0; i < z.p.size(); ++i) - z.p(i) = rand_diag_gaus() / sqrt(z.get_inv_metric()(i)); + z.p = z.get_inv_metric().unaryExpr([&](auto&& x) { + return rand_diag_gaus() / sqrt(x); + }); } }; diff --git a/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp b/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp index af136812afd..927bfa94512 100644 --- a/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp @@ -42,7 +42,7 @@ class diag_e_point : public ps_point { * * @return reference to the inverse metric */ - const Eigen::VectorXd& get_inv_metric() { + const Eigen::VectorXd& get_inv_metric() const { return inv_e_metric_; } From 83ef8032bbbf705a9219334cf9d03a16b3af8dcf Mon Sep 17 00:00:00 2001 From: Ben Date: Wed, 15 Jul 2020 23:38:08 -0400 Subject: [PATCH 03/16] Added unit tests to diag_e_point/diag_e_metric interface (Issue #2881) --- .../mcmc/hmc/hamiltonians/dense_e_point.hpp | 7 ++- .../mcmc/hmc/hamiltonians/diag_e_metric.hpp | 2 +- .../mcmc/hmc/hamiltonians/diag_e_point.hpp | 3 + src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp | 4 +- src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp | 6 +- .../hmc/static/adapt_dense_e_static_hmc.hpp | 4 +- .../hmc/static/adapt_diag_e_static_hmc.hpp | 4 +- .../hmc/hamiltonians/dense_e_point_test.cpp | 55 +++++++++++++++++++ .../hmc/hamiltonians/diag_e_point_test.cpp | 33 +++++++++++ 9 files changed, 105 insertions(+), 13 deletions(-) create mode 100644 src/test/unit/mcmc/hmc/hamiltonians/dense_e_point_test.cpp create mode 100644 src/test/unit/mcmc/hmc/hamiltonians/diag_e_point_test.cpp diff --git a/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp b/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp index 0f3f3f685dd..29739c8b710 100644 --- a/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp @@ -2,6 +2,7 @@ #define STAN_MCMC_HMC_HAMILTONIANS_DENSE_E_POINT_HPP #include +#include #include namespace stan { @@ -17,8 +18,8 @@ class dense_e_point : public ps_point { */ Eigen::MatrixXd inv_e_metric_; Eigen::MatrixXd inv_e_metric_llt_matrixU_; -public: +public: /** * Construct a dense point in n-dimensional phase space * with identity matrix as inverse mass matrix. @@ -26,8 +27,8 @@ class dense_e_point : public ps_point { * @param n number of dimensions */ explicit dense_e_point(int n) : ps_point(n), - inv_e_metric_(n, n), - inv_e_metric_llt_matrixU_(n, n) { + inv_e_metric_(n, n), + inv_e_metric_llt_matrixU_(n, n) { inv_e_metric_.setIdentity(); inv_e_metric_llt_matrixU_.setIdentity(); } diff --git a/src/stan/mcmc/hmc/hamiltonians/diag_e_metric.hpp b/src/stan/mcmc/hmc/hamiltonians/diag_e_metric.hpp index 33f1bca1e48..8272e61d1a0 100644 --- a/src/stan/mcmc/hmc/hamiltonians/diag_e_metric.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/diag_e_metric.hpp @@ -46,7 +46,7 @@ class diag_e_metric : public base_hamiltonian { rand_diag_gaus(rng, boost::normal_distribution<>()); z.p = z.get_inv_metric().unaryExpr([&](auto&& x) { - return rand_diag_gaus() / sqrt(x); + return rand_diag_gaus() / sqrt(x); }); } }; diff --git a/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp b/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp index 927bfa94512..ebe043a736a 100644 --- a/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp @@ -2,6 +2,7 @@ #define STAN_MCMC_HMC_HAMILTONIANS_DIAG_E_POINT_HPP #include +#include #include namespace stan { @@ -34,6 +35,8 @@ class diag_e_point : public ps_point { * @param inv_e_metric initial mass matrix */ void set_inv_metric(const Eigen::VectorXd& inv_e_metric) { + math::check_size_match("set_inv_metric", "Number of rows in old inverse metric", inv_e_metric_.size(), + "number of rows in new inverse metric", inv_e_metric.size()); inv_e_metric_ = inv_e_metric; } diff --git a/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp b/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp index e78f9440cd6..fb1360a9e73 100644 --- a/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp +++ b/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp @@ -30,13 +30,13 @@ class adapt_dense_e_nuts : public dense_e_nuts, s.accept_stat()); Eigen::MatrixXd inv_metric; - + bool update = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); - this->z_.set_inv_metric(inv_metric); + this->z_.set_inv_metric(inv_metric); this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); diff --git a/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp b/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp index 94a05abc70a..e51449efeda 100644 --- a/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp +++ b/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp @@ -30,13 +30,13 @@ class adapt_diag_e_nuts : public diag_e_nuts, s.accept_stat()); Eigen::VectorXd inv_metric; - + bool update = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); - + if (update) { this->init_stepsize(logger); - this->z_.set_inv_metric(inv_metric); + this->z_.set_inv_metric(inv_metric); this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); diff --git a/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp b/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp index 0f469d8cdc2..091735c631a 100644 --- a/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp +++ b/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp @@ -33,13 +33,13 @@ class adapt_dense_e_static_hmc : public dense_e_static_hmc, this->update_L_(); Eigen::MatrixXd inv_metric; - + bool update = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); this->update_L_(); - this->z_.set_inv_metric(inv_metric); + this->z_.set_inv_metric(inv_metric); this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); diff --git a/src/stan/mcmc/hmc/static/adapt_diag_e_static_hmc.hpp b/src/stan/mcmc/hmc/static/adapt_diag_e_static_hmc.hpp index 8f443b01cc3..a5fb7363df5 100644 --- a/src/stan/mcmc/hmc/static/adapt_diag_e_static_hmc.hpp +++ b/src/stan/mcmc/hmc/static/adapt_diag_e_static_hmc.hpp @@ -33,14 +33,14 @@ class adapt_diag_e_static_hmc : public diag_e_static_hmc, this->update_L_(); Eigen::VectorXd inv_metric; - + bool update = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); this->update_L_(); - this->z_.set_inv_metric(inv_metric); + this->z_.set_inv_metric(inv_metric); this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); diff --git a/src/test/unit/mcmc/hmc/hamiltonians/dense_e_point_test.cpp b/src/test/unit/mcmc/hmc/hamiltonians/dense_e_point_test.cpp new file mode 100644 index 00000000000..20040c42b91 --- /dev/null +++ b/src/test/unit/mcmc/hmc/hamiltonians/dense_e_point_test.cpp @@ -0,0 +1,55 @@ +#include +#include +#include +#include + +TEST(McmcDenseEPoint, inv_metric_wrong_size) { + int N = 2; + + stan::mcmc::dense_e_point z(N); + + Eigen::MatrixXd inv_metric_large(2 * N, 2 * N); + + EXPECT_THROW_MSG(z.set_inv_metric(inv_metric_large), + std::invalid_argument, + "number of rows in new inverse metric"); +} + +TEST(McmcDenseEPoint, inv_metric) { + int N = 2; + + stan::mcmc::dense_e_point z(N); + + Eigen::MatrixXd inv_metric(N, N); + + inv_metric << 2, 1, + 1, 2; + + z.set_inv_metric(inv_metric); + + Eigen::MatrixXd z_inv_metric = z.get_inv_metric(); + EXPECT_EQ(z_inv_metric.rows(), inv_metric.rows()); + EXPECT_EQ(z_inv_metric.cols(), inv_metric.cols()); + for(size_t i = 0; i < inv_metric.size(); ++i) + EXPECT_FLOAT_EQ(z_inv_metric(i), inv_metric(i)); +} + +TEST(McmcDenseEPoint, inv_metric_llt) { + int N = 2; + + stan::mcmc::dense_e_point z(N); + + Eigen::MatrixXd inv_metric(N, N); + + inv_metric << 2, 1, + 1, 2; + + z.set_inv_metric(inv_metric); + + Eigen::MatrixXd z_inv_metric_llt_matrixU = z.get_transpose_llt_inv_metric(); + Eigen::MatrixXd z_inv_metric_2 = z_inv_metric_llt_matrixU.transpose() * z_inv_metric_llt_matrixU; + EXPECT_EQ(z_inv_metric_2.rows(), inv_metric.rows()); + EXPECT_EQ(z_inv_metric_2.cols(), inv_metric.cols()); + for(size_t i = 0; i < inv_metric.size(); ++i) + EXPECT_FLOAT_EQ(z_inv_metric_2(i), inv_metric(i)); +} diff --git a/src/test/unit/mcmc/hmc/hamiltonians/diag_e_point_test.cpp b/src/test/unit/mcmc/hmc/hamiltonians/diag_e_point_test.cpp new file mode 100644 index 00000000000..5425a6d613a --- /dev/null +++ b/src/test/unit/mcmc/hmc/hamiltonians/diag_e_point_test.cpp @@ -0,0 +1,33 @@ +#include +#include +#include +#include + +TEST(McmcDiagEPoint, inv_metric_wrong_size) { + int N = 2; + + stan::mcmc::diag_e_point z(N); + + Eigen::VectorXd inv_metric_large(2 * N); + + EXPECT_THROW_MSG(z.set_inv_metric(inv_metric_large), + std::invalid_argument, + "number of rows in new inverse metric"); +} + +TEST(McmcDiagEPoint, inv_metric) { + int N = 2; + + stan::mcmc::diag_e_point z(N); + + Eigen::VectorXd inv_metric(N); + + inv_metric << 2, 2; + + z.set_inv_metric(inv_metric); + + Eigen::VectorXd z_inv_metric = z.get_inv_metric(); + EXPECT_EQ(z_inv_metric.size(), inv_metric.size()); + for(size_t i = 0; i < inv_metric.size(); ++i) + EXPECT_FLOAT_EQ(z_inv_metric(i), inv_metric(i)); +} From 1da6121f5b82e0cb503cb82237071cb4d04f499e Mon Sep 17 00:00:00 2001 From: Ben Date: Wed, 28 Oct 2020 10:35:45 -0400 Subject: [PATCH 04/16] Converted some other samplers over to use accessor functions on dense and diagonal metrics (Issue #2881) --- .../mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp | 7 +++++-- .../mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp | 6 +++++- src/stan/mcmc/hmc/nuts_classic/dense_e_nuts_classic.hpp | 4 ++-- src/stan/mcmc/hmc/nuts_classic/diag_e_nuts_classic.hpp | 4 ++-- .../hmc/static_uniform/adapt_dense_e_static_uniform.hpp | 8 ++++++-- .../hmc/static_uniform/adapt_diag_e_static_uniform.hpp | 8 ++++++-- src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp | 7 +++++-- src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp | 7 +++++-- 8 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/stan/mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp b/src/stan/mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp index 4838118f8a3..5e646b73e83 100644 --- a/src/stan/mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp +++ b/src/stan/mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp @@ -29,12 +29,15 @@ class adapt_dense_e_nuts_classic : public dense_e_nuts_classic, this->stepsize_adaptation_.learn_stepsize(this->nom_epsilon_, s.accept_stat()); - bool update = this->covar_adaptation_.learn_covariance( - this->z_.inv_e_metric_, this->z_.q); + Eigen::MatrixXd inv_metric; + + bool update = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); + this->z_.set_inv_metric(inv_metric); + this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); } diff --git a/src/stan/mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp b/src/stan/mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp index 77e146119b1..4ff3322ff79 100644 --- a/src/stan/mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp +++ b/src/stan/mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp @@ -30,12 +30,16 @@ class adapt_diag_e_nuts_classic : public diag_e_nuts_classic, this->stepsize_adaptation_.learn_stepsize(this->nom_epsilon_, s.accept_stat()); - bool update = this->var_adaptation_.learn_variance(this->z_.inv_e_metric_, + Eigen::VectorXd inv_metric; + + bool update = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); + this->z_.set_inv_metric(inv_metric); + this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); } diff --git a/src/stan/mcmc/hmc/nuts_classic/dense_e_nuts_classic.hpp b/src/stan/mcmc/hmc/nuts_classic/dense_e_nuts_classic.hpp index ff66ca1df3f..8c08d4915b3 100644 --- a/src/stan/mcmc/hmc/nuts_classic/dense_e_nuts_classic.hpp +++ b/src/stan/mcmc/hmc/nuts_classic/dense_e_nuts_classic.hpp @@ -22,8 +22,8 @@ class dense_e_nuts_classic // here since start.inv_e_metric_ = finish.inv_e_metric_ bool compute_criterion(ps_point& start, dense_e_point& finish, Eigen::VectorXd& rho) { - return finish.p.transpose() * finish.inv_e_metric_ * (rho - finish.p) > 0 - && start.p.transpose() * finish.inv_e_metric_ * (rho - start.p) > 0; + return finish.p.transpose() * finish.get_inv_metric() * (rho - finish.p) > 0 + && start.p.transpose() * finish.get_inv_metric() * (rho - start.p) > 0; } }; diff --git a/src/stan/mcmc/hmc/nuts_classic/diag_e_nuts_classic.hpp b/src/stan/mcmc/hmc/nuts_classic/diag_e_nuts_classic.hpp index e1ae23cb0cc..765cc6619df 100644 --- a/src/stan/mcmc/hmc/nuts_classic/diag_e_nuts_classic.hpp +++ b/src/stan/mcmc/hmc/nuts_classic/diag_e_nuts_classic.hpp @@ -22,8 +22,8 @@ class diag_e_nuts_classic // since start.inv_e_metric_ = finish.inv_e_metric_ bool compute_criterion(ps_point& start, diag_e_point& finish, Eigen::VectorXd& rho) { - return finish.inv_e_metric_.cwiseProduct(finish.p).dot(rho - finish.p) > 0 - && finish.inv_e_metric_.cwiseProduct(start.p).dot(rho - start.p) > 0; + return finish.get_inv_metric().cwiseProduct(finish.p).dot(rho - finish.p) > 0 + && finish.get_inv_metric().cwiseProduct(start.p).dot(rho - start.p) > 0; } }; diff --git a/src/stan/mcmc/hmc/static_uniform/adapt_dense_e_static_uniform.hpp b/src/stan/mcmc/hmc/static_uniform/adapt_dense_e_static_uniform.hpp index 716d200cb46..cc64ebbb51f 100644 --- a/src/stan/mcmc/hmc/static_uniform/adapt_dense_e_static_uniform.hpp +++ b/src/stan/mcmc/hmc/static_uniform/adapt_dense_e_static_uniform.hpp @@ -31,11 +31,15 @@ class adapt_dense_e_static_uniform this->stepsize_adaptation_.learn_stepsize(this->nom_epsilon_, s.accept_stat()); - bool update = this->covar_adaptation_.learn_covariance( - this->z_.inv_e_metric_, this->z_.q); + Eigen::MatrixXd inv_metric; + + bool update = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); + + this->z_.set_inv_metric(inv_metric); + this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); } diff --git a/src/stan/mcmc/hmc/static_uniform/adapt_diag_e_static_uniform.hpp b/src/stan/mcmc/hmc/static_uniform/adapt_diag_e_static_uniform.hpp index 6a068dff830..d8345779dd1 100644 --- a/src/stan/mcmc/hmc/static_uniform/adapt_diag_e_static_uniform.hpp +++ b/src/stan/mcmc/hmc/static_uniform/adapt_diag_e_static_uniform.hpp @@ -31,10 +31,14 @@ class adapt_diag_e_static_uniform this->stepsize_adaptation_.learn_stepsize(this->nom_epsilon_, s.accept_stat()); - bool update = this->var_adaptation_.learn_variance(this->z_.inv_e_metric_, - this->z_.q); + Eigen::VectorXd inv_metric; + + bool update = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); + + this->z_.set_inv_metric(inv_metric); + this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); } diff --git a/src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp b/src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp index fb473ff7471..1ba8654090b 100644 --- a/src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp +++ b/src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp @@ -29,12 +29,15 @@ class adapt_dense_e_xhmc : public dense_e_xhmc, this->stepsize_adaptation_.learn_stepsize(this->nom_epsilon_, s.accept_stat()); - bool update = this->covar_adaptation_.learn_covariance( - this->z_.inv_e_metric_, this->z_.q); + Eigen::MatrixXd inv_metric; + + bool update = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); + this->z_.set_inv_metric(inv_metric); + this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); } diff --git a/src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp b/src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp index 5ddee86725b..3c7b6e75a56 100644 --- a/src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp +++ b/src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp @@ -29,12 +29,15 @@ class adapt_diag_e_xhmc : public diag_e_xhmc, this->stepsize_adaptation_.learn_stepsize(this->nom_epsilon_, s.accept_stat()); - bool update = this->var_adaptation_.learn_variance(this->z_.inv_e_metric_, - this->z_.q); + Eigen::VectorXd inv_metric; + + bool update = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); + this->z_.set_inv_metric(inv_metric); + this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); } From a182f785aed310787ddee5ec3faa1a2419b9b160 Mon Sep 17 00:00:00 2001 From: Ben Date: Thu, 29 Oct 2020 14:54:16 -0400 Subject: [PATCH 05/16] Removed more direct metric accesses (Issue #2881) --- .../hmc/nuts_classic/dense_e_nuts_classic.hpp | 2 +- .../hmc/nuts_classic/diag_e_nuts_classic.hpp | 2 +- .../mcmc/hmc/integrators/expl_leapfrog_test.cpp | 2 +- .../mcmc/hmc/integrators/impl_leapfrog_test.cpp | 2 +- .../unit/mcmc/hmc/nuts/derived_nuts_test.cpp | 16 ++++++++-------- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/stan/mcmc/hmc/nuts_classic/dense_e_nuts_classic.hpp b/src/stan/mcmc/hmc/nuts_classic/dense_e_nuts_classic.hpp index 8c08d4915b3..10e95c7b13a 100644 --- a/src/stan/mcmc/hmc/nuts_classic/dense_e_nuts_classic.hpp +++ b/src/stan/mcmc/hmc/nuts_classic/dense_e_nuts_classic.hpp @@ -19,7 +19,7 @@ class dense_e_nuts_classic rng) {} // Note that the points don't need to be swapped - // here since start.inv_e_metric_ = finish.inv_e_metric_ + // here since start.get_inv_metric() = finish.get_inv_metric() bool compute_criterion(ps_point& start, dense_e_point& finish, Eigen::VectorXd& rho) { return finish.p.transpose() * finish.get_inv_metric() * (rho - finish.p) > 0 diff --git a/src/stan/mcmc/hmc/nuts_classic/diag_e_nuts_classic.hpp b/src/stan/mcmc/hmc/nuts_classic/diag_e_nuts_classic.hpp index 765cc6619df..64f3f82ea33 100644 --- a/src/stan/mcmc/hmc/nuts_classic/diag_e_nuts_classic.hpp +++ b/src/stan/mcmc/hmc/nuts_classic/diag_e_nuts_classic.hpp @@ -19,7 +19,7 @@ class diag_e_nuts_classic rng) {} // Note that the points don't need to be swapped here - // since start.inv_e_metric_ = finish.inv_e_metric_ + // since start.get_inv_metric() = finish.get_inv_metric() bool compute_criterion(ps_point& start, diag_e_point& finish, Eigen::VectorXd& rho) { return finish.get_inv_metric().cwiseProduct(finish.p).dot(rho - finish.p) > 0 diff --git a/src/test/unit/mcmc/hmc/integrators/expl_leapfrog_test.cpp b/src/test/unit/mcmc/hmc/integrators/expl_leapfrog_test.cpp index 6dd6eaf419e..4c2873033ad 100644 --- a/src/test/unit/mcmc/hmc/integrators/expl_leapfrog_test.cpp +++ b/src/test/unit/mcmc/hmc/integrators/expl_leapfrog_test.cpp @@ -417,7 +417,7 @@ TEST_F(McmcHmcIntegratorsExplLeapfrogF, evolve_9) { z.q(0) = 1.27097196280777; z.p(0) = -0.159996782671291; z.g(0) = 1.27097196280777; - z.inv_e_metric_(0) = 0.733184698671436; + z.get_inv_metric()(0) = 0.733184698671436; EXPECT_NEAR(z.V, 0.807684865121721, 1e-15); EXPECT_NEAR(z.q(0), 1.27097196280777, 1e-15); EXPECT_NEAR(z.p(0), -0.159996782671291, 1e-15); diff --git a/src/test/unit/mcmc/hmc/integrators/impl_leapfrog_test.cpp b/src/test/unit/mcmc/hmc/integrators/impl_leapfrog_test.cpp index 8aba1b21dff..3bc849e3e29 100644 --- a/src/test/unit/mcmc/hmc/integrators/impl_leapfrog_test.cpp +++ b/src/test/unit/mcmc/hmc/integrators/impl_leapfrog_test.cpp @@ -522,7 +522,7 @@ TEST_F(McmcHmcIntegratorsImplLeapfrogF, evolve_9) { z.q(0) = 1.27097196280777; z.p(0) = -0.159996782671291; z.g(0) = 1.27097196280777; - z.inv_e_metric_(0) = 0.733184698671436; + z.get_inv_metric()(0) = 0.733184698671436; EXPECT_NEAR(z.V, 0.807684865121721, 1e-15); EXPECT_NEAR(z.q(0), 1.27097196280777, 1e-15); EXPECT_NEAR(z.p(0), -0.159996782671291, 1e-15); diff --git a/src/test/unit/mcmc/hmc/nuts/derived_nuts_test.cpp b/src/test/unit/mcmc/hmc/nuts/derived_nuts_test.cpp index 1bf6e3dbb1c..92126f33e3f 100644 --- a/src/test/unit/mcmc/hmc/nuts/derived_nuts_test.cpp +++ b/src/test/unit/mcmc/hmc/nuts/derived_nuts_test.cpp @@ -75,8 +75,8 @@ TEST(McmcNutsDerivedNuts, compute_criterion_diag_e) { finish.q(0) = 2; finish.p(0) = 1; - p_sharp_start = start.inv_e_metric_.cwiseProduct(start.p); - p_sharp_finish = finish.inv_e_metric_.cwiseProduct(finish.p); + p_sharp_start = start.get_inv_metric().cwiseProduct(start.p); + p_sharp_finish = finish.get_inv_metric().cwiseProduct(finish.p); rho = start.p + finish.p; EXPECT_TRUE(sampler.compute_criterion(p_sharp_start, p_sharp_finish, rho)); @@ -87,8 +87,8 @@ TEST(McmcNutsDerivedNuts, compute_criterion_diag_e) { finish.q(0) = 2; finish.p(0) = -1; - p_sharp_start = start.inv_e_metric_.cwiseProduct(start.p); - p_sharp_finish = finish.inv_e_metric_.cwiseProduct(finish.p); + p_sharp_start = start.get_inv_metric().cwiseProduct(start.p); + p_sharp_finish = finish.get_inv_metric().cwiseProduct(finish.p); rho = start.p + finish.p; EXPECT_FALSE(sampler.compute_criterion(p_sharp_start, p_sharp_finish, rho)); @@ -115,8 +115,8 @@ TEST(McmcNutsDerivedNuts, compute_criterion_dense_e) { finish.q(0) = 2; finish.p(0) = 1; - p_sharp_start = start.inv_e_metric_ * start.p; - p_sharp_finish = finish.inv_e_metric_ * finish.p; + p_sharp_start = start.get_inv_metric() * start.p; + p_sharp_finish = finish.get_inv_metric() * finish.p; rho = start.p + finish.p; EXPECT_TRUE(sampler.compute_criterion(p_sharp_start, p_sharp_finish, rho)); @@ -127,8 +127,8 @@ TEST(McmcNutsDerivedNuts, compute_criterion_dense_e) { finish.q(0) = 2; finish.p(0) = -1; - p_sharp_start = start.inv_e_metric_ * start.p; - p_sharp_finish = finish.inv_e_metric_ * finish.p; + p_sharp_start = start.get_inv_metric() * start.p; + p_sharp_finish = finish.get_inv_metric() * finish.p; rho = start.p + finish.p; EXPECT_FALSE(sampler.compute_criterion(p_sharp_start, p_sharp_finish, rho)); From 6f165f98d7ff9eeac000a507a497d469a20f0612 Mon Sep 17 00:00:00 2001 From: Ben Date: Thu, 29 Oct 2020 15:10:04 -0400 Subject: [PATCH 06/16] Fixed lint issues (Issue #2881) --- src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp | 3 ++- src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp | 5 +++-- src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp | 3 ++- src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp | 3 ++- .../mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp | 7 ++++--- .../mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp | 4 ++-- src/stan/mcmc/hmc/nuts_classic/diag_e_nuts_classic.hpp | 6 ++++-- src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp | 3 ++- .../hmc/static_uniform/adapt_dense_e_static_uniform.hpp | 9 +++++---- .../hmc/static_uniform/adapt_diag_e_static_uniform.hpp | 9 +++++---- src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp | 9 +++++---- src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp | 7 ++++--- 12 files changed, 40 insertions(+), 28 deletions(-) diff --git a/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp b/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp index 24216f09c57..ab91cb56bd2 100644 --- a/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp @@ -50,7 +50,8 @@ class dense_e_metric : public base_hamiltonian { for (idx_t i = 0; i < u.size(); ++i) u(i) = rand_dense_gaus(); - z.p = z.get_transpose_llt_inv_metric().triangularView().solve(u); + z.p = z.get_transpose_llt_inv_metric().triangularView() + .solve(u); } }; diff --git a/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp b/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp index ebe043a736a..3bfe012f322 100644 --- a/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp @@ -35,8 +35,9 @@ class diag_e_point : public ps_point { * @param inv_e_metric initial mass matrix */ void set_inv_metric(const Eigen::VectorXd& inv_e_metric) { - math::check_size_match("set_inv_metric", "Number of rows in old inverse metric", inv_e_metric_.size(), - "number of rows in new inverse metric", inv_e_metric.size()); + math::check_size_match("set_inv_metric", + "Number of rows in old inverse metric", inv_e_metric_.size(), + "number of rows in new inverse metric", inv_e_metric.size()); inv_e_metric_ = inv_e_metric; } diff --git a/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp b/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp index fb1360a9e73..52e156915dc 100644 --- a/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp +++ b/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp @@ -31,7 +31,8 @@ class adapt_dense_e_nuts : public dense_e_nuts, Eigen::MatrixXd inv_metric; - bool update = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); + bool update = this->covar_adaptation_.learn_covariance(inv_metric, + this->z_.q); if (update) { this->init_stepsize(logger); diff --git a/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp b/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp index e51449efeda..9f236009931 100644 --- a/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp +++ b/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp @@ -31,7 +31,8 @@ class adapt_diag_e_nuts : public diag_e_nuts, Eigen::VectorXd inv_metric; - bool update = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); + bool update = this->var_adaptation_.learn_variance(inv_metric, + this->z_.q); if (update) { this->init_stepsize(logger); diff --git a/src/stan/mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp b/src/stan/mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp index 5e646b73e83..dedc6bda832 100644 --- a/src/stan/mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp +++ b/src/stan/mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp @@ -31,13 +31,14 @@ class adapt_dense_e_nuts_classic : public dense_e_nuts_classic, Eigen::MatrixXd inv_metric; - bool update = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); + bool update = this->covar_adaptation_.learn_covariance(inv_metric, + this->z_.q); if (update) { this->init_stepsize(logger); - this->z_.set_inv_metric(inv_metric); - + this->z_.set_inv_metric(inv_metric); + this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); } diff --git a/src/stan/mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp b/src/stan/mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp index 4ff3322ff79..04635b9dbe0 100644 --- a/src/stan/mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp +++ b/src/stan/mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp @@ -31,14 +31,14 @@ class adapt_diag_e_nuts_classic : public diag_e_nuts_classic, s.accept_stat()); Eigen::VectorXd inv_metric; - + bool update = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); - this->z_.set_inv_metric(inv_metric); + this->z_.set_inv_metric(inv_metric); this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); diff --git a/src/stan/mcmc/hmc/nuts_classic/diag_e_nuts_classic.hpp b/src/stan/mcmc/hmc/nuts_classic/diag_e_nuts_classic.hpp index 64f3f82ea33..b3f4e4c48d7 100644 --- a/src/stan/mcmc/hmc/nuts_classic/diag_e_nuts_classic.hpp +++ b/src/stan/mcmc/hmc/nuts_classic/diag_e_nuts_classic.hpp @@ -22,8 +22,10 @@ class diag_e_nuts_classic // since start.get_inv_metric() = finish.get_inv_metric() bool compute_criterion(ps_point& start, diag_e_point& finish, Eigen::VectorXd& rho) { - return finish.get_inv_metric().cwiseProduct(finish.p).dot(rho - finish.p) > 0 - && finish.get_inv_metric().cwiseProduct(start.p).dot(rho - start.p) > 0; + return finish.get_inv_metric().cwiseProduct(finish.p).dot(rho - finish.p) + > 0 + && finish.get_inv_metric().cwiseProduct(start.p).dot(rho - start.p) + > 0; } }; diff --git a/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp b/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp index 091735c631a..88c26549272 100644 --- a/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp +++ b/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp @@ -34,7 +34,8 @@ class adapt_dense_e_static_hmc : public dense_e_static_hmc, Eigen::MatrixXd inv_metric; - bool update = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); + bool update = this->covar_adaptation_.learn_covariance(inv_metric, + this->z_.q); if (update) { this->init_stepsize(logger); diff --git a/src/stan/mcmc/hmc/static_uniform/adapt_dense_e_static_uniform.hpp b/src/stan/mcmc/hmc/static_uniform/adapt_dense_e_static_uniform.hpp index cc64ebbb51f..07f496afbe4 100644 --- a/src/stan/mcmc/hmc/static_uniform/adapt_dense_e_static_uniform.hpp +++ b/src/stan/mcmc/hmc/static_uniform/adapt_dense_e_static_uniform.hpp @@ -32,14 +32,15 @@ class adapt_dense_e_static_uniform s.accept_stat()); Eigen::MatrixXd inv_metric; - - bool update = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); + + bool update = this->covar_adaptation_.learn_covariance(inv_metric, + this->z_.q); if (update) { this->init_stepsize(logger); - this->z_.set_inv_metric(inv_metric); - + this->z_.set_inv_metric(inv_metric); + this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); } diff --git a/src/stan/mcmc/hmc/static_uniform/adapt_diag_e_static_uniform.hpp b/src/stan/mcmc/hmc/static_uniform/adapt_diag_e_static_uniform.hpp index d8345779dd1..de29674e675 100644 --- a/src/stan/mcmc/hmc/static_uniform/adapt_diag_e_static_uniform.hpp +++ b/src/stan/mcmc/hmc/static_uniform/adapt_diag_e_static_uniform.hpp @@ -32,13 +32,14 @@ class adapt_diag_e_static_uniform s.accept_stat()); Eigen::VectorXd inv_metric; - - bool update = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); + + bool update = this->var_adaptation_.learn_variance(inv_metric, + this->z_.q); if (update) { this->init_stepsize(logger); - this->z_.set_inv_metric(inv_metric); - + this->z_.set_inv_metric(inv_metric); + this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); } diff --git a/src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp b/src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp index 1ba8654090b..1ff6f41d9fb 100644 --- a/src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp +++ b/src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp @@ -30,14 +30,15 @@ class adapt_dense_e_xhmc : public dense_e_xhmc, s.accept_stat()); Eigen::MatrixXd inv_metric; - - bool update = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); + + bool update = this->covar_adaptation_.learn_covariance(inv_metric, + this->z_.q); if (update) { this->init_stepsize(logger); - this->z_.set_inv_metric(inv_metric); - + this->z_.set_inv_metric(inv_metric); + this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); } diff --git a/src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp b/src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp index 3c7b6e75a56..7eb3d488d66 100644 --- a/src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp +++ b/src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp @@ -30,13 +30,14 @@ class adapt_diag_e_xhmc : public diag_e_xhmc, s.accept_stat()); Eigen::VectorXd inv_metric; - - bool update = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); + + bool update = this->var_adaptation_.learn_variance(inv_metric, + this->z_.q); if (update) { this->init_stepsize(logger); - this->z_.set_inv_metric(inv_metric); + this->z_.set_inv_metric(inv_metric); this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); From 7889b2797ce61d7bdd2496870b19726b53c6169a Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Thu, 29 Oct 2020 19:14:54 +0000 Subject: [PATCH 07/16] [Jenkins] auto-formatting by clang-format version 6.0.0-1ubuntu2~16.04.1 (tags/RELEASE_600/final) --- .../mcmc/hmc/hamiltonians/dense_e_metric.hpp | 4 ++-- .../mcmc/hmc/hamiltonians/dense_e_point.hpp | 13 ++++------ .../mcmc/hmc/hamiltonians/diag_e_metric.hpp | 5 ++-- .../mcmc/hmc/hamiltonians/diag_e_point.hpp | 15 ++++++------ src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp | 4 ++-- src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp | 4 ++-- .../adapt_dense_e_nuts_classic.hpp | 4 ++-- .../adapt_diag_e_nuts_classic.hpp | 4 ++-- .../hmc/nuts_classic/dense_e_nuts_classic.hpp | 3 ++- .../hmc/nuts_classic/diag_e_nuts_classic.hpp | 6 ++--- .../hmc/static/adapt_dense_e_static_hmc.hpp | 4 ++-- .../hmc/static/adapt_diag_e_static_hmc.hpp | 4 ++-- .../adapt_dense_e_static_uniform.hpp | 4 ++-- .../adapt_diag_e_static_uniform.hpp | 4 ++-- src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp | 4 ++-- src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp | 4 ++-- .../hmc/hamiltonians/dense_e_point_test.cpp | 24 +++++++++---------- .../hmc/hamiltonians/diag_e_point_test.cpp | 7 +++--- 18 files changed, 55 insertions(+), 62 deletions(-) diff --git a/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp b/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp index ab91cb56bd2..67973f22a66 100644 --- a/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp @@ -50,8 +50,8 @@ class dense_e_metric : public base_hamiltonian { for (idx_t i = 0; i < u.size(); ++i) u(i) = rand_dense_gaus(); - z.p = z.get_transpose_llt_inv_metric().triangularView() - .solve(u); + z.p = z.get_transpose_llt_inv_metric().triangularView().solve( + u); } }; diff --git a/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp b/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp index 29739c8b710..8b4eb974cbd 100644 --- a/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp @@ -12,23 +12,22 @@ namespace mcmc { * Euclidean manifold with dense metric */ class dense_e_point : public ps_point { -private: + private: /** * Inverse mass matrix. */ Eigen::MatrixXd inv_e_metric_; Eigen::MatrixXd inv_e_metric_llt_matrixU_; -public: + public: /** * Construct a dense point in n-dimensional phase space * with identity matrix as inverse mass matrix. * * @param n number of dimensions */ - explicit dense_e_point(int n) : ps_point(n), - inv_e_metric_(n, n), - inv_e_metric_llt_matrixU_(n, n) { + explicit dense_e_point(int n) + : ps_point(n), inv_e_metric_(n, n), inv_e_metric_llt_matrixU_(n, n) { inv_e_metric_.setIdentity(); inv_e_metric_llt_matrixU_.setIdentity(); } @@ -48,9 +47,7 @@ class dense_e_point : public ps_point { * * @return reference to the inverse metric */ - const Eigen::MatrixXd& get_inv_metric() const { - return inv_e_metric_; - } + const Eigen::MatrixXd& get_inv_metric() const { return inv_e_metric_; } /** * Get the transpose of the lower Cholesky factor diff --git a/src/stan/mcmc/hmc/hamiltonians/diag_e_metric.hpp b/src/stan/mcmc/hmc/hamiltonians/diag_e_metric.hpp index 8272e61d1a0..ba895082602 100644 --- a/src/stan/mcmc/hmc/hamiltonians/diag_e_metric.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/diag_e_metric.hpp @@ -45,9 +45,8 @@ class diag_e_metric : public base_hamiltonian { boost::variate_generator > rand_diag_gaus(rng, boost::normal_distribution<>()); - z.p = z.get_inv_metric().unaryExpr([&](auto&& x) { - return rand_diag_gaus() / sqrt(x); - }); + z.p = z.get_inv_metric().unaryExpr( + [&](auto&& x) { return rand_diag_gaus() / sqrt(x); }); } }; diff --git a/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp b/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp index 3bfe012f322..9e6391c7fcd 100644 --- a/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp @@ -12,13 +12,13 @@ namespace mcmc { * Euclidean manifold with diagonal metric */ class diag_e_point : public ps_point { -private: + private: /** * Vector of diagonal elements of inverse mass matrix. */ Eigen::VectorXd inv_e_metric_; -public: + public: /** * Construct a diag point in n-dimensional phase space * with vector of ones for diagonal elements of inverse mass matrix. @@ -35,9 +35,10 @@ class diag_e_point : public ps_point { * @param inv_e_metric initial mass matrix */ void set_inv_metric(const Eigen::VectorXd& inv_e_metric) { - math::check_size_match("set_inv_metric", - "Number of rows in old inverse metric", inv_e_metric_.size(), - "number of rows in new inverse metric", inv_e_metric.size()); + math::check_size_match( + "set_inv_metric", "Number of rows in old inverse metric", + inv_e_metric_.size(), "number of rows in new inverse metric", + inv_e_metric.size()); inv_e_metric_ = inv_e_metric; } @@ -46,9 +47,7 @@ class diag_e_point : public ps_point { * * @return reference to the inverse metric */ - const Eigen::VectorXd& get_inv_metric() const { - return inv_e_metric_; - } + const Eigen::VectorXd& get_inv_metric() const { return inv_e_metric_; } /** * Write elements of mass matrix to string and handoff to writer. diff --git a/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp b/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp index 52e156915dc..6f0e43c6e6b 100644 --- a/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp +++ b/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp @@ -31,8 +31,8 @@ class adapt_dense_e_nuts : public dense_e_nuts, Eigen::MatrixXd inv_metric; - bool update = this->covar_adaptation_.learn_covariance(inv_metric, - this->z_.q); + bool update + = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); diff --git a/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp b/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp index 9f236009931..984602a91a4 100644 --- a/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp +++ b/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp @@ -31,8 +31,8 @@ class adapt_diag_e_nuts : public diag_e_nuts, Eigen::VectorXd inv_metric; - bool update = this->var_adaptation_.learn_variance(inv_metric, - this->z_.q); + bool update + = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); diff --git a/src/stan/mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp b/src/stan/mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp index dedc6bda832..0245d78d954 100644 --- a/src/stan/mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp +++ b/src/stan/mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp @@ -31,8 +31,8 @@ class adapt_dense_e_nuts_classic : public dense_e_nuts_classic, Eigen::MatrixXd inv_metric; - bool update = this->covar_adaptation_.learn_covariance(inv_metric, - this->z_.q); + bool update + = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); diff --git a/src/stan/mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp b/src/stan/mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp index 04635b9dbe0..56450a86ab9 100644 --- a/src/stan/mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp +++ b/src/stan/mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp @@ -32,8 +32,8 @@ class adapt_diag_e_nuts_classic : public diag_e_nuts_classic, Eigen::VectorXd inv_metric; - bool update = this->var_adaptation_.learn_variance(inv_metric, - this->z_.q); + bool update + = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); diff --git a/src/stan/mcmc/hmc/nuts_classic/dense_e_nuts_classic.hpp b/src/stan/mcmc/hmc/nuts_classic/dense_e_nuts_classic.hpp index 10e95c7b13a..1fa1b1e5965 100644 --- a/src/stan/mcmc/hmc/nuts_classic/dense_e_nuts_classic.hpp +++ b/src/stan/mcmc/hmc/nuts_classic/dense_e_nuts_classic.hpp @@ -23,7 +23,8 @@ class dense_e_nuts_classic bool compute_criterion(ps_point& start, dense_e_point& finish, Eigen::VectorXd& rho) { return finish.p.transpose() * finish.get_inv_metric() * (rho - finish.p) > 0 - && start.p.transpose() * finish.get_inv_metric() * (rho - start.p) > 0; + && start.p.transpose() * finish.get_inv_metric() * (rho - start.p) + > 0; } }; diff --git a/src/stan/mcmc/hmc/nuts_classic/diag_e_nuts_classic.hpp b/src/stan/mcmc/hmc/nuts_classic/diag_e_nuts_classic.hpp index b3f4e4c48d7..8509e2c86f7 100644 --- a/src/stan/mcmc/hmc/nuts_classic/diag_e_nuts_classic.hpp +++ b/src/stan/mcmc/hmc/nuts_classic/diag_e_nuts_classic.hpp @@ -23,9 +23,9 @@ class diag_e_nuts_classic bool compute_criterion(ps_point& start, diag_e_point& finish, Eigen::VectorXd& rho) { return finish.get_inv_metric().cwiseProduct(finish.p).dot(rho - finish.p) - > 0 - && finish.get_inv_metric().cwiseProduct(start.p).dot(rho - start.p) - > 0; + > 0 + && finish.get_inv_metric().cwiseProduct(start.p).dot(rho - start.p) + > 0; } }; diff --git a/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp b/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp index 88c26549272..c96cd34ca2a 100644 --- a/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp +++ b/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp @@ -34,8 +34,8 @@ class adapt_dense_e_static_hmc : public dense_e_static_hmc, Eigen::MatrixXd inv_metric; - bool update = this->covar_adaptation_.learn_covariance(inv_metric, - this->z_.q); + bool update + = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); diff --git a/src/stan/mcmc/hmc/static/adapt_diag_e_static_hmc.hpp b/src/stan/mcmc/hmc/static/adapt_diag_e_static_hmc.hpp index a5fb7363df5..a775a0417ed 100644 --- a/src/stan/mcmc/hmc/static/adapt_diag_e_static_hmc.hpp +++ b/src/stan/mcmc/hmc/static/adapt_diag_e_static_hmc.hpp @@ -34,8 +34,8 @@ class adapt_diag_e_static_hmc : public diag_e_static_hmc, Eigen::VectorXd inv_metric; - bool update = this->var_adaptation_.learn_variance(inv_metric, - this->z_.q); + bool update + = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); diff --git a/src/stan/mcmc/hmc/static_uniform/adapt_dense_e_static_uniform.hpp b/src/stan/mcmc/hmc/static_uniform/adapt_dense_e_static_uniform.hpp index 07f496afbe4..898036f7925 100644 --- a/src/stan/mcmc/hmc/static_uniform/adapt_dense_e_static_uniform.hpp +++ b/src/stan/mcmc/hmc/static_uniform/adapt_dense_e_static_uniform.hpp @@ -33,8 +33,8 @@ class adapt_dense_e_static_uniform Eigen::MatrixXd inv_metric; - bool update = this->covar_adaptation_.learn_covariance(inv_metric, - this->z_.q); + bool update + = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); diff --git a/src/stan/mcmc/hmc/static_uniform/adapt_diag_e_static_uniform.hpp b/src/stan/mcmc/hmc/static_uniform/adapt_diag_e_static_uniform.hpp index de29674e675..6f5a7356288 100644 --- a/src/stan/mcmc/hmc/static_uniform/adapt_diag_e_static_uniform.hpp +++ b/src/stan/mcmc/hmc/static_uniform/adapt_diag_e_static_uniform.hpp @@ -33,8 +33,8 @@ class adapt_diag_e_static_uniform Eigen::VectorXd inv_metric; - bool update = this->var_adaptation_.learn_variance(inv_metric, - this->z_.q); + bool update + = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); diff --git a/src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp b/src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp index 1ff6f41d9fb..d5b17c432f2 100644 --- a/src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp +++ b/src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp @@ -31,8 +31,8 @@ class adapt_dense_e_xhmc : public dense_e_xhmc, Eigen::MatrixXd inv_metric; - bool update = this->covar_adaptation_.learn_covariance(inv_metric, - this->z_.q); + bool update + = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); diff --git a/src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp b/src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp index 7eb3d488d66..158c7bb2eda 100644 --- a/src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp +++ b/src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp @@ -31,8 +31,8 @@ class adapt_diag_e_xhmc : public diag_e_xhmc, Eigen::VectorXd inv_metric; - bool update = this->var_adaptation_.learn_variance(inv_metric, - this->z_.q); + bool update + = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); if (update) { this->init_stepsize(logger); diff --git a/src/test/unit/mcmc/hmc/hamiltonians/dense_e_point_test.cpp b/src/test/unit/mcmc/hmc/hamiltonians/dense_e_point_test.cpp index 20040c42b91..debd9bd8eb1 100644 --- a/src/test/unit/mcmc/hmc/hamiltonians/dense_e_point_test.cpp +++ b/src/test/unit/mcmc/hmc/hamiltonians/dense_e_point_test.cpp @@ -5,51 +5,49 @@ TEST(McmcDenseEPoint, inv_metric_wrong_size) { int N = 2; - + stan::mcmc::dense_e_point z(N); Eigen::MatrixXd inv_metric_large(2 * N, 2 * N); - EXPECT_THROW_MSG(z.set_inv_metric(inv_metric_large), - std::invalid_argument, - "number of rows in new inverse metric"); + EXPECT_THROW_MSG(z.set_inv_metric(inv_metric_large), std::invalid_argument, + "number of rows in new inverse metric"); } TEST(McmcDenseEPoint, inv_metric) { int N = 2; - + stan::mcmc::dense_e_point z(N); Eigen::MatrixXd inv_metric(N, N); - inv_metric << 2, 1, - 1, 2; + inv_metric << 2, 1, 1, 2; z.set_inv_metric(inv_metric); Eigen::MatrixXd z_inv_metric = z.get_inv_metric(); EXPECT_EQ(z_inv_metric.rows(), inv_metric.rows()); EXPECT_EQ(z_inv_metric.cols(), inv_metric.cols()); - for(size_t i = 0; i < inv_metric.size(); ++i) + for (size_t i = 0; i < inv_metric.size(); ++i) EXPECT_FLOAT_EQ(z_inv_metric(i), inv_metric(i)); } TEST(McmcDenseEPoint, inv_metric_llt) { int N = 2; - + stan::mcmc::dense_e_point z(N); Eigen::MatrixXd inv_metric(N, N); - inv_metric << 2, 1, - 1, 2; + inv_metric << 2, 1, 1, 2; z.set_inv_metric(inv_metric); Eigen::MatrixXd z_inv_metric_llt_matrixU = z.get_transpose_llt_inv_metric(); - Eigen::MatrixXd z_inv_metric_2 = z_inv_metric_llt_matrixU.transpose() * z_inv_metric_llt_matrixU; + Eigen::MatrixXd z_inv_metric_2 + = z_inv_metric_llt_matrixU.transpose() * z_inv_metric_llt_matrixU; EXPECT_EQ(z_inv_metric_2.rows(), inv_metric.rows()); EXPECT_EQ(z_inv_metric_2.cols(), inv_metric.cols()); - for(size_t i = 0; i < inv_metric.size(); ++i) + for (size_t i = 0; i < inv_metric.size(); ++i) EXPECT_FLOAT_EQ(z_inv_metric_2(i), inv_metric(i)); } diff --git a/src/test/unit/mcmc/hmc/hamiltonians/diag_e_point_test.cpp b/src/test/unit/mcmc/hmc/hamiltonians/diag_e_point_test.cpp index 5425a6d613a..dfd96e4cf31 100644 --- a/src/test/unit/mcmc/hmc/hamiltonians/diag_e_point_test.cpp +++ b/src/test/unit/mcmc/hmc/hamiltonians/diag_e_point_test.cpp @@ -10,9 +10,8 @@ TEST(McmcDiagEPoint, inv_metric_wrong_size) { Eigen::VectorXd inv_metric_large(2 * N); - EXPECT_THROW_MSG(z.set_inv_metric(inv_metric_large), - std::invalid_argument, - "number of rows in new inverse metric"); + EXPECT_THROW_MSG(z.set_inv_metric(inv_metric_large), std::invalid_argument, + "number of rows in new inverse metric"); } TEST(McmcDiagEPoint, inv_metric) { @@ -28,6 +27,6 @@ TEST(McmcDiagEPoint, inv_metric) { Eigen::VectorXd z_inv_metric = z.get_inv_metric(); EXPECT_EQ(z_inv_metric.size(), inv_metric.size()); - for(size_t i = 0; i < inv_metric.size(); ++i) + for (size_t i = 0; i < inv_metric.size(); ++i) EXPECT_FLOAT_EQ(z_inv_metric(i), inv_metric(i)); } From f8b5be7f9f6d51dbd149f9682d5b2def0584f0c6 Mon Sep 17 00:00:00 2001 From: Ben Date: Fri, 30 Oct 2020 12:43:10 -0400 Subject: [PATCH 08/16] Fixed inv_metric access in test (Issue #2881) --- src/test/unit/mcmc/hmc/integrators/impl_leapfrog_test.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/unit/mcmc/hmc/integrators/impl_leapfrog_test.cpp b/src/test/unit/mcmc/hmc/integrators/impl_leapfrog_test.cpp index 3bc849e3e29..246d32c9696 100644 --- a/src/test/unit/mcmc/hmc/integrators/impl_leapfrog_test.cpp +++ b/src/test/unit/mcmc/hmc/integrators/impl_leapfrog_test.cpp @@ -522,7 +522,9 @@ TEST_F(McmcHmcIntegratorsImplLeapfrogF, evolve_9) { z.q(0) = 1.27097196280777; z.p(0) = -0.159996782671291; z.g(0) = 1.27097196280777; - z.get_inv_metric()(0) = 0.733184698671436; + Eigen::VectorXd inv_metric(1); + inv_metric << 0.733184698671436; + z.set_inv_metric(inv_metric); EXPECT_NEAR(z.V, 0.807684865121721, 1e-15); EXPECT_NEAR(z.q(0), 1.27097196280777, 1e-15); EXPECT_NEAR(z.p(0), -0.159996782671291, 1e-15); From a67e9e5f9100278c3f78787403be4b980ec403be Mon Sep 17 00:00:00 2001 From: Ben Date: Sat, 31 Oct 2020 12:39:41 -0400 Subject: [PATCH 09/16] Fixed test (Issue #2881) --- src/test/unit/mcmc/hmc/integrators/expl_leapfrog_test.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/unit/mcmc/hmc/integrators/expl_leapfrog_test.cpp b/src/test/unit/mcmc/hmc/integrators/expl_leapfrog_test.cpp index 4c2873033ad..9152cc47280 100644 --- a/src/test/unit/mcmc/hmc/integrators/expl_leapfrog_test.cpp +++ b/src/test/unit/mcmc/hmc/integrators/expl_leapfrog_test.cpp @@ -417,7 +417,9 @@ TEST_F(McmcHmcIntegratorsExplLeapfrogF, evolve_9) { z.q(0) = 1.27097196280777; z.p(0) = -0.159996782671291; z.g(0) = 1.27097196280777; - z.get_inv_metric()(0) = 0.733184698671436; + Eigen::VectorXd inv_metric(1); + inv_metric << 0.733184698671436; + z.set_inv_metric(inv_metric); EXPECT_NEAR(z.V, 0.807684865121721, 1e-15); EXPECT_NEAR(z.q(0), 1.27097196280777, 1e-15); EXPECT_NEAR(z.p(0), -0.159996782671291, 1e-15); From a8e7500d483c98ee0c4da8a9b68a76287f0d93ae Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 2 Nov 2020 15:39:35 -0500 Subject: [PATCH 10/16] Fixed order of updated inverse metric with stepsize (Issue #2881) --- src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp | 4 ++-- src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp | 4 ++-- src/stan/mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp | 4 ++-- src/stan/mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp | 4 ++-- src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp | 4 ++-- src/stan/mcmc/hmc/static/adapt_diag_e_static_hmc.hpp | 4 ++-- .../mcmc/hmc/static_uniform/adapt_dense_e_static_uniform.hpp | 4 ++-- .../mcmc/hmc/static_uniform/adapt_diag_e_static_uniform.hpp | 4 ++-- src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp | 4 ++-- src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp | 4 ++-- 10 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp b/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp index 6f0e43c6e6b..377cd96eab9 100644 --- a/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp +++ b/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp @@ -35,10 +35,10 @@ class adapt_dense_e_nuts : public dense_e_nuts, = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); if (update) { - this->init_stepsize(logger); - this->z_.set_inv_metric(inv_metric); + this->init_stepsize(logger); + this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); } diff --git a/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp b/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp index 984602a91a4..33cd61e13f1 100644 --- a/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp +++ b/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp @@ -35,10 +35,10 @@ class adapt_diag_e_nuts : public diag_e_nuts, = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); if (update) { - this->init_stepsize(logger); - this->z_.set_inv_metric(inv_metric); + this->init_stepsize(logger); + this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); } diff --git a/src/stan/mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp b/src/stan/mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp index 0245d78d954..d930bb5bec5 100644 --- a/src/stan/mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp +++ b/src/stan/mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp @@ -35,10 +35,10 @@ class adapt_dense_e_nuts_classic : public dense_e_nuts_classic, = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); if (update) { - this->init_stepsize(logger); - this->z_.set_inv_metric(inv_metric); + this->init_stepsize(logger); + this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); } diff --git a/src/stan/mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp b/src/stan/mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp index 56450a86ab9..14ab69a04cc 100644 --- a/src/stan/mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp +++ b/src/stan/mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp @@ -36,10 +36,10 @@ class adapt_diag_e_nuts_classic : public diag_e_nuts_classic, = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); if (update) { - this->init_stepsize(logger); - this->z_.set_inv_metric(inv_metric); + this->init_stepsize(logger); + this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); } diff --git a/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp b/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp index c96cd34ca2a..119ed9a5f97 100644 --- a/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp +++ b/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp @@ -38,10 +38,10 @@ class adapt_dense_e_static_hmc : public dense_e_static_hmc, = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); if (update) { - this->init_stepsize(logger); - this->update_L_(); this->z_.set_inv_metric(inv_metric); + this->init_stepsize(logger); + this->update_L_(); this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); } diff --git a/src/stan/mcmc/hmc/static/adapt_diag_e_static_hmc.hpp b/src/stan/mcmc/hmc/static/adapt_diag_e_static_hmc.hpp index a775a0417ed..fe8f39c25c0 100644 --- a/src/stan/mcmc/hmc/static/adapt_diag_e_static_hmc.hpp +++ b/src/stan/mcmc/hmc/static/adapt_diag_e_static_hmc.hpp @@ -38,10 +38,10 @@ class adapt_diag_e_static_hmc : public diag_e_static_hmc, = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); if (update) { - this->init_stepsize(logger); - this->update_L_(); this->z_.set_inv_metric(inv_metric); + this->init_stepsize(logger); + this->update_L_(); this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); } diff --git a/src/stan/mcmc/hmc/static_uniform/adapt_dense_e_static_uniform.hpp b/src/stan/mcmc/hmc/static_uniform/adapt_dense_e_static_uniform.hpp index 898036f7925..0af604faf1e 100644 --- a/src/stan/mcmc/hmc/static_uniform/adapt_dense_e_static_uniform.hpp +++ b/src/stan/mcmc/hmc/static_uniform/adapt_dense_e_static_uniform.hpp @@ -37,10 +37,10 @@ class adapt_dense_e_static_uniform = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); if (update) { - this->init_stepsize(logger); - this->z_.set_inv_metric(inv_metric); + this->init_stepsize(logger); + this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); } diff --git a/src/stan/mcmc/hmc/static_uniform/adapt_diag_e_static_uniform.hpp b/src/stan/mcmc/hmc/static_uniform/adapt_diag_e_static_uniform.hpp index 6f5a7356288..b0fd0f5ab84 100644 --- a/src/stan/mcmc/hmc/static_uniform/adapt_diag_e_static_uniform.hpp +++ b/src/stan/mcmc/hmc/static_uniform/adapt_diag_e_static_uniform.hpp @@ -36,10 +36,10 @@ class adapt_diag_e_static_uniform bool update = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); if (update) { - this->init_stepsize(logger); - this->z_.set_inv_metric(inv_metric); + this->init_stepsize(logger); + this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); } diff --git a/src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp b/src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp index d5b17c432f2..f09186507ec 100644 --- a/src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp +++ b/src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp @@ -35,10 +35,10 @@ class adapt_dense_e_xhmc : public dense_e_xhmc, = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); if (update) { - this->init_stepsize(logger); - this->z_.set_inv_metric(inv_metric); + this->init_stepsize(logger); + this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); } diff --git a/src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp b/src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp index 158c7bb2eda..b28fb886eb6 100644 --- a/src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp +++ b/src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp @@ -35,10 +35,10 @@ class adapt_diag_e_xhmc : public diag_e_xhmc, = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); if (update) { - this->init_stepsize(logger); - this->z_.set_inv_metric(inv_metric); + this->init_stepsize(logger); + this->stepsize_adaptation_.set_mu(log(10 * this->nom_epsilon_)); this->stepsize_adaptation_.restart(); } From 6925d77f17e529280322e6e6a66af25fdd5ed5f1 Mon Sep 17 00:00:00 2001 From: Ben Date: Tue, 9 Mar 2021 12:13:00 -0500 Subject: [PATCH 11/16] Updated to use forwarding (Issue #2881) --- src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp | 4 ++-- src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp | 8 ++------ src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp | 2 +- src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp | 2 +- .../mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp | 2 +- .../mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp | 2 +- src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp | 2 +- src/stan/mcmc/hmc/static/adapt_diag_e_static_hmc.hpp | 2 +- .../hmc/static_uniform/adapt_dense_e_static_uniform.hpp | 2 +- .../hmc/static_uniform/adapt_diag_e_static_uniform.hpp | 2 +- src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp | 2 +- src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp | 2 +- 12 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp b/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp index 8b4eb974cbd..aa4debe1447 100644 --- a/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp @@ -37,8 +37,8 @@ class dense_e_point : public ps_point { * * @param inv_e_metric initial mass matrix */ - void set_inv_metric(const Eigen::MatrixXd& inv_e_metric) { - inv_e_metric_ = inv_e_metric; + void set_inv_metric(Eigen::MatrixXd&& inv_e_metric) { + inv_e_metric_ = std::forward(inv_e_metric); inv_e_metric_llt_matrixU_ = inv_e_metric_.llt().matrixU(); } diff --git a/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp b/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp index 9e6391c7fcd..197b7e317a4 100644 --- a/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp @@ -34,12 +34,8 @@ class diag_e_point : public ps_point { * * @param inv_e_metric initial mass matrix */ - void set_inv_metric(const Eigen::VectorXd& inv_e_metric) { - math::check_size_match( - "set_inv_metric", "Number of rows in old inverse metric", - inv_e_metric_.size(), "number of rows in new inverse metric", - inv_e_metric.size()); - inv_e_metric_ = inv_e_metric; + void set_inv_metric(Eigen::VectorXd&& inv_e_metric) { + inv_e_metric_ = std::forward(inv_e_metric); } /** diff --git a/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp b/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp index 377cd96eab9..e726396d289 100644 --- a/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp +++ b/src/stan/mcmc/hmc/nuts/adapt_dense_e_nuts.hpp @@ -35,7 +35,7 @@ class adapt_dense_e_nuts : public dense_e_nuts, = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); if (update) { - this->z_.set_inv_metric(inv_metric); + this->z_.set_inv_metric(std::move(inv_metric)); this->init_stepsize(logger); diff --git a/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp b/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp index 33cd61e13f1..a2d193ab381 100644 --- a/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp +++ b/src/stan/mcmc/hmc/nuts/adapt_diag_e_nuts.hpp @@ -35,7 +35,7 @@ class adapt_diag_e_nuts : public diag_e_nuts, = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); if (update) { - this->z_.set_inv_metric(inv_metric); + this->z_.set_inv_metric(std::move(inv_metric)); this->init_stepsize(logger); diff --git a/src/stan/mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp b/src/stan/mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp index d930bb5bec5..43edd6e8e91 100644 --- a/src/stan/mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp +++ b/src/stan/mcmc/hmc/nuts_classic/adapt_dense_e_nuts_classic.hpp @@ -35,7 +35,7 @@ class adapt_dense_e_nuts_classic : public dense_e_nuts_classic, = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); if (update) { - this->z_.set_inv_metric(inv_metric); + this->z_.set_inv_metric(std::move(inv_metric)); this->init_stepsize(logger); diff --git a/src/stan/mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp b/src/stan/mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp index 14ab69a04cc..d0590a255c8 100644 --- a/src/stan/mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp +++ b/src/stan/mcmc/hmc/nuts_classic/adapt_diag_e_nuts_classic.hpp @@ -36,7 +36,7 @@ class adapt_diag_e_nuts_classic : public diag_e_nuts_classic, = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); if (update) { - this->z_.set_inv_metric(inv_metric); + this->z_.set_inv_metric(std::move(inv_metric)); this->init_stepsize(logger); diff --git a/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp b/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp index 119ed9a5f97..ccac57e0e8f 100644 --- a/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp +++ b/src/stan/mcmc/hmc/static/adapt_dense_e_static_hmc.hpp @@ -38,7 +38,7 @@ class adapt_dense_e_static_hmc : public dense_e_static_hmc, = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); if (update) { - this->z_.set_inv_metric(inv_metric); + this->z_.set_inv_metric(std::move(inv_metric)); this->init_stepsize(logger); this->update_L_(); diff --git a/src/stan/mcmc/hmc/static/adapt_diag_e_static_hmc.hpp b/src/stan/mcmc/hmc/static/adapt_diag_e_static_hmc.hpp index fe8f39c25c0..58130de0da8 100644 --- a/src/stan/mcmc/hmc/static/adapt_diag_e_static_hmc.hpp +++ b/src/stan/mcmc/hmc/static/adapt_diag_e_static_hmc.hpp @@ -38,7 +38,7 @@ class adapt_diag_e_static_hmc : public diag_e_static_hmc, = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); if (update) { - this->z_.set_inv_metric(inv_metric); + this->z_.set_inv_metric(std::move(inv_metric)); this->init_stepsize(logger); this->update_L_(); diff --git a/src/stan/mcmc/hmc/static_uniform/adapt_dense_e_static_uniform.hpp b/src/stan/mcmc/hmc/static_uniform/adapt_dense_e_static_uniform.hpp index 0af604faf1e..e565fd743b6 100644 --- a/src/stan/mcmc/hmc/static_uniform/adapt_dense_e_static_uniform.hpp +++ b/src/stan/mcmc/hmc/static_uniform/adapt_dense_e_static_uniform.hpp @@ -37,7 +37,7 @@ class adapt_dense_e_static_uniform = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); if (update) { - this->z_.set_inv_metric(inv_metric); + this->z_.set_inv_metric(std::move(inv_metric)); this->init_stepsize(logger); diff --git a/src/stan/mcmc/hmc/static_uniform/adapt_diag_e_static_uniform.hpp b/src/stan/mcmc/hmc/static_uniform/adapt_diag_e_static_uniform.hpp index b0fd0f5ab84..09203285bb8 100644 --- a/src/stan/mcmc/hmc/static_uniform/adapt_diag_e_static_uniform.hpp +++ b/src/stan/mcmc/hmc/static_uniform/adapt_diag_e_static_uniform.hpp @@ -36,7 +36,7 @@ class adapt_diag_e_static_uniform bool update = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); if (update) { - this->z_.set_inv_metric(inv_metric); + this->z_.set_inv_metric(std::move(inv_metric)); this->init_stepsize(logger); diff --git a/src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp b/src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp index f09186507ec..f0cd49e401f 100644 --- a/src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp +++ b/src/stan/mcmc/hmc/xhmc/adapt_dense_e_xhmc.hpp @@ -35,7 +35,7 @@ class adapt_dense_e_xhmc : public dense_e_xhmc, = this->covar_adaptation_.learn_covariance(inv_metric, this->z_.q); if (update) { - this->z_.set_inv_metric(inv_metric); + this->z_.set_inv_metric(std::move(inv_metric)); this->init_stepsize(logger); diff --git a/src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp b/src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp index b28fb886eb6..e0f7b07e19f 100644 --- a/src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp +++ b/src/stan/mcmc/hmc/xhmc/adapt_diag_e_xhmc.hpp @@ -35,7 +35,7 @@ class adapt_diag_e_xhmc : public diag_e_xhmc, = this->var_adaptation_.learn_variance(inv_metric, this->z_.q); if (update) { - this->z_.set_inv_metric(inv_metric); + this->z_.set_inv_metric(std::move(inv_metric)); this->init_stepsize(logger); From 13d139f42e0f8a0b114c85de73b498325efc7800 Mon Sep 17 00:00:00 2001 From: Ben Date: Tue, 9 Mar 2021 12:17:02 -0500 Subject: [PATCH 12/16] Only close over rng (Issue #2881) --- src/stan/mcmc/hmc/hamiltonians/diag_e_metric.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stan/mcmc/hmc/hamiltonians/diag_e_metric.hpp b/src/stan/mcmc/hmc/hamiltonians/diag_e_metric.hpp index ba895082602..ccc0b8d3346 100644 --- a/src/stan/mcmc/hmc/hamiltonians/diag_e_metric.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/diag_e_metric.hpp @@ -46,7 +46,7 @@ class diag_e_metric : public base_hamiltonian { rand_diag_gaus(rng, boost::normal_distribution<>()); z.p = z.get_inv_metric().unaryExpr( - [&](auto&& x) { return rand_diag_gaus() / sqrt(x); }); + [&rand_diag_gaus](auto&& x) { return rand_diag_gaus() / sqrt(x); }); } }; From 83f551f1829e94ca06744244cdcff3a1cf603f63 Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 15 Mar 2021 16:30:19 -0400 Subject: [PATCH 13/16] Fix universal references (Issue #2881) --- src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp | 6 ++++-- src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp b/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp index aa4debe1447..b733e612785 100644 --- a/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp @@ -37,8 +37,10 @@ class dense_e_point : public ps_point { * * @param inv_e_metric initial mass matrix */ - void set_inv_metric(Eigen::MatrixXd&& inv_e_metric) { - inv_e_metric_ = std::forward(inv_e_metric); + template * = nullptr> + void set_inv_metric(EigMat&& inv_e_metric) { + inv_e_metric_ = std::forward(inv_e_metric); inv_e_metric_llt_matrixU_ = inv_e_metric_.llt().matrixU(); } diff --git a/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp b/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp index 197b7e317a4..6ee4779b96a 100644 --- a/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp @@ -34,8 +34,10 @@ class diag_e_point : public ps_point { * * @param inv_e_metric initial mass matrix */ - void set_inv_metric(Eigen::VectorXd&& inv_e_metric) { - inv_e_metric_ = std::forward(inv_e_metric); + template * = nullptr> + void set_inv_metric(EigVec&& inv_e_metric) { + inv_e_metric_ = std::forward(inv_e_metric); } /** From 297742672edb10033d98aee8bef2b475511d10d5 Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Mon, 15 Mar 2021 20:31:03 +0000 Subject: [PATCH 14/16] [Jenkins] auto-formatting by clang-format version 6.0.0-1ubuntu2~16.04.1 (tags/RELEASE_600/final) --- src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp | 3 +-- src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp b/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp index b733e612785..90b0970ae79 100644 --- a/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp @@ -37,8 +37,7 @@ class dense_e_point : public ps_point { * * @param inv_e_metric initial mass matrix */ - template * = nullptr> + template * = nullptr> void set_inv_metric(EigMat&& inv_e_metric) { inv_e_metric_ = std::forward(inv_e_metric); inv_e_metric_llt_matrixU_ = inv_e_metric_.llt().matrixU(); diff --git a/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp b/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp index 6ee4779b96a..9de415183c7 100644 --- a/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp @@ -34,8 +34,7 @@ class diag_e_point : public ps_point { * * @param inv_e_metric initial mass matrix */ - template * = nullptr> + template * = nullptr> void set_inv_metric(EigVec&& inv_e_metric) { inv_e_metric_ = std::forward(inv_e_metric); } From fd36a2665374e8e4a248a961facf64688d634288 Mon Sep 17 00:00:00 2001 From: Ben Date: Sat, 3 Apr 2021 15:56:24 -0700 Subject: [PATCH 15/16] Store matrixL of llt instead of not matrixU --- src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp | 3 +-- src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp | 12 ++++++------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp b/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp index 67973f22a66..4451c615098 100644 --- a/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp @@ -50,8 +50,7 @@ class dense_e_metric : public base_hamiltonian { for (idx_t i = 0; i < u.size(); ++i) u(i) = rand_dense_gaus(); - z.p = z.get_transpose_llt_inv_metric().triangularView().solve( - u); + z.p = z.get_llt_inv_metric().transpose().triangularView().solve(u); } }; diff --git a/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp b/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp index 90b0970ae79..d5eb1b8e65c 100644 --- a/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp @@ -17,7 +17,7 @@ class dense_e_point : public ps_point { * Inverse mass matrix. */ Eigen::MatrixXd inv_e_metric_; - Eigen::MatrixXd inv_e_metric_llt_matrixU_; + Eigen::MatrixXd inv_e_metric_llt_matrixL_; public: /** @@ -27,9 +27,9 @@ class dense_e_point : public ps_point { * @param n number of dimensions */ explicit dense_e_point(int n) - : ps_point(n), inv_e_metric_(n, n), inv_e_metric_llt_matrixU_(n, n) { + : ps_point(n), inv_e_metric_(n, n), inv_e_metric_llt_matrixL_(n, n) { inv_e_metric_.setIdentity(); - inv_e_metric_llt_matrixU_.setIdentity(); + inv_e_metric_llt_matrixL_.setIdentity(); } /** @@ -40,7 +40,7 @@ class dense_e_point : public ps_point { template * = nullptr> void set_inv_metric(EigMat&& inv_e_metric) { inv_e_metric_ = std::forward(inv_e_metric); - inv_e_metric_llt_matrixU_ = inv_e_metric_.llt().matrixU(); + inv_e_metric_llt_matrixL_ = inv_e_metric_.llt().matrixL(); } /** @@ -56,8 +56,8 @@ class dense_e_point : public ps_point { * * @return reference to transpose of Cholesky factor */ - const Eigen::MatrixXd& get_transpose_llt_inv_metric() const { - return inv_e_metric_llt_matrixU_; + const Eigen::MatrixXd& get_llt_inv_metric() const { + return inv_e_metric_llt_matrixL_; } /** From 1c610a2c26636df8093fbb1b7d1295e46a0e04c3 Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Sat, 3 Apr 2021 22:57:15 +0000 Subject: [PATCH 16/16] [Jenkins] auto-formatting by clang-format version 6.0.0-1ubuntu2~16.04.1 (tags/RELEASE_600/final) --- src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp b/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp index 4451c615098..7c1b2bde45d 100644 --- a/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp @@ -50,7 +50,10 @@ class dense_e_metric : public base_hamiltonian { for (idx_t i = 0; i < u.size(); ++i) u(i) = rand_dense_gaus(); - z.p = z.get_llt_inv_metric().transpose().triangularView().solve(u); + z.p = z.get_llt_inv_metric() + .transpose() + .triangularView() + .solve(u); } };