Skip to content

Commit

Permalink
Fix size-zero mass matrix
Browse files Browse the repository at this point in the history
  • Loading branch information
nhuurre committed Oct 20, 2021
1 parent 891fde4 commit e138b71
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 3 deletions.
2 changes: 2 additions & 0 deletions src/stan/mcmc/hmc/hamiltonians/dense_e_point.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ class dense_e_point : public ps_point {
*/
inline void write_metric(stan::callbacks::writer& writer) {
writer("Elements of inverse mass matrix:");
if (inv_e_metric_.rows() == 0)
writer("");
for (int i = 0; i < inv_e_metric_.rows(); ++i) {
std::stringstream inv_e_metric_ss;
inv_e_metric_ss << inv_e_metric_(i, 0);
Expand Down
3 changes: 2 additions & 1 deletion src/stan/mcmc/hmc/hamiltonians/diag_e_point.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ class diag_e_point : public ps_point {
inline void write_metric(stan::callbacks::writer& writer) {
writer("Diagonal elements of inverse mass matrix:");
std::stringstream inv_e_metric_ss;
inv_e_metric_ss << inv_e_metric_(0);
if (inv_e_metric_.size() > 0)
inv_e_metric_ss << inv_e_metric_(0);
for (int i = 1; i < inv_e_metric_.size(); ++i)
inv_e_metric_ss << ", " << inv_e_metric_(i);
writer(inv_e_metric_ss.str());
Expand Down
5 changes: 3 additions & 2 deletions src/stan/services/util/validate_dense_inv_metric.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@ namespace util {
inline void validate_dense_inv_metric(const Eigen::MatrixXd& inv_metric,
callbacks::logger& logger) {
try {
stan::math::check_pos_definite("check_pos_definite", "inv_metric",
inv_metric);
if (inv_metric.size() > 0)
stan::math::check_pos_definite("check_pos_definite", "inv_metric",
inv_metric);
} catch (const std::domain_error& e) {
logger.error("Inverse Euclidean metric not positive definite.");
throw std::domain_error("Initialization failure");
Expand Down
10 changes: 10 additions & 0 deletions src/test/unit/services/util/inv_metric_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,16 @@ TEST(inv_metric, read_dense_OK) {
ASSERT_NEAR(0.8274, inv_inv_metric(8), 0.000001);
}

TEST(inv_metric, read_dense_sz0) {
stan::callbacks::logger logger;
stan::io::dump dmp = stan::services::util::create_unit_e_dense_inv_metric(0);
Eigen::MatrixXd inv_inv_metric
= stan::services::util::read_dense_inv_metric(dmp, 0, logger);
EXPECT_EQ(0, inv_inv_metric.size());
EXPECT_EQ(0, inv_inv_metric.rows());
EXPECT_EQ(0, inv_inv_metric.cols());
}

TEST(inv_metric, read_dense_bad1) {
stan::callbacks::logger logger;
std::string txt
Expand Down

0 comments on commit e138b71

Please sign in to comment.