diff --git a/src/stan/mcmc/hmc/hamiltonians/ps_point.hpp b/src/stan/mcmc/hmc/hamiltonians/ps_point.hpp index b66cbc6c12e..e94409ac67c 100644 --- a/src/stan/mcmc/hmc/hamiltonians/ps_point.hpp +++ b/src/stan/mcmc/hmc/hamiltonians/ps_point.hpp @@ -24,7 +24,7 @@ class ps_point { virtual inline void get_param_names(std::vector& model_names, std::vector& names) { - names.reserve(q.size() + p.size() + g.size()); + names.reserve(names.size() + q.size() + p.size() + g.size()); for (int i = 0; i < q.size(); ++i) names.emplace_back(model_names[i]); for (int i = 0; i < p.size(); ++i) @@ -34,7 +34,7 @@ class ps_point { } virtual inline void get_params(std::vector& values) { - values.reserve(q.size() + p.size() + g.size()); + values.reserve(values.size() + q.size() + p.size() + g.size()); for (int i = 0; i < q.size(); ++i) values.push_back(q[i]); for (int i = 0; i < p.size(); ++i) diff --git a/src/test/unit/mcmc/hmc/hamiltonians/ps_point_test.cpp b/src/test/unit/mcmc/hmc/hamiltonians/ps_point_test.cpp index a5452fa7df0..3691d2e6703 100644 --- a/src/test/unit/mcmc/hmc/hamiltonians/ps_point_test.cpp +++ b/src/test/unit/mcmc/hmc/hamiltonians/ps_point_test.cpp @@ -21,5 +21,30 @@ TEST(psPoint, write_metric_streams) { EXPECT_EQ("", stan::test::cerr_ss.str()); } +TEST(psPoint, get_param_names_appends_to_existing_names) { + ps_point point(2); + std::vector model_names{"alpha", "beta"}; + std::vector names{"lp__"}; + + point.get_param_names(model_names, names); + + std::vector expected{"lp__", "alpha", "beta", "p_alpha", + "p_beta", "g_alpha", "g_beta"}; + EXPECT_EQ(expected, names); +} + +TEST(psPoint, get_params_appends_to_existing_values) { + ps_point point(2); + point.q << 1.0, 2.0; + point.p << 3.0, 4.0; + point.g << 5.0, 6.0; + std::vector values{-1.0}; + + point.get_params(values); + + std::vector expected{-1.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + EXPECT_EQ(expected, values); +} + } // namespace mcmc } // namespace stan