From d95e37718fbd61868a2c811b7324d07b96932e03 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Mon, 9 Dec 2019 18:17:58 +0100 Subject: [PATCH 01/82] Failing test for cutoff when delegate neg_binomial_2 to poisson --- .../prim/scal/prob/neg_binomial_2_lpmf.hpp | 7 +++++- .../prim/scal/prob/neg_binomial_2_test.cpp | 24 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp index 10c7ff708ae..c3769982c37 100644 --- a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp @@ -16,6 +16,11 @@ namespace stan { namespace math { +namespace internal { + //Exposing to let me us this in tests + constexpr double neg_binomial_2_phi_cutoff = 1e5; +} + // NegBinomial(n|mu, phi) [mu >= 0; phi > 0; n >= 0] template return_type_t neg_binomial_2_lpmf( @@ -95,7 +100,7 @@ return_type_t neg_binomial_2_lpmf( } // if phi is large we probably overflow, defer to Poisson: - if (phi__[i] > 1e5) { + if (phi__[i] > internal::neg_binomial_2_phi_cutoff) { logp = poisson_lpmf(n_vec[i], mu__[i]); } diff --git a/test/unit/math/prim/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/prim/scal/prob/neg_binomial_2_test.cpp index 00192dd81cb..20ebb48aa51 100644 --- a/test/unit/math/prim/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/prim/scal/prob/neg_binomial_2_test.cpp @@ -214,3 +214,27 @@ TEST(ProbDistributionsNegBinomial, extreme_values) { EXPECT_LT(logp, 0); } } + +TEST(ProbDistributionsNegativeBinomial2, poissonCutoff) { + std::array mu_to_test = {0.1, 13, 150, 1621, 18432 }; + std::array y_to_test = {0, 3, 16, 24, 181, 2132, 121358 }; + constexpr double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; + for(auto mu_iter = mu_to_test.begin(); + mu_iter != mu_to_test.end(); ++mu_iter) { + for(auto y_iter = y_to_test.begin(); + y_iter != y_to_test.end(); ++y_iter) { + unsigned int y = *y_iter; + double mu = *mu_iter; + + double before_cutoff = + stan::math::neg_binomial_2_lpmf(y, mu, phi_cutoff - 1e-8); + double after_cutoff = + stan::math::neg_binomial_2_lpmf(y, mu, phi_cutoff + 1e-8); + double diff_at_cutoff = before_cutoff - after_cutoff; + EXPECT_NEAR(diff_at_cutoff, 0, 1e-8) << + "neg_binomial_2_lpmf changes too much around phi cutoff for y = " << + y << ", mu = " << mu << " value at cutoff - 1e-8: " << + before_cutoff << ", value at cutoff + 1e-8: " << after_cutoff; + } + } +} From 25b8ebe9fbad12ab6ff99a7f9ad8ed78f1351c7d Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Mon, 9 Dec 2019 18:37:10 +0100 Subject: [PATCH 02/82] Failing test for vectors needing cutoff --- .../unit/math/prim/mat/prob/neg_binomial_2_test.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/unit/math/prim/mat/prob/neg_binomial_2_test.cpp b/test/unit/math/prim/mat/prob/neg_binomial_2_test.cpp index b51719abf6f..2d854325692 100644 --- a/test/unit/math/prim/mat/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/prim/mat/prob/neg_binomial_2_test.cpp @@ -34,3 +34,16 @@ TEST(ProbDistributionsNegativeBinomial2, errorCheck) { TEST(ProbDistributionsNegativeBinomial2, distributionCheck) { check_counts_real_real(NegativeBinomial2TestRig()); } + +TEST(ProbDistributionsNegativeBinomial2, vectorAroundCutoff) { + int y = 10; + double mu = 9.36; + std::vector phi; + phi.push_back(1); + phi.push_back(stan::math::internal::neg_binomial_2_phi_cutoff + 1); + double vector_value = stan::math::neg_binomial_2_lpmf(y, mu, phi); + double scalar_value = stan::math::neg_binomial_2_lpmf(y, mu, phi[0]) + + stan::math::neg_binomial_2_lpmf(y, mu, phi[1]); + + EXPECT_FLOAT_EQ(vector_value, scalar_value); +} \ No newline at end of file From e47d5d792d59de4c6c75f3f72b6d69221d2aa444 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Mon, 9 Dec 2019 18:45:55 +0100 Subject: [PATCH 03/82] Phi cutoff no longer overrides logp accumulator --- stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp index c3769982c37..c5bb8890445 100644 --- a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp @@ -83,6 +83,12 @@ return_type_t neg_binomial_2_lpmf( } for (size_t i = 0; i < size; i++) { + // if phi is large we probably overflow, defer to Poisson: + if (phi__[i] > internal::neg_binomial_2_phi_cutoff) { + logp += poisson_lpmf(n_vec[i], mu__[i]); + continue; + } + if (include_summand::value) { logp -= lgamma(n_vec[i] + 1.0); } @@ -99,11 +105,6 @@ return_type_t neg_binomial_2_lpmf( logp += lgamma(n_plus_phi[i]); } - // if phi is large we probably overflow, defer to Poisson: - if (phi__[i] > internal::neg_binomial_2_phi_cutoff) { - logp = poisson_lpmf(n_vec[i], mu__[i]); - } - if (!is_constant_all::value) { ops_partials.edge1_.partials_[i] += n_vec[i] / mu__[i] - (n_vec[i] + phi__[i]) / (mu__[i] + phi__[i]); From 6f76adfef4098490c3f75feece3433a0d0942fbd Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Mon, 9 Dec 2019 19:03:49 +0100 Subject: [PATCH 04/82] Failing test for propto conservation around the cutoff --- .../rev/scal/prob/neg_binomial_2_test.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index e4d49b3f753..e168660f70f 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -38,9 +38,26 @@ TEST(ProbDistributionsNegBinomial, derivatives) { finite_diffs.push_back(dphi * inv2e); for (int i = 0; i < 2; ++i) { - EXPECT_NEAR(gradients[i], finite_diffs[i], 1.0); + EXPECT_NEAR(gradients[i], finite_diffs[i], 1.0) << + "for mu = " << mu_dbl << " +/- epsilon, phi = " << phi_dbl << + " +/- epsilon"; } phi_dbl *= 10; } } + +TEST(ProbDistributionsNegativeBinomial2, proptoAtPoissonCutoff) { + using stan::math::neg_binomial_2_lpmf; + using stan::math::var; + using stan::math::internal::neg_binomial_2_phi_cutoff; + + var mu_var(10); + int y = 11.8; + var value_before_cutoff = neg_binomial_2_lpmf( + y, mu_var, neg_binomial_2_phi_cutoff - 1e-8); + var value_after_cutoff = neg_binomial_2_lpmf( + y, mu_var, neg_binomial_2_phi_cutoff + 1e-8); + + EXPECT_NEAR(value_of(value_before_cutoff), value_of(value_after_cutoff), 1); +} From b43aa0d98d6a1ddb2eb5e581528269be4c1ccd5c Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Mon, 9 Dec 2019 15:13:15 -0500 Subject: [PATCH 05/82] [Jenkins] auto-formatting by clang-format version 6.0.0 (tags/google/stable/2017-11-14) --- .../prim/scal/prob/neg_binomial_2_lpmf.hpp | 6 +-- .../prim/mat/prob/neg_binomial_2_test.cpp | 6 +-- .../prim/scal/prob/neg_binomial_2_test.cpp | 38 +++++++++---------- .../rev/scal/prob/neg_binomial_2_test.cpp | 14 +++---- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp index c5bb8890445..72296f25f0f 100644 --- a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp @@ -17,9 +17,9 @@ namespace stan { namespace math { namespace internal { - //Exposing to let me us this in tests - constexpr double neg_binomial_2_phi_cutoff = 1e5; -} +// Exposing to let me us this in tests +constexpr double neg_binomial_2_phi_cutoff = 1e5; +} // namespace internal // NegBinomial(n|mu, phi) [mu >= 0; phi > 0; n >= 0] template diff --git a/test/unit/math/prim/mat/prob/neg_binomial_2_test.cpp b/test/unit/math/prim/mat/prob/neg_binomial_2_test.cpp index 2d854325692..deabf8c9fae 100644 --- a/test/unit/math/prim/mat/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/prim/mat/prob/neg_binomial_2_test.cpp @@ -42,8 +42,8 @@ TEST(ProbDistributionsNegativeBinomial2, vectorAroundCutoff) { phi.push_back(1); phi.push_back(stan::math::internal::neg_binomial_2_phi_cutoff + 1); double vector_value = stan::math::neg_binomial_2_lpmf(y, mu, phi); - double scalar_value = stan::math::neg_binomial_2_lpmf(y, mu, phi[0]) + - stan::math::neg_binomial_2_lpmf(y, mu, phi[1]); - + double scalar_value = stan::math::neg_binomial_2_lpmf(y, mu, phi[0]) + + stan::math::neg_binomial_2_lpmf(y, mu, phi[1]); + EXPECT_FLOAT_EQ(vector_value, scalar_value); } \ No newline at end of file diff --git a/test/unit/math/prim/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/prim/scal/prob/neg_binomial_2_test.cpp index 20ebb48aa51..ddbf1dd0b0e 100644 --- a/test/unit/math/prim/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/prim/scal/prob/neg_binomial_2_test.cpp @@ -216,25 +216,25 @@ TEST(ProbDistributionsNegBinomial, extreme_values) { } TEST(ProbDistributionsNegativeBinomial2, poissonCutoff) { - std::array mu_to_test = {0.1, 13, 150, 1621, 18432 }; - std::array y_to_test = {0, 3, 16, 24, 181, 2132, 121358 }; + std::array mu_to_test = {0.1, 13, 150, 1621, 18432}; + std::array y_to_test = {0, 3, 16, 24, 181, 2132, 121358}; constexpr double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; - for(auto mu_iter = mu_to_test.begin(); - mu_iter != mu_to_test.end(); ++mu_iter) { - for(auto y_iter = y_to_test.begin(); - y_iter != y_to_test.end(); ++y_iter) { - unsigned int y = *y_iter; - double mu = *mu_iter; - - double before_cutoff = - stan::math::neg_binomial_2_lpmf(y, mu, phi_cutoff - 1e-8); - double after_cutoff = - stan::math::neg_binomial_2_lpmf(y, mu, phi_cutoff + 1e-8); - double diff_at_cutoff = before_cutoff - after_cutoff; - EXPECT_NEAR(diff_at_cutoff, 0, 1e-8) << - "neg_binomial_2_lpmf changes too much around phi cutoff for y = " << - y << ", mu = " << mu << " value at cutoff - 1e-8: " << - before_cutoff << ", value at cutoff + 1e-8: " << after_cutoff; + for (auto mu_iter = mu_to_test.begin(); mu_iter != mu_to_test.end(); + ++mu_iter) { + for (auto y_iter = y_to_test.begin(); y_iter != y_to_test.end(); ++y_iter) { + unsigned int y = *y_iter; + double mu = *mu_iter; + + double before_cutoff + = stan::math::neg_binomial_2_lpmf(y, mu, phi_cutoff - 1e-8); + double after_cutoff + = stan::math::neg_binomial_2_lpmf(y, mu, phi_cutoff + 1e-8); + double diff_at_cutoff = before_cutoff - after_cutoff; + EXPECT_NEAR(diff_at_cutoff, 0, 1e-8) + << "neg_binomial_2_lpmf changes too much around phi cutoff for y = " + << y << ", mu = " << mu + << " value at cutoff - 1e-8: " << before_cutoff + << ", value at cutoff + 1e-8: " << after_cutoff; } - } + } } diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index e168660f70f..00f26e74a65 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -38,9 +38,9 @@ TEST(ProbDistributionsNegBinomial, derivatives) { finite_diffs.push_back(dphi * inv2e); for (int i = 0; i < 2; ++i) { - EXPECT_NEAR(gradients[i], finite_diffs[i], 1.0) << - "for mu = " << mu_dbl << " +/- epsilon, phi = " << phi_dbl << - " +/- epsilon"; + EXPECT_NEAR(gradients[i], finite_diffs[i], 1.0) + << "for mu = " << mu_dbl << " +/- epsilon, phi = " << phi_dbl + << " +/- epsilon"; } phi_dbl *= 10; @@ -48,16 +48,16 @@ TEST(ProbDistributionsNegBinomial, derivatives) { } TEST(ProbDistributionsNegativeBinomial2, proptoAtPoissonCutoff) { + using stan::math::internal::neg_binomial_2_phi_cutoff; using stan::math::neg_binomial_2_lpmf; using stan::math::var; - using stan::math::internal::neg_binomial_2_phi_cutoff; var mu_var(10); int y = 11.8; var value_before_cutoff = neg_binomial_2_lpmf( - y, mu_var, neg_binomial_2_phi_cutoff - 1e-8); + y, mu_var, neg_binomial_2_phi_cutoff - 1e-8); var value_after_cutoff = neg_binomial_2_lpmf( - y, mu_var, neg_binomial_2_phi_cutoff + 1e-8); + y, mu_var, neg_binomial_2_phi_cutoff + 1e-8); - EXPECT_NEAR(value_of(value_before_cutoff), value_of(value_after_cutoff), 1); + EXPECT_NEAR(value_of(value_before_cutoff), value_of(value_after_cutoff), 1); } From 8bcd8b46f58e4160030c695aade4fa0930d55f39 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Tue, 10 Dec 2019 15:33:21 +0100 Subject: [PATCH 06/82] Using binomial_coefficient_log, better Poisson defer, further tests --- stan/math/prim/scal/fun/lgamma.hpp | 11 ++ .../prim/scal/prob/neg_binomial_2_lpmf.hpp | 94 +++++++---- .../prim/scal/prob/neg_binomial_2_test.cpp | 73 +++++---- .../rev/scal/prob/neg_binomial_2_test.cpp | 146 +++++++++++++++--- 4 files changed, 241 insertions(+), 83 deletions(-) diff --git a/stan/math/prim/scal/fun/lgamma.hpp b/stan/math/prim/scal/fun/lgamma.hpp index 43d74f1b684..6b5794855a5 100644 --- a/stan/math/prim/scal/fun/lgamma.hpp +++ b/stan/math/prim/scal/fun/lgamma.hpp @@ -89,6 +89,17 @@ inline double lgamma(int x) { #endif } +inline double lgamma(unsigned int x) { +#if !__MINGW32__ + int sign = 1; + return ::lgamma_r(x, &sign); +#else + if (unlikely(x == 0.0)) + return std::numeric_limits::infinity(); + return boost::math::lgamma(x, boost_policy_t()); +#endif +} + } // namespace math } // namespace stan #endif diff --git a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp index 72296f25f0f..cb4cd46520a 100644 --- a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -17,9 +18,11 @@ namespace stan { namespace math { namespace internal { -// Exposing to let me us this in tests -constexpr double neg_binomial_2_phi_cutoff = 1e5; -} // namespace internal + //Exposing to let me us this in tests + //The current tests fail when the cutoff is 1e8 and pass with 1e9, + //setting 1e10 to be safe + constexpr double neg_binomial_2_phi_cutoff = 1e10; +} // NegBinomial(n|mu, phi) [mu >= 0; phi > 0; n >= 0] template @@ -83,36 +86,61 @@ return_type_t neg_binomial_2_lpmf( } for (size_t i = 0; i < size; i++) { - // if phi is large we probably overflow, defer to Poisson: - if (phi__[i] > internal::neg_binomial_2_phi_cutoff) { - logp += poisson_lpmf(n_vec[i], mu__[i]); - continue; - } - - if (include_summand::value) { - logp -= lgamma(n_vec[i] + 1.0); - } - if (include_summand::value) { - logp += multiply_log(phi__[i], phi__[i]) - lgamma(phi__[i]); - } - if (include_summand::value) { - logp -= (n_plus_phi[i]) * log_mu_plus_phi[i]; - } - if (include_summand::value) { - logp += multiply_log(n_vec[i], mu__[i]); - } - if (include_summand::value) { - logp += lgamma(n_plus_phi[i]); - } - - if (!is_constant_all::value) { - ops_partials.edge1_.partials_[i] - += n_vec[i] / mu__[i] - (n_vec[i] + phi__[i]) / (mu__[i] + phi__[i]); - } - if (!is_constant_all::value) { - ops_partials.edge2_.partials_[i] - += 1.0 - n_plus_phi[i] / (mu__[i] + phi__[i]) + log_phi[i] - - log_mu_plus_phi[i] - digamma(phi__[i]) + digamma(n_plus_phi[i]); + if(phi__[i] > internal::neg_binomial_2_phi_cutoff) { + //Phi is large, deferring to Poisson. + //Copying the code here as just calling + //poisson_lpmf does not preserve propto logic correctly + if (include_summand::value) { + logp -= lgamma(n_vec[i] + 1.0); + } + if (include_summand::value) { + logp += multiply_log(n_vec[i], mu__[i]) - mu__[i]; + } + + // if (include_summand::value) { + // logp += (mu__[i] * (mu__[i] - 2 * n_vec[i]) + + // n_vec[i] * (n_vec[i] - 1)) / ( 2 * phi__[i] ); + // // logp += (mu__[i] * mu__[i] - n_vec[i] - + // // 2 * mu__[i] * n_vec[i] + n_vec[i] * n_vec[i])/phi + // } + + if (!is_constant_all::value) { + //This is the Taylor series of the full derivative for phi -> Inf + //Obtained in Mathematica via + //Series[n/mu - (n + phi)/(mu+phi),{phi,Infinity, 1}] + ops_partials.edge1_.partials_[i] + += n_vec[i] / mu__[i] + (mu__[i] - n_vec[i]) / phi__[i] - 1; + } + + //The derivative wrt. phi = 0 + O(1/neg_binomial_2_phi_cutoff^2) + //So ignoring here + //Obtained in Mathematica via + //Series[1 - (n + phi) / (mu + phi) + Log[phi] - Log[mu + phi] - + // PolyGamma[phi] + PolyGamma[n + phi],{phi,Infinity, 1}] + + } else { + if (include_summand::value) { + logp += binomial_coefficient_log(n_plus_phi[i] - 1, n_vec[i]); + } + if (include_summand::value) { + logp += multiply_log(phi__[i], phi__[i]); + } + if (include_summand::value) { + logp -= (n_plus_phi[i]) * log_mu_plus_phi[i]; + } + if (include_summand::value) { + logp += multiply_log(n_vec[i], mu__[i]); + } + + if (!is_constant_all::value) { + ops_partials.edge1_.partials_[i] + += n_vec[i] / mu__[i] - (n_vec[i] + phi__[i]) / (mu__[i] + phi__[i]); + } + if (!is_constant_all::value) { + ops_partials.edge2_.partials_[i] + += 1.0 - n_plus_phi[i] / (mu__[i] + phi__[i]) + log_phi[i] + - log_mu_plus_phi[i] - digamma(phi__[i]) + digamma(n_plus_phi[i]); + } } } return ops_partials.build(logp); diff --git a/test/unit/math/prim/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/prim/scal/prob/neg_binomial_2_test.cpp index ddbf1dd0b0e..63f9a4eaf34 100644 --- a/test/unit/math/prim/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/prim/scal/prob/neg_binomial_2_test.cpp @@ -205,36 +205,57 @@ TEST(ProbDistributionsNegBinomial, chiSquareGoodnessFitTest4) { } TEST(ProbDistributionsNegBinomial, extreme_values) { - int N = 100; - double mu = 8; - double phi = 1e12; - for (int n = 0; n < 10; ++n) { - phi *= 10; - double logp = stan::math::neg_binomial_2_log(N, mu, phi); - EXPECT_LT(logp, 0); + std::array n_to_test = {1, 5, 100, 12985, 1968422}; + std::array mu_to_test = {1e-5, 0.1, 8, 713, 28311, 19850054 }; + double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; + for(auto mu_iter = mu_to_test.begin(); + mu_iter != mu_to_test.end(); ++mu_iter) { + for(auto n_iter = n_to_test.begin(); + n_iter != n_to_test.end(); ++n_iter) { + double mu = *mu_iter; + unsigned int n = *n_iter; + //Test just before cutoff + double logp = stan::math::neg_binomial_2_log( + n, mu, phi_cutoff - 1e-8); + EXPECT_LT(logp, 0) << "n = " << n << ", mu = " << + mu << ", phi = " << (phi_cutoff - 1e-8); + + + //Test across a range of phi + double phi = 1e12; + for (int i = 0; i < 10; ++i) { + phi *= 10; + double logp = stan::math::neg_binomial_2_log(n, mu, phi); + EXPECT_LT(logp, 0) << "n = " << n << ", mu = " << + mu << ", phi = " << phi; + } + } } } TEST(ProbDistributionsNegativeBinomial2, poissonCutoff) { - std::array mu_to_test = {0.1, 13, 150, 1621, 18432}; - std::array y_to_test = {0, 3, 16, 24, 181, 2132, 121358}; - constexpr double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; - for (auto mu_iter = mu_to_test.begin(); mu_iter != mu_to_test.end(); - ++mu_iter) { - for (auto y_iter = y_to_test.begin(); y_iter != y_to_test.end(); ++y_iter) { - unsigned int y = *y_iter; - double mu = *mu_iter; - - double before_cutoff - = stan::math::neg_binomial_2_lpmf(y, mu, phi_cutoff - 1e-8); - double after_cutoff - = stan::math::neg_binomial_2_lpmf(y, mu, phi_cutoff + 1e-8); - double diff_at_cutoff = before_cutoff - after_cutoff; - EXPECT_NEAR(diff_at_cutoff, 0, 1e-8) - << "neg_binomial_2_lpmf changes too much around phi cutoff for y = " - << y << ", mu = " << mu - << " value at cutoff - 1e-8: " << before_cutoff - << ", value at cutoff + 1e-8: " << after_cutoff; + double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; + std::array mu_to_test = + {2.345e-5, 0.2, 13, 150, 1621, 18432, 73582345 }; + std::array n_to_test = + {0, 3, 16, 24, 181, 2132, 121358, 865422242 }; + for(auto mu_iter = mu_to_test.begin(); + mu_iter != mu_to_test.end(); ++mu_iter) { + double mu = *mu_iter; + for(auto n_iter = n_to_test.begin(); + n_iter != n_to_test.end(); ++n_iter) { + unsigned int n = *n_iter; + + double before_cutoff = + stan::math::neg_binomial_2_lpmf(n, mu, phi_cutoff - 1e-8); + double after_cutoff = + stan::math::neg_binomial_2_lpmf(n, mu, phi_cutoff + 1e-8); + double relative_error_at_cutoff = log(before_cutoff / after_cutoff); + EXPECT_NEAR(relative_error_at_cutoff, 0, 1e-8) << + "neg_binomial_2_lpmf changes too much around phi cutoff for n = " << + n << ", mu = " << mu << ", cutoff = " << phi_cutoff << + " value at cutoff - 1e-8: " << + before_cutoff << ", value at cutoff + 1e-8: " << after_cutoff; } } } diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index 00f26e74a65..a0964ba894a 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -2,19 +2,62 @@ #include #include -TEST(ProbDistributionsNegBinomial, derivatives) { +struct TestValue { + unsigned int n; + double mu; + double phi; + double value; + double grad_mu; + double grad_phi; + + TestValue(unsigned int _n, double _mu, double _phi, double _value, double _grad_mu, double _grad_phi) + : n(_n), mu(_mu), phi(_phi), value(_value), grad_mu(_grad_mu), grad_phi(_grad_phi) {} +}; + +//Test data generated in Mathematica (Wolfram Cloud) via +// nb2[n_,mu_,phi_]:= LogGamma[n + phi] - LogGamma[n + 1] - LogGamma[phi ]+ +// n * (Log[mu] - Log[mu + phi]) + phi * (Log[phi] - Log[mu + phi]) +// nb2dmu[n_,mu_,phi_]= D[nb2[n, mu, phi],mu]; +// nb2dphi[n_,mu_,phi_]= D[nb2[n, mu, phi],phi]; +// out = OpenWrite["nb_test.txt"] +// mus= {256*10^-7,314*10^-3,15*10^-1,3,180, 1123,10586}; +// phis= {4*10^-4,65*10^-3,442*10^-2,800, 15324}; +// ns = {0,6,14,1525,10233}; +// WriteString[out, "std::array testValues = {"]; +// Block[{$MaxPrecision = 80, $MinPrecision = 40}, { +// For[i = 1, i <= Length[mus], i++, { +// For[j = 1, j <= Length[phis], j++, { +// For[k = 1, k <= Length[ns], k++, { +// cmu = mus[[i]]; +// cphi = phis[[j]]; +// cn=ns[[k]]; +// val = N[nb2[cn,cmu,cphi]]; +// ddmu= N[nb2dmu[cn,cmu,cphi]]; +// ddphi= N[nb2dphi[cn,cmu,cphi]]; +// WriteString[out," TestValue(",CForm[cn],",",CForm[cmu],",", +// CForm[cphi],",", CForm[val],","CForm[ddmu],",",CForm[ddphi],"),"] +// }] +// }] +// }] +// }]; +// WriteString[out,"};"]; +// Close[out]; +// FilePrint[%] +std::array testValues = { TestValue(0,0.0000256,0.0004,-0.000024814156367780882, -0.9398496240601504,-0.0018850149796021398), TestValue(6,0.0000256,0.0004,-26.480362597222488, 220276.31578947368,-11595.463497838708), TestValue(14,0.0000256,0.0004,-49.814562438358635, 513979.32330827066,-30391.559221530802), TestValue(1525,0.0000256,0.0004,-4301.784727467015, 5.5987134868421055e7,-3.580668787634408e6), TestValue(10233,0.0000256,0.0004,-28781.07085289515, 3.7568285855263156e8,-2.4041193199521683e7), TestValue(0,0.0000256,0.065,-0.000025594960092480967, -0.9996063088998794,-7.751668684718993e-8), TestValue(6,0.0000256,0.065,-51.41938813644809, 234281.72904210034,-74.69380754597304), TestValue(14,0.0000256,0.065,-114.92817109028836, 546658.7005733127,-196.83239209326592), TestValue(1525,0.0000256,0.065,-11965.467128123484, 5.954685919853104e7,-23429.11268911477), TestValue(10233,0.0000256,0.065,-80237.4790550341, 3.995691927102557e8,-157343.697098361), TestValue(0,0.0000256,4.42,-0.000025599925864390194, -0.9999942081783417,-1.677258332222209e-11), TestValue(6,0.0000256,4.42,-67.52038137511191, 234372.6425475907,-0.4312559247584902), TestValue(14,0.0000256,4.42,-161.64931287705224, 546870.8326033225,-1.650128690902025), TestValue(1525,0.0000256,4.42,-18367.34289180058, 5.956996647937967e7,-339.0570825343945), TestValue(10233,0.0000256,4.42,-123371.16336416776, 3.997242463550437e8,-2307.279979293951), TestValue(0,0.0000256,800,-0.00002559999998652529, -0.999999968000001,-8.881784197001252e-16), TestValue(6,0.0000256,800,-69.9980790657431, 234373.99250003224,-0.000023330384471442756), TestValue(14,0.0000256,800,-173.09898662779824, 546873.9825000325,-0.00014060727924558591), TestValue(1525,0.0000256,800,-24826.22813563853, 5.957030959375009e7,-0.8389762876176414), TestValue(10233,0.0000256,800,-173733.65594636812, 3.997265487087504e8,-10.166635446653597), TestValue(0,0.0000256,15324,-0.000025599996959613236, -0.9999999983294179,0.), TestValue(6,0.0000256,15324,-70.01580732128963, 234373.99960845898,-6.386142814562845e-8), TestValue(14,0.0000256,15324,-173.20616504262574, 546873.9990864021,-3.872936886750722e-7), TestValue(1525,0.0000256,15324,-25707.717028801628, 5.957031140048291e7,-0.004643062913324059), TestValue(10233,0.0000256,15324,-189611.39394380094, 3.9972656083222395e8,-0.15627194690990365), TestValue(0,0.314,0.0004,-0.002666782716971683, -0.001272264631043257,-5.66822905706025), TestValue(6,0.314,0.0004,-9.625197494412376, 0.023038524497171847,2477.530549555817), TestValue(14,0.314,0.0004,-10.482321240387563, 0.05545291000145865,2452.982014445862), TestValue(1525,0.314,0.0004,-17.094738795518424, 6.1777199721236284,-2348.2711549792057), TestValue(10233,0.314,0.0004,-30.083534640958533, 41.460778593539814,-30043.568270589793), TestValue(0,0.314,0.065,-0.11460468078714132, -0.17150395778364116,-0.9346528929704305), TestValue(6,0.314,0.065,-5.6231627412658, 3.1056417323496293,0.8117566646875254), TestValue(14,0.314,0.065,-7.917539720426937, 7.4751693191939905,-19.40653851445296), TestValue(1525,0.314,0.065,-296.58556828610017, 832.7696922844226,-4001.4921811261693), TestValue(10233,0.314,0.065,-1936.716591758479, 5589.00047056451,-26975.841613138524), TestValue(0,0.314,4.42,-0.30334820230965986, -0.9336713138994508,-0.00230212890163628), TestValue(6,0.314,4.42,-11.748118636048988, 16.90718181793719,-0.3435269754367143), TestValue(14,0.314,4.42,-31.109603016060397, 40.69498599371937,-1.4423583039713965), TestValue(1525,0.314,4.42,-4115.10160678526, 4533.61649969458,-316.1764856190919), TestValue(10233,0.314,4.42,-27734.55588693275, 30426.641345033488,-2153.7342775414127), TestValue(0,0.314,800,-0.31393839362010567, -0.9996076539958066,-7.698783210940974e-8), TestValue(6,0.314,800,-13.827010724886122, 18.101175543376296,-0.000020465017271042996), TestValue(14,0.314,800,-41.61461010763844, 43.568886473205765,-0.00013381877200302483), TestValue(1525,0.314,800,-10469.94267675256, 4853.782788344746,-0.8382285160349765), TestValue(10233,0.314,800,-77398.83453431107, 32575.386135464123,-10.16161733713528), TestValue(0,0.314,15324,-0.31399678298770084, -0.9999795096863716,-2.099280749234822e-10), TestValue(6,0.314,15324,-13.842565956968983, 18.10790921043538,-5.6049177743489054e-8), TestValue(14,0.314,15324,-41.71664028188991, 43.58509417059771,-3.687852014877535e-7), TestValue(1525,0.314,15324,-11350.864477542971, 4855.588403521258,-0.004641024152967077), TestValue(10233,0.314,15324,-93272.76691554434, 32587.50423265796,-0.15625826529496223), TestValue(0,1.5,0.0004,-0.003291911100032755, -0.00026659557451346307,-7.230044345656401), TestValue(6,1.5,0.0004,-9.619783961619232, 0.0007997867235403892,2491.0537701151675), TestValue(14,1.5,0.0004,-10.468856159359483, 0.002221629787612192,2486.6186161358087), TestValue(1525,1.5,0.0004,-15.560537541616213, 0.270772238514174,1484.280307752038), TestValue(10233,1.5,0.0004,-19.785223133323598, 1.8184484137563317,-4317.601447204935), TestValue(0,1.5,0.065,-0.2067814991501101, -0.04153354632587859,-2.2227873794044952), TestValue(6,1.5,0.065,-4.841004539887443, 0.12460063897763578,11.520890928200775), TestValue(14,1.5,0.065,-5.969601492726813, 0.34611288604898827,7.298954082323366), TestValue(1525,1.5,0.065,-74.45092758687497, 42.184238551650694,-953.4745083343279), TestValue(10233,1.5,0.065,-445.630392408013, 283.3003194888179,-6515.787894589817), TestValue(0,1.5,4.42,-1.2915096474038796, -0.7466216216216216,-0.03881837442792935), TestValue(6,1.5,4.42,-4.694711300875651, 2.239864864864865,-0.12612961153608993), TestValue(14,1.5,4.42,-13.334103973863655, 6.221846846846847,-0.8864094608348823), TestValue(1525,1.5,4.42,-2072.1910365790172, 758.3186936936937,-251.67662613527665), TestValue(10233,1.5,4.42,-14020.648493631525, 5092.706081081081,-1720.7211329093311), TestValue(0,1.5,800,-1.4985955053447242, -0.9981285090455396,-1.7534272203079126e-6), TestValue(6,1.5,800,-5.63758835785638, 2.9943855271366187,-0.00001104786953298742), TestValue(14,1.5,800,-20.926415102269573, 8.317737575379496,-0.00010961017476240897), TestValue(1525,1.5,800,-8088.548799680884, 1013.7658556872531,-0.8354105724129193), TestValue(10233,1.5,800,-61412.52664040723, 6808.234560199626,-10.142698900729565), TestValue(0,1.5,15324,-1.499926590534038, -0.9999021239111285,-4.790177143831897e-9), TestValue(6,1.5,15324,-5.645995699555982, 2.9997063717333856,-3.032959305926397e-8), TestValue(14,1.5,15324,-21.010069937864472, 8.332517699259403,-3.0266583905813604e-7), TestValue(1525,1.5,15324,-8967.33164084002, 1015.5672571857361,-0.004633327525485953), TestValue(10233,1.5,15324,-77272.09898456372, 6820.332387197807,-0.15620659350885369), TestValue(0,3,0.0004,-0.003569116649587855, -0.0001333155579256099,-7.922924939527562), TestValue(6,3,0.0004,-9.619261327135609, 0.0001333155579256099,2492.360089770114), TestValue(14,3,0.0004,-10.467267071498288, 0.0004888237123939031,2490.5905361225123), TestValue(1525,3,0.0004,-15.357522072066786, 0.06763542638759276,1991.7174903993568), TestValue(10233,3,0.0004,-18.421373162287637, 0.4546060525263298,-908.6583034400528), TestValue(0,3,0.065,-0.25047201260085383, -0.021207177814029365,-2.874622756288704), TestValue(6,3,0.065,-4.758782442354863, 0.021207177814029365,12.74533572164111), TestValue(14,3,0.065,-5.719495913883133, 0.07775965198477433,11.025105769529759), TestValue(1525,3,0.065,-42.491829475397026, 10.75910821098423,-477.2384670870571), TestValue(10233,3,0.065,-230.9301248894044, 72.31647634584013,-3316.4438994781904), TestValue(0,3,4.42,-2.2897339760163957, -0.5956873315363881,-0.11372669262607049), TestValue(6,3,4.42,-2.889108195828742, 0.5956873315363881,0.003850246852058703), TestValue(14,3,4.42,-7.790064290604171, 2.18418688230009,-0.4832453669983474), TestValue(1525,3,4.42,-1360.5497881858591, 302.2120395327942,-199.67578957112616), TestValue(10233,3,4.42,-9239.719029853994, 2031.2938005390836,-1371.3592560596119), TestValue(0,3,800,-2.994389023067612, -0.9962640099626401,-6.996241475043519e-6), TestValue(6,3,800,-2.9857172436025223, 0.9962640099626401,-2.3069406651643476e-6), TestValue(14,3,800,-12.744324478713366, 3.65296803652968,-0.00008222425506509978), TestValue(1525,3,800,-7035.84649923785, 505.4379410543794,-0.8318616138503963), TestValue(10233,3,800,-54340.180404088605, 3397.2602739726026,-10.118854869649681), TestValue(0,3,15324,-2.999706381300726, -0.9998042669798395,-1.9158207464897714e-8), TestValue(6,3,15324,-2.9874796347589054, 0.9998042669798395,-6.3824572293924575e-9), TestValue(14,3,15324,-12.807159398982407, 3.665948978926078,-2.2763181739549054e-7), TestValue(1525,3,15324,-7911.931224008331, 507.2340314477719,-0.004623603455756964), TestValue(10233,3,15324,-70181.6251826905, 3409.332550401253,-0.15614126136305728), TestValue(0,180,0.0004,-0.0052068020335865025, -2.2222172839615914e-6,-12.01700730618354), TestValue(6,180,0.0004,-9.62011239916672, -2.148143374496205e-6,2490.2324075130828), TestValue(14,180,0.0004,-10.467069325725546, -2.04937816187569e-6,2491.084720678314), TestValue(1525,180,0.0004,-15.159228863591125, 0.000016604901371824113,2487.4167692289852), TestValue(10233,180,0.0004,-17.08144177432405, 0.00012411083530925487,2440.94300115826), TestValue(0,180,0.065,-0.5152345838836883, -0.00036098075694887956,-6.927046886659846), TestValue(6,180,0.065,-4.897099604874426, -0.0003489480650505836,10.617175935000475), TestValue(14,180,0.065,-5.689219198051667, -0.0003329044758528556,11.4626317745298), TestValue(1525,180,0.065,-10.618383986015033, 0.0026973284338680167,7.7929628140754765), TestValue(10233,180,0.065,-15.542242814932251, 0.020160775275594924,-38.6634853761835), TestValue(0,180,4.42,-16.491356225074536, -0.023967031775295522,-2.755043100796684), TestValue(6,180,4.42,-11.802883319144515, -0.023168130716119003,-1.8613752566654882), TestValue(14,180,4.42,-9.653376579596795, -0.022102929303883648,-1.313682997645138), TestValue(1525,180,4.42,-30.756932642065294, 0.1790869874320693,-5.0606677133089075), TestValue(10233,180,4.42,-235.49737914944126, 1.3385587246502548,-50.37753458197702), TestValue(0,180,800,-162.35267519735217, -0.8163265306122449,-0.01926737460893513), TestValue(6,180,800,-138.9731231908616, -0.7891156462585034,-0.017913154212997107), TestValue(14,180,800,-117.57055678993851, -0.7528344671201814,-0.016193696733894036), TestValue(1525,180,800,-1255.1060610431614, 6.099773242630386,-0.5081161722061651), TestValue(10233,180,800,-14640.50246307096, 45.59183673469388,-7.836489965276398), TestValue(0,180,15324,-178.95104102256036, -0.9883900928792569,-0.00006792118926490787), TestValue(6,180,15324,-154.44163935947577, -0.9554437564499484,-0.00006343927721985665), TestValue(14,180,15324,-131.5984192349756, -0.911515307877537,-0.000057701678183974536), TestValue(1525,180,15324,-1861.5172673616398, 7.38547041623667,-0.0035556000115217756), TestValue(10233,180,15324,-28577.644697168085, 55.2015866873065,-0.14858705144088802), TestValue(0,1123,0.0004,-0.005939122128713381, -3.5618865318302646e-7,-13.847805677972104), TestValue(6,1123,0.0004,-9.620833523075628, -3.5428559715533445e-7,2488.429599570756), TestValue(14,1123,0.0004,-10.467775521386166, -3.517481891184117e-7,2489.3192333086026), TestValue(1525,1123,0.0004,-15.157115486355906, 1.2750475385536657e-7,2492.70020501204), TestValue(10233,1123,0.0004,-17.063078998820856, 2.8894734020457448e-6,2486.849880233364), TestValue(0,1123,0.065,-0.6342170147837343, -0.000057877326779839104,-8.75724272015346), TestValue(6,1123,0.065,-5.014263034227778, -0.000057568097963562137,8.814958879676311), TestValue(14,1123,0.065,-5.803957292009425, -0.000057155792875192846,9.697719756764902), TestValue(1525,1123,0.065,-10.275036857130544, 0.000020718330690556827,13.074039765317043), TestValue(10233,1123,0.065,-12.558918107941281, 0.0004695124193805291,7.224124958319663), TestValue(0,1123,4.42,-24.493639593452325, -0.00392045555338738,-4.545467874886493), TestValue(6,1123,4.42,-19.68318216630322, -0.003899509219175159,-3.624587483847729), TestValue(14,1123,4.42,-17.37102939846337, -0.003871580773558864,-3.040611828950623), TestValue(1525,1123,4.42,-7.7548168672583415, 0.0014034043922188128,0.0654298516080507), TestValue(10233,1123,4.42,-35.45506157865748, 0.031803517445555686,-5.756960605210265), TestValue(0,1123,800,-701.6240143366822, -0.4160166406656266,-0.29304665858647905), TestValue(6,1123,800,-671.3041847506472, -0.4137939337698174,-0.28869011401594236), TestValue(14,1123,800,-640.6479149103316, -0.4108303245754051,-0.2829675576373729), TestValue(1525,1123,800,-30.39018204828426, 0.14892136201921807,-0.018804728472968435), TestValue(10233,1123,800,-3343.1303902972795, 3.3748099701370067,-2.9898053694742615), TestValue(0,1123,15324,-1083.757151397245, -0.9317200705295798,-0.002442933450309326), TestValue(6,1123,15324,-1048.6172073187354, -0.9267420470004815,-0.002416262805940761), TestValue(14,1123,15324,-1011.5999306403351, -0.920104682295017,-0.00238094023047708), TestValue(1525,1123,15324,-64.3938471491183, 0.33352757644959136,-0.00029097614079454104), TestValue(10233,1123,15324,-11352.060718035325, 7.558299058347705,-0.11311918072723515), TestValue(0,10586,0.0004,-0.006836533480423993, -3.778575334268833e-8,-16.091333738845734), TestValue(6,10586,0.0004,-9.621729024009568, -3.776433689454398e-8,2486.19084755338), TestValue(14,10586,0.0004,-10.468668475096411, -3.7735781630351504e-8,2487.0868493492235), TestValue(1525,10586,0.0004,-15.157527333190956, -3.234240610599839e-8,2491.6705880068075), TestValue(10233,10586,0.0004,-17.060718192660715, -1.2600010324928188e-9,2492.7518943576556), TestValue(0,10586,0.065,-0.7800430171085975, -6.1401474485561915e-6,-11.00066794181818), TestValue(6,10586,0.065,-5.159778603540011, -6.1366672969700086e-6,6.57630939764217), TestValue(14,10586,0.065,-5.949058950638154, -6.132027094855097e-6,7.465437927571536), TestValue(1525,10586,0.065,-10.34196113541293, -5.255608920401252e-6,12.044448366424728), TestValue(10233,10586,0.065,-12.175300607224926, -2.047489183204549e-7,13.125723676609066), TestValue(0,10586,4.42,-34.3945190758502, -0.0004173583295091224,-6.781982760105572), TestValue(6,10586,4.42,-29.562997357281894, -0.00041712177651676886,-5.856347033468785), TestValue(14,10586,4.42,-27.2227588675498, -0.0004168063725269641,-5.266030931107645), TestValue(1525,10586,4.42,-12.301855613945008, -0.0003572344439525938,-0.9624372357797295), TestValue(10233,10586,4.42,-9.430792045634007, -0.00001391720105013416,0.11674937200192481), TestValue(0,10586,800,-2124.4224654744803, -0.07026172492534692,-1.7257898067684474), TestValue(6,10586,800,-2091.312452085902, -0.07022190154073024,-1.7188401003298583), TestValue(14,10586,800,-2056.9359371755286, -0.07016880369457469,-1.7096599947938858), TestValue(1525,10586,800,-744.0169167062886, -0.060139948001942986,-0.7924525685250288), TestValue(10233,10586,800,-7.2703661972227565, -0.0023429424616141564,0.00008904830662359586), TestValue(0,10586,15324,-8048.29915678056, -0.5914318795831726,-0.11664064731878732), TestValue(6,10586,15324,-8002.424955944863, -0.5910966640836922,-0.11648073932479441), TestValue(14,10586,15324,-7951.095336923546, -0.590649710084385,-0.11626776694982688), TestValue(1525,10586,15324,-4300.645593413912, -0.506231273465249,-0.08062419697917278), TestValue(10233,10586,15324,-9.327824035135563, -0.019721845219427537,-0.00008059480749977865)}; + +TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { using stan::math::is_nan; using stan::math::neg_binomial_2_log; using stan::math::var; + using stan::math::value_of; - int N = 100; - double mu_dbl = 8; - double phi_dbl = 1.5; - - for (int k = 0; k < 20; ++k) { - var mu(mu_dbl); - var phi(phi_dbl); - var val = neg_binomial_2_log(N, mu, phi); + for(auto iter = testValues.begin(); iter != testValues.end(); ++iter) { + TestValue t = *iter; + unsigned int n = t.n; + var mu(t.mu); + var phi(t.phi); + var val = neg_binomial_2_log(n, mu, phi); std::vector x; x.push_back(mu); @@ -27,23 +70,75 @@ TEST(ProbDistributionsNegBinomial, derivatives) { EXPECT_FALSE(is_nan(gradients[i])); } - std::vector finite_diffs; - double eps = 1e-10; - double inv2e = 0.5 / eps; - double dmu = neg_binomial_2_log(N, mu_dbl + eps, phi_dbl) - - neg_binomial_2_log(N, mu_dbl - eps, phi_dbl); - double dphi = neg_binomial_2_log(N, mu_dbl, phi_dbl + eps) - - neg_binomial_2_log(N, mu_dbl, phi_dbl - eps); - finite_diffs.push_back(dmu * inv2e); - finite_diffs.push_back(dphi * inv2e); + EXPECT_NEAR(value_of(val), t.value, fabs(t.value * 1e-8)) << + "value n = " << n << ", mu = " << t.mu << ", phi = " << t.phi; + EXPECT_NEAR(gradients[0], t.grad_mu, fabs(t.grad_mu * 1e-8)) << + "grad_mu n = " << n << ", mu = " << t.mu << ", phi = " << t.phi; + EXPECT_NEAR(gradients[1], t.grad_phi, fabs(t.grad_phi * 1e-8)) << + "grad_phi n = " << n << ", mu = " << t.mu << ", phi = " << t.phi; + + } +} - for (int i = 0; i < 2; ++i) { - EXPECT_NEAR(gradients[i], finite_diffs[i], 1.0) - << "for mu = " << mu_dbl << " +/- epsilon, phi = " << phi_dbl - << " +/- epsilon"; - } - phi_dbl *= 10; +TEST(ProbDistributionsNegBinomial, derivativesFiniteDiffs) { + using stan::math::is_nan; + using stan::math::neg_binomial_2_log; + using stan::math::var; + + //The range of values tested has to be quite conservative to let the test + //pass + std::array n_to_test = {100}; + std::array mu_to_test = {8}; + // std::array n_to_test = {7, 100, 835}; + // std::array mu_to_test = {8, 24}; + // std::array n_to_test = {0, 7, 100, 835}; + // std::array mu_to_test = {0.8, 8, 24, 271}; + double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; + for(auto mu_iter = mu_to_test.begin(); + mu_iter != mu_to_test.end(); ++mu_iter) { + for(auto n_iter = n_to_test.begin(); + n_iter != n_to_test.end(); ++n_iter) { + double mu_dbl = *mu_iter; + unsigned int n = *n_iter; + double phi_dbl = 1.5; + + for (int k = 0; k < 20; ++k) { + var mu(mu_dbl); + var phi(phi_dbl); + var val = neg_binomial_2_log(n, mu, phi); + + std::vector x; + x.push_back(mu); + x.push_back(phi); + + std::vector gradients; + val.grad(x, gradients); + + for (int i = 0; i < 2; ++i) { + EXPECT_FALSE(is_nan(gradients[i])); + } + + std::vector finite_diffs; + double eps = 1e-10; + double inv2e = 0.5 / eps; + double dmu = neg_binomial_2_log(n, mu_dbl + eps, phi_dbl) + - neg_binomial_2_log(n, mu_dbl - eps, phi_dbl); + double dphi = neg_binomial_2_log(n, mu_dbl, phi_dbl + eps) + - neg_binomial_2_log(n, mu_dbl, phi_dbl - eps); + finite_diffs.push_back(dmu * inv2e); + finite_diffs.push_back(dphi * inv2e); + + for (int i = 0; i < 2; ++i) { + EXPECT_NEAR(gradients[i], finite_diffs[i], + std::max(1.0, gradients[i] * 1e-4)) << + "for i = " << i << ", n = " << n << ", mu = " << mu_dbl << + " +/- epsilon, phi = " << phi_dbl << " +/- epsilon"; + } + + phi_dbl *= 10; + } + } } } @@ -61,3 +156,6 @@ TEST(ProbDistributionsNegativeBinomial2, proptoAtPoissonCutoff) { EXPECT_NEAR(value_of(value_before_cutoff), value_of(value_after_cutoff), 1); } + + +//TODO test continuity of derivatives at cutoff \ No newline at end of file From c96d9d81bac54dc4fd8b936b60e987b7464c885c Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Tue, 10 Dec 2019 09:34:08 -0500 Subject: [PATCH 07/82] [Jenkins] auto-formatting by clang-format version 5.0.2-svn328729-1~exp1~20180509124008.99 (branches/release_50) --- .../prim/scal/prob/neg_binomial_2_lpmf.hpp | 48 +- .../prim/scal/prob/neg_binomial_2_test.cpp | 59 ++- .../rev/scal/prob/neg_binomial_2_test.cpp | 412 ++++++++++++++++-- 3 files changed, 435 insertions(+), 84 deletions(-) diff --git a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp index cb4cd46520a..96b17de1589 100644 --- a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp @@ -18,11 +18,11 @@ namespace stan { namespace math { namespace internal { - //Exposing to let me us this in tests - //The current tests fail when the cutoff is 1e8 and pass with 1e9, - //setting 1e10 to be safe - constexpr double neg_binomial_2_phi_cutoff = 1e10; -} +// Exposing to let me us this in tests +// The current tests fail when the cutoff is 1e8 and pass with 1e9, +// setting 1e10 to be safe +constexpr double neg_binomial_2_phi_cutoff = 1e10; +} // namespace internal // NegBinomial(n|mu, phi) [mu >= 0; phi > 0; n >= 0] template @@ -86,10 +86,10 @@ return_type_t neg_binomial_2_lpmf( } for (size_t i = 0; i < size; i++) { - if(phi__[i] > internal::neg_binomial_2_phi_cutoff) { - //Phi is large, deferring to Poisson. - //Copying the code here as just calling - //poisson_lpmf does not preserve propto logic correctly + if (phi__[i] > internal::neg_binomial_2_phi_cutoff) { + // Phi is large, deferring to Poisson. + // Copying the code here as just calling + // poisson_lpmf does not preserve propto logic correctly if (include_summand::value) { logp -= lgamma(n_vec[i] + 1.0); } @@ -99,23 +99,23 @@ return_type_t neg_binomial_2_lpmf( // if (include_summand::value) { // logp += (mu__[i] * (mu__[i] - 2 * n_vec[i]) + - // n_vec[i] * (n_vec[i] - 1)) / ( 2 * phi__[i] ); - // // logp += (mu__[i] * mu__[i] - n_vec[i] - + // n_vec[i] * (n_vec[i] - 1)) / ( 2 * phi__[i] ); + // // logp += (mu__[i] * mu__[i] - n_vec[i] - // // 2 * mu__[i] * n_vec[i] + n_vec[i] * n_vec[i])/phi // } if (!is_constant_all::value) { - //This is the Taylor series of the full derivative for phi -> Inf - //Obtained in Mathematica via - //Series[n/mu - (n + phi)/(mu+phi),{phi,Infinity, 1}] + // This is the Taylor series of the full derivative for phi -> Inf + // Obtained in Mathematica via + // Series[n/mu - (n + phi)/(mu+phi),{phi,Infinity, 1}] ops_partials.edge1_.partials_[i] - += n_vec[i] / mu__[i] + (mu__[i] - n_vec[i]) / phi__[i] - 1; + += n_vec[i] / mu__[i] + (mu__[i] - n_vec[i]) / phi__[i] - 1; } - - //The derivative wrt. phi = 0 + O(1/neg_binomial_2_phi_cutoff^2) - //So ignoring here - //Obtained in Mathematica via - //Series[1 - (n + phi) / (mu + phi) + Log[phi] - Log[mu + phi] - + + // The derivative wrt. phi = 0 + O(1/neg_binomial_2_phi_cutoff^2) + // So ignoring here + // Obtained in Mathematica via + // Series[1 - (n + phi) / (mu + phi) + Log[phi] - Log[mu + phi] - // PolyGamma[phi] + PolyGamma[n + phi],{phi,Infinity, 1}] } else { @@ -134,13 +134,15 @@ return_type_t neg_binomial_2_lpmf( if (!is_constant_all::value) { ops_partials.edge1_.partials_[i] - += n_vec[i] / mu__[i] - (n_vec[i] + phi__[i]) / (mu__[i] + phi__[i]); + += n_vec[i] / mu__[i] + - (n_vec[i] + phi__[i]) / (mu__[i] + phi__[i]); } if (!is_constant_all::value) { ops_partials.edge2_.partials_[i] += 1.0 - n_plus_phi[i] / (mu__[i] + phi__[i]) + log_phi[i] - - log_mu_plus_phi[i] - digamma(phi__[i]) + digamma(n_plus_phi[i]); - } + - log_mu_plus_phi[i] - digamma(phi__[i]) + + digamma(n_plus_phi[i]); + } } } return ops_partials.build(logp); diff --git a/test/unit/math/prim/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/prim/scal/prob/neg_binomial_2_test.cpp index 63f9a4eaf34..56572e2d91f 100644 --- a/test/unit/math/prim/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/prim/scal/prob/neg_binomial_2_test.cpp @@ -206,28 +206,26 @@ TEST(ProbDistributionsNegBinomial, chiSquareGoodnessFitTest4) { TEST(ProbDistributionsNegBinomial, extreme_values) { std::array n_to_test = {1, 5, 100, 12985, 1968422}; - std::array mu_to_test = {1e-5, 0.1, 8, 713, 28311, 19850054 }; + std::array mu_to_test = {1e-5, 0.1, 8, 713, 28311, 19850054}; double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; - for(auto mu_iter = mu_to_test.begin(); - mu_iter != mu_to_test.end(); ++mu_iter) { - for(auto n_iter = n_to_test.begin(); - n_iter != n_to_test.end(); ++n_iter) { + for (auto mu_iter = mu_to_test.begin(); mu_iter != mu_to_test.end(); + ++mu_iter) { + for (auto n_iter = n_to_test.begin(); n_iter != n_to_test.end(); ++n_iter) { double mu = *mu_iter; unsigned int n = *n_iter; - //Test just before cutoff - double logp = stan::math::neg_binomial_2_log( - n, mu, phi_cutoff - 1e-8); - EXPECT_LT(logp, 0) << "n = " << n << ", mu = " << - mu << ", phi = " << (phi_cutoff - 1e-8); + // Test just before cutoff + double logp + = stan::math::neg_binomial_2_log(n, mu, phi_cutoff - 1e-8); + EXPECT_LT(logp, 0) << "n = " << n << ", mu = " << mu + << ", phi = " << (phi_cutoff - 1e-8); - - //Test across a range of phi + // Test across a range of phi double phi = 1e12; for (int i = 0; i < 10; ++i) { phi *= 10; double logp = stan::math::neg_binomial_2_log(n, mu, phi); - EXPECT_LT(logp, 0) << "n = " << n << ", mu = " << - mu << ", phi = " << phi; + EXPECT_LT(logp, 0) << "n = " << n << ", mu = " << mu + << ", phi = " << phi; } } } @@ -235,27 +233,26 @@ TEST(ProbDistributionsNegBinomial, extreme_values) { TEST(ProbDistributionsNegativeBinomial2, poissonCutoff) { double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; - std::array mu_to_test = - {2.345e-5, 0.2, 13, 150, 1621, 18432, 73582345 }; - std::array n_to_test = - {0, 3, 16, 24, 181, 2132, 121358, 865422242 }; - for(auto mu_iter = mu_to_test.begin(); - mu_iter != mu_to_test.end(); ++mu_iter) { + std::array mu_to_test + = {2.345e-5, 0.2, 13, 150, 1621, 18432, 73582345}; + std::array n_to_test + = {0, 3, 16, 24, 181, 2132, 121358, 865422242}; + for (auto mu_iter = mu_to_test.begin(); mu_iter != mu_to_test.end(); + ++mu_iter) { double mu = *mu_iter; - for(auto n_iter = n_to_test.begin(); - n_iter != n_to_test.end(); ++n_iter) { + for (auto n_iter = n_to_test.begin(); n_iter != n_to_test.end(); ++n_iter) { unsigned int n = *n_iter; - double before_cutoff = - stan::math::neg_binomial_2_lpmf(n, mu, phi_cutoff - 1e-8); - double after_cutoff = - stan::math::neg_binomial_2_lpmf(n, mu, phi_cutoff + 1e-8); + double before_cutoff + = stan::math::neg_binomial_2_lpmf(n, mu, phi_cutoff - 1e-8); + double after_cutoff + = stan::math::neg_binomial_2_lpmf(n, mu, phi_cutoff + 1e-8); double relative_error_at_cutoff = log(before_cutoff / after_cutoff); - EXPECT_NEAR(relative_error_at_cutoff, 0, 1e-8) << - "neg_binomial_2_lpmf changes too much around phi cutoff for n = " << - n << ", mu = " << mu << ", cutoff = " << phi_cutoff << - " value at cutoff - 1e-8: " << - before_cutoff << ", value at cutoff + 1e-8: " << after_cutoff; + EXPECT_NEAR(relative_error_at_cutoff, 0, 1e-8) + << "neg_binomial_2_lpmf changes too much around phi cutoff for n = " + << n << ", mu = " << mu << ", cutoff = " << phi_cutoff + << " value at cutoff - 1e-8: " << before_cutoff + << ", value at cutoff + 1e-8: " << after_cutoff; } } } diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index a0964ba894a..841ffe2679b 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -10,12 +10,18 @@ struct TestValue { double grad_mu; double grad_phi; - TestValue(unsigned int _n, double _mu, double _phi, double _value, double _grad_mu, double _grad_phi) - : n(_n), mu(_mu), phi(_phi), value(_value), grad_mu(_grad_mu), grad_phi(_grad_phi) {} + TestValue(unsigned int _n, double _mu, double _phi, double _value, + double _grad_mu, double _grad_phi) + : n(_n), + mu(_mu), + phi(_phi), + value(_value), + grad_mu(_grad_mu), + grad_phi(_grad_phi) {} }; -//Test data generated in Mathematica (Wolfram Cloud) via -// nb2[n_,mu_,phi_]:= LogGamma[n + phi] - LogGamma[n + 1] - LogGamma[phi ]+ +// Test data generated in Mathematica (Wolfram Cloud) via +// nb2[n_,mu_,phi_]:= LogGamma[n + phi] - LogGamma[n + 1] - LogGamma[phi ]+ // n * (Log[mu] - Log[mu + phi]) + phi * (Log[phi] - Log[mu + phi]) // nb2dmu[n_,mu_,phi_]= D[nb2[n, mu, phi],mu]; // nb2dphi[n_,mu_,phi_]= D[nb2[n, mu, phi],phi]; @@ -23,7 +29,7 @@ struct TestValue { // mus= {256*10^-7,314*10^-3,15*10^-1,3,180, 1123,10586}; // phis= {4*10^-4,65*10^-3,442*10^-2,800, 15324}; // ns = {0,6,14,1525,10233}; -// WriteString[out, "std::array testValues = {"]; // Block[{$MaxPrecision = 80, $MinPrecision = 40}, { // For[i = 1, i <= Length[mus], i++, { @@ -44,16 +50,366 @@ struct TestValue { // WriteString[out,"};"]; // Close[out]; // FilePrint[%] -std::array testValues = { TestValue(0,0.0000256,0.0004,-0.000024814156367780882, -0.9398496240601504,-0.0018850149796021398), TestValue(6,0.0000256,0.0004,-26.480362597222488, 220276.31578947368,-11595.463497838708), TestValue(14,0.0000256,0.0004,-49.814562438358635, 513979.32330827066,-30391.559221530802), TestValue(1525,0.0000256,0.0004,-4301.784727467015, 5.5987134868421055e7,-3.580668787634408e6), TestValue(10233,0.0000256,0.0004,-28781.07085289515, 3.7568285855263156e8,-2.4041193199521683e7), TestValue(0,0.0000256,0.065,-0.000025594960092480967, -0.9996063088998794,-7.751668684718993e-8), TestValue(6,0.0000256,0.065,-51.41938813644809, 234281.72904210034,-74.69380754597304), TestValue(14,0.0000256,0.065,-114.92817109028836, 546658.7005733127,-196.83239209326592), TestValue(1525,0.0000256,0.065,-11965.467128123484, 5.954685919853104e7,-23429.11268911477), TestValue(10233,0.0000256,0.065,-80237.4790550341, 3.995691927102557e8,-157343.697098361), TestValue(0,0.0000256,4.42,-0.000025599925864390194, -0.9999942081783417,-1.677258332222209e-11), TestValue(6,0.0000256,4.42,-67.52038137511191, 234372.6425475907,-0.4312559247584902), TestValue(14,0.0000256,4.42,-161.64931287705224, 546870.8326033225,-1.650128690902025), TestValue(1525,0.0000256,4.42,-18367.34289180058, 5.956996647937967e7,-339.0570825343945), TestValue(10233,0.0000256,4.42,-123371.16336416776, 3.997242463550437e8,-2307.279979293951), TestValue(0,0.0000256,800,-0.00002559999998652529, -0.999999968000001,-8.881784197001252e-16), TestValue(6,0.0000256,800,-69.9980790657431, 234373.99250003224,-0.000023330384471442756), TestValue(14,0.0000256,800,-173.09898662779824, 546873.9825000325,-0.00014060727924558591), TestValue(1525,0.0000256,800,-24826.22813563853, 5.957030959375009e7,-0.8389762876176414), TestValue(10233,0.0000256,800,-173733.65594636812, 3.997265487087504e8,-10.166635446653597), TestValue(0,0.0000256,15324,-0.000025599996959613236, -0.9999999983294179,0.), TestValue(6,0.0000256,15324,-70.01580732128963, 234373.99960845898,-6.386142814562845e-8), TestValue(14,0.0000256,15324,-173.20616504262574, 546873.9990864021,-3.872936886750722e-7), TestValue(1525,0.0000256,15324,-25707.717028801628, 5.957031140048291e7,-0.004643062913324059), TestValue(10233,0.0000256,15324,-189611.39394380094, 3.9972656083222395e8,-0.15627194690990365), TestValue(0,0.314,0.0004,-0.002666782716971683, -0.001272264631043257,-5.66822905706025), TestValue(6,0.314,0.0004,-9.625197494412376, 0.023038524497171847,2477.530549555817), TestValue(14,0.314,0.0004,-10.482321240387563, 0.05545291000145865,2452.982014445862), TestValue(1525,0.314,0.0004,-17.094738795518424, 6.1777199721236284,-2348.2711549792057), TestValue(10233,0.314,0.0004,-30.083534640958533, 41.460778593539814,-30043.568270589793), TestValue(0,0.314,0.065,-0.11460468078714132, -0.17150395778364116,-0.9346528929704305), TestValue(6,0.314,0.065,-5.6231627412658, 3.1056417323496293,0.8117566646875254), TestValue(14,0.314,0.065,-7.917539720426937, 7.4751693191939905,-19.40653851445296), TestValue(1525,0.314,0.065,-296.58556828610017, 832.7696922844226,-4001.4921811261693), TestValue(10233,0.314,0.065,-1936.716591758479, 5589.00047056451,-26975.841613138524), TestValue(0,0.314,4.42,-0.30334820230965986, -0.9336713138994508,-0.00230212890163628), TestValue(6,0.314,4.42,-11.748118636048988, 16.90718181793719,-0.3435269754367143), TestValue(14,0.314,4.42,-31.109603016060397, 40.69498599371937,-1.4423583039713965), TestValue(1525,0.314,4.42,-4115.10160678526, 4533.61649969458,-316.1764856190919), TestValue(10233,0.314,4.42,-27734.55588693275, 30426.641345033488,-2153.7342775414127), TestValue(0,0.314,800,-0.31393839362010567, -0.9996076539958066,-7.698783210940974e-8), TestValue(6,0.314,800,-13.827010724886122, 18.101175543376296,-0.000020465017271042996), TestValue(14,0.314,800,-41.61461010763844, 43.568886473205765,-0.00013381877200302483), TestValue(1525,0.314,800,-10469.94267675256, 4853.782788344746,-0.8382285160349765), TestValue(10233,0.314,800,-77398.83453431107, 32575.386135464123,-10.16161733713528), TestValue(0,0.314,15324,-0.31399678298770084, -0.9999795096863716,-2.099280749234822e-10), TestValue(6,0.314,15324,-13.842565956968983, 18.10790921043538,-5.6049177743489054e-8), TestValue(14,0.314,15324,-41.71664028188991, 43.58509417059771,-3.687852014877535e-7), TestValue(1525,0.314,15324,-11350.864477542971, 4855.588403521258,-0.004641024152967077), TestValue(10233,0.314,15324,-93272.76691554434, 32587.50423265796,-0.15625826529496223), TestValue(0,1.5,0.0004,-0.003291911100032755, -0.00026659557451346307,-7.230044345656401), TestValue(6,1.5,0.0004,-9.619783961619232, 0.0007997867235403892,2491.0537701151675), TestValue(14,1.5,0.0004,-10.468856159359483, 0.002221629787612192,2486.6186161358087), TestValue(1525,1.5,0.0004,-15.560537541616213, 0.270772238514174,1484.280307752038), TestValue(10233,1.5,0.0004,-19.785223133323598, 1.8184484137563317,-4317.601447204935), TestValue(0,1.5,0.065,-0.2067814991501101, -0.04153354632587859,-2.2227873794044952), TestValue(6,1.5,0.065,-4.841004539887443, 0.12460063897763578,11.520890928200775), TestValue(14,1.5,0.065,-5.969601492726813, 0.34611288604898827,7.298954082323366), TestValue(1525,1.5,0.065,-74.45092758687497, 42.184238551650694,-953.4745083343279), TestValue(10233,1.5,0.065,-445.630392408013, 283.3003194888179,-6515.787894589817), TestValue(0,1.5,4.42,-1.2915096474038796, -0.7466216216216216,-0.03881837442792935), TestValue(6,1.5,4.42,-4.694711300875651, 2.239864864864865,-0.12612961153608993), TestValue(14,1.5,4.42,-13.334103973863655, 6.221846846846847,-0.8864094608348823), TestValue(1525,1.5,4.42,-2072.1910365790172, 758.3186936936937,-251.67662613527665), TestValue(10233,1.5,4.42,-14020.648493631525, 5092.706081081081,-1720.7211329093311), TestValue(0,1.5,800,-1.4985955053447242, -0.9981285090455396,-1.7534272203079126e-6), TestValue(6,1.5,800,-5.63758835785638, 2.9943855271366187,-0.00001104786953298742), TestValue(14,1.5,800,-20.926415102269573, 8.317737575379496,-0.00010961017476240897), TestValue(1525,1.5,800,-8088.548799680884, 1013.7658556872531,-0.8354105724129193), TestValue(10233,1.5,800,-61412.52664040723, 6808.234560199626,-10.142698900729565), TestValue(0,1.5,15324,-1.499926590534038, -0.9999021239111285,-4.790177143831897e-9), TestValue(6,1.5,15324,-5.645995699555982, 2.9997063717333856,-3.032959305926397e-8), TestValue(14,1.5,15324,-21.010069937864472, 8.332517699259403,-3.0266583905813604e-7), TestValue(1525,1.5,15324,-8967.33164084002, 1015.5672571857361,-0.004633327525485953), TestValue(10233,1.5,15324,-77272.09898456372, 6820.332387197807,-0.15620659350885369), TestValue(0,3,0.0004,-0.003569116649587855, -0.0001333155579256099,-7.922924939527562), TestValue(6,3,0.0004,-9.619261327135609, 0.0001333155579256099,2492.360089770114), TestValue(14,3,0.0004,-10.467267071498288, 0.0004888237123939031,2490.5905361225123), TestValue(1525,3,0.0004,-15.357522072066786, 0.06763542638759276,1991.7174903993568), TestValue(10233,3,0.0004,-18.421373162287637, 0.4546060525263298,-908.6583034400528), TestValue(0,3,0.065,-0.25047201260085383, -0.021207177814029365,-2.874622756288704), TestValue(6,3,0.065,-4.758782442354863, 0.021207177814029365,12.74533572164111), TestValue(14,3,0.065,-5.719495913883133, 0.07775965198477433,11.025105769529759), TestValue(1525,3,0.065,-42.491829475397026, 10.75910821098423,-477.2384670870571), TestValue(10233,3,0.065,-230.9301248894044, 72.31647634584013,-3316.4438994781904), TestValue(0,3,4.42,-2.2897339760163957, -0.5956873315363881,-0.11372669262607049), TestValue(6,3,4.42,-2.889108195828742, 0.5956873315363881,0.003850246852058703), TestValue(14,3,4.42,-7.790064290604171, 2.18418688230009,-0.4832453669983474), TestValue(1525,3,4.42,-1360.5497881858591, 302.2120395327942,-199.67578957112616), TestValue(10233,3,4.42,-9239.719029853994, 2031.2938005390836,-1371.3592560596119), TestValue(0,3,800,-2.994389023067612, -0.9962640099626401,-6.996241475043519e-6), TestValue(6,3,800,-2.9857172436025223, 0.9962640099626401,-2.3069406651643476e-6), TestValue(14,3,800,-12.744324478713366, 3.65296803652968,-0.00008222425506509978), TestValue(1525,3,800,-7035.84649923785, 505.4379410543794,-0.8318616138503963), TestValue(10233,3,800,-54340.180404088605, 3397.2602739726026,-10.118854869649681), TestValue(0,3,15324,-2.999706381300726, -0.9998042669798395,-1.9158207464897714e-8), TestValue(6,3,15324,-2.9874796347589054, 0.9998042669798395,-6.3824572293924575e-9), TestValue(14,3,15324,-12.807159398982407, 3.665948978926078,-2.2763181739549054e-7), TestValue(1525,3,15324,-7911.931224008331, 507.2340314477719,-0.004623603455756964), TestValue(10233,3,15324,-70181.6251826905, 3409.332550401253,-0.15614126136305728), TestValue(0,180,0.0004,-0.0052068020335865025, -2.2222172839615914e-6,-12.01700730618354), TestValue(6,180,0.0004,-9.62011239916672, -2.148143374496205e-6,2490.2324075130828), TestValue(14,180,0.0004,-10.467069325725546, -2.04937816187569e-6,2491.084720678314), TestValue(1525,180,0.0004,-15.159228863591125, 0.000016604901371824113,2487.4167692289852), TestValue(10233,180,0.0004,-17.08144177432405, 0.00012411083530925487,2440.94300115826), TestValue(0,180,0.065,-0.5152345838836883, -0.00036098075694887956,-6.927046886659846), TestValue(6,180,0.065,-4.897099604874426, -0.0003489480650505836,10.617175935000475), TestValue(14,180,0.065,-5.689219198051667, -0.0003329044758528556,11.4626317745298), TestValue(1525,180,0.065,-10.618383986015033, 0.0026973284338680167,7.7929628140754765), TestValue(10233,180,0.065,-15.542242814932251, 0.020160775275594924,-38.6634853761835), TestValue(0,180,4.42,-16.491356225074536, -0.023967031775295522,-2.755043100796684), TestValue(6,180,4.42,-11.802883319144515, -0.023168130716119003,-1.8613752566654882), TestValue(14,180,4.42,-9.653376579596795, -0.022102929303883648,-1.313682997645138), TestValue(1525,180,4.42,-30.756932642065294, 0.1790869874320693,-5.0606677133089075), TestValue(10233,180,4.42,-235.49737914944126, 1.3385587246502548,-50.37753458197702), TestValue(0,180,800,-162.35267519735217, -0.8163265306122449,-0.01926737460893513), TestValue(6,180,800,-138.9731231908616, -0.7891156462585034,-0.017913154212997107), TestValue(14,180,800,-117.57055678993851, -0.7528344671201814,-0.016193696733894036), TestValue(1525,180,800,-1255.1060610431614, 6.099773242630386,-0.5081161722061651), TestValue(10233,180,800,-14640.50246307096, 45.59183673469388,-7.836489965276398), TestValue(0,180,15324,-178.95104102256036, -0.9883900928792569,-0.00006792118926490787), TestValue(6,180,15324,-154.44163935947577, -0.9554437564499484,-0.00006343927721985665), TestValue(14,180,15324,-131.5984192349756, -0.911515307877537,-0.000057701678183974536), TestValue(1525,180,15324,-1861.5172673616398, 7.38547041623667,-0.0035556000115217756), TestValue(10233,180,15324,-28577.644697168085, 55.2015866873065,-0.14858705144088802), TestValue(0,1123,0.0004,-0.005939122128713381, -3.5618865318302646e-7,-13.847805677972104), TestValue(6,1123,0.0004,-9.620833523075628, -3.5428559715533445e-7,2488.429599570756), TestValue(14,1123,0.0004,-10.467775521386166, -3.517481891184117e-7,2489.3192333086026), TestValue(1525,1123,0.0004,-15.157115486355906, 1.2750475385536657e-7,2492.70020501204), TestValue(10233,1123,0.0004,-17.063078998820856, 2.8894734020457448e-6,2486.849880233364), TestValue(0,1123,0.065,-0.6342170147837343, -0.000057877326779839104,-8.75724272015346), TestValue(6,1123,0.065,-5.014263034227778, -0.000057568097963562137,8.814958879676311), TestValue(14,1123,0.065,-5.803957292009425, -0.000057155792875192846,9.697719756764902), TestValue(1525,1123,0.065,-10.275036857130544, 0.000020718330690556827,13.074039765317043), TestValue(10233,1123,0.065,-12.558918107941281, 0.0004695124193805291,7.224124958319663), TestValue(0,1123,4.42,-24.493639593452325, -0.00392045555338738,-4.545467874886493), TestValue(6,1123,4.42,-19.68318216630322, -0.003899509219175159,-3.624587483847729), TestValue(14,1123,4.42,-17.37102939846337, -0.003871580773558864,-3.040611828950623), TestValue(1525,1123,4.42,-7.7548168672583415, 0.0014034043922188128,0.0654298516080507), TestValue(10233,1123,4.42,-35.45506157865748, 0.031803517445555686,-5.756960605210265), TestValue(0,1123,800,-701.6240143366822, -0.4160166406656266,-0.29304665858647905), TestValue(6,1123,800,-671.3041847506472, -0.4137939337698174,-0.28869011401594236), TestValue(14,1123,800,-640.6479149103316, -0.4108303245754051,-0.2829675576373729), TestValue(1525,1123,800,-30.39018204828426, 0.14892136201921807,-0.018804728472968435), TestValue(10233,1123,800,-3343.1303902972795, 3.3748099701370067,-2.9898053694742615), TestValue(0,1123,15324,-1083.757151397245, -0.9317200705295798,-0.002442933450309326), TestValue(6,1123,15324,-1048.6172073187354, -0.9267420470004815,-0.002416262805940761), TestValue(14,1123,15324,-1011.5999306403351, -0.920104682295017,-0.00238094023047708), TestValue(1525,1123,15324,-64.3938471491183, 0.33352757644959136,-0.00029097614079454104), TestValue(10233,1123,15324,-11352.060718035325, 7.558299058347705,-0.11311918072723515), TestValue(0,10586,0.0004,-0.006836533480423993, -3.778575334268833e-8,-16.091333738845734), TestValue(6,10586,0.0004,-9.621729024009568, -3.776433689454398e-8,2486.19084755338), TestValue(14,10586,0.0004,-10.468668475096411, -3.7735781630351504e-8,2487.0868493492235), TestValue(1525,10586,0.0004,-15.157527333190956, -3.234240610599839e-8,2491.6705880068075), TestValue(10233,10586,0.0004,-17.060718192660715, -1.2600010324928188e-9,2492.7518943576556), TestValue(0,10586,0.065,-0.7800430171085975, -6.1401474485561915e-6,-11.00066794181818), TestValue(6,10586,0.065,-5.159778603540011, -6.1366672969700086e-6,6.57630939764217), TestValue(14,10586,0.065,-5.949058950638154, -6.132027094855097e-6,7.465437927571536), TestValue(1525,10586,0.065,-10.34196113541293, -5.255608920401252e-6,12.044448366424728), TestValue(10233,10586,0.065,-12.175300607224926, -2.047489183204549e-7,13.125723676609066), TestValue(0,10586,4.42,-34.3945190758502, -0.0004173583295091224,-6.781982760105572), TestValue(6,10586,4.42,-29.562997357281894, -0.00041712177651676886,-5.856347033468785), TestValue(14,10586,4.42,-27.2227588675498, -0.0004168063725269641,-5.266030931107645), TestValue(1525,10586,4.42,-12.301855613945008, -0.0003572344439525938,-0.9624372357797295), TestValue(10233,10586,4.42,-9.430792045634007, -0.00001391720105013416,0.11674937200192481), TestValue(0,10586,800,-2124.4224654744803, -0.07026172492534692,-1.7257898067684474), TestValue(6,10586,800,-2091.312452085902, -0.07022190154073024,-1.7188401003298583), TestValue(14,10586,800,-2056.9359371755286, -0.07016880369457469,-1.7096599947938858), TestValue(1525,10586,800,-744.0169167062886, -0.060139948001942986,-0.7924525685250288), TestValue(10233,10586,800,-7.2703661972227565, -0.0023429424616141564,0.00008904830662359586), TestValue(0,10586,15324,-8048.29915678056, -0.5914318795831726,-0.11664064731878732), TestValue(6,10586,15324,-8002.424955944863, -0.5910966640836922,-0.11648073932479441), TestValue(14,10586,15324,-7951.095336923546, -0.590649710084385,-0.11626776694982688), TestValue(1525,10586,15324,-4300.645593413912, -0.506231273465249,-0.08062419697917278), TestValue(10233,10586,15324,-9.327824035135563, -0.019721845219427537,-0.00008059480749977865)}; +std::array testValues + = {TestValue(0, 0.0000256, 0.0004, -0.000024814156367780882, + -0.9398496240601504, -0.0018850149796021398), + TestValue(6, 0.0000256, 0.0004, -26.480362597222488, 220276.31578947368, + -11595.463497838708), + TestValue(14, 0.0000256, 0.0004, -49.814562438358635, 513979.32330827066, + -30391.559221530802), + TestValue(1525, 0.0000256, 0.0004, -4301.784727467015, + 5.5987134868421055e7, -3.580668787634408e6), + TestValue(10233, 0.0000256, 0.0004, -28781.07085289515, + 3.7568285855263156e8, -2.4041193199521683e7), + TestValue(0, 0.0000256, 0.065, -0.000025594960092480967, + -0.9996063088998794, -7.751668684718993e-8), + TestValue(6, 0.0000256, 0.065, -51.41938813644809, 234281.72904210034, + -74.69380754597304), + TestValue(14, 0.0000256, 0.065, -114.92817109028836, 546658.7005733127, + -196.83239209326592), + TestValue(1525, 0.0000256, 0.065, -11965.467128123484, + 5.954685919853104e7, -23429.11268911477), + TestValue(10233, 0.0000256, 0.065, -80237.4790550341, + 3.995691927102557e8, -157343.697098361), + TestValue(0, 0.0000256, 4.42, -0.000025599925864390194, + -0.9999942081783417, -1.677258332222209e-11), + TestValue(6, 0.0000256, 4.42, -67.52038137511191, 234372.6425475907, + -0.4312559247584902), + TestValue(14, 0.0000256, 4.42, -161.64931287705224, 546870.8326033225, + -1.650128690902025), + TestValue(1525, 0.0000256, 4.42, -18367.34289180058, 5.956996647937967e7, + -339.0570825343945), + TestValue(10233, 0.0000256, 4.42, -123371.16336416776, + 3.997242463550437e8, -2307.279979293951), + TestValue(0, 0.0000256, 800, -0.00002559999998652529, -0.999999968000001, + -8.881784197001252e-16), + TestValue(6, 0.0000256, 800, -69.9980790657431, 234373.99250003224, + -0.000023330384471442756), + TestValue(14, 0.0000256, 800, -173.09898662779824, 546873.9825000325, + -0.00014060727924558591), + TestValue(1525, 0.0000256, 800, -24826.22813563853, 5.957030959375009e7, + -0.8389762876176414), + TestValue(10233, 0.0000256, 800, -173733.65594636812, + 3.997265487087504e8, -10.166635446653597), + TestValue(0, 0.0000256, 15324, -0.000025599996959613236, + -0.9999999983294179, 0.), + TestValue(6, 0.0000256, 15324, -70.01580732128963, 234373.99960845898, + -6.386142814562845e-8), + TestValue(14, 0.0000256, 15324, -173.20616504262574, 546873.9990864021, + -3.872936886750722e-7), + TestValue(1525, 0.0000256, 15324, -25707.717028801628, + 5.957031140048291e7, -0.004643062913324059), + TestValue(10233, 0.0000256, 15324, -189611.39394380094, + 3.9972656083222395e8, -0.15627194690990365), + TestValue(0, 0.314, 0.0004, -0.002666782716971683, -0.001272264631043257, + -5.66822905706025), + TestValue(6, 0.314, 0.0004, -9.625197494412376, 0.023038524497171847, + 2477.530549555817), + TestValue(14, 0.314, 0.0004, -10.482321240387563, 0.05545291000145865, + 2452.982014445862), + TestValue(1525, 0.314, 0.0004, -17.094738795518424, 6.1777199721236284, + -2348.2711549792057), + TestValue(10233, 0.314, 0.0004, -30.083534640958533, 41.460778593539814, + -30043.568270589793), + TestValue(0, 0.314, 0.065, -0.11460468078714132, -0.17150395778364116, + -0.9346528929704305), + TestValue(6, 0.314, 0.065, -5.6231627412658, 3.1056417323496293, + 0.8117566646875254), + TestValue(14, 0.314, 0.065, -7.917539720426937, 7.4751693191939905, + -19.40653851445296), + TestValue(1525, 0.314, 0.065, -296.58556828610017, 832.7696922844226, + -4001.4921811261693), + TestValue(10233, 0.314, 0.065, -1936.716591758479, 5589.00047056451, + -26975.841613138524), + TestValue(0, 0.314, 4.42, -0.30334820230965986, -0.9336713138994508, + -0.00230212890163628), + TestValue(6, 0.314, 4.42, -11.748118636048988, 16.90718181793719, + -0.3435269754367143), + TestValue(14, 0.314, 4.42, -31.109603016060397, 40.69498599371937, + -1.4423583039713965), + TestValue(1525, 0.314, 4.42, -4115.10160678526, 4533.61649969458, + -316.1764856190919), + TestValue(10233, 0.314, 4.42, -27734.55588693275, 30426.641345033488, + -2153.7342775414127), + TestValue(0, 0.314, 800, -0.31393839362010567, -0.9996076539958066, + -7.698783210940974e-8), + TestValue(6, 0.314, 800, -13.827010724886122, 18.101175543376296, + -0.000020465017271042996), + TestValue(14, 0.314, 800, -41.61461010763844, 43.568886473205765, + -0.00013381877200302483), + TestValue(1525, 0.314, 800, -10469.94267675256, 4853.782788344746, + -0.8382285160349765), + TestValue(10233, 0.314, 800, -77398.83453431107, 32575.386135464123, + -10.16161733713528), + TestValue(0, 0.314, 15324, -0.31399678298770084, -0.9999795096863716, + -2.099280749234822e-10), + TestValue(6, 0.314, 15324, -13.842565956968983, 18.10790921043538, + -5.6049177743489054e-8), + TestValue(14, 0.314, 15324, -41.71664028188991, 43.58509417059771, + -3.687852014877535e-7), + TestValue(1525, 0.314, 15324, -11350.864477542971, 4855.588403521258, + -0.004641024152967077), + TestValue(10233, 0.314, 15324, -93272.76691554434, 32587.50423265796, + -0.15625826529496223), + TestValue(0, 1.5, 0.0004, -0.003291911100032755, -0.00026659557451346307, + -7.230044345656401), + TestValue(6, 1.5, 0.0004, -9.619783961619232, 0.0007997867235403892, + 2491.0537701151675), + TestValue(14, 1.5, 0.0004, -10.468856159359483, 0.002221629787612192, + 2486.6186161358087), + TestValue(1525, 1.5, 0.0004, -15.560537541616213, 0.270772238514174, + 1484.280307752038), + TestValue(10233, 1.5, 0.0004, -19.785223133323598, 1.8184484137563317, + -4317.601447204935), + TestValue(0, 1.5, 0.065, -0.2067814991501101, -0.04153354632587859, + -2.2227873794044952), + TestValue(6, 1.5, 0.065, -4.841004539887443, 0.12460063897763578, + 11.520890928200775), + TestValue(14, 1.5, 0.065, -5.969601492726813, 0.34611288604898827, + 7.298954082323366), + TestValue(1525, 1.5, 0.065, -74.45092758687497, 42.184238551650694, + -953.4745083343279), + TestValue(10233, 1.5, 0.065, -445.630392408013, 283.3003194888179, + -6515.787894589817), + TestValue(0, 1.5, 4.42, -1.2915096474038796, -0.7466216216216216, + -0.03881837442792935), + TestValue(6, 1.5, 4.42, -4.694711300875651, 2.239864864864865, + -0.12612961153608993), + TestValue(14, 1.5, 4.42, -13.334103973863655, 6.221846846846847, + -0.8864094608348823), + TestValue(1525, 1.5, 4.42, -2072.1910365790172, 758.3186936936937, + -251.67662613527665), + TestValue(10233, 1.5, 4.42, -14020.648493631525, 5092.706081081081, + -1720.7211329093311), + TestValue(0, 1.5, 800, -1.4985955053447242, -0.9981285090455396, + -1.7534272203079126e-6), + TestValue(6, 1.5, 800, -5.63758835785638, 2.9943855271366187, + -0.00001104786953298742), + TestValue(14, 1.5, 800, -20.926415102269573, 8.317737575379496, + -0.00010961017476240897), + TestValue(1525, 1.5, 800, -8088.548799680884, 1013.7658556872531, + -0.8354105724129193), + TestValue(10233, 1.5, 800, -61412.52664040723, 6808.234560199626, + -10.142698900729565), + TestValue(0, 1.5, 15324, -1.499926590534038, -0.9999021239111285, + -4.790177143831897e-9), + TestValue(6, 1.5, 15324, -5.645995699555982, 2.9997063717333856, + -3.032959305926397e-8), + TestValue(14, 1.5, 15324, -21.010069937864472, 8.332517699259403, + -3.0266583905813604e-7), + TestValue(1525, 1.5, 15324, -8967.33164084002, 1015.5672571857361, + -0.004633327525485953), + TestValue(10233, 1.5, 15324, -77272.09898456372, 6820.332387197807, + -0.15620659350885369), + TestValue(0, 3, 0.0004, -0.003569116649587855, -0.0001333155579256099, + -7.922924939527562), + TestValue(6, 3, 0.0004, -9.619261327135609, 0.0001333155579256099, + 2492.360089770114), + TestValue(14, 3, 0.0004, -10.467267071498288, 0.0004888237123939031, + 2490.5905361225123), + TestValue(1525, 3, 0.0004, -15.357522072066786, 0.06763542638759276, + 1991.7174903993568), + TestValue(10233, 3, 0.0004, -18.421373162287637, 0.4546060525263298, + -908.6583034400528), + TestValue(0, 3, 0.065, -0.25047201260085383, -0.021207177814029365, + -2.874622756288704), + TestValue(6, 3, 0.065, -4.758782442354863, 0.021207177814029365, + 12.74533572164111), + TestValue(14, 3, 0.065, -5.719495913883133, 0.07775965198477433, + 11.025105769529759), + TestValue(1525, 3, 0.065, -42.491829475397026, 10.75910821098423, + -477.2384670870571), + TestValue(10233, 3, 0.065, -230.9301248894044, 72.31647634584013, + -3316.4438994781904), + TestValue(0, 3, 4.42, -2.2897339760163957, -0.5956873315363881, + -0.11372669262607049), + TestValue(6, 3, 4.42, -2.889108195828742, 0.5956873315363881, + 0.003850246852058703), + TestValue(14, 3, 4.42, -7.790064290604171, 2.18418688230009, + -0.4832453669983474), + TestValue(1525, 3, 4.42, -1360.5497881858591, 302.2120395327942, + -199.67578957112616), + TestValue(10233, 3, 4.42, -9239.719029853994, 2031.2938005390836, + -1371.3592560596119), + TestValue(0, 3, 800, -2.994389023067612, -0.9962640099626401, + -6.996241475043519e-6), + TestValue(6, 3, 800, -2.9857172436025223, 0.9962640099626401, + -2.3069406651643476e-6), + TestValue(14, 3, 800, -12.744324478713366, 3.65296803652968, + -0.00008222425506509978), + TestValue(1525, 3, 800, -7035.84649923785, 505.4379410543794, + -0.8318616138503963), + TestValue(10233, 3, 800, -54340.180404088605, 3397.2602739726026, + -10.118854869649681), + TestValue(0, 3, 15324, -2.999706381300726, -0.9998042669798395, + -1.9158207464897714e-8), + TestValue(6, 3, 15324, -2.9874796347589054, 0.9998042669798395, + -6.3824572293924575e-9), + TestValue(14, 3, 15324, -12.807159398982407, 3.665948978926078, + -2.2763181739549054e-7), + TestValue(1525, 3, 15324, -7911.931224008331, 507.2340314477719, + -0.004623603455756964), + TestValue(10233, 3, 15324, -70181.6251826905, 3409.332550401253, + -0.15614126136305728), + TestValue(0, 180, 0.0004, -0.0052068020335865025, -2.2222172839615914e-6, + -12.01700730618354), + TestValue(6, 180, 0.0004, -9.62011239916672, -2.148143374496205e-6, + 2490.2324075130828), + TestValue(14, 180, 0.0004, -10.467069325725546, -2.04937816187569e-6, + 2491.084720678314), + TestValue(1525, 180, 0.0004, -15.159228863591125, + 0.000016604901371824113, 2487.4167692289852), + TestValue(10233, 180, 0.0004, -17.08144177432405, 0.00012411083530925487, + 2440.94300115826), + TestValue(0, 180, 0.065, -0.5152345838836883, -0.00036098075694887956, + -6.927046886659846), + TestValue(6, 180, 0.065, -4.897099604874426, -0.0003489480650505836, + 10.617175935000475), + TestValue(14, 180, 0.065, -5.689219198051667, -0.0003329044758528556, + 11.4626317745298), + TestValue(1525, 180, 0.065, -10.618383986015033, 0.0026973284338680167, + 7.7929628140754765), + TestValue(10233, 180, 0.065, -15.542242814932251, 0.020160775275594924, + -38.6634853761835), + TestValue(0, 180, 4.42, -16.491356225074536, -0.023967031775295522, + -2.755043100796684), + TestValue(6, 180, 4.42, -11.802883319144515, -0.023168130716119003, + -1.8613752566654882), + TestValue(14, 180, 4.42, -9.653376579596795, -0.022102929303883648, + -1.313682997645138), + TestValue(1525, 180, 4.42, -30.756932642065294, 0.1790869874320693, + -5.0606677133089075), + TestValue(10233, 180, 4.42, -235.49737914944126, 1.3385587246502548, + -50.37753458197702), + TestValue(0, 180, 800, -162.35267519735217, -0.8163265306122449, + -0.01926737460893513), + TestValue(6, 180, 800, -138.9731231908616, -0.7891156462585034, + -0.017913154212997107), + TestValue(14, 180, 800, -117.57055678993851, -0.7528344671201814, + -0.016193696733894036), + TestValue(1525, 180, 800, -1255.1060610431614, 6.099773242630386, + -0.5081161722061651), + TestValue(10233, 180, 800, -14640.50246307096, 45.59183673469388, + -7.836489965276398), + TestValue(0, 180, 15324, -178.95104102256036, -0.9883900928792569, + -0.00006792118926490787), + TestValue(6, 180, 15324, -154.44163935947577, -0.9554437564499484, + -0.00006343927721985665), + TestValue(14, 180, 15324, -131.5984192349756, -0.911515307877537, + -0.000057701678183974536), + TestValue(1525, 180, 15324, -1861.5172673616398, 7.38547041623667, + -0.0035556000115217756), + TestValue(10233, 180, 15324, -28577.644697168085, 55.2015866873065, + -0.14858705144088802), + TestValue(0, 1123, 0.0004, -0.005939122128713381, -3.5618865318302646e-7, + -13.847805677972104), + TestValue(6, 1123, 0.0004, -9.620833523075628, -3.5428559715533445e-7, + 2488.429599570756), + TestValue(14, 1123, 0.0004, -10.467775521386166, -3.517481891184117e-7, + 2489.3192333086026), + TestValue(1525, 1123, 0.0004, -15.157115486355906, 1.2750475385536657e-7, + 2492.70020501204), + TestValue(10233, 1123, 0.0004, -17.063078998820856, + 2.8894734020457448e-6, 2486.849880233364), + TestValue(0, 1123, 0.065, -0.6342170147837343, -0.000057877326779839104, + -8.75724272015346), + TestValue(6, 1123, 0.065, -5.014263034227778, -0.000057568097963562137, + 8.814958879676311), + TestValue(14, 1123, 0.065, -5.803957292009425, -0.000057155792875192846, + 9.697719756764902), + TestValue(1525, 1123, 0.065, -10.275036857130544, + 0.000020718330690556827, 13.074039765317043), + TestValue(10233, 1123, 0.065, -12.558918107941281, 0.0004695124193805291, + 7.224124958319663), + TestValue(0, 1123, 4.42, -24.493639593452325, -0.00392045555338738, + -4.545467874886493), + TestValue(6, 1123, 4.42, -19.68318216630322, -0.003899509219175159, + -3.624587483847729), + TestValue(14, 1123, 4.42, -17.37102939846337, -0.003871580773558864, + -3.040611828950623), + TestValue(1525, 1123, 4.42, -7.7548168672583415, 0.0014034043922188128, + 0.0654298516080507), + TestValue(10233, 1123, 4.42, -35.45506157865748, 0.031803517445555686, + -5.756960605210265), + TestValue(0, 1123, 800, -701.6240143366822, -0.4160166406656266, + -0.29304665858647905), + TestValue(6, 1123, 800, -671.3041847506472, -0.4137939337698174, + -0.28869011401594236), + TestValue(14, 1123, 800, -640.6479149103316, -0.4108303245754051, + -0.2829675576373729), + TestValue(1525, 1123, 800, -30.39018204828426, 0.14892136201921807, + -0.018804728472968435), + TestValue(10233, 1123, 800, -3343.1303902972795, 3.3748099701370067, + -2.9898053694742615), + TestValue(0, 1123, 15324, -1083.757151397245, -0.9317200705295798, + -0.002442933450309326), + TestValue(6, 1123, 15324, -1048.6172073187354, -0.9267420470004815, + -0.002416262805940761), + TestValue(14, 1123, 15324, -1011.5999306403351, -0.920104682295017, + -0.00238094023047708), + TestValue(1525, 1123, 15324, -64.3938471491183, 0.33352757644959136, + -0.00029097614079454104), + TestValue(10233, 1123, 15324, -11352.060718035325, 7.558299058347705, + -0.11311918072723515), + TestValue(0, 10586, 0.0004, -0.006836533480423993, -3.778575334268833e-8, + -16.091333738845734), + TestValue(6, 10586, 0.0004, -9.621729024009568, -3.776433689454398e-8, + 2486.19084755338), + TestValue(14, 10586, 0.0004, -10.468668475096411, -3.7735781630351504e-8, + 2487.0868493492235), + TestValue(1525, 10586, 0.0004, -15.157527333190956, + -3.234240610599839e-8, 2491.6705880068075), + TestValue(10233, 10586, 0.0004, -17.060718192660715, + -1.2600010324928188e-9, 2492.7518943576556), + TestValue(0, 10586, 0.065, -0.7800430171085975, -6.1401474485561915e-6, + -11.00066794181818), + TestValue(6, 10586, 0.065, -5.159778603540011, -6.1366672969700086e-6, + 6.57630939764217), + TestValue(14, 10586, 0.065, -5.949058950638154, -6.132027094855097e-6, + 7.465437927571536), + TestValue(1525, 10586, 0.065, -10.34196113541293, -5.255608920401252e-6, + 12.044448366424728), + TestValue(10233, 10586, 0.065, -12.175300607224926, + -2.047489183204549e-7, 13.125723676609066), + TestValue(0, 10586, 4.42, -34.3945190758502, -0.0004173583295091224, + -6.781982760105572), + TestValue(6, 10586, 4.42, -29.562997357281894, -0.00041712177651676886, + -5.856347033468785), + TestValue(14, 10586, 4.42, -27.2227588675498, -0.0004168063725269641, + -5.266030931107645), + TestValue(1525, 10586, 4.42, -12.301855613945008, -0.0003572344439525938, + -0.9624372357797295), + TestValue(10233, 10586, 4.42, -9.430792045634007, + -0.00001391720105013416, 0.11674937200192481), + TestValue(0, 10586, 800, -2124.4224654744803, -0.07026172492534692, + -1.7257898067684474), + TestValue(6, 10586, 800, -2091.312452085902, -0.07022190154073024, + -1.7188401003298583), + TestValue(14, 10586, 800, -2056.9359371755286, -0.07016880369457469, + -1.7096599947938858), + TestValue(1525, 10586, 800, -744.0169167062886, -0.060139948001942986, + -0.7924525685250288), + TestValue(10233, 10586, 800, -7.2703661972227565, -0.0023429424616141564, + 0.00008904830662359586), + TestValue(0, 10586, 15324, -8048.29915678056, -0.5914318795831726, + -0.11664064731878732), + TestValue(6, 10586, 15324, -8002.424955944863, -0.5910966640836922, + -0.11648073932479441), + TestValue(14, 10586, 15324, -7951.095336923546, -0.590649710084385, + -0.11626776694982688), + TestValue(1525, 10586, 15324, -4300.645593413912, -0.506231273465249, + -0.08062419697917278), + TestValue(10233, 10586, 15324, -9.327824035135563, -0.019721845219427537, + -0.00008059480749977865)}; TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { using stan::math::is_nan; using stan::math::neg_binomial_2_log; - using stan::math::var; using stan::math::value_of; + using stan::math::var; - for(auto iter = testValues.begin(); iter != testValues.end(); ++iter) { - TestValue t = *iter; + for (auto iter = testValues.begin(); iter != testValues.end(); ++iter) { + TestValue t = *iter; unsigned int n = t.n; var mu(t.mu); var phi(t.phi); @@ -70,24 +426,22 @@ TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { EXPECT_FALSE(is_nan(gradients[i])); } - EXPECT_NEAR(value_of(val), t.value, fabs(t.value * 1e-8)) << - "value n = " << n << ", mu = " << t.mu << ", phi = " << t.phi; - EXPECT_NEAR(gradients[0], t.grad_mu, fabs(t.grad_mu * 1e-8)) << - "grad_mu n = " << n << ", mu = " << t.mu << ", phi = " << t.phi; - EXPECT_NEAR(gradients[1], t.grad_phi, fabs(t.grad_phi * 1e-8)) << - "grad_phi n = " << n << ", mu = " << t.mu << ", phi = " << t.phi; - + EXPECT_NEAR(value_of(val), t.value, fabs(t.value * 1e-8)) + << "value n = " << n << ", mu = " << t.mu << ", phi = " << t.phi; + EXPECT_NEAR(gradients[0], t.grad_mu, fabs(t.grad_mu * 1e-8)) + << "grad_mu n = " << n << ", mu = " << t.mu << ", phi = " << t.phi; + EXPECT_NEAR(gradients[1], t.grad_phi, fabs(t.grad_phi * 1e-8)) + << "grad_phi n = " << n << ", mu = " << t.mu << ", phi = " << t.phi; } } - TEST(ProbDistributionsNegBinomial, derivativesFiniteDiffs) { using stan::math::is_nan; using stan::math::neg_binomial_2_log; using stan::math::var; - //The range of values tested has to be quite conservative to let the test - //pass + // The range of values tested has to be quite conservative to let the test + // pass std::array n_to_test = {100}; std::array mu_to_test = {8}; // std::array n_to_test = {7, 100, 835}; @@ -95,10 +449,9 @@ TEST(ProbDistributionsNegBinomial, derivativesFiniteDiffs) { // std::array n_to_test = {0, 7, 100, 835}; // std::array mu_to_test = {0.8, 8, 24, 271}; double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; - for(auto mu_iter = mu_to_test.begin(); - mu_iter != mu_to_test.end(); ++mu_iter) { - for(auto n_iter = n_to_test.begin(); - n_iter != n_to_test.end(); ++n_iter) { + for (auto mu_iter = mu_to_test.begin(); mu_iter != mu_to_test.end(); + ++mu_iter) { + for (auto n_iter = n_to_test.begin(); n_iter != n_to_test.end(); ++n_iter) { double mu_dbl = *mu_iter; unsigned int n = *n_iter; double phi_dbl = 1.5; @@ -123,17 +476,17 @@ TEST(ProbDistributionsNegBinomial, derivativesFiniteDiffs) { double eps = 1e-10; double inv2e = 0.5 / eps; double dmu = neg_binomial_2_log(n, mu_dbl + eps, phi_dbl) - - neg_binomial_2_log(n, mu_dbl - eps, phi_dbl); + - neg_binomial_2_log(n, mu_dbl - eps, phi_dbl); double dphi = neg_binomial_2_log(n, mu_dbl, phi_dbl + eps) - neg_binomial_2_log(n, mu_dbl, phi_dbl - eps); finite_diffs.push_back(dmu * inv2e); finite_diffs.push_back(dphi * inv2e); for (int i = 0; i < 2; ++i) { - EXPECT_NEAR(gradients[i], finite_diffs[i], - std::max(1.0, gradients[i] * 1e-4)) << - "for i = " << i << ", n = " << n << ", mu = " << mu_dbl << - " +/- epsilon, phi = " << phi_dbl << " +/- epsilon"; + EXPECT_NEAR(gradients[i], finite_diffs[i], + std::max(1.0, gradients[i] * 1e-4)) + << "for i = " << i << ", n = " << n << ", mu = " << mu_dbl + << " +/- epsilon, phi = " << phi_dbl << " +/- epsilon"; } phi_dbl *= 10; @@ -157,5 +510,4 @@ TEST(ProbDistributionsNegativeBinomial2, proptoAtPoissonCutoff) { EXPECT_NEAR(value_of(value_before_cutoff), value_of(value_after_cutoff), 1); } - -//TODO test continuity of derivatives at cutoff \ No newline at end of file +// TODO test continuity of derivatives at cutoff \ No newline at end of file From 7b992e9bc3534a876cea6b182fd25edb8b18d805 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Tue, 10 Dec 2019 17:21:39 +0100 Subject: [PATCH 08/82] Fixed formatting issues --- test/unit/math/prim/mat/prob/neg_binomial_2_test.cpp | 2 +- test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/test/unit/math/prim/mat/prob/neg_binomial_2_test.cpp b/test/unit/math/prim/mat/prob/neg_binomial_2_test.cpp index deabf8c9fae..d6a5ce6c0b0 100644 --- a/test/unit/math/prim/mat/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/prim/mat/prob/neg_binomial_2_test.cpp @@ -46,4 +46,4 @@ TEST(ProbDistributionsNegativeBinomial2, vectorAroundCutoff) { + stan::math::neg_binomial_2_lpmf(y, mu, phi[1]); EXPECT_FLOAT_EQ(vector_value, scalar_value); -} \ No newline at end of file +} diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index 841ffe2679b..dec12cf5fd1 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -1,6 +1,7 @@ #include #include #include +#include struct TestValue { unsigned int n; @@ -510,4 +511,4 @@ TEST(ProbDistributionsNegativeBinomial2, proptoAtPoissonCutoff) { EXPECT_NEAR(value_of(value_before_cutoff), value_of(value_after_cutoff), 1); } -// TODO test continuity of derivatives at cutoff \ No newline at end of file +// TODO(martinmodrak) test continuity of derivatives at cutoff From 64e034fe2ca815d7dd84ba942d1f17a1241229ff Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Wed, 11 Dec 2019 09:02:38 +0100 Subject: [PATCH 09/82] Improved tests and their reporting --- .../rev/scal/prob/neg_binomial_2_test.cpp | 381 +----------------- 1 file changed, 17 insertions(+), 364 deletions(-) diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index dec12cf5fd1..50bc6b3861f 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -51,357 +51,7 @@ struct TestValue { // WriteString[out,"};"]; // Close[out]; // FilePrint[%] -std::array testValues - = {TestValue(0, 0.0000256, 0.0004, -0.000024814156367780882, - -0.9398496240601504, -0.0018850149796021398), - TestValue(6, 0.0000256, 0.0004, -26.480362597222488, 220276.31578947368, - -11595.463497838708), - TestValue(14, 0.0000256, 0.0004, -49.814562438358635, 513979.32330827066, - -30391.559221530802), - TestValue(1525, 0.0000256, 0.0004, -4301.784727467015, - 5.5987134868421055e7, -3.580668787634408e6), - TestValue(10233, 0.0000256, 0.0004, -28781.07085289515, - 3.7568285855263156e8, -2.4041193199521683e7), - TestValue(0, 0.0000256, 0.065, -0.000025594960092480967, - -0.9996063088998794, -7.751668684718993e-8), - TestValue(6, 0.0000256, 0.065, -51.41938813644809, 234281.72904210034, - -74.69380754597304), - TestValue(14, 0.0000256, 0.065, -114.92817109028836, 546658.7005733127, - -196.83239209326592), - TestValue(1525, 0.0000256, 0.065, -11965.467128123484, - 5.954685919853104e7, -23429.11268911477), - TestValue(10233, 0.0000256, 0.065, -80237.4790550341, - 3.995691927102557e8, -157343.697098361), - TestValue(0, 0.0000256, 4.42, -0.000025599925864390194, - -0.9999942081783417, -1.677258332222209e-11), - TestValue(6, 0.0000256, 4.42, -67.52038137511191, 234372.6425475907, - -0.4312559247584902), - TestValue(14, 0.0000256, 4.42, -161.64931287705224, 546870.8326033225, - -1.650128690902025), - TestValue(1525, 0.0000256, 4.42, -18367.34289180058, 5.956996647937967e7, - -339.0570825343945), - TestValue(10233, 0.0000256, 4.42, -123371.16336416776, - 3.997242463550437e8, -2307.279979293951), - TestValue(0, 0.0000256, 800, -0.00002559999998652529, -0.999999968000001, - -8.881784197001252e-16), - TestValue(6, 0.0000256, 800, -69.9980790657431, 234373.99250003224, - -0.000023330384471442756), - TestValue(14, 0.0000256, 800, -173.09898662779824, 546873.9825000325, - -0.00014060727924558591), - TestValue(1525, 0.0000256, 800, -24826.22813563853, 5.957030959375009e7, - -0.8389762876176414), - TestValue(10233, 0.0000256, 800, -173733.65594636812, - 3.997265487087504e8, -10.166635446653597), - TestValue(0, 0.0000256, 15324, -0.000025599996959613236, - -0.9999999983294179, 0.), - TestValue(6, 0.0000256, 15324, -70.01580732128963, 234373.99960845898, - -6.386142814562845e-8), - TestValue(14, 0.0000256, 15324, -173.20616504262574, 546873.9990864021, - -3.872936886750722e-7), - TestValue(1525, 0.0000256, 15324, -25707.717028801628, - 5.957031140048291e7, -0.004643062913324059), - TestValue(10233, 0.0000256, 15324, -189611.39394380094, - 3.9972656083222395e8, -0.15627194690990365), - TestValue(0, 0.314, 0.0004, -0.002666782716971683, -0.001272264631043257, - -5.66822905706025), - TestValue(6, 0.314, 0.0004, -9.625197494412376, 0.023038524497171847, - 2477.530549555817), - TestValue(14, 0.314, 0.0004, -10.482321240387563, 0.05545291000145865, - 2452.982014445862), - TestValue(1525, 0.314, 0.0004, -17.094738795518424, 6.1777199721236284, - -2348.2711549792057), - TestValue(10233, 0.314, 0.0004, -30.083534640958533, 41.460778593539814, - -30043.568270589793), - TestValue(0, 0.314, 0.065, -0.11460468078714132, -0.17150395778364116, - -0.9346528929704305), - TestValue(6, 0.314, 0.065, -5.6231627412658, 3.1056417323496293, - 0.8117566646875254), - TestValue(14, 0.314, 0.065, -7.917539720426937, 7.4751693191939905, - -19.40653851445296), - TestValue(1525, 0.314, 0.065, -296.58556828610017, 832.7696922844226, - -4001.4921811261693), - TestValue(10233, 0.314, 0.065, -1936.716591758479, 5589.00047056451, - -26975.841613138524), - TestValue(0, 0.314, 4.42, -0.30334820230965986, -0.9336713138994508, - -0.00230212890163628), - TestValue(6, 0.314, 4.42, -11.748118636048988, 16.90718181793719, - -0.3435269754367143), - TestValue(14, 0.314, 4.42, -31.109603016060397, 40.69498599371937, - -1.4423583039713965), - TestValue(1525, 0.314, 4.42, -4115.10160678526, 4533.61649969458, - -316.1764856190919), - TestValue(10233, 0.314, 4.42, -27734.55588693275, 30426.641345033488, - -2153.7342775414127), - TestValue(0, 0.314, 800, -0.31393839362010567, -0.9996076539958066, - -7.698783210940974e-8), - TestValue(6, 0.314, 800, -13.827010724886122, 18.101175543376296, - -0.000020465017271042996), - TestValue(14, 0.314, 800, -41.61461010763844, 43.568886473205765, - -0.00013381877200302483), - TestValue(1525, 0.314, 800, -10469.94267675256, 4853.782788344746, - -0.8382285160349765), - TestValue(10233, 0.314, 800, -77398.83453431107, 32575.386135464123, - -10.16161733713528), - TestValue(0, 0.314, 15324, -0.31399678298770084, -0.9999795096863716, - -2.099280749234822e-10), - TestValue(6, 0.314, 15324, -13.842565956968983, 18.10790921043538, - -5.6049177743489054e-8), - TestValue(14, 0.314, 15324, -41.71664028188991, 43.58509417059771, - -3.687852014877535e-7), - TestValue(1525, 0.314, 15324, -11350.864477542971, 4855.588403521258, - -0.004641024152967077), - TestValue(10233, 0.314, 15324, -93272.76691554434, 32587.50423265796, - -0.15625826529496223), - TestValue(0, 1.5, 0.0004, -0.003291911100032755, -0.00026659557451346307, - -7.230044345656401), - TestValue(6, 1.5, 0.0004, -9.619783961619232, 0.0007997867235403892, - 2491.0537701151675), - TestValue(14, 1.5, 0.0004, -10.468856159359483, 0.002221629787612192, - 2486.6186161358087), - TestValue(1525, 1.5, 0.0004, -15.560537541616213, 0.270772238514174, - 1484.280307752038), - TestValue(10233, 1.5, 0.0004, -19.785223133323598, 1.8184484137563317, - -4317.601447204935), - TestValue(0, 1.5, 0.065, -0.2067814991501101, -0.04153354632587859, - -2.2227873794044952), - TestValue(6, 1.5, 0.065, -4.841004539887443, 0.12460063897763578, - 11.520890928200775), - TestValue(14, 1.5, 0.065, -5.969601492726813, 0.34611288604898827, - 7.298954082323366), - TestValue(1525, 1.5, 0.065, -74.45092758687497, 42.184238551650694, - -953.4745083343279), - TestValue(10233, 1.5, 0.065, -445.630392408013, 283.3003194888179, - -6515.787894589817), - TestValue(0, 1.5, 4.42, -1.2915096474038796, -0.7466216216216216, - -0.03881837442792935), - TestValue(6, 1.5, 4.42, -4.694711300875651, 2.239864864864865, - -0.12612961153608993), - TestValue(14, 1.5, 4.42, -13.334103973863655, 6.221846846846847, - -0.8864094608348823), - TestValue(1525, 1.5, 4.42, -2072.1910365790172, 758.3186936936937, - -251.67662613527665), - TestValue(10233, 1.5, 4.42, -14020.648493631525, 5092.706081081081, - -1720.7211329093311), - TestValue(0, 1.5, 800, -1.4985955053447242, -0.9981285090455396, - -1.7534272203079126e-6), - TestValue(6, 1.5, 800, -5.63758835785638, 2.9943855271366187, - -0.00001104786953298742), - TestValue(14, 1.5, 800, -20.926415102269573, 8.317737575379496, - -0.00010961017476240897), - TestValue(1525, 1.5, 800, -8088.548799680884, 1013.7658556872531, - -0.8354105724129193), - TestValue(10233, 1.5, 800, -61412.52664040723, 6808.234560199626, - -10.142698900729565), - TestValue(0, 1.5, 15324, -1.499926590534038, -0.9999021239111285, - -4.790177143831897e-9), - TestValue(6, 1.5, 15324, -5.645995699555982, 2.9997063717333856, - -3.032959305926397e-8), - TestValue(14, 1.5, 15324, -21.010069937864472, 8.332517699259403, - -3.0266583905813604e-7), - TestValue(1525, 1.5, 15324, -8967.33164084002, 1015.5672571857361, - -0.004633327525485953), - TestValue(10233, 1.5, 15324, -77272.09898456372, 6820.332387197807, - -0.15620659350885369), - TestValue(0, 3, 0.0004, -0.003569116649587855, -0.0001333155579256099, - -7.922924939527562), - TestValue(6, 3, 0.0004, -9.619261327135609, 0.0001333155579256099, - 2492.360089770114), - TestValue(14, 3, 0.0004, -10.467267071498288, 0.0004888237123939031, - 2490.5905361225123), - TestValue(1525, 3, 0.0004, -15.357522072066786, 0.06763542638759276, - 1991.7174903993568), - TestValue(10233, 3, 0.0004, -18.421373162287637, 0.4546060525263298, - -908.6583034400528), - TestValue(0, 3, 0.065, -0.25047201260085383, -0.021207177814029365, - -2.874622756288704), - TestValue(6, 3, 0.065, -4.758782442354863, 0.021207177814029365, - 12.74533572164111), - TestValue(14, 3, 0.065, -5.719495913883133, 0.07775965198477433, - 11.025105769529759), - TestValue(1525, 3, 0.065, -42.491829475397026, 10.75910821098423, - -477.2384670870571), - TestValue(10233, 3, 0.065, -230.9301248894044, 72.31647634584013, - -3316.4438994781904), - TestValue(0, 3, 4.42, -2.2897339760163957, -0.5956873315363881, - -0.11372669262607049), - TestValue(6, 3, 4.42, -2.889108195828742, 0.5956873315363881, - 0.003850246852058703), - TestValue(14, 3, 4.42, -7.790064290604171, 2.18418688230009, - -0.4832453669983474), - TestValue(1525, 3, 4.42, -1360.5497881858591, 302.2120395327942, - -199.67578957112616), - TestValue(10233, 3, 4.42, -9239.719029853994, 2031.2938005390836, - -1371.3592560596119), - TestValue(0, 3, 800, -2.994389023067612, -0.9962640099626401, - -6.996241475043519e-6), - TestValue(6, 3, 800, -2.9857172436025223, 0.9962640099626401, - -2.3069406651643476e-6), - TestValue(14, 3, 800, -12.744324478713366, 3.65296803652968, - -0.00008222425506509978), - TestValue(1525, 3, 800, -7035.84649923785, 505.4379410543794, - -0.8318616138503963), - TestValue(10233, 3, 800, -54340.180404088605, 3397.2602739726026, - -10.118854869649681), - TestValue(0, 3, 15324, -2.999706381300726, -0.9998042669798395, - -1.9158207464897714e-8), - TestValue(6, 3, 15324, -2.9874796347589054, 0.9998042669798395, - -6.3824572293924575e-9), - TestValue(14, 3, 15324, -12.807159398982407, 3.665948978926078, - -2.2763181739549054e-7), - TestValue(1525, 3, 15324, -7911.931224008331, 507.2340314477719, - -0.004623603455756964), - TestValue(10233, 3, 15324, -70181.6251826905, 3409.332550401253, - -0.15614126136305728), - TestValue(0, 180, 0.0004, -0.0052068020335865025, -2.2222172839615914e-6, - -12.01700730618354), - TestValue(6, 180, 0.0004, -9.62011239916672, -2.148143374496205e-6, - 2490.2324075130828), - TestValue(14, 180, 0.0004, -10.467069325725546, -2.04937816187569e-6, - 2491.084720678314), - TestValue(1525, 180, 0.0004, -15.159228863591125, - 0.000016604901371824113, 2487.4167692289852), - TestValue(10233, 180, 0.0004, -17.08144177432405, 0.00012411083530925487, - 2440.94300115826), - TestValue(0, 180, 0.065, -0.5152345838836883, -0.00036098075694887956, - -6.927046886659846), - TestValue(6, 180, 0.065, -4.897099604874426, -0.0003489480650505836, - 10.617175935000475), - TestValue(14, 180, 0.065, -5.689219198051667, -0.0003329044758528556, - 11.4626317745298), - TestValue(1525, 180, 0.065, -10.618383986015033, 0.0026973284338680167, - 7.7929628140754765), - TestValue(10233, 180, 0.065, -15.542242814932251, 0.020160775275594924, - -38.6634853761835), - TestValue(0, 180, 4.42, -16.491356225074536, -0.023967031775295522, - -2.755043100796684), - TestValue(6, 180, 4.42, -11.802883319144515, -0.023168130716119003, - -1.8613752566654882), - TestValue(14, 180, 4.42, -9.653376579596795, -0.022102929303883648, - -1.313682997645138), - TestValue(1525, 180, 4.42, -30.756932642065294, 0.1790869874320693, - -5.0606677133089075), - TestValue(10233, 180, 4.42, -235.49737914944126, 1.3385587246502548, - -50.37753458197702), - TestValue(0, 180, 800, -162.35267519735217, -0.8163265306122449, - -0.01926737460893513), - TestValue(6, 180, 800, -138.9731231908616, -0.7891156462585034, - -0.017913154212997107), - TestValue(14, 180, 800, -117.57055678993851, -0.7528344671201814, - -0.016193696733894036), - TestValue(1525, 180, 800, -1255.1060610431614, 6.099773242630386, - -0.5081161722061651), - TestValue(10233, 180, 800, -14640.50246307096, 45.59183673469388, - -7.836489965276398), - TestValue(0, 180, 15324, -178.95104102256036, -0.9883900928792569, - -0.00006792118926490787), - TestValue(6, 180, 15324, -154.44163935947577, -0.9554437564499484, - -0.00006343927721985665), - TestValue(14, 180, 15324, -131.5984192349756, -0.911515307877537, - -0.000057701678183974536), - TestValue(1525, 180, 15324, -1861.5172673616398, 7.38547041623667, - -0.0035556000115217756), - TestValue(10233, 180, 15324, -28577.644697168085, 55.2015866873065, - -0.14858705144088802), - TestValue(0, 1123, 0.0004, -0.005939122128713381, -3.5618865318302646e-7, - -13.847805677972104), - TestValue(6, 1123, 0.0004, -9.620833523075628, -3.5428559715533445e-7, - 2488.429599570756), - TestValue(14, 1123, 0.0004, -10.467775521386166, -3.517481891184117e-7, - 2489.3192333086026), - TestValue(1525, 1123, 0.0004, -15.157115486355906, 1.2750475385536657e-7, - 2492.70020501204), - TestValue(10233, 1123, 0.0004, -17.063078998820856, - 2.8894734020457448e-6, 2486.849880233364), - TestValue(0, 1123, 0.065, -0.6342170147837343, -0.000057877326779839104, - -8.75724272015346), - TestValue(6, 1123, 0.065, -5.014263034227778, -0.000057568097963562137, - 8.814958879676311), - TestValue(14, 1123, 0.065, -5.803957292009425, -0.000057155792875192846, - 9.697719756764902), - TestValue(1525, 1123, 0.065, -10.275036857130544, - 0.000020718330690556827, 13.074039765317043), - TestValue(10233, 1123, 0.065, -12.558918107941281, 0.0004695124193805291, - 7.224124958319663), - TestValue(0, 1123, 4.42, -24.493639593452325, -0.00392045555338738, - -4.545467874886493), - TestValue(6, 1123, 4.42, -19.68318216630322, -0.003899509219175159, - -3.624587483847729), - TestValue(14, 1123, 4.42, -17.37102939846337, -0.003871580773558864, - -3.040611828950623), - TestValue(1525, 1123, 4.42, -7.7548168672583415, 0.0014034043922188128, - 0.0654298516080507), - TestValue(10233, 1123, 4.42, -35.45506157865748, 0.031803517445555686, - -5.756960605210265), - TestValue(0, 1123, 800, -701.6240143366822, -0.4160166406656266, - -0.29304665858647905), - TestValue(6, 1123, 800, -671.3041847506472, -0.4137939337698174, - -0.28869011401594236), - TestValue(14, 1123, 800, -640.6479149103316, -0.4108303245754051, - -0.2829675576373729), - TestValue(1525, 1123, 800, -30.39018204828426, 0.14892136201921807, - -0.018804728472968435), - TestValue(10233, 1123, 800, -3343.1303902972795, 3.3748099701370067, - -2.9898053694742615), - TestValue(0, 1123, 15324, -1083.757151397245, -0.9317200705295798, - -0.002442933450309326), - TestValue(6, 1123, 15324, -1048.6172073187354, -0.9267420470004815, - -0.002416262805940761), - TestValue(14, 1123, 15324, -1011.5999306403351, -0.920104682295017, - -0.00238094023047708), - TestValue(1525, 1123, 15324, -64.3938471491183, 0.33352757644959136, - -0.00029097614079454104), - TestValue(10233, 1123, 15324, -11352.060718035325, 7.558299058347705, - -0.11311918072723515), - TestValue(0, 10586, 0.0004, -0.006836533480423993, -3.778575334268833e-8, - -16.091333738845734), - TestValue(6, 10586, 0.0004, -9.621729024009568, -3.776433689454398e-8, - 2486.19084755338), - TestValue(14, 10586, 0.0004, -10.468668475096411, -3.7735781630351504e-8, - 2487.0868493492235), - TestValue(1525, 10586, 0.0004, -15.157527333190956, - -3.234240610599839e-8, 2491.6705880068075), - TestValue(10233, 10586, 0.0004, -17.060718192660715, - -1.2600010324928188e-9, 2492.7518943576556), - TestValue(0, 10586, 0.065, -0.7800430171085975, -6.1401474485561915e-6, - -11.00066794181818), - TestValue(6, 10586, 0.065, -5.159778603540011, -6.1366672969700086e-6, - 6.57630939764217), - TestValue(14, 10586, 0.065, -5.949058950638154, -6.132027094855097e-6, - 7.465437927571536), - TestValue(1525, 10586, 0.065, -10.34196113541293, -5.255608920401252e-6, - 12.044448366424728), - TestValue(10233, 10586, 0.065, -12.175300607224926, - -2.047489183204549e-7, 13.125723676609066), - TestValue(0, 10586, 4.42, -34.3945190758502, -0.0004173583295091224, - -6.781982760105572), - TestValue(6, 10586, 4.42, -29.562997357281894, -0.00041712177651676886, - -5.856347033468785), - TestValue(14, 10586, 4.42, -27.2227588675498, -0.0004168063725269641, - -5.266030931107645), - TestValue(1525, 10586, 4.42, -12.301855613945008, -0.0003572344439525938, - -0.9624372357797295), - TestValue(10233, 10586, 4.42, -9.430792045634007, - -0.00001391720105013416, 0.11674937200192481), - TestValue(0, 10586, 800, -2124.4224654744803, -0.07026172492534692, - -1.7257898067684474), - TestValue(6, 10586, 800, -2091.312452085902, -0.07022190154073024, - -1.7188401003298583), - TestValue(14, 10586, 800, -2056.9359371755286, -0.07016880369457469, - -1.7096599947938858), - TestValue(1525, 10586, 800, -744.0169167062886, -0.060139948001942986, - -0.7924525685250288), - TestValue(10233, 10586, 800, -7.2703661972227565, -0.0023429424616141564, - 0.00008904830662359586), - TestValue(0, 10586, 15324, -8048.29915678056, -0.5914318795831726, - -0.11664064731878732), - TestValue(6, 10586, 15324, -8002.424955944863, -0.5910966640836922, - -0.11648073932479441), - TestValue(14, 10586, 15324, -7951.095336923546, -0.590649710084385, - -0.11626776694982688), - TestValue(1525, 10586, 15324, -4300.645593413912, -0.506231273465249, - -0.08062419697917278), - TestValue(10233, 10586, 15324, -9.327824035135563, -0.019721845219427537, - -0.00008059480749977865)}; +std::array testValues = { TestValue(0,0.0000256,0.0004,-0.000024814156367780882,-0.9398496240601504,-0.0018850149796021398), TestValue(6,0.0000256,0.0004,-26.480362597222488,220276.31578947368,-11595.463497838708), TestValue(14,0.0000256,0.0004,-49.814562438358635,513979.32330827066,-30391.559221530802), TestValue(1525,0.0000256,0.0004,-4301.784727467015,5.5987134868421055e7,-3.580668787634408e6), TestValue(10233,0.0000256,0.0004,-28781.07085289515,3.7568285855263156e8,-2.4041193199521683e7), TestValue(0,0.0000256,0.065,-0.000025594960092480967,-0.9996063088998794,-7.751668684718993e-8), TestValue(6,0.0000256,0.065,-51.41938813644809,234281.72904210034,-74.69380754597304), TestValue(14,0.0000256,0.065,-114.92817109028836,546658.7005733127,-196.83239209326592), TestValue(1525,0.0000256,0.065,-11965.467128123484,5.954685919853104e7,-23429.11268911477), TestValue(10233,0.0000256,0.065,-80237.4790550341,3.995691927102557e8,-157343.697098361), TestValue(0,0.0000256,4.42,-0.000025599925864390194,-0.9999942081783417,-1.677258332222209e-11), TestValue(6,0.0000256,4.42,-67.52038137511191,234372.6425475907,-0.4312559247584902), TestValue(14,0.0000256,4.42,-161.64931287705224,546870.8326033225,-1.650128690902025), TestValue(1525,0.0000256,4.42,-18367.34289180058,5.956996647937967e7,-339.0570825343945), TestValue(10233,0.0000256,4.42,-123371.16336416776,3.997242463550437e8,-2307.279979293951), TestValue(0,0.0000256,800,-0.00002559999998652529,-0.999999968000001,-8.881784197001252e-16), TestValue(6,0.0000256,800,-69.9980790657431,234373.99250003224,-0.000023330384471442756), TestValue(14,0.0000256,800,-173.09898662779824,546873.9825000325,-0.00014060727924558591), TestValue(1525,0.0000256,800,-24826.22813563853,5.957030959375009e7,-0.8389762876176414), TestValue(10233,0.0000256,800,-173733.65594636812,3.997265487087504e8,-10.166635446653597), TestValue(0,0.0000256,15324,-0.000025599996959613236,-0.9999999983294179,0.), TestValue(6,0.0000256,15324,-70.01580732128963,234373.99960845898,-6.386142814562845e-8), TestValue(14,0.0000256,15324,-173.20616504262574,546873.9990864021,-3.872936886750722e-7), TestValue(1525,0.0000256,15324,-25707.717028801628,5.957031140048291e7,-0.004643062913324059), TestValue(10233,0.0000256,15324,-189611.39394380094,3.9972656083222395e8,-0.15627194690990365), TestValue(0,0.0000256,162345,-0.00002560001632012643,-0.9999999998423111,0.), TestValue(6,0.0000256,162345,-70.01669365713798,234373.99996304183,-5.691145332775704e-10), TestValue(14,0.0000256,162345,-173.21154115647926,546873.9999137641,-3.452532482128845e-9), TestValue(1525,0.0000256,162345,-25774.016830882043,5.957031149060642e7,-0.00004381660427021927), TestValue(10233,0.0000256,162345,-192134.409728957,3.9972656143696755e8,-0.001906640534274473), TestValue(0,0.314,0.0004,-0.002666782716971683,-0.001272264631043257,-5.66822905706025), TestValue(6,0.314,0.0004,-9.625197494412376,0.023038524497171847,2477.530549555817), TestValue(14,0.314,0.0004,-10.482321240387563,0.05545291000145865,2452.982014445862), TestValue(1525,0.314,0.0004,-17.094738795518424,6.1777199721236284,-2348.2711549792057), TestValue(10233,0.314,0.0004,-30.083534640958533,41.460778593539814,-30043.568270589793), TestValue(0,0.314,0.065,-0.11460468078714132,-0.17150395778364116,-0.9346528929704305), TestValue(6,0.314,0.065,-5.6231627412658,3.1056417323496293,0.8117566646875254), TestValue(14,0.314,0.065,-7.917539720426937,7.4751693191939905,-19.40653851445296), TestValue(1525,0.314,0.065,-296.58556828610017,832.7696922844226,-4001.4921811261693), TestValue(10233,0.314,0.065,-1936.716591758479,5589.00047056451,-26975.841613138524), TestValue(0,0.314,4.42,-0.30334820230965986,-0.9336713138994508,-0.00230212890163628), TestValue(6,0.314,4.42,-11.748118636048988,16.90718181793719,-0.3435269754367143), TestValue(14,0.314,4.42,-31.109603016060397,40.69498599371937,-1.4423583039713965), TestValue(1525,0.314,4.42,-4115.10160678526,4533.61649969458,-316.1764856190919), TestValue(10233,0.314,4.42,-27734.55588693275,30426.641345033488,-2153.7342775414127), TestValue(0,0.314,800,-0.31393839362010567,-0.9996076539958066,-7.698783210940974e-8), TestValue(6,0.314,800,-13.827010724886122,18.101175543376296,-0.000020465017271042996), TestValue(14,0.314,800,-41.61461010763844,43.568886473205765,-0.00013381877200302483), TestValue(1525,0.314,800,-10469.94267675256,4853.782788344746,-0.8382285160349765), TestValue(10233,0.314,800,-77398.83453431107,32575.386135464123,-10.16161733713528), TestValue(0,0.314,15324,-0.31399678298770084,-0.9999795096863716,-2.099280749234822e-10), TestValue(6,0.314,15324,-13.842565956968983,18.10790921043538,-5.6049177743489054e-8), TestValue(14,0.314,15324,-41.71664028188991,43.58509417059771,-3.687852014877535e-7), TestValue(1525,0.314,15324,-11350.864477542971,4855.588403521258,-0.004641024152967077), TestValue(10233,0.314,15324,-93272.76691554434,32587.50423265796,-0.15625826529496223), TestValue(0,0.314,162345,-0.31399969611972445,-0.9999980658511647,-1.8687273950490635e-12), TestValue(6,0.314,162345,-13.843343876770248,18.108245230667904,-4.995062141688322e-10), TestValue(14,0.314,162345,-41.72175954081669,43.58590295936,-3.2876226185862834e-9), TestValue(1525,0.314,162345,-11417.135986375062,4855.678506466079,-0.0000437984390462276), TestValue(10233,0.314,162345,-95795.59283173154,32588.10894414742,-0.001906518631979992), TestValue(0,1.5,0.0004,-0.003291911100032755,-0.00026659557451346307,-7.230044345656401), TestValue(6,1.5,0.0004,-9.619783961619232,0.0007997867235403892,2491.0537701151675), TestValue(14,1.5,0.0004,-10.468856159359483,0.002221629787612192,2486.6186161358087), TestValue(1525,1.5,0.0004,-15.560537541616213,0.270772238514174,1484.280307752038), TestValue(10233,1.5,0.0004,-19.785223133323598,1.8184484137563317,-4317.601447204935), TestValue(0,1.5,0.065,-0.2067814991501101,-0.04153354632587859,-2.2227873794044952), TestValue(6,1.5,0.065,-4.841004539887443,0.12460063897763578,11.520890928200775), TestValue(14,1.5,0.065,-5.969601492726813,0.34611288604898827,7.298954082323366), TestValue(1525,1.5,0.065,-74.45092758687497,42.184238551650694,-953.4745083343279), TestValue(10233,1.5,0.065,-445.630392408013,283.3003194888179,-6515.787894589817), TestValue(0,1.5,4.42,-1.2915096474038796,-0.7466216216216216,-0.03881837442792935), TestValue(6,1.5,4.42,-4.694711300875651,2.239864864864865,-0.12612961153608993), TestValue(14,1.5,4.42,-13.334103973863655,6.221846846846847,-0.8864094608348823), TestValue(1525,1.5,4.42,-2072.1910365790172,758.3186936936937,-251.67662613527665), TestValue(10233,1.5,4.42,-14020.648493631525,5092.706081081081,-1720.7211329093311), TestValue(0,1.5,800,-1.4985955053447242,-0.9981285090455396,-1.7534272203079126e-6), TestValue(6,1.5,800,-5.63758835785638,2.9943855271366187,-0.00001104786953298742), TestValue(14,1.5,800,-20.926415102269573,8.317737575379496,-0.00010961017476240897), TestValue(1525,1.5,800,-8088.548799680884,1013.7658556872531,-0.8354105724129193), TestValue(10233,1.5,800,-61412.52664040723,6808.234560199626,-10.142698900729565), TestValue(0,1.5,15324,-1.499926590534038,-0.9999021239111285,-4.790177143831897e-9), TestValue(6,1.5,15324,-5.645995699555982,2.9997063717333856,-3.032959305926397e-8), TestValue(14,1.5,15324,-21.010069937864472,8.332517699259403,-3.0266583905813604e-7), TestValue(1525,1.5,15324,-8967.33164084002,1015.5672571857361,-0.004633327525485953), TestValue(10233,1.5,15324,-77272.09898456372,6820.332387197807,-0.15620659350885369), TestValue(0,1.5,162345,-1.4999930703617181,-0.9999907605029982,-4.268407849394862e-11), TestValue(6,1.5,162345,-5.646416676253864,2.999972281508995,-2.703277601767695e-10), TestValue(14,1.5,162345,-21.01427157395574,8.333256337524984,-2.698453016591884e-9), TestValue(1525,1.5,162345,-9033.49633366488,1015.6572824175452,-0.000043729856523455624), TestValue(10233,1.5,162345,-79794.20778485533,6820.936977390951,-0.0019060581989425174), TestValue(0,3,0.0004,-0.003569116649587855,-0.0001333155579256099,-7.922924939527562), TestValue(6,3,0.0004,-9.619261327135609,0.0001333155579256099,2492.360089770114), TestValue(14,3,0.0004,-10.467267071498288,0.0004888237123939031,2490.5905361225123), TestValue(1525,3,0.0004,-15.357522072066786,0.06763542638759276,1991.7174903993568), TestValue(10233,3,0.0004,-18.421373162287637,0.4546060525263298,-908.6583034400528), TestValue(0,3,0.065,-0.25047201260085383,-0.021207177814029365,-2.874622756288704), TestValue(6,3,0.065,-4.758782442354863,0.021207177814029365,12.74533572164111), TestValue(14,3,0.065,-5.719495913883133,0.07775965198477433,11.025105769529759), TestValue(1525,3,0.065,-42.491829475397026,10.75910821098423,-477.2384670870571), TestValue(10233,3,0.065,-230.9301248894044,72.31647634584013,-3316.4438994781904), TestValue(0,3,4.42,-2.2897339760163957,-0.5956873315363881,-0.11372669262607049), TestValue(6,3,4.42,-2.889108195828742,0.5956873315363881,0.003850246852058703), TestValue(14,3,4.42,-7.790064290604171,2.18418688230009,-0.4832453669983474), TestValue(1525,3,4.42,-1360.5497881858591,302.2120395327942,-199.67578957112616), TestValue(10233,3,4.42,-9239.719029853994,2031.2938005390836,-1371.3592560596119), TestValue(0,3,800,-2.994389023067612,-0.9962640099626401,-6.996241475043519e-6), TestValue(6,3,800,-2.9857172436025223,0.9962640099626401,-2.3069406651643476e-6), TestValue(14,3,800,-12.744324478713366,3.65296803652968,-0.00008222425506509978), TestValue(1525,3,800,-7035.84649923785,505.4379410543794,-0.8318616138503963), TestValue(10233,3,800,-54340.180404088605,3397.2602739726026,-10.118854869649681), TestValue(0,3,15324,-2.999706381300726,-0.9998042669798395,-1.9158207464897714e-8), TestValue(6,3,15324,-2.9874796347589054,0.9998042669798395,-6.3824572293924575e-9), TestValue(14,3,15324,-12.807159398982407,3.665948978926078,-2.2763181739549054e-7), TestValue(1525,3,15324,-7911.931224008331,507.2340314477719,-0.004623603455756964), TestValue(10233,3,15324,-70181.6251826905,3409.332550401253,-0.15614126136305728), TestValue(0,3,162345,-2.99997228162999,-0.9999815211767314,-1.7073631397579447e-10), TestValue(6,3,162345,-2.987568240888365,0.9999815211767314,-5.6909144063865824e-11), TestValue(14,3,162345,-12.810319609745221,3.6665989109813486,-2.029739931685981e-9), TestValue(1525,3,162345,-7977.960952690064,507.32395841032843,-0.00004364319426564123), TestValue(10233,3,162345,-72702.82721273272,3409.9369872126545,-0.0019054759497976193), TestValue(0,180,0.0004,-0.0052068020335865025,-2.2222172839615914e-6,-12.01700730618354), TestValue(6,180,0.0004,-9.62011239916672,-2.148143374496205e-6,2490.2324075130828), TestValue(14,180,0.0004,-10.467069325725546,-2.04937816187569e-6,2491.084720678314), TestValue(1525,180,0.0004,-15.159228863591125,0.000016604901371824113,2487.4167692289852), TestValue(10233,180,0.0004,-17.08144177432405,0.00012411083530925487,2440.94300115826), TestValue(0,180,0.065,-0.5152345838836883,-0.00036098075694887956,-6.927046886659846), TestValue(6,180,0.065,-4.897099604874426,-0.0003489480650505836,10.617175935000475), TestValue(14,180,0.065,-5.689219198051667,-0.0003329044758528556,11.4626317745298), TestValue(1525,180,0.065,-10.618383986015033,0.0026973284338680167,7.7929628140754765), TestValue(10233,180,0.065,-15.542242814932251,0.020160775275594924,-38.6634853761835), TestValue(0,180,4.42,-16.491356225074536,-0.023967031775295522,-2.755043100796684), TestValue(6,180,4.42,-11.802883319144515,-0.023168130716119003,-1.8613752566654882), TestValue(14,180,4.42,-9.653376579596795,-0.022102929303883648,-1.313682997645138), TestValue(1525,180,4.42,-30.756932642065294,0.1790869874320693,-5.0606677133089075), TestValue(10233,180,4.42,-235.49737914944126,1.3385587246502548,-50.37753458197702), TestValue(0,180,800,-162.35267519735217,-0.8163265306122449,-0.01926737460893513), TestValue(6,180,800,-138.9731231908616,-0.7891156462585034,-0.017913154212997107), TestValue(14,180,800,-117.57055678993851,-0.7528344671201814,-0.016193696733894036), TestValue(1525,180,800,-1255.1060610431614,6.099773242630386,-0.5081161722061651), TestValue(10233,180,800,-14640.50246307096,45.59183673469388,-7.836489965276398), TestValue(0,180,15324,-178.95104102256036,-0.9883900928792569,-0.00006792118926490787), TestValue(6,180,15324,-154.44163935947577,-0.9554437564499484,-0.00006343927721985665), TestValue(14,180,15324,-131.5984192349756,-0.911515307877537,-0.000057701678183974536), TestValue(1525,180,15324,-1861.5172673616398,7.38547041623667,-0.0035556000115217756), TestValue(10233,180,15324,-28577.644697168085,55.2015866873065,-0.14858705144088802), TestValue(0,180,162345,-179.90028620870413,-0.9988924780802954,-6.137556081142748e-7), TestValue(6,180,162345,-155.32835273471773,-0.9655960621442855,-5.733925689810349e-7), TestValue(14,180,162345,-132.40506485924828,-0.9212008408962724,-5.216997802648393e-7), TestValue(1525,180,162345,-1912.647535667431,7.4639465723222065,-0.00003402677068820026), TestValue(10233,180,162345,-30993.45007826088,55.788144900784495,-0.0018374445009108342), TestValue(0,1123,0.0004,-0.005939122128713381,-3.5618865318302646e-7,-13.847805677972104), TestValue(6,1123,0.0004,-9.620833523075628,-3.5428559715533445e-7,2488.429599570756), TestValue(14,1123,0.0004,-10.467775521386166,-3.517481891184117e-7,2489.3192333086026), TestValue(1525,1123,0.0004,-15.157115486355906,1.2750475385536657e-7,2492.70020501204), TestValue(10233,1123,0.0004,-17.063078998820856,2.8894734020457448e-6,2486.849880233364), TestValue(0,1123,0.065,-0.6342170147837343,-0.000057877326779839104,-8.75724272015346), TestValue(6,1123,0.065,-5.014263034227778,-0.000057568097963562137,8.814958879676311), TestValue(14,1123,0.065,-5.803957292009425,-0.000057155792875192846,9.697719756764902), TestValue(1525,1123,0.065,-10.275036857130544,0.000020718330690556827,13.074039765317043), TestValue(10233,1123,0.065,-12.558918107941281,0.0004695124193805291,7.224124958319663), TestValue(0,1123,4.42,-24.493639593452325,-0.00392045555338738,-4.545467874886493), TestValue(6,1123,4.42,-19.68318216630322,-0.003899509219175159,-3.624587483847729), TestValue(14,1123,4.42,-17.37102939846337,-0.003871580773558864,-3.040611828950623), TestValue(1525,1123,4.42,-7.7548168672583415,0.0014034043922188128,0.0654298516080507), TestValue(10233,1123,4.42,-35.45506157865748,0.031803517445555686,-5.756960605210265), TestValue(0,1123,800,-701.6240143366822,-0.4160166406656266,-0.29304665858647905), TestValue(6,1123,800,-671.3041847506472,-0.4137939337698174,-0.28869011401594236), TestValue(14,1123,800,-640.6479149103316,-0.4108303245754051,-0.2829675576373729), TestValue(1525,1123,800,-30.39018204828426,0.14892136201921807,-0.018804728472968435), TestValue(10233,1123,800,-3343.1303902972795,3.3748099701370067,-2.9898053694742615), TestValue(0,1123,15324,-1083.757151397245,-0.9317200705295798,-0.002442933450309326), TestValue(6,1123,15324,-1048.6172073187354,-0.9267420470004815,-0.002416262805940761), TestValue(14,1123,15324,-1011.5999306403351,-0.920104682295017,-0.00238094023047708), TestValue(1525,1123,15324,-64.3938471491183,0.33352757644959136,-0.00029097614079454104), TestValue(10233,1123,15324,-11352.060718035325,7.558299058347705,-0.11311918072723515), TestValue(0,1123,162345,-1119.133717664517,-0.9931301539139159,-0.000023706026173186956), TestValue(6,1123,162345,-1083.611684066063,-0.9878240266445628,-0.00002345269725800847), TestValue(14,1123,162345,-1046.088262691303,-0.9807491902854254,-0.000023117049972043446), TestValue(1525,1123,162345,-68.73051882103027,0.35551052704665553,-2.9902146572169386e-6), TestValue(10233,1123,162345,-13257.287747436989,8.056469903967741,-0.0014973234714386052), TestValue(0,10586,0.0004,-0.006836533480423993,-3.778575334268833e-8,-16.091333738845734), TestValue(6,10586,0.0004,-9.621729024009568,-3.776433689454398e-8,2486.19084755338), TestValue(14,10586,0.0004,-10.468668475096411,-3.7735781630351504e-8,2487.0868493492235), TestValue(1525,10586,0.0004,-15.157527333190956,-3.234240610599839e-8,2491.6705880068075), TestValue(10233,10586,0.0004,-17.060718192660715,-1.2600010324928188e-9,2492.7518943576556), TestValue(0,10586,0.065,-0.7800430171085975,-6.1401474485561915e-6,-11.00066794181818), TestValue(6,10586,0.065,-5.159778603540011,-6.1366672969700086e-6,6.57630939764217), TestValue(14,10586,0.065,-5.949058950638154,-6.132027094855097e-6,7.465437927571536), TestValue(1525,10586,0.065,-10.34196113541293,-5.255608920401252e-6,12.044448366424728), TestValue(10233,10586,0.065,-12.175300607224926,-2.047489183204549e-7,13.125723676609066), TestValue(0,10586,4.42,-34.3945190758502,-0.0004173583295091224,-6.781982760105572), TestValue(6,10586,4.42,-29.562997357281894,-0.00041712177651676886,-5.856347033468785), TestValue(14,10586,4.42,-27.2227588675498,-0.0004168063725269641,-5.266030931107645), TestValue(1525,10586,4.42,-12.301855613945008,-0.0003572344439525938,-0.9624372357797295), TestValue(10233,10586,4.42,-9.430792045634007,-0.00001391720105013416,0.11674937200192481), TestValue(0,10586,800,-2124.4224654744803,-0.07026172492534692,-1.7257898067684474), TestValue(6,10586,800,-2091.312452085902,-0.07022190154073024,-1.7188401003298583), TestValue(14,10586,800,-2056.9359371755286,-0.07016880369457469,-1.7096599947938858), TestValue(1525,10586,800,-744.0169167062886,-0.060139948001942986,-0.7924525685250288), TestValue(10233,10586,800,-7.2703661972227565,-0.0023429424616141564,0.00008904830662359586), TestValue(0,10586,15324,-8048.29915678056,-0.5914318795831726,-0.11664064731878732), TestValue(6,10586,15324,-8002.424955944863,-0.5910966640836922,-0.11648073932479441), TestValue(14,10586,15324,-7951.095336923546,-0.590649710084385,-0.11626776694982688), TestValue(1525,10586,15324,-4300.645593413912,-0.506231273465249,-0.08062419697917278), TestValue(10233,10586,15324,-9.327824035135563,-0.019721845219427537,-0.00008059480749977865), TestValue(0,10586,162345,-10255.166530843997,-0.9387848332571951,-0.0019538038497231014), TestValue(6,10586,162345,-10206.520977570348,-0.93825274285482,-0.001951542008541196), TestValue(14,10586,162345,-10151.499529961993,-0.9375432889849864,-0.0019485283448990032), TestValue(1525,10586,162345,-5869.2020812217015,-0.8035451893201818,-0.0014225911704155436), TestValue(10233,10586,162345,-11.157754570856923,-0.03130465200640373,-1.9036241010184085e-6),}; TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { using stan::math::is_nan; @@ -441,12 +91,8 @@ TEST(ProbDistributionsNegBinomial, derivativesFiniteDiffs) { using stan::math::neg_binomial_2_log; using stan::math::var; - // The range of values tested has to be quite conservative to let the test - // pass - std::array n_to_test = {100}; - std::array mu_to_test = {8}; - // std::array n_to_test = {7, 100, 835}; - // std::array mu_to_test = {8, 24}; + std::array n_to_test = {7, 100, 835}; + std::array mu_to_test = {8, 24}; // std::array n_to_test = {0, 7, 100, 835}; // std::array mu_to_test = {0.8, 8, 24, 271}; double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; @@ -469,6 +115,9 @@ TEST(ProbDistributionsNegBinomial, derivativesFiniteDiffs) { std::vector gradients; val.grad(x, gradients); + EXPECT_TRUE(value_of(val) < 0) << "for n = " << n << ", mu = " << + mu_dbl << ", phi = " << phi_dbl; + for (int i = 0; i < 2; ++i) { EXPECT_FALSE(is_nan(gradients[i])); } @@ -483,12 +132,16 @@ TEST(ProbDistributionsNegBinomial, derivativesFiniteDiffs) { finite_diffs.push_back(dmu * inv2e); finite_diffs.push_back(dphi * inv2e); - for (int i = 0; i < 2; ++i) { - EXPECT_NEAR(gradients[i], finite_diffs[i], - std::max(1.0, gradients[i] * 1e-4)) - << "for i = " << i << ", n = " << n << ", mu = " << mu_dbl - << " +/- epsilon, phi = " << phi_dbl << " +/- epsilon"; - } + EXPECT_NEAR(gradients[0], finite_diffs[0], + std::max(1.0, gradients[0] * 1e-4)) + << "grad_mu, n = " << n << ", mu = " << mu_dbl + << " +/- epsilon, phi = " << phi_dbl << " +/- epsilon, dmu = " << + dmu; + EXPECT_NEAR(gradients[1], finite_diffs[1], + std::max(1.0, gradients[1] * 1e-4)) + << "grad_phi, n = " << n << ", mu = " << mu_dbl + << " +/- epsilon, phi = " << phi_dbl << " +/- epsilon, dphi = " << + dphi; phi_dbl *= 10; } @@ -502,7 +155,7 @@ TEST(ProbDistributionsNegativeBinomial2, proptoAtPoissonCutoff) { using stan::math::var; var mu_var(10); - int y = 11.8; + int y = 11; var value_before_cutoff = neg_binomial_2_lpmf( y, mu_var, neg_binomial_2_phi_cutoff - 1e-8); var value_after_cutoff = neg_binomial_2_lpmf( From a6eccc83c9b90afc1a3f8a9662e15595621abe6e Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Wed, 11 Dec 2019 08:03:19 +0000 Subject: [PATCH 10/82] [Jenkins] auto-formatting by clang-format version 5.0.0-3~16.04.1 (tags/RELEASE_500/final) --- .../rev/scal/prob/neg_binomial_2_test.cpp | 435 +++++++++++++++++- 1 file changed, 428 insertions(+), 7 deletions(-) diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index 50bc6b3861f..fd01952f017 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -51,7 +51,428 @@ struct TestValue { // WriteString[out,"};"]; // Close[out]; // FilePrint[%] -std::array testValues = { TestValue(0,0.0000256,0.0004,-0.000024814156367780882,-0.9398496240601504,-0.0018850149796021398), TestValue(6,0.0000256,0.0004,-26.480362597222488,220276.31578947368,-11595.463497838708), TestValue(14,0.0000256,0.0004,-49.814562438358635,513979.32330827066,-30391.559221530802), TestValue(1525,0.0000256,0.0004,-4301.784727467015,5.5987134868421055e7,-3.580668787634408e6), TestValue(10233,0.0000256,0.0004,-28781.07085289515,3.7568285855263156e8,-2.4041193199521683e7), TestValue(0,0.0000256,0.065,-0.000025594960092480967,-0.9996063088998794,-7.751668684718993e-8), TestValue(6,0.0000256,0.065,-51.41938813644809,234281.72904210034,-74.69380754597304), TestValue(14,0.0000256,0.065,-114.92817109028836,546658.7005733127,-196.83239209326592), TestValue(1525,0.0000256,0.065,-11965.467128123484,5.954685919853104e7,-23429.11268911477), TestValue(10233,0.0000256,0.065,-80237.4790550341,3.995691927102557e8,-157343.697098361), TestValue(0,0.0000256,4.42,-0.000025599925864390194,-0.9999942081783417,-1.677258332222209e-11), TestValue(6,0.0000256,4.42,-67.52038137511191,234372.6425475907,-0.4312559247584902), TestValue(14,0.0000256,4.42,-161.64931287705224,546870.8326033225,-1.650128690902025), TestValue(1525,0.0000256,4.42,-18367.34289180058,5.956996647937967e7,-339.0570825343945), TestValue(10233,0.0000256,4.42,-123371.16336416776,3.997242463550437e8,-2307.279979293951), TestValue(0,0.0000256,800,-0.00002559999998652529,-0.999999968000001,-8.881784197001252e-16), TestValue(6,0.0000256,800,-69.9980790657431,234373.99250003224,-0.000023330384471442756), TestValue(14,0.0000256,800,-173.09898662779824,546873.9825000325,-0.00014060727924558591), TestValue(1525,0.0000256,800,-24826.22813563853,5.957030959375009e7,-0.8389762876176414), TestValue(10233,0.0000256,800,-173733.65594636812,3.997265487087504e8,-10.166635446653597), TestValue(0,0.0000256,15324,-0.000025599996959613236,-0.9999999983294179,0.), TestValue(6,0.0000256,15324,-70.01580732128963,234373.99960845898,-6.386142814562845e-8), TestValue(14,0.0000256,15324,-173.20616504262574,546873.9990864021,-3.872936886750722e-7), TestValue(1525,0.0000256,15324,-25707.717028801628,5.957031140048291e7,-0.004643062913324059), TestValue(10233,0.0000256,15324,-189611.39394380094,3.9972656083222395e8,-0.15627194690990365), TestValue(0,0.0000256,162345,-0.00002560001632012643,-0.9999999998423111,0.), TestValue(6,0.0000256,162345,-70.01669365713798,234373.99996304183,-5.691145332775704e-10), TestValue(14,0.0000256,162345,-173.21154115647926,546873.9999137641,-3.452532482128845e-9), TestValue(1525,0.0000256,162345,-25774.016830882043,5.957031149060642e7,-0.00004381660427021927), TestValue(10233,0.0000256,162345,-192134.409728957,3.9972656143696755e8,-0.001906640534274473), TestValue(0,0.314,0.0004,-0.002666782716971683,-0.001272264631043257,-5.66822905706025), TestValue(6,0.314,0.0004,-9.625197494412376,0.023038524497171847,2477.530549555817), TestValue(14,0.314,0.0004,-10.482321240387563,0.05545291000145865,2452.982014445862), TestValue(1525,0.314,0.0004,-17.094738795518424,6.1777199721236284,-2348.2711549792057), TestValue(10233,0.314,0.0004,-30.083534640958533,41.460778593539814,-30043.568270589793), TestValue(0,0.314,0.065,-0.11460468078714132,-0.17150395778364116,-0.9346528929704305), TestValue(6,0.314,0.065,-5.6231627412658,3.1056417323496293,0.8117566646875254), TestValue(14,0.314,0.065,-7.917539720426937,7.4751693191939905,-19.40653851445296), TestValue(1525,0.314,0.065,-296.58556828610017,832.7696922844226,-4001.4921811261693), TestValue(10233,0.314,0.065,-1936.716591758479,5589.00047056451,-26975.841613138524), TestValue(0,0.314,4.42,-0.30334820230965986,-0.9336713138994508,-0.00230212890163628), TestValue(6,0.314,4.42,-11.748118636048988,16.90718181793719,-0.3435269754367143), TestValue(14,0.314,4.42,-31.109603016060397,40.69498599371937,-1.4423583039713965), TestValue(1525,0.314,4.42,-4115.10160678526,4533.61649969458,-316.1764856190919), TestValue(10233,0.314,4.42,-27734.55588693275,30426.641345033488,-2153.7342775414127), TestValue(0,0.314,800,-0.31393839362010567,-0.9996076539958066,-7.698783210940974e-8), TestValue(6,0.314,800,-13.827010724886122,18.101175543376296,-0.000020465017271042996), TestValue(14,0.314,800,-41.61461010763844,43.568886473205765,-0.00013381877200302483), TestValue(1525,0.314,800,-10469.94267675256,4853.782788344746,-0.8382285160349765), TestValue(10233,0.314,800,-77398.83453431107,32575.386135464123,-10.16161733713528), TestValue(0,0.314,15324,-0.31399678298770084,-0.9999795096863716,-2.099280749234822e-10), TestValue(6,0.314,15324,-13.842565956968983,18.10790921043538,-5.6049177743489054e-8), TestValue(14,0.314,15324,-41.71664028188991,43.58509417059771,-3.687852014877535e-7), TestValue(1525,0.314,15324,-11350.864477542971,4855.588403521258,-0.004641024152967077), TestValue(10233,0.314,15324,-93272.76691554434,32587.50423265796,-0.15625826529496223), TestValue(0,0.314,162345,-0.31399969611972445,-0.9999980658511647,-1.8687273950490635e-12), TestValue(6,0.314,162345,-13.843343876770248,18.108245230667904,-4.995062141688322e-10), TestValue(14,0.314,162345,-41.72175954081669,43.58590295936,-3.2876226185862834e-9), TestValue(1525,0.314,162345,-11417.135986375062,4855.678506466079,-0.0000437984390462276), TestValue(10233,0.314,162345,-95795.59283173154,32588.10894414742,-0.001906518631979992), TestValue(0,1.5,0.0004,-0.003291911100032755,-0.00026659557451346307,-7.230044345656401), TestValue(6,1.5,0.0004,-9.619783961619232,0.0007997867235403892,2491.0537701151675), TestValue(14,1.5,0.0004,-10.468856159359483,0.002221629787612192,2486.6186161358087), TestValue(1525,1.5,0.0004,-15.560537541616213,0.270772238514174,1484.280307752038), TestValue(10233,1.5,0.0004,-19.785223133323598,1.8184484137563317,-4317.601447204935), TestValue(0,1.5,0.065,-0.2067814991501101,-0.04153354632587859,-2.2227873794044952), TestValue(6,1.5,0.065,-4.841004539887443,0.12460063897763578,11.520890928200775), TestValue(14,1.5,0.065,-5.969601492726813,0.34611288604898827,7.298954082323366), TestValue(1525,1.5,0.065,-74.45092758687497,42.184238551650694,-953.4745083343279), TestValue(10233,1.5,0.065,-445.630392408013,283.3003194888179,-6515.787894589817), TestValue(0,1.5,4.42,-1.2915096474038796,-0.7466216216216216,-0.03881837442792935), TestValue(6,1.5,4.42,-4.694711300875651,2.239864864864865,-0.12612961153608993), TestValue(14,1.5,4.42,-13.334103973863655,6.221846846846847,-0.8864094608348823), TestValue(1525,1.5,4.42,-2072.1910365790172,758.3186936936937,-251.67662613527665), TestValue(10233,1.5,4.42,-14020.648493631525,5092.706081081081,-1720.7211329093311), TestValue(0,1.5,800,-1.4985955053447242,-0.9981285090455396,-1.7534272203079126e-6), TestValue(6,1.5,800,-5.63758835785638,2.9943855271366187,-0.00001104786953298742), TestValue(14,1.5,800,-20.926415102269573,8.317737575379496,-0.00010961017476240897), TestValue(1525,1.5,800,-8088.548799680884,1013.7658556872531,-0.8354105724129193), TestValue(10233,1.5,800,-61412.52664040723,6808.234560199626,-10.142698900729565), TestValue(0,1.5,15324,-1.499926590534038,-0.9999021239111285,-4.790177143831897e-9), TestValue(6,1.5,15324,-5.645995699555982,2.9997063717333856,-3.032959305926397e-8), TestValue(14,1.5,15324,-21.010069937864472,8.332517699259403,-3.0266583905813604e-7), TestValue(1525,1.5,15324,-8967.33164084002,1015.5672571857361,-0.004633327525485953), TestValue(10233,1.5,15324,-77272.09898456372,6820.332387197807,-0.15620659350885369), TestValue(0,1.5,162345,-1.4999930703617181,-0.9999907605029982,-4.268407849394862e-11), TestValue(6,1.5,162345,-5.646416676253864,2.999972281508995,-2.703277601767695e-10), TestValue(14,1.5,162345,-21.01427157395574,8.333256337524984,-2.698453016591884e-9), TestValue(1525,1.5,162345,-9033.49633366488,1015.6572824175452,-0.000043729856523455624), TestValue(10233,1.5,162345,-79794.20778485533,6820.936977390951,-0.0019060581989425174), TestValue(0,3,0.0004,-0.003569116649587855,-0.0001333155579256099,-7.922924939527562), TestValue(6,3,0.0004,-9.619261327135609,0.0001333155579256099,2492.360089770114), TestValue(14,3,0.0004,-10.467267071498288,0.0004888237123939031,2490.5905361225123), TestValue(1525,3,0.0004,-15.357522072066786,0.06763542638759276,1991.7174903993568), TestValue(10233,3,0.0004,-18.421373162287637,0.4546060525263298,-908.6583034400528), TestValue(0,3,0.065,-0.25047201260085383,-0.021207177814029365,-2.874622756288704), TestValue(6,3,0.065,-4.758782442354863,0.021207177814029365,12.74533572164111), TestValue(14,3,0.065,-5.719495913883133,0.07775965198477433,11.025105769529759), TestValue(1525,3,0.065,-42.491829475397026,10.75910821098423,-477.2384670870571), TestValue(10233,3,0.065,-230.9301248894044,72.31647634584013,-3316.4438994781904), TestValue(0,3,4.42,-2.2897339760163957,-0.5956873315363881,-0.11372669262607049), TestValue(6,3,4.42,-2.889108195828742,0.5956873315363881,0.003850246852058703), TestValue(14,3,4.42,-7.790064290604171,2.18418688230009,-0.4832453669983474), TestValue(1525,3,4.42,-1360.5497881858591,302.2120395327942,-199.67578957112616), TestValue(10233,3,4.42,-9239.719029853994,2031.2938005390836,-1371.3592560596119), TestValue(0,3,800,-2.994389023067612,-0.9962640099626401,-6.996241475043519e-6), TestValue(6,3,800,-2.9857172436025223,0.9962640099626401,-2.3069406651643476e-6), TestValue(14,3,800,-12.744324478713366,3.65296803652968,-0.00008222425506509978), TestValue(1525,3,800,-7035.84649923785,505.4379410543794,-0.8318616138503963), TestValue(10233,3,800,-54340.180404088605,3397.2602739726026,-10.118854869649681), TestValue(0,3,15324,-2.999706381300726,-0.9998042669798395,-1.9158207464897714e-8), TestValue(6,3,15324,-2.9874796347589054,0.9998042669798395,-6.3824572293924575e-9), TestValue(14,3,15324,-12.807159398982407,3.665948978926078,-2.2763181739549054e-7), TestValue(1525,3,15324,-7911.931224008331,507.2340314477719,-0.004623603455756964), TestValue(10233,3,15324,-70181.6251826905,3409.332550401253,-0.15614126136305728), TestValue(0,3,162345,-2.99997228162999,-0.9999815211767314,-1.7073631397579447e-10), TestValue(6,3,162345,-2.987568240888365,0.9999815211767314,-5.6909144063865824e-11), TestValue(14,3,162345,-12.810319609745221,3.6665989109813486,-2.029739931685981e-9), TestValue(1525,3,162345,-7977.960952690064,507.32395841032843,-0.00004364319426564123), TestValue(10233,3,162345,-72702.82721273272,3409.9369872126545,-0.0019054759497976193), TestValue(0,180,0.0004,-0.0052068020335865025,-2.2222172839615914e-6,-12.01700730618354), TestValue(6,180,0.0004,-9.62011239916672,-2.148143374496205e-6,2490.2324075130828), TestValue(14,180,0.0004,-10.467069325725546,-2.04937816187569e-6,2491.084720678314), TestValue(1525,180,0.0004,-15.159228863591125,0.000016604901371824113,2487.4167692289852), TestValue(10233,180,0.0004,-17.08144177432405,0.00012411083530925487,2440.94300115826), TestValue(0,180,0.065,-0.5152345838836883,-0.00036098075694887956,-6.927046886659846), TestValue(6,180,0.065,-4.897099604874426,-0.0003489480650505836,10.617175935000475), TestValue(14,180,0.065,-5.689219198051667,-0.0003329044758528556,11.4626317745298), TestValue(1525,180,0.065,-10.618383986015033,0.0026973284338680167,7.7929628140754765), TestValue(10233,180,0.065,-15.542242814932251,0.020160775275594924,-38.6634853761835), TestValue(0,180,4.42,-16.491356225074536,-0.023967031775295522,-2.755043100796684), TestValue(6,180,4.42,-11.802883319144515,-0.023168130716119003,-1.8613752566654882), TestValue(14,180,4.42,-9.653376579596795,-0.022102929303883648,-1.313682997645138), TestValue(1525,180,4.42,-30.756932642065294,0.1790869874320693,-5.0606677133089075), TestValue(10233,180,4.42,-235.49737914944126,1.3385587246502548,-50.37753458197702), TestValue(0,180,800,-162.35267519735217,-0.8163265306122449,-0.01926737460893513), TestValue(6,180,800,-138.9731231908616,-0.7891156462585034,-0.017913154212997107), TestValue(14,180,800,-117.57055678993851,-0.7528344671201814,-0.016193696733894036), TestValue(1525,180,800,-1255.1060610431614,6.099773242630386,-0.5081161722061651), TestValue(10233,180,800,-14640.50246307096,45.59183673469388,-7.836489965276398), TestValue(0,180,15324,-178.95104102256036,-0.9883900928792569,-0.00006792118926490787), TestValue(6,180,15324,-154.44163935947577,-0.9554437564499484,-0.00006343927721985665), TestValue(14,180,15324,-131.5984192349756,-0.911515307877537,-0.000057701678183974536), TestValue(1525,180,15324,-1861.5172673616398,7.38547041623667,-0.0035556000115217756), TestValue(10233,180,15324,-28577.644697168085,55.2015866873065,-0.14858705144088802), TestValue(0,180,162345,-179.90028620870413,-0.9988924780802954,-6.137556081142748e-7), TestValue(6,180,162345,-155.32835273471773,-0.9655960621442855,-5.733925689810349e-7), TestValue(14,180,162345,-132.40506485924828,-0.9212008408962724,-5.216997802648393e-7), TestValue(1525,180,162345,-1912.647535667431,7.4639465723222065,-0.00003402677068820026), TestValue(10233,180,162345,-30993.45007826088,55.788144900784495,-0.0018374445009108342), TestValue(0,1123,0.0004,-0.005939122128713381,-3.5618865318302646e-7,-13.847805677972104), TestValue(6,1123,0.0004,-9.620833523075628,-3.5428559715533445e-7,2488.429599570756), TestValue(14,1123,0.0004,-10.467775521386166,-3.517481891184117e-7,2489.3192333086026), TestValue(1525,1123,0.0004,-15.157115486355906,1.2750475385536657e-7,2492.70020501204), TestValue(10233,1123,0.0004,-17.063078998820856,2.8894734020457448e-6,2486.849880233364), TestValue(0,1123,0.065,-0.6342170147837343,-0.000057877326779839104,-8.75724272015346), TestValue(6,1123,0.065,-5.014263034227778,-0.000057568097963562137,8.814958879676311), TestValue(14,1123,0.065,-5.803957292009425,-0.000057155792875192846,9.697719756764902), TestValue(1525,1123,0.065,-10.275036857130544,0.000020718330690556827,13.074039765317043), TestValue(10233,1123,0.065,-12.558918107941281,0.0004695124193805291,7.224124958319663), TestValue(0,1123,4.42,-24.493639593452325,-0.00392045555338738,-4.545467874886493), TestValue(6,1123,4.42,-19.68318216630322,-0.003899509219175159,-3.624587483847729), TestValue(14,1123,4.42,-17.37102939846337,-0.003871580773558864,-3.040611828950623), TestValue(1525,1123,4.42,-7.7548168672583415,0.0014034043922188128,0.0654298516080507), TestValue(10233,1123,4.42,-35.45506157865748,0.031803517445555686,-5.756960605210265), TestValue(0,1123,800,-701.6240143366822,-0.4160166406656266,-0.29304665858647905), TestValue(6,1123,800,-671.3041847506472,-0.4137939337698174,-0.28869011401594236), TestValue(14,1123,800,-640.6479149103316,-0.4108303245754051,-0.2829675576373729), TestValue(1525,1123,800,-30.39018204828426,0.14892136201921807,-0.018804728472968435), TestValue(10233,1123,800,-3343.1303902972795,3.3748099701370067,-2.9898053694742615), TestValue(0,1123,15324,-1083.757151397245,-0.9317200705295798,-0.002442933450309326), TestValue(6,1123,15324,-1048.6172073187354,-0.9267420470004815,-0.002416262805940761), TestValue(14,1123,15324,-1011.5999306403351,-0.920104682295017,-0.00238094023047708), TestValue(1525,1123,15324,-64.3938471491183,0.33352757644959136,-0.00029097614079454104), TestValue(10233,1123,15324,-11352.060718035325,7.558299058347705,-0.11311918072723515), TestValue(0,1123,162345,-1119.133717664517,-0.9931301539139159,-0.000023706026173186956), TestValue(6,1123,162345,-1083.611684066063,-0.9878240266445628,-0.00002345269725800847), TestValue(14,1123,162345,-1046.088262691303,-0.9807491902854254,-0.000023117049972043446), TestValue(1525,1123,162345,-68.73051882103027,0.35551052704665553,-2.9902146572169386e-6), TestValue(10233,1123,162345,-13257.287747436989,8.056469903967741,-0.0014973234714386052), TestValue(0,10586,0.0004,-0.006836533480423993,-3.778575334268833e-8,-16.091333738845734), TestValue(6,10586,0.0004,-9.621729024009568,-3.776433689454398e-8,2486.19084755338), TestValue(14,10586,0.0004,-10.468668475096411,-3.7735781630351504e-8,2487.0868493492235), TestValue(1525,10586,0.0004,-15.157527333190956,-3.234240610599839e-8,2491.6705880068075), TestValue(10233,10586,0.0004,-17.060718192660715,-1.2600010324928188e-9,2492.7518943576556), TestValue(0,10586,0.065,-0.7800430171085975,-6.1401474485561915e-6,-11.00066794181818), TestValue(6,10586,0.065,-5.159778603540011,-6.1366672969700086e-6,6.57630939764217), TestValue(14,10586,0.065,-5.949058950638154,-6.132027094855097e-6,7.465437927571536), TestValue(1525,10586,0.065,-10.34196113541293,-5.255608920401252e-6,12.044448366424728), TestValue(10233,10586,0.065,-12.175300607224926,-2.047489183204549e-7,13.125723676609066), TestValue(0,10586,4.42,-34.3945190758502,-0.0004173583295091224,-6.781982760105572), TestValue(6,10586,4.42,-29.562997357281894,-0.00041712177651676886,-5.856347033468785), TestValue(14,10586,4.42,-27.2227588675498,-0.0004168063725269641,-5.266030931107645), TestValue(1525,10586,4.42,-12.301855613945008,-0.0003572344439525938,-0.9624372357797295), TestValue(10233,10586,4.42,-9.430792045634007,-0.00001391720105013416,0.11674937200192481), TestValue(0,10586,800,-2124.4224654744803,-0.07026172492534692,-1.7257898067684474), TestValue(6,10586,800,-2091.312452085902,-0.07022190154073024,-1.7188401003298583), TestValue(14,10586,800,-2056.9359371755286,-0.07016880369457469,-1.7096599947938858), TestValue(1525,10586,800,-744.0169167062886,-0.060139948001942986,-0.7924525685250288), TestValue(10233,10586,800,-7.2703661972227565,-0.0023429424616141564,0.00008904830662359586), TestValue(0,10586,15324,-8048.29915678056,-0.5914318795831726,-0.11664064731878732), TestValue(6,10586,15324,-8002.424955944863,-0.5910966640836922,-0.11648073932479441), TestValue(14,10586,15324,-7951.095336923546,-0.590649710084385,-0.11626776694982688), TestValue(1525,10586,15324,-4300.645593413912,-0.506231273465249,-0.08062419697917278), TestValue(10233,10586,15324,-9.327824035135563,-0.019721845219427537,-0.00008059480749977865), TestValue(0,10586,162345,-10255.166530843997,-0.9387848332571951,-0.0019538038497231014), TestValue(6,10586,162345,-10206.520977570348,-0.93825274285482,-0.001951542008541196), TestValue(14,10586,162345,-10151.499529961993,-0.9375432889849864,-0.0019485283448990032), TestValue(1525,10586,162345,-5869.2020812217015,-0.8035451893201818,-0.0014225911704155436), TestValue(10233,10586,162345,-11.157754570856923,-0.03130465200640373,-1.9036241010184085e-6),}; +std::array testValues = { + TestValue(0, 0.0000256, 0.0004, -0.000024814156367780882, + -0.9398496240601504, -0.0018850149796021398), + TestValue(6, 0.0000256, 0.0004, -26.480362597222488, 220276.31578947368, + -11595.463497838708), + TestValue(14, 0.0000256, 0.0004, -49.814562438358635, 513979.32330827066, + -30391.559221530802), + TestValue(1525, 0.0000256, 0.0004, -4301.784727467015, 5.5987134868421055e7, + -3.580668787634408e6), + TestValue(10233, 0.0000256, 0.0004, -28781.07085289515, + 3.7568285855263156e8, -2.4041193199521683e7), + TestValue(0, 0.0000256, 0.065, -0.000025594960092480967, + -0.9996063088998794, -7.751668684718993e-8), + TestValue(6, 0.0000256, 0.065, -51.41938813644809, 234281.72904210034, + -74.69380754597304), + TestValue(14, 0.0000256, 0.065, -114.92817109028836, 546658.7005733127, + -196.83239209326592), + TestValue(1525, 0.0000256, 0.065, -11965.467128123484, 5.954685919853104e7, + -23429.11268911477), + TestValue(10233, 0.0000256, 0.065, -80237.4790550341, 3.995691927102557e8, + -157343.697098361), + TestValue(0, 0.0000256, 4.42, -0.000025599925864390194, -0.9999942081783417, + -1.677258332222209e-11), + TestValue(6, 0.0000256, 4.42, -67.52038137511191, 234372.6425475907, + -0.4312559247584902), + TestValue(14, 0.0000256, 4.42, -161.64931287705224, 546870.8326033225, + -1.650128690902025), + TestValue(1525, 0.0000256, 4.42, -18367.34289180058, 5.956996647937967e7, + -339.0570825343945), + TestValue(10233, 0.0000256, 4.42, -123371.16336416776, 3.997242463550437e8, + -2307.279979293951), + TestValue(0, 0.0000256, 800, -0.00002559999998652529, -0.999999968000001, + -8.881784197001252e-16), + TestValue(6, 0.0000256, 800, -69.9980790657431, 234373.99250003224, + -0.000023330384471442756), + TestValue(14, 0.0000256, 800, -173.09898662779824, 546873.9825000325, + -0.00014060727924558591), + TestValue(1525, 0.0000256, 800, -24826.22813563853, 5.957030959375009e7, + -0.8389762876176414), + TestValue(10233, 0.0000256, 800, -173733.65594636812, 3.997265487087504e8, + -10.166635446653597), + TestValue(0, 0.0000256, 15324, -0.000025599996959613236, + -0.9999999983294179, 0.), + TestValue(6, 0.0000256, 15324, -70.01580732128963, 234373.99960845898, + -6.386142814562845e-8), + TestValue(14, 0.0000256, 15324, -173.20616504262574, 546873.9990864021, + -3.872936886750722e-7), + TestValue(1525, 0.0000256, 15324, -25707.717028801628, 5.957031140048291e7, + -0.004643062913324059), + TestValue(10233, 0.0000256, 15324, -189611.39394380094, + 3.9972656083222395e8, -0.15627194690990365), + TestValue(0, 0.0000256, 162345, -0.00002560001632012643, + -0.9999999998423111, 0.), + TestValue(6, 0.0000256, 162345, -70.01669365713798, 234373.99996304183, + -5.691145332775704e-10), + TestValue(14, 0.0000256, 162345, -173.21154115647926, 546873.9999137641, + -3.452532482128845e-9), + TestValue(1525, 0.0000256, 162345, -25774.016830882043, 5.957031149060642e7, + -0.00004381660427021927), + TestValue(10233, 0.0000256, 162345, -192134.409728957, 3.9972656143696755e8, + -0.001906640534274473), + TestValue(0, 0.314, 0.0004, -0.002666782716971683, -0.001272264631043257, + -5.66822905706025), + TestValue(6, 0.314, 0.0004, -9.625197494412376, 0.023038524497171847, + 2477.530549555817), + TestValue(14, 0.314, 0.0004, -10.482321240387563, 0.05545291000145865, + 2452.982014445862), + TestValue(1525, 0.314, 0.0004, -17.094738795518424, 6.1777199721236284, + -2348.2711549792057), + TestValue(10233, 0.314, 0.0004, -30.083534640958533, 41.460778593539814, + -30043.568270589793), + TestValue(0, 0.314, 0.065, -0.11460468078714132, -0.17150395778364116, + -0.9346528929704305), + TestValue(6, 0.314, 0.065, -5.6231627412658, 3.1056417323496293, + 0.8117566646875254), + TestValue(14, 0.314, 0.065, -7.917539720426937, 7.4751693191939905, + -19.40653851445296), + TestValue(1525, 0.314, 0.065, -296.58556828610017, 832.7696922844226, + -4001.4921811261693), + TestValue(10233, 0.314, 0.065, -1936.716591758479, 5589.00047056451, + -26975.841613138524), + TestValue(0, 0.314, 4.42, -0.30334820230965986, -0.9336713138994508, + -0.00230212890163628), + TestValue(6, 0.314, 4.42, -11.748118636048988, 16.90718181793719, + -0.3435269754367143), + TestValue(14, 0.314, 4.42, -31.109603016060397, 40.69498599371937, + -1.4423583039713965), + TestValue(1525, 0.314, 4.42, -4115.10160678526, 4533.61649969458, + -316.1764856190919), + TestValue(10233, 0.314, 4.42, -27734.55588693275, 30426.641345033488, + -2153.7342775414127), + TestValue(0, 0.314, 800, -0.31393839362010567, -0.9996076539958066, + -7.698783210940974e-8), + TestValue(6, 0.314, 800, -13.827010724886122, 18.101175543376296, + -0.000020465017271042996), + TestValue(14, 0.314, 800, -41.61461010763844, 43.568886473205765, + -0.00013381877200302483), + TestValue(1525, 0.314, 800, -10469.94267675256, 4853.782788344746, + -0.8382285160349765), + TestValue(10233, 0.314, 800, -77398.83453431107, 32575.386135464123, + -10.16161733713528), + TestValue(0, 0.314, 15324, -0.31399678298770084, -0.9999795096863716, + -2.099280749234822e-10), + TestValue(6, 0.314, 15324, -13.842565956968983, 18.10790921043538, + -5.6049177743489054e-8), + TestValue(14, 0.314, 15324, -41.71664028188991, 43.58509417059771, + -3.687852014877535e-7), + TestValue(1525, 0.314, 15324, -11350.864477542971, 4855.588403521258, + -0.004641024152967077), + TestValue(10233, 0.314, 15324, -93272.76691554434, 32587.50423265796, + -0.15625826529496223), + TestValue(0, 0.314, 162345, -0.31399969611972445, -0.9999980658511647, + -1.8687273950490635e-12), + TestValue(6, 0.314, 162345, -13.843343876770248, 18.108245230667904, + -4.995062141688322e-10), + TestValue(14, 0.314, 162345, -41.72175954081669, 43.58590295936, + -3.2876226185862834e-9), + TestValue(1525, 0.314, 162345, -11417.135986375062, 4855.678506466079, + -0.0000437984390462276), + TestValue(10233, 0.314, 162345, -95795.59283173154, 32588.10894414742, + -0.001906518631979992), + TestValue(0, 1.5, 0.0004, -0.003291911100032755, -0.00026659557451346307, + -7.230044345656401), + TestValue(6, 1.5, 0.0004, -9.619783961619232, 0.0007997867235403892, + 2491.0537701151675), + TestValue(14, 1.5, 0.0004, -10.468856159359483, 0.002221629787612192, + 2486.6186161358087), + TestValue(1525, 1.5, 0.0004, -15.560537541616213, 0.270772238514174, + 1484.280307752038), + TestValue(10233, 1.5, 0.0004, -19.785223133323598, 1.8184484137563317, + -4317.601447204935), + TestValue(0, 1.5, 0.065, -0.2067814991501101, -0.04153354632587859, + -2.2227873794044952), + TestValue(6, 1.5, 0.065, -4.841004539887443, 0.12460063897763578, + 11.520890928200775), + TestValue(14, 1.5, 0.065, -5.969601492726813, 0.34611288604898827, + 7.298954082323366), + TestValue(1525, 1.5, 0.065, -74.45092758687497, 42.184238551650694, + -953.4745083343279), + TestValue(10233, 1.5, 0.065, -445.630392408013, 283.3003194888179, + -6515.787894589817), + TestValue(0, 1.5, 4.42, -1.2915096474038796, -0.7466216216216216, + -0.03881837442792935), + TestValue(6, 1.5, 4.42, -4.694711300875651, 2.239864864864865, + -0.12612961153608993), + TestValue(14, 1.5, 4.42, -13.334103973863655, 6.221846846846847, + -0.8864094608348823), + TestValue(1525, 1.5, 4.42, -2072.1910365790172, 758.3186936936937, + -251.67662613527665), + TestValue(10233, 1.5, 4.42, -14020.648493631525, 5092.706081081081, + -1720.7211329093311), + TestValue(0, 1.5, 800, -1.4985955053447242, -0.9981285090455396, + -1.7534272203079126e-6), + TestValue(6, 1.5, 800, -5.63758835785638, 2.9943855271366187, + -0.00001104786953298742), + TestValue(14, 1.5, 800, -20.926415102269573, 8.317737575379496, + -0.00010961017476240897), + TestValue(1525, 1.5, 800, -8088.548799680884, 1013.7658556872531, + -0.8354105724129193), + TestValue(10233, 1.5, 800, -61412.52664040723, 6808.234560199626, + -10.142698900729565), + TestValue(0, 1.5, 15324, -1.499926590534038, -0.9999021239111285, + -4.790177143831897e-9), + TestValue(6, 1.5, 15324, -5.645995699555982, 2.9997063717333856, + -3.032959305926397e-8), + TestValue(14, 1.5, 15324, -21.010069937864472, 8.332517699259403, + -3.0266583905813604e-7), + TestValue(1525, 1.5, 15324, -8967.33164084002, 1015.5672571857361, + -0.004633327525485953), + TestValue(10233, 1.5, 15324, -77272.09898456372, 6820.332387197807, + -0.15620659350885369), + TestValue(0, 1.5, 162345, -1.4999930703617181, -0.9999907605029982, + -4.268407849394862e-11), + TestValue(6, 1.5, 162345, -5.646416676253864, 2.999972281508995, + -2.703277601767695e-10), + TestValue(14, 1.5, 162345, -21.01427157395574, 8.333256337524984, + -2.698453016591884e-9), + TestValue(1525, 1.5, 162345, -9033.49633366488, 1015.6572824175452, + -0.000043729856523455624), + TestValue(10233, 1.5, 162345, -79794.20778485533, 6820.936977390951, + -0.0019060581989425174), + TestValue(0, 3, 0.0004, -0.003569116649587855, -0.0001333155579256099, + -7.922924939527562), + TestValue(6, 3, 0.0004, -9.619261327135609, 0.0001333155579256099, + 2492.360089770114), + TestValue(14, 3, 0.0004, -10.467267071498288, 0.0004888237123939031, + 2490.5905361225123), + TestValue(1525, 3, 0.0004, -15.357522072066786, 0.06763542638759276, + 1991.7174903993568), + TestValue(10233, 3, 0.0004, -18.421373162287637, 0.4546060525263298, + -908.6583034400528), + TestValue(0, 3, 0.065, -0.25047201260085383, -0.021207177814029365, + -2.874622756288704), + TestValue(6, 3, 0.065, -4.758782442354863, 0.021207177814029365, + 12.74533572164111), + TestValue(14, 3, 0.065, -5.719495913883133, 0.07775965198477433, + 11.025105769529759), + TestValue(1525, 3, 0.065, -42.491829475397026, 10.75910821098423, + -477.2384670870571), + TestValue(10233, 3, 0.065, -230.9301248894044, 72.31647634584013, + -3316.4438994781904), + TestValue(0, 3, 4.42, -2.2897339760163957, -0.5956873315363881, + -0.11372669262607049), + TestValue(6, 3, 4.42, -2.889108195828742, 0.5956873315363881, + 0.003850246852058703), + TestValue(14, 3, 4.42, -7.790064290604171, 2.18418688230009, + -0.4832453669983474), + TestValue(1525, 3, 4.42, -1360.5497881858591, 302.2120395327942, + -199.67578957112616), + TestValue(10233, 3, 4.42, -9239.719029853994, 2031.2938005390836, + -1371.3592560596119), + TestValue(0, 3, 800, -2.994389023067612, -0.9962640099626401, + -6.996241475043519e-6), + TestValue(6, 3, 800, -2.9857172436025223, 0.9962640099626401, + -2.3069406651643476e-6), + TestValue(14, 3, 800, -12.744324478713366, 3.65296803652968, + -0.00008222425506509978), + TestValue(1525, 3, 800, -7035.84649923785, 505.4379410543794, + -0.8318616138503963), + TestValue(10233, 3, 800, -54340.180404088605, 3397.2602739726026, + -10.118854869649681), + TestValue(0, 3, 15324, -2.999706381300726, -0.9998042669798395, + -1.9158207464897714e-8), + TestValue(6, 3, 15324, -2.9874796347589054, 0.9998042669798395, + -6.3824572293924575e-9), + TestValue(14, 3, 15324, -12.807159398982407, 3.665948978926078, + -2.2763181739549054e-7), + TestValue(1525, 3, 15324, -7911.931224008331, 507.2340314477719, + -0.004623603455756964), + TestValue(10233, 3, 15324, -70181.6251826905, 3409.332550401253, + -0.15614126136305728), + TestValue(0, 3, 162345, -2.99997228162999, -0.9999815211767314, + -1.7073631397579447e-10), + TestValue(6, 3, 162345, -2.987568240888365, 0.9999815211767314, + -5.6909144063865824e-11), + TestValue(14, 3, 162345, -12.810319609745221, 3.6665989109813486, + -2.029739931685981e-9), + TestValue(1525, 3, 162345, -7977.960952690064, 507.32395841032843, + -0.00004364319426564123), + TestValue(10233, 3, 162345, -72702.82721273272, 3409.9369872126545, + -0.0019054759497976193), + TestValue(0, 180, 0.0004, -0.0052068020335865025, -2.2222172839615914e-6, + -12.01700730618354), + TestValue(6, 180, 0.0004, -9.62011239916672, -2.148143374496205e-6, + 2490.2324075130828), + TestValue(14, 180, 0.0004, -10.467069325725546, -2.04937816187569e-6, + 2491.084720678314), + TestValue(1525, 180, 0.0004, -15.159228863591125, 0.000016604901371824113, + 2487.4167692289852), + TestValue(10233, 180, 0.0004, -17.08144177432405, 0.00012411083530925487, + 2440.94300115826), + TestValue(0, 180, 0.065, -0.5152345838836883, -0.00036098075694887956, + -6.927046886659846), + TestValue(6, 180, 0.065, -4.897099604874426, -0.0003489480650505836, + 10.617175935000475), + TestValue(14, 180, 0.065, -5.689219198051667, -0.0003329044758528556, + 11.4626317745298), + TestValue(1525, 180, 0.065, -10.618383986015033, 0.0026973284338680167, + 7.7929628140754765), + TestValue(10233, 180, 0.065, -15.542242814932251, 0.020160775275594924, + -38.6634853761835), + TestValue(0, 180, 4.42, -16.491356225074536, -0.023967031775295522, + -2.755043100796684), + TestValue(6, 180, 4.42, -11.802883319144515, -0.023168130716119003, + -1.8613752566654882), + TestValue(14, 180, 4.42, -9.653376579596795, -0.022102929303883648, + -1.313682997645138), + TestValue(1525, 180, 4.42, -30.756932642065294, 0.1790869874320693, + -5.0606677133089075), + TestValue(10233, 180, 4.42, -235.49737914944126, 1.3385587246502548, + -50.37753458197702), + TestValue(0, 180, 800, -162.35267519735217, -0.8163265306122449, + -0.01926737460893513), + TestValue(6, 180, 800, -138.9731231908616, -0.7891156462585034, + -0.017913154212997107), + TestValue(14, 180, 800, -117.57055678993851, -0.7528344671201814, + -0.016193696733894036), + TestValue(1525, 180, 800, -1255.1060610431614, 6.099773242630386, + -0.5081161722061651), + TestValue(10233, 180, 800, -14640.50246307096, 45.59183673469388, + -7.836489965276398), + TestValue(0, 180, 15324, -178.95104102256036, -0.9883900928792569, + -0.00006792118926490787), + TestValue(6, 180, 15324, -154.44163935947577, -0.9554437564499484, + -0.00006343927721985665), + TestValue(14, 180, 15324, -131.5984192349756, -0.911515307877537, + -0.000057701678183974536), + TestValue(1525, 180, 15324, -1861.5172673616398, 7.38547041623667, + -0.0035556000115217756), + TestValue(10233, 180, 15324, -28577.644697168085, 55.2015866873065, + -0.14858705144088802), + TestValue(0, 180, 162345, -179.90028620870413, -0.9988924780802954, + -6.137556081142748e-7), + TestValue(6, 180, 162345, -155.32835273471773, -0.9655960621442855, + -5.733925689810349e-7), + TestValue(14, 180, 162345, -132.40506485924828, -0.9212008408962724, + -5.216997802648393e-7), + TestValue(1525, 180, 162345, -1912.647535667431, 7.4639465723222065, + -0.00003402677068820026), + TestValue(10233, 180, 162345, -30993.45007826088, 55.788144900784495, + -0.0018374445009108342), + TestValue(0, 1123, 0.0004, -0.005939122128713381, -3.5618865318302646e-7, + -13.847805677972104), + TestValue(6, 1123, 0.0004, -9.620833523075628, -3.5428559715533445e-7, + 2488.429599570756), + TestValue(14, 1123, 0.0004, -10.467775521386166, -3.517481891184117e-7, + 2489.3192333086026), + TestValue(1525, 1123, 0.0004, -15.157115486355906, 1.2750475385536657e-7, + 2492.70020501204), + TestValue(10233, 1123, 0.0004, -17.063078998820856, 2.8894734020457448e-6, + 2486.849880233364), + TestValue(0, 1123, 0.065, -0.6342170147837343, -0.000057877326779839104, + -8.75724272015346), + TestValue(6, 1123, 0.065, -5.014263034227778, -0.000057568097963562137, + 8.814958879676311), + TestValue(14, 1123, 0.065, -5.803957292009425, -0.000057155792875192846, + 9.697719756764902), + TestValue(1525, 1123, 0.065, -10.275036857130544, 0.000020718330690556827, + 13.074039765317043), + TestValue(10233, 1123, 0.065, -12.558918107941281, 0.0004695124193805291, + 7.224124958319663), + TestValue(0, 1123, 4.42, -24.493639593452325, -0.00392045555338738, + -4.545467874886493), + TestValue(6, 1123, 4.42, -19.68318216630322, -0.003899509219175159, + -3.624587483847729), + TestValue(14, 1123, 4.42, -17.37102939846337, -0.003871580773558864, + -3.040611828950623), + TestValue(1525, 1123, 4.42, -7.7548168672583415, 0.0014034043922188128, + 0.0654298516080507), + TestValue(10233, 1123, 4.42, -35.45506157865748, 0.031803517445555686, + -5.756960605210265), + TestValue(0, 1123, 800, -701.6240143366822, -0.4160166406656266, + -0.29304665858647905), + TestValue(6, 1123, 800, -671.3041847506472, -0.4137939337698174, + -0.28869011401594236), + TestValue(14, 1123, 800, -640.6479149103316, -0.4108303245754051, + -0.2829675576373729), + TestValue(1525, 1123, 800, -30.39018204828426, 0.14892136201921807, + -0.018804728472968435), + TestValue(10233, 1123, 800, -3343.1303902972795, 3.3748099701370067, + -2.9898053694742615), + TestValue(0, 1123, 15324, -1083.757151397245, -0.9317200705295798, + -0.002442933450309326), + TestValue(6, 1123, 15324, -1048.6172073187354, -0.9267420470004815, + -0.002416262805940761), + TestValue(14, 1123, 15324, -1011.5999306403351, -0.920104682295017, + -0.00238094023047708), + TestValue(1525, 1123, 15324, -64.3938471491183, 0.33352757644959136, + -0.00029097614079454104), + TestValue(10233, 1123, 15324, -11352.060718035325, 7.558299058347705, + -0.11311918072723515), + TestValue(0, 1123, 162345, -1119.133717664517, -0.9931301539139159, + -0.000023706026173186956), + TestValue(6, 1123, 162345, -1083.611684066063, -0.9878240266445628, + -0.00002345269725800847), + TestValue(14, 1123, 162345, -1046.088262691303, -0.9807491902854254, + -0.000023117049972043446), + TestValue(1525, 1123, 162345, -68.73051882103027, 0.35551052704665553, + -2.9902146572169386e-6), + TestValue(10233, 1123, 162345, -13257.287747436989, 8.056469903967741, + -0.0014973234714386052), + TestValue(0, 10586, 0.0004, -0.006836533480423993, -3.778575334268833e-8, + -16.091333738845734), + TestValue(6, 10586, 0.0004, -9.621729024009568, -3.776433689454398e-8, + 2486.19084755338), + TestValue(14, 10586, 0.0004, -10.468668475096411, -3.7735781630351504e-8, + 2487.0868493492235), + TestValue(1525, 10586, 0.0004, -15.157527333190956, -3.234240610599839e-8, + 2491.6705880068075), + TestValue(10233, 10586, 0.0004, -17.060718192660715, -1.2600010324928188e-9, + 2492.7518943576556), + TestValue(0, 10586, 0.065, -0.7800430171085975, -6.1401474485561915e-6, + -11.00066794181818), + TestValue(6, 10586, 0.065, -5.159778603540011, -6.1366672969700086e-6, + 6.57630939764217), + TestValue(14, 10586, 0.065, -5.949058950638154, -6.132027094855097e-6, + 7.465437927571536), + TestValue(1525, 10586, 0.065, -10.34196113541293, -5.255608920401252e-6, + 12.044448366424728), + TestValue(10233, 10586, 0.065, -12.175300607224926, -2.047489183204549e-7, + 13.125723676609066), + TestValue(0, 10586, 4.42, -34.3945190758502, -0.0004173583295091224, + -6.781982760105572), + TestValue(6, 10586, 4.42, -29.562997357281894, -0.00041712177651676886, + -5.856347033468785), + TestValue(14, 10586, 4.42, -27.2227588675498, -0.0004168063725269641, + -5.266030931107645), + TestValue(1525, 10586, 4.42, -12.301855613945008, -0.0003572344439525938, + -0.9624372357797295), + TestValue(10233, 10586, 4.42, -9.430792045634007, -0.00001391720105013416, + 0.11674937200192481), + TestValue(0, 10586, 800, -2124.4224654744803, -0.07026172492534692, + -1.7257898067684474), + TestValue(6, 10586, 800, -2091.312452085902, -0.07022190154073024, + -1.7188401003298583), + TestValue(14, 10586, 800, -2056.9359371755286, -0.07016880369457469, + -1.7096599947938858), + TestValue(1525, 10586, 800, -744.0169167062886, -0.060139948001942986, + -0.7924525685250288), + TestValue(10233, 10586, 800, -7.2703661972227565, -0.0023429424616141564, + 0.00008904830662359586), + TestValue(0, 10586, 15324, -8048.29915678056, -0.5914318795831726, + -0.11664064731878732), + TestValue(6, 10586, 15324, -8002.424955944863, -0.5910966640836922, + -0.11648073932479441), + TestValue(14, 10586, 15324, -7951.095336923546, -0.590649710084385, + -0.11626776694982688), + TestValue(1525, 10586, 15324, -4300.645593413912, -0.506231273465249, + -0.08062419697917278), + TestValue(10233, 10586, 15324, -9.327824035135563, -0.019721845219427537, + -0.00008059480749977865), + TestValue(0, 10586, 162345, -10255.166530843997, -0.9387848332571951, + -0.0019538038497231014), + TestValue(6, 10586, 162345, -10206.520977570348, -0.93825274285482, + -0.001951542008541196), + TestValue(14, 10586, 162345, -10151.499529961993, -0.9375432889849864, + -0.0019485283448990032), + TestValue(1525, 10586, 162345, -5869.2020812217015, -0.8035451893201818, + -0.0014225911704155436), + TestValue(10233, 10586, 162345, -11.157754570856923, -0.03130465200640373, + -1.9036241010184085e-6), +}; TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { using stan::math::is_nan; @@ -115,8 +536,8 @@ TEST(ProbDistributionsNegBinomial, derivativesFiniteDiffs) { std::vector gradients; val.grad(x, gradients); - EXPECT_TRUE(value_of(val) < 0) << "for n = " << n << ", mu = " << - mu_dbl << ", phi = " << phi_dbl; + EXPECT_TRUE(value_of(val) < 0) + << "for n = " << n << ", mu = " << mu_dbl << ", phi = " << phi_dbl; for (int i = 0; i < 2; ++i) { EXPECT_FALSE(is_nan(gradients[i])); @@ -135,13 +556,13 @@ TEST(ProbDistributionsNegBinomial, derivativesFiniteDiffs) { EXPECT_NEAR(gradients[0], finite_diffs[0], std::max(1.0, gradients[0] * 1e-4)) << "grad_mu, n = " << n << ", mu = " << mu_dbl - << " +/- epsilon, phi = " << phi_dbl << " +/- epsilon, dmu = " << - dmu; + << " +/- epsilon, phi = " << phi_dbl + << " +/- epsilon, dmu = " << dmu; EXPECT_NEAR(gradients[1], finite_diffs[1], std::max(1.0, gradients[1] * 1e-4)) << "grad_phi, n = " << n << ", mu = " << mu_dbl - << " +/- epsilon, phi = " << phi_dbl << " +/- epsilon, dphi = " << - dphi; + << " +/- epsilon, phi = " << phi_dbl + << " +/- epsilon, dphi = " << dphi; phi_dbl *= 10; } From 50653afd67092d03ba53e490f6889e3bb515a0c9 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Wed, 11 Dec 2019 09:14:10 +0100 Subject: [PATCH 11/82] Updated precomputed test values --- .../rev/scal/prob/neg_binomial_2_test.cpp | 633 ++++++------------ 1 file changed, 211 insertions(+), 422 deletions(-) diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index fd01952f017..cdfbf394855 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -51,428 +51,217 @@ struct TestValue { // WriteString[out,"};"]; // Close[out]; // FilePrint[%] -std::array testValues = { - TestValue(0, 0.0000256, 0.0004, -0.000024814156367780882, - -0.9398496240601504, -0.0018850149796021398), - TestValue(6, 0.0000256, 0.0004, -26.480362597222488, 220276.31578947368, - -11595.463497838708), - TestValue(14, 0.0000256, 0.0004, -49.814562438358635, 513979.32330827066, - -30391.559221530802), - TestValue(1525, 0.0000256, 0.0004, -4301.784727467015, 5.5987134868421055e7, - -3.580668787634408e6), - TestValue(10233, 0.0000256, 0.0004, -28781.07085289515, - 3.7568285855263156e8, -2.4041193199521683e7), - TestValue(0, 0.0000256, 0.065, -0.000025594960092480967, - -0.9996063088998794, -7.751668684718993e-8), - TestValue(6, 0.0000256, 0.065, -51.41938813644809, 234281.72904210034, - -74.69380754597304), - TestValue(14, 0.0000256, 0.065, -114.92817109028836, 546658.7005733127, - -196.83239209326592), - TestValue(1525, 0.0000256, 0.065, -11965.467128123484, 5.954685919853104e7, - -23429.11268911477), - TestValue(10233, 0.0000256, 0.065, -80237.4790550341, 3.995691927102557e8, - -157343.697098361), - TestValue(0, 0.0000256, 4.42, -0.000025599925864390194, -0.9999942081783417, - -1.677258332222209e-11), - TestValue(6, 0.0000256, 4.42, -67.52038137511191, 234372.6425475907, - -0.4312559247584902), - TestValue(14, 0.0000256, 4.42, -161.64931287705224, 546870.8326033225, - -1.650128690902025), - TestValue(1525, 0.0000256, 4.42, -18367.34289180058, 5.956996647937967e7, - -339.0570825343945), - TestValue(10233, 0.0000256, 4.42, -123371.16336416776, 3.997242463550437e8, - -2307.279979293951), - TestValue(0, 0.0000256, 800, -0.00002559999998652529, -0.999999968000001, - -8.881784197001252e-16), - TestValue(6, 0.0000256, 800, -69.9980790657431, 234373.99250003224, - -0.000023330384471442756), - TestValue(14, 0.0000256, 800, -173.09898662779824, 546873.9825000325, - -0.00014060727924558591), - TestValue(1525, 0.0000256, 800, -24826.22813563853, 5.957030959375009e7, - -0.8389762876176414), - TestValue(10233, 0.0000256, 800, -173733.65594636812, 3.997265487087504e8, - -10.166635446653597), - TestValue(0, 0.0000256, 15324, -0.000025599996959613236, - -0.9999999983294179, 0.), - TestValue(6, 0.0000256, 15324, -70.01580732128963, 234373.99960845898, - -6.386142814562845e-8), - TestValue(14, 0.0000256, 15324, -173.20616504262574, 546873.9990864021, - -3.872936886750722e-7), - TestValue(1525, 0.0000256, 15324, -25707.717028801628, 5.957031140048291e7, - -0.004643062913324059), - TestValue(10233, 0.0000256, 15324, -189611.39394380094, - 3.9972656083222395e8, -0.15627194690990365), - TestValue(0, 0.0000256, 162345, -0.00002560001632012643, - -0.9999999998423111, 0.), - TestValue(6, 0.0000256, 162345, -70.01669365713798, 234373.99996304183, - -5.691145332775704e-10), - TestValue(14, 0.0000256, 162345, -173.21154115647926, 546873.9999137641, - -3.452532482128845e-9), - TestValue(1525, 0.0000256, 162345, -25774.016830882043, 5.957031149060642e7, - -0.00004381660427021927), - TestValue(10233, 0.0000256, 162345, -192134.409728957, 3.9972656143696755e8, - -0.001906640534274473), - TestValue(0, 0.314, 0.0004, -0.002666782716971683, -0.001272264631043257, - -5.66822905706025), - TestValue(6, 0.314, 0.0004, -9.625197494412376, 0.023038524497171847, - 2477.530549555817), - TestValue(14, 0.314, 0.0004, -10.482321240387563, 0.05545291000145865, - 2452.982014445862), - TestValue(1525, 0.314, 0.0004, -17.094738795518424, 6.1777199721236284, - -2348.2711549792057), - TestValue(10233, 0.314, 0.0004, -30.083534640958533, 41.460778593539814, - -30043.568270589793), - TestValue(0, 0.314, 0.065, -0.11460468078714132, -0.17150395778364116, - -0.9346528929704305), - TestValue(6, 0.314, 0.065, -5.6231627412658, 3.1056417323496293, - 0.8117566646875254), - TestValue(14, 0.314, 0.065, -7.917539720426937, 7.4751693191939905, - -19.40653851445296), - TestValue(1525, 0.314, 0.065, -296.58556828610017, 832.7696922844226, - -4001.4921811261693), - TestValue(10233, 0.314, 0.065, -1936.716591758479, 5589.00047056451, - -26975.841613138524), - TestValue(0, 0.314, 4.42, -0.30334820230965986, -0.9336713138994508, - -0.00230212890163628), - TestValue(6, 0.314, 4.42, -11.748118636048988, 16.90718181793719, - -0.3435269754367143), - TestValue(14, 0.314, 4.42, -31.109603016060397, 40.69498599371937, - -1.4423583039713965), - TestValue(1525, 0.314, 4.42, -4115.10160678526, 4533.61649969458, - -316.1764856190919), - TestValue(10233, 0.314, 4.42, -27734.55588693275, 30426.641345033488, - -2153.7342775414127), - TestValue(0, 0.314, 800, -0.31393839362010567, -0.9996076539958066, - -7.698783210940974e-8), - TestValue(6, 0.314, 800, -13.827010724886122, 18.101175543376296, - -0.000020465017271042996), - TestValue(14, 0.314, 800, -41.61461010763844, 43.568886473205765, - -0.00013381877200302483), - TestValue(1525, 0.314, 800, -10469.94267675256, 4853.782788344746, - -0.8382285160349765), - TestValue(10233, 0.314, 800, -77398.83453431107, 32575.386135464123, - -10.16161733713528), - TestValue(0, 0.314, 15324, -0.31399678298770084, -0.9999795096863716, - -2.099280749234822e-10), - TestValue(6, 0.314, 15324, -13.842565956968983, 18.10790921043538, - -5.6049177743489054e-8), - TestValue(14, 0.314, 15324, -41.71664028188991, 43.58509417059771, - -3.687852014877535e-7), - TestValue(1525, 0.314, 15324, -11350.864477542971, 4855.588403521258, - -0.004641024152967077), - TestValue(10233, 0.314, 15324, -93272.76691554434, 32587.50423265796, - -0.15625826529496223), - TestValue(0, 0.314, 162345, -0.31399969611972445, -0.9999980658511647, - -1.8687273950490635e-12), - TestValue(6, 0.314, 162345, -13.843343876770248, 18.108245230667904, - -4.995062141688322e-10), - TestValue(14, 0.314, 162345, -41.72175954081669, 43.58590295936, - -3.2876226185862834e-9), - TestValue(1525, 0.314, 162345, -11417.135986375062, 4855.678506466079, - -0.0000437984390462276), - TestValue(10233, 0.314, 162345, -95795.59283173154, 32588.10894414742, - -0.001906518631979992), - TestValue(0, 1.5, 0.0004, -0.003291911100032755, -0.00026659557451346307, - -7.230044345656401), - TestValue(6, 1.5, 0.0004, -9.619783961619232, 0.0007997867235403892, - 2491.0537701151675), - TestValue(14, 1.5, 0.0004, -10.468856159359483, 0.002221629787612192, - 2486.6186161358087), - TestValue(1525, 1.5, 0.0004, -15.560537541616213, 0.270772238514174, - 1484.280307752038), - TestValue(10233, 1.5, 0.0004, -19.785223133323598, 1.8184484137563317, - -4317.601447204935), - TestValue(0, 1.5, 0.065, -0.2067814991501101, -0.04153354632587859, - -2.2227873794044952), - TestValue(6, 1.5, 0.065, -4.841004539887443, 0.12460063897763578, - 11.520890928200775), - TestValue(14, 1.5, 0.065, -5.969601492726813, 0.34611288604898827, - 7.298954082323366), - TestValue(1525, 1.5, 0.065, -74.45092758687497, 42.184238551650694, - -953.4745083343279), - TestValue(10233, 1.5, 0.065, -445.630392408013, 283.3003194888179, - -6515.787894589817), - TestValue(0, 1.5, 4.42, -1.2915096474038796, -0.7466216216216216, - -0.03881837442792935), - TestValue(6, 1.5, 4.42, -4.694711300875651, 2.239864864864865, - -0.12612961153608993), - TestValue(14, 1.5, 4.42, -13.334103973863655, 6.221846846846847, - -0.8864094608348823), - TestValue(1525, 1.5, 4.42, -2072.1910365790172, 758.3186936936937, - -251.67662613527665), - TestValue(10233, 1.5, 4.42, -14020.648493631525, 5092.706081081081, - -1720.7211329093311), - TestValue(0, 1.5, 800, -1.4985955053447242, -0.9981285090455396, - -1.7534272203079126e-6), - TestValue(6, 1.5, 800, -5.63758835785638, 2.9943855271366187, - -0.00001104786953298742), - TestValue(14, 1.5, 800, -20.926415102269573, 8.317737575379496, - -0.00010961017476240897), - TestValue(1525, 1.5, 800, -8088.548799680884, 1013.7658556872531, - -0.8354105724129193), - TestValue(10233, 1.5, 800, -61412.52664040723, 6808.234560199626, - -10.142698900729565), - TestValue(0, 1.5, 15324, -1.499926590534038, -0.9999021239111285, - -4.790177143831897e-9), - TestValue(6, 1.5, 15324, -5.645995699555982, 2.9997063717333856, - -3.032959305926397e-8), - TestValue(14, 1.5, 15324, -21.010069937864472, 8.332517699259403, - -3.0266583905813604e-7), - TestValue(1525, 1.5, 15324, -8967.33164084002, 1015.5672571857361, - -0.004633327525485953), - TestValue(10233, 1.5, 15324, -77272.09898456372, 6820.332387197807, - -0.15620659350885369), - TestValue(0, 1.5, 162345, -1.4999930703617181, -0.9999907605029982, - -4.268407849394862e-11), - TestValue(6, 1.5, 162345, -5.646416676253864, 2.999972281508995, - -2.703277601767695e-10), - TestValue(14, 1.5, 162345, -21.01427157395574, 8.333256337524984, - -2.698453016591884e-9), - TestValue(1525, 1.5, 162345, -9033.49633366488, 1015.6572824175452, - -0.000043729856523455624), - TestValue(10233, 1.5, 162345, -79794.20778485533, 6820.936977390951, - -0.0019060581989425174), - TestValue(0, 3, 0.0004, -0.003569116649587855, -0.0001333155579256099, - -7.922924939527562), - TestValue(6, 3, 0.0004, -9.619261327135609, 0.0001333155579256099, - 2492.360089770114), - TestValue(14, 3, 0.0004, -10.467267071498288, 0.0004888237123939031, - 2490.5905361225123), - TestValue(1525, 3, 0.0004, -15.357522072066786, 0.06763542638759276, - 1991.7174903993568), - TestValue(10233, 3, 0.0004, -18.421373162287637, 0.4546060525263298, - -908.6583034400528), - TestValue(0, 3, 0.065, -0.25047201260085383, -0.021207177814029365, - -2.874622756288704), - TestValue(6, 3, 0.065, -4.758782442354863, 0.021207177814029365, - 12.74533572164111), - TestValue(14, 3, 0.065, -5.719495913883133, 0.07775965198477433, - 11.025105769529759), - TestValue(1525, 3, 0.065, -42.491829475397026, 10.75910821098423, - -477.2384670870571), - TestValue(10233, 3, 0.065, -230.9301248894044, 72.31647634584013, - -3316.4438994781904), - TestValue(0, 3, 4.42, -2.2897339760163957, -0.5956873315363881, - -0.11372669262607049), - TestValue(6, 3, 4.42, -2.889108195828742, 0.5956873315363881, - 0.003850246852058703), - TestValue(14, 3, 4.42, -7.790064290604171, 2.18418688230009, - -0.4832453669983474), - TestValue(1525, 3, 4.42, -1360.5497881858591, 302.2120395327942, - -199.67578957112616), - TestValue(10233, 3, 4.42, -9239.719029853994, 2031.2938005390836, - -1371.3592560596119), - TestValue(0, 3, 800, -2.994389023067612, -0.9962640099626401, - -6.996241475043519e-6), - TestValue(6, 3, 800, -2.9857172436025223, 0.9962640099626401, - -2.3069406651643476e-6), - TestValue(14, 3, 800, -12.744324478713366, 3.65296803652968, - -0.00008222425506509978), - TestValue(1525, 3, 800, -7035.84649923785, 505.4379410543794, - -0.8318616138503963), - TestValue(10233, 3, 800, -54340.180404088605, 3397.2602739726026, - -10.118854869649681), - TestValue(0, 3, 15324, -2.999706381300726, -0.9998042669798395, - -1.9158207464897714e-8), - TestValue(6, 3, 15324, -2.9874796347589054, 0.9998042669798395, - -6.3824572293924575e-9), - TestValue(14, 3, 15324, -12.807159398982407, 3.665948978926078, - -2.2763181739549054e-7), - TestValue(1525, 3, 15324, -7911.931224008331, 507.2340314477719, - -0.004623603455756964), - TestValue(10233, 3, 15324, -70181.6251826905, 3409.332550401253, - -0.15614126136305728), - TestValue(0, 3, 162345, -2.99997228162999, -0.9999815211767314, - -1.7073631397579447e-10), - TestValue(6, 3, 162345, -2.987568240888365, 0.9999815211767314, - -5.6909144063865824e-11), - TestValue(14, 3, 162345, -12.810319609745221, 3.6665989109813486, - -2.029739931685981e-9), - TestValue(1525, 3, 162345, -7977.960952690064, 507.32395841032843, - -0.00004364319426564123), - TestValue(10233, 3, 162345, -72702.82721273272, 3409.9369872126545, - -0.0019054759497976193), - TestValue(0, 180, 0.0004, -0.0052068020335865025, -2.2222172839615914e-6, - -12.01700730618354), - TestValue(6, 180, 0.0004, -9.62011239916672, -2.148143374496205e-6, - 2490.2324075130828), - TestValue(14, 180, 0.0004, -10.467069325725546, -2.04937816187569e-6, - 2491.084720678314), - TestValue(1525, 180, 0.0004, -15.159228863591125, 0.000016604901371824113, - 2487.4167692289852), - TestValue(10233, 180, 0.0004, -17.08144177432405, 0.00012411083530925487, - 2440.94300115826), - TestValue(0, 180, 0.065, -0.5152345838836883, -0.00036098075694887956, - -6.927046886659846), - TestValue(6, 180, 0.065, -4.897099604874426, -0.0003489480650505836, - 10.617175935000475), - TestValue(14, 180, 0.065, -5.689219198051667, -0.0003329044758528556, - 11.4626317745298), - TestValue(1525, 180, 0.065, -10.618383986015033, 0.0026973284338680167, - 7.7929628140754765), - TestValue(10233, 180, 0.065, -15.542242814932251, 0.020160775275594924, - -38.6634853761835), - TestValue(0, 180, 4.42, -16.491356225074536, -0.023967031775295522, - -2.755043100796684), - TestValue(6, 180, 4.42, -11.802883319144515, -0.023168130716119003, - -1.8613752566654882), - TestValue(14, 180, 4.42, -9.653376579596795, -0.022102929303883648, - -1.313682997645138), - TestValue(1525, 180, 4.42, -30.756932642065294, 0.1790869874320693, - -5.0606677133089075), - TestValue(10233, 180, 4.42, -235.49737914944126, 1.3385587246502548, - -50.37753458197702), - TestValue(0, 180, 800, -162.35267519735217, -0.8163265306122449, - -0.01926737460893513), - TestValue(6, 180, 800, -138.9731231908616, -0.7891156462585034, - -0.017913154212997107), - TestValue(14, 180, 800, -117.57055678993851, -0.7528344671201814, - -0.016193696733894036), - TestValue(1525, 180, 800, -1255.1060610431614, 6.099773242630386, - -0.5081161722061651), - TestValue(10233, 180, 800, -14640.50246307096, 45.59183673469388, - -7.836489965276398), - TestValue(0, 180, 15324, -178.95104102256036, -0.9883900928792569, - -0.00006792118926490787), - TestValue(6, 180, 15324, -154.44163935947577, -0.9554437564499484, - -0.00006343927721985665), - TestValue(14, 180, 15324, -131.5984192349756, -0.911515307877537, - -0.000057701678183974536), - TestValue(1525, 180, 15324, -1861.5172673616398, 7.38547041623667, - -0.0035556000115217756), - TestValue(10233, 180, 15324, -28577.644697168085, 55.2015866873065, - -0.14858705144088802), - TestValue(0, 180, 162345, -179.90028620870413, -0.9988924780802954, - -6.137556081142748e-7), - TestValue(6, 180, 162345, -155.32835273471773, -0.9655960621442855, - -5.733925689810349e-7), - TestValue(14, 180, 162345, -132.40506485924828, -0.9212008408962724, - -5.216997802648393e-7), - TestValue(1525, 180, 162345, -1912.647535667431, 7.4639465723222065, - -0.00003402677068820026), - TestValue(10233, 180, 162345, -30993.45007826088, 55.788144900784495, - -0.0018374445009108342), - TestValue(0, 1123, 0.0004, -0.005939122128713381, -3.5618865318302646e-7, - -13.847805677972104), - TestValue(6, 1123, 0.0004, -9.620833523075628, -3.5428559715533445e-7, - 2488.429599570756), - TestValue(14, 1123, 0.0004, -10.467775521386166, -3.517481891184117e-7, - 2489.3192333086026), - TestValue(1525, 1123, 0.0004, -15.157115486355906, 1.2750475385536657e-7, - 2492.70020501204), - TestValue(10233, 1123, 0.0004, -17.063078998820856, 2.8894734020457448e-6, - 2486.849880233364), - TestValue(0, 1123, 0.065, -0.6342170147837343, -0.000057877326779839104, - -8.75724272015346), - TestValue(6, 1123, 0.065, -5.014263034227778, -0.000057568097963562137, - 8.814958879676311), - TestValue(14, 1123, 0.065, -5.803957292009425, -0.000057155792875192846, - 9.697719756764902), - TestValue(1525, 1123, 0.065, -10.275036857130544, 0.000020718330690556827, - 13.074039765317043), - TestValue(10233, 1123, 0.065, -12.558918107941281, 0.0004695124193805291, - 7.224124958319663), - TestValue(0, 1123, 4.42, -24.493639593452325, -0.00392045555338738, - -4.545467874886493), - TestValue(6, 1123, 4.42, -19.68318216630322, -0.003899509219175159, - -3.624587483847729), - TestValue(14, 1123, 4.42, -17.37102939846337, -0.003871580773558864, - -3.040611828950623), - TestValue(1525, 1123, 4.42, -7.7548168672583415, 0.0014034043922188128, - 0.0654298516080507), - TestValue(10233, 1123, 4.42, -35.45506157865748, 0.031803517445555686, - -5.756960605210265), - TestValue(0, 1123, 800, -701.6240143366822, -0.4160166406656266, - -0.29304665858647905), - TestValue(6, 1123, 800, -671.3041847506472, -0.4137939337698174, - -0.28869011401594236), - TestValue(14, 1123, 800, -640.6479149103316, -0.4108303245754051, - -0.2829675576373729), - TestValue(1525, 1123, 800, -30.39018204828426, 0.14892136201921807, - -0.018804728472968435), - TestValue(10233, 1123, 800, -3343.1303902972795, 3.3748099701370067, - -2.9898053694742615), - TestValue(0, 1123, 15324, -1083.757151397245, -0.9317200705295798, - -0.002442933450309326), - TestValue(6, 1123, 15324, -1048.6172073187354, -0.9267420470004815, - -0.002416262805940761), - TestValue(14, 1123, 15324, -1011.5999306403351, -0.920104682295017, - -0.00238094023047708), - TestValue(1525, 1123, 15324, -64.3938471491183, 0.33352757644959136, - -0.00029097614079454104), - TestValue(10233, 1123, 15324, -11352.060718035325, 7.558299058347705, - -0.11311918072723515), - TestValue(0, 1123, 162345, -1119.133717664517, -0.9931301539139159, - -0.000023706026173186956), - TestValue(6, 1123, 162345, -1083.611684066063, -0.9878240266445628, - -0.00002345269725800847), - TestValue(14, 1123, 162345, -1046.088262691303, -0.9807491902854254, - -0.000023117049972043446), - TestValue(1525, 1123, 162345, -68.73051882103027, 0.35551052704665553, - -2.9902146572169386e-6), - TestValue(10233, 1123, 162345, -13257.287747436989, 8.056469903967741, - -0.0014973234714386052), - TestValue(0, 10586, 0.0004, -0.006836533480423993, -3.778575334268833e-8, - -16.091333738845734), - TestValue(6, 10586, 0.0004, -9.621729024009568, -3.776433689454398e-8, - 2486.19084755338), - TestValue(14, 10586, 0.0004, -10.468668475096411, -3.7735781630351504e-8, - 2487.0868493492235), - TestValue(1525, 10586, 0.0004, -15.157527333190956, -3.234240610599839e-8, - 2491.6705880068075), - TestValue(10233, 10586, 0.0004, -17.060718192660715, -1.2600010324928188e-9, - 2492.7518943576556), - TestValue(0, 10586, 0.065, -0.7800430171085975, -6.1401474485561915e-6, - -11.00066794181818), - TestValue(6, 10586, 0.065, -5.159778603540011, -6.1366672969700086e-6, - 6.57630939764217), - TestValue(14, 10586, 0.065, -5.949058950638154, -6.132027094855097e-6, - 7.465437927571536), - TestValue(1525, 10586, 0.065, -10.34196113541293, -5.255608920401252e-6, - 12.044448366424728), - TestValue(10233, 10586, 0.065, -12.175300607224926, -2.047489183204549e-7, - 13.125723676609066), - TestValue(0, 10586, 4.42, -34.3945190758502, -0.0004173583295091224, - -6.781982760105572), - TestValue(6, 10586, 4.42, -29.562997357281894, -0.00041712177651676886, - -5.856347033468785), - TestValue(14, 10586, 4.42, -27.2227588675498, -0.0004168063725269641, - -5.266030931107645), - TestValue(1525, 10586, 4.42, -12.301855613945008, -0.0003572344439525938, - -0.9624372357797295), - TestValue(10233, 10586, 4.42, -9.430792045634007, -0.00001391720105013416, - 0.11674937200192481), - TestValue(0, 10586, 800, -2124.4224654744803, -0.07026172492534692, - -1.7257898067684474), - TestValue(6, 10586, 800, -2091.312452085902, -0.07022190154073024, - -1.7188401003298583), - TestValue(14, 10586, 800, -2056.9359371755286, -0.07016880369457469, - -1.7096599947938858), - TestValue(1525, 10586, 800, -744.0169167062886, -0.060139948001942986, - -0.7924525685250288), - TestValue(10233, 10586, 800, -7.2703661972227565, -0.0023429424616141564, - 0.00008904830662359586), - TestValue(0, 10586, 15324, -8048.29915678056, -0.5914318795831726, - -0.11664064731878732), - TestValue(6, 10586, 15324, -8002.424955944863, -0.5910966640836922, - -0.11648073932479441), - TestValue(14, 10586, 15324, -7951.095336923546, -0.590649710084385, - -0.11626776694982688), - TestValue(1525, 10586, 15324, -4300.645593413912, -0.506231273465249, - -0.08062419697917278), - TestValue(10233, 10586, 15324, -9.327824035135563, -0.019721845219427537, - -0.00008059480749977865), - TestValue(0, 10586, 162345, -10255.166530843997, -0.9387848332571951, - -0.0019538038497231014), - TestValue(6, 10586, 162345, -10206.520977570348, -0.93825274285482, - -0.001951542008541196), - TestValue(14, 10586, 162345, -10151.499529961993, -0.9375432889849864, - -0.0019485283448990032), - TestValue(1525, 10586, 162345, -5869.2020812217015, -0.8035451893201818, - -0.0014225911704155436), - TestValue(10233, 10586, 162345, -11.157754570856923, -0.03130465200640373, - -1.9036241010184085e-6), -}; +std::array testValues = { +TestValue(0,0.0000256,0.0004,-0.000024814156367780882,-0.9398496240601504,-0.0018850149796021398), +TestValue(0,0.0000256,0.065,-0.000025594960092480967,-0.9996063088998794,-7.751668684718993e-8), +TestValue(0,0.0000256,4.42,-0.000025599925864390194,-0.9999942081783417,-1.677258332222209e-11), +TestValue(0,0.0000256,800,-0.00002559999998652529,-0.999999968000001,-8.881784197001252e-16), +TestValue(0,0.0000256,15324,-0.000025599996959613236,-0.9999999983294179,0.), +TestValue(0,0.0000256,150000,-0.00002560005540885868,-0.9999999998293333,0.), +TestValue(0,0.314,0.0004,-0.002666782716971683,-0.001272264631043257,-5.66822905706025), +TestValue(0,0.314,0.065,-0.11460468078714132,-0.17150395778364116,-0.9346528929704305), +TestValue(0,0.314,4.42,-0.30334820230965986,-0.9336713138994508,-0.00230212890163628), +TestValue(0,0.314,800,-0.31393839362010567,-0.9996076539958066,-7.698783210940974e-8), +TestValue(0,0.314,15324,-0.31399678298770084,-0.9999795096863716,-2.099280749234822e-10), +TestValue(0,0.314,150000,-0.3139996713308335,-0.9999979066710487,-2.190247982980509e-12), +TestValue(0,1.5,0.0004,-0.003291911100032755,-0.00026659557451346307,-7.230044345656401), +TestValue(0,1.5,0.065,-0.2067814991501101,-0.04153354632587859,-2.2227873794044952), +TestValue(0,1.5,4.42,-1.2915096474038796,-0.7466216216216216,-0.03881837442792935), +TestValue(0,1.5,800,-1.4985955053447242,-0.9981285090455396,-1.7534272203079126e-6), +TestValue(0,1.5,15324,-1.499926590534038,-0.9999021239111285,-4.790177143831897e-9), +TestValue(0,1.5,150000,-1.4999925000758196,-0.999990000099999,-4.999911595859885e-11), +TestValue(0,8,0.0004,-0.003961415020514468,-0.00004999750012499375,-8.903587548786295), +TestValue(0,8,0.065,-0.3133586118431387,-0.008059516429014259,-3.8289612370926864), +TestValue(0,8,4.42,-4.566604241437509,-0.355877616747182,-0.3890459971629081), +TestValue(0,8,800,-7.9602646825343015,-0.9900990099009901,-0.000049340754157967126), +TestValue(0,8,15324,-7.99791249886043,-0.9994782154969998,-1.361769044194716e-7), +TestValue(0,8,150000,-7.999786674428577,-0.9999466695109595,-1.4221228639144101e-9), +TestValue(0,180,0.0004,-0.0052068020335865025,-2.2222172839615914e-6,-12.01700730618354), +TestValue(0,180,0.065,-0.5152345838836883,-0.00036098075694887956,-6.927046886659846), +TestValue(0,180,4.42,-16.491356225074536,-0.023967031775295522,-2.755043100796684), +TestValue(0,180,800,-162.35267519735217,-0.8163265306122449,-0.01926737460893513), +TestValue(0,180,15324,-178.95104102256036,-0.9883900928792569,-0.00006792118926490787), +TestValue(0,180,150000,-179.8920863223863,-0.9988014382740711,-7.188495541043949e-7), +TestValue(0,1123,0.0004,-0.005939122128713381,-3.5618865318302646e-7,-13.847805677972104), +TestValue(0,1123,0.065,-0.6342170147837343,-0.000057877326779839104,-8.75724272015346), +TestValue(0,1123,4.42,-24.493639593452325,-0.00392045555338738,-4.545467874886493), +TestValue(0,1123,800,-701.6240143366822,-0.4160166406656266,-0.29304665858647905), +TestValue(0,1123,15324,-1083.757151397245,-0.9317200705295798,-0.002442933450309326), +TestValue(0,1123,150000,-1118.817101006986,-0.9925689670003904,-0.000027747673771116865), +TestValue(0,10586,0.0004,-0.006836533480423993,-3.778575334268833e-8,-16.091333738845734), +TestValue(0,10586,0.065,-0.7800430171085975,-6.1401474485561915e-6,-11.00066794181818), +TestValue(0,10586,4.42,-34.3945190758502,-0.0004173583295091224,-6.781982760105572), +TestValue(0,10586,800,-2124.4224654744803,-0.07026172492534692,-1.7257898067684474), +TestValue(0,10586,15324,-8048.29915678056,-0.5914318795831726,-0.11664064731878732), +TestValue(0,10586,150000,-10229.149577360897,-0.9340789358972762,-0.0022732664130149516), +TestValue(7,0.0000256,0.0004,-29.445354199147125,256989.1917293233,-13944.92090243279), +TestValue(7,0.0000256,0.065,-59.40270770911646,273328.85048350185,-89.90748568276743), +TestValue(7,0.0000256,4.42,-79.18162818224879,273434.9163045572,-0.5615296684557465), +TestValue(7,0.0000256,800,-82.50943543843826,273436.49125003227,-0.00003263555538968177), +TestValue(7,0.0000256,15324,-82.5342442124603,273436.4995432019,-8.94022633701752e-8), +TestValue(7,0.0000256,150000,-82.53547440969385,273436.4999533335,-9.33299659777731e-10), +TestValue(7,0.314,0.0004,-9.780554584441889,0.027090322685207696,2474.516543534505), +TestValue(7,0.314,0.065,-5.954681567099272,3.6518326807051746,-1.661885301087814), +TestValue(7,0.314,4.42,-14.063434552944763,19.880657339909963,-0.4587955394328642), +TestValue(7,0.314,800,-16.924203575168434,21.284639409604978,-0.000029279795684011845), +TestValue(7,0.314,15324,-16.946467423587734,21.292557330455672,-8.025298470215603e-8), +TestValue(7,0.314,150000,-16.947571739258493,21.29294905733322,-8.378080451620917e-10), +TestValue(7,1.5,0.0004,-9.774134608119379,0.0009775171065493646,2490.5539367351803), +TestValue(7,1.5,0.065,-5.026800862430695,0.15228966986155484,11.046793754083321), +TestValue(7,1.5,4.42,-5.669765754393499,2.7376126126126126,-0.1990792406277535), +TestValue(7,1.5,800,-7.172434628346302,3.6598045331669784,-0.000018013716757359077), +TestValue(7,1.5,15324,-7.186147155348181,3.6663077876741377,-4.948342535726624e-8), +TestValue(7,1.5,150000,-7.1868281060611565,3.666630000366663,-5.166445049553658e-10), +TestValue(7,8,0.0004,-9.773287685468139,-6.249687515624219e-6,2492.6708598338487), +TestValue(7,8,0.065,-4.893078153217412,-0.0010074395536267824,13.045515423749752), +TestValue(7,8,4.42,-2.4138267066913563,-0.04448470209339775,0.06951848372348413), +TestValue(7,8,800,-1.972808375834589,-0.12376237623762376,4.6570738199136485e-6), +TestValue(7,8,15324,-1.9692663072788577,-0.12493477693712497,1.277112104958178e-8), +TestValue(7,8,150000,-1.9690905691403486,-0.12499333368886993,1.333280152948646e-10), +TestValue(7,180,0.0004,-9.774198636769189,-2.1357977229186406e-6,2490.3935075261693), +TestValue(7,180,0.065,-5.040836257459913,-0.00034694261640086756,10.776502846558865), +TestValue(7,180,4.42,-11.4293253460954,-0.023034980539589585,-1.770828372217259), +TestValue(7,180,800,-135.92154531818449,-0.7845804988662132,-0.017692867587181027), +TestValue(7,180,15324,-151.2058790199169,-0.949952700378397,-0.00006270718914258566), +TestValue(7,180,150000,-152.07480469327567,-0.9599591601189683,-6.638499794320296e-7), +TestValue(7,1123,0.0004,-9.77491789464706,-3.539684211507191e-7,2488.5953646554194), +TestValue(7,1123,0.065,-5.157696519888815,-0.00005751655982751597,8.978948920929607), +TestValue(7,1123,4.42,-19.28929343971758,-0.003896018163473122,-3.5295051749149056), +TestValue(7,1123,800,-667.0958939480461,-0.41342348262051587,-0.287969440027692), +TestValue(7,1123,15324,-1043.6096899099389,-0.9259123764122984,-0.0024118325958113473), +TestValue(7,1123,150000,-1078.228021151623,-0.9863819832345821,-0.000027401825537509694), +TestValue(7,10586,0.0004,-9.77581307717804,-3.7760767486519914e-8,2486.357408645293), +TestValue(7,10586,0.065,-5.303160350365611,-6.136087271705644e-6,6.741095395500565), +TestValue(7,10586,4.42,-29.16559791545973,-0.00041708235101804323,-5.760472168602957), +TestValue(7,10586,800,-2086.6391306495434,-0.0702152643099608,-1.7176872326969326), +TestValue(7,10586,15324,-7995.6283957432015,-0.5910407948337788,-0.11645410288972613), +TestValue(7,10586,150000,-10173.280945470673,-0.9334612755391352,-0.0022701910299964823), +TestValue(14,0.0000256,0.0004,-49.814562438358635,513979.32330827066,-30391.559221530802), +TestValue(14,0.0000256,0.065,-114.92817109028836,546658.7005733127,-196.83239209326592), +TestValue(14,0.0000256,4.42,-161.64931287705224,546870.8326033225,-1.650128690902025), +TestValue(14,0.0000256,800,-173.09898662779824,546873.9825000325,-0.00014060727924558591), +TestValue(14,0.0000256,15324,-173.20616504262574,546873.9990864021,-3.872936886750722e-7), +TestValue(14,0.0000256,150000,-173.21149502739468,546873.9999066668,-4.044185430984726e-9), +TestValue(14,0.314,0.0004,-10.482321240387563,0.05545291000145865,2452.982014445862), +TestValue(14,0.314,0.065,-7.917539720426937,7.4751693191939905,-19.40653851445296), +TestValue(14,0.314,4.42,-31.109603016060397,40.69498599371937,-1.4423583039713965), +TestValue(14,0.314,800,-41.61461010763844,43.568886473205765,-0.00013381877200302483), +TestValue(14,0.314,15324,-41.71664028188991,43.58509417059771,-3.687852014877535e-7), +TestValue(14,0.314,150000,-41.72171561524851,43.58589602133749,-3.851015506484146e-9), +TestValue(14,1.5,0.0004,-10.468856159359483,0.002221629787612192,2486.6186161358087), +TestValue(14,1.5,0.065,-5.969601492726813,0.34611288604898827,7.298954082323366), +TestValue(14,1.5,4.42,-13.334103973863655,6.221846846846847,-0.8864094608348823), +TestValue(14,1.5,800,-20.926415102269573,8.317737575379496,-0.00010961017476240897), +TestValue(14,1.5,15324,-21.010069937864472,8.332517699259403,-3.0266583905813604e-7), +TestValue(14,1.5,150000,-21.014235520108855,8.333250000833324,-3.160877781738236e-9), +TestValue(14,8,0.0004,-10.466492810136518,0.00003749812509374531,2492.526005536275), +TestValue(14,8,0.065,-5.595578961607217,0.006044637321760695,12.902571279344416), +TestValue(14,8,4.42,-3.5471312844257383,0.2669082125603865,0.0010136106025722125), +TestValue(14,8,800,-4.065493420056555,0.7425742574257426,-0.00001668126667020431), +TestValue(14,8,15324,-4.078322333399456,0.7496086616227498,-4.677001541608661e-8), +TestValue(14,8,150000,-4.0789662719144815,0.7499600021332196,-4.888125459956427e-10), +TestValue(14,180,0.0004,-10.467069325725546,-2.04937816187569e-6,2491.084720678314), +TestValue(14,180,0.065,-5.689219198051667,-0.0003329044758528556,11.4626317745298), +TestValue(14,180,4.42,-9.653376579596795,-0.022102929303883648,-1.313682997645138), +TestValue(14,180,800,-117.57055678993851,-0.7528344671201814,-0.016193696733894036), +TestValue(14,180,15324,-131.5984192349756,-0.911515307877537,-0.000057701678183974536), +TestValue(14,180,150000,-132.39809487222743,-0.9211168819638655,-6.110279944238073e-7), +TestValue(14,1123,0.0004,-10.467775521386166,-3.517481891184117e-7,2489.3192333086026), +TestValue(14,1123,0.065,-5.803957292009425,-0.000057155792875192846,9.697719756764902), +TestValue(14,1123,4.42,-17.37102939846337,-0.003871580773558864,-3.040611828950623), +TestValue(14,1123,800,-640.6479149103316,-0.4108303245754051,-0.2829675576373729), +TestValue(14,1123,15324,-1011.5999306403351,-0.920104682295017,-0.00238094023047708), +TestValue(14,1123,150000,-1045.7795131043224,-0.9801949994687738,-0.00002705815489179031), +TestValue(14,10586,0.0004,-10.468668475096411,-3.7735781630351504e-8,2487.0868493492235), +TestValue(14,10586,0.065,-5.949058950638154,-6.132027094855097e-6,7.465437927571536), +TestValue(14,10586,4.42,-27.2227588675498,-0.0004168063725269641,-5.266030931107645), +TestValue(14,10586,800,-2056.9359371755286,-0.07016880369457469,-1.7096599947938858), +TestValue(14,10586,15324,-7951.095336923546,-0.590649710084385,-0.11626776694982688), +TestValue(14,10586,150000,-10125.552885388513,-0.9328436151809941,-0.002267117824567677), +TestValue(1525,0.0000256,0.0004,-4301.784727467015,5.5987134868421055e7,-3.580668787634408e6), +TestValue(1525,0.0000256,0.065,-11965.467128123484,5.954685919853104e7,-23429.11268911477), +TestValue(1525,0.0000256,4.42,-18367.34289180058,5.956996647937967e7,-339.0570825343945), +TestValue(1525,0.0000256,800,-24826.22813563853,5.957030959375009e7,-0.8389762876176414), +TestValue(1525,0.0000256,15324,-25707.717028801628,5.957031140048291e7,-0.004643062913324059), +TestValue(1525,0.0000256,150000,-25773.43154710444,5.957031148983333e7,-0.00005129937594539058), +TestValue(1525,0.314,0.0004,-17.094738795518424,6.1777199721236284,-2348.2711549792057), +TestValue(1525,0.314,0.065,-296.58556828610017,832.7696922844226,-4001.4921811261693), +TestValue(1525,0.314,4.42,-4115.10160678526,4533.61649969458,-316.1764856190919), +TestValue(1525,0.314,800,-10469.94267675256,4853.782788344746,-0.8382285160349765), +TestValue(1525,0.314,15324,-11350.864477542971,4855.588403521258,-0.004641024152967077), +TestValue(1525,0.314,150000,-11416.550945303003,4855.677733537116,-0.00005127809769334135), +TestValue(1525,1.5,0.0004,-15.560537541616213,0.270772238514174,1484.280307752038), +TestValue(1525,1.5,0.065,-74.45092758687497,42.184238551650694,-953.4745083343279), +TestValue(1525,1.5,4.42,-2072.1910365790172,758.3186936936937,-251.67662613527665), +TestValue(1525,1.5,800,-8088.548799680884,1013.7658556872531,-0.8354105724129193), +TestValue(1525,1.5,15324,-8967.33164084002,1015.5672571857361,-0.004633327525485953), +TestValue(1525,1.5,150000,-9032.912208922884,1015.6565101015657,-0.00005119776202988646), +TestValue(1525,8,0.0004,-15.230842685268726,0.00948077596120194,2308.3869231549475), +TestValue(1525,8,0.065,-22.20647206997819,1.528285802851829,-169.72844230404513), +TestValue(1525,8,4.42,-652.6338020806143,67.48329307568439,-117.2113317142287), +TestValue(1525,8,800,-5554.513964530293,187.74752475247524,-0.8201519269955586), +TestValue(1525,8,15324,-6421.662226247852,189.52605661361858,-0.004591272777291877), +TestValue(1525,8,150000,-6486.664023141206,189.61488720601568,-0.00005075860649661479), +TestValue(1525,180,0.0004,-15.159228863591125,0.000016604901371824113,2487.4167692289852), +TestValue(1525,180,0.065,-10.618383986015033,0.0026973284338680167,7.7929628140754765), +TestValue(1525,180,4.42,-30.756932642065294,0.1790869874320693,-5.0606677133089075), +TestValue(1525,180,800,-1255.1060610431614,6.099773242630386,-0.5081161722061651), +TestValue(1525,180,15324,-1861.5172673616398,7.38547041623667,-0.0035556000115217756), +TestValue(1525,180,150000,-1912.1930479564326,7.463266302659031,-0.00003983284968711587), +TestValue(1525,1123,0.0004,-15.157115486355906,1.2750475385536657e-7,2492.70020501204), +TestValue(1525,1123,0.065,-10.275036857130544,0.000020718330690556827,13.074039765317043), +TestValue(1525,1123,4.42,-7.7548168672583415,0.0014034043922188128,0.0654298516080507), +TestValue(1525,1123,800,-30.39018204828426,0.14892136201921807,-0.018804728472968435), +TestValue(1525,1123,15324,-64.3938471491183,0.33352757644959136,-0.00029097614079454104), +TestValue(1525,1123,150000,-68.69059192176792,0.3553096391221344,-3.4982159551333325e-6), +TestValue(1525,10586,0.0004,-15.157527333190956,-3.234240610599839e-8,2491.6705880068075), +TestValue(1525,10586,0.065,-10.34196113541293,-5.255608920401252e-6,12.044448366424728), +TestValue(1525,10586,4.42,-12.301855613945008,-0.0003572344439525938,-0.9624372357797295), +TestValue(1525,10586,800,-744.0169167062886,-0.060139948001942986,-0.7924525685250288), +TestValue(1525,10586,15324,-4300.645593413912,-0.506231273465249,-0.08062419697917278), +TestValue(1525,10586,150000,-5850.263517824056,-0.799517215016552,-0.0016543683056511327), +TestValue(10233,0.0000256,0.0004,-28781.07085289515,3.7568285855263156e8,-2.4041193199521683e7), +TestValue(10233,0.0000256,0.065,-80237.4790550341,3.995691927102557e8,-157343.697098361), +TestValue(10233,0.0000256,4.42,-123371.16336416776,3.997242463550437e8,-2307.279979293951), +TestValue(10233,0.0000256,800,-173733.65594636812,3.997265487087504e8,-10.166635446653597), +TestValue(10233,0.0000256,15324,-189611.39394380094,3.9972656083222395e8,-0.15627194690990365), +TestValue(10233,0.0000256,150000,-192108.97687250923,3.9972656143178e8,-0.0022260752765799197), +TestValue(10233,0.314,0.0004,-30.083534640958533,41.460778593539814,-30043.568270589793), +TestValue(10233,0.314,0.065,-1936.716591758479,5589.00047056451,-26975.841613138524), +TestValue(10233,0.314,4.42,-27734.55588693275,30426.641345033488,-2153.7342775414127), +TestValue(10233,0.314,800,-77398.83453431107,32575.386135464123,-10.16161733713528), +TestValue(10233,0.314,15324,-93272.76691554434,32587.50423265796,-0.15625826529496223), +TestValue(10233,0.314,150000,-95770.16160401958,32588.103756758428,-0.0022259324835118832), +TestValue(10233,1.5,0.0004,-19.785223133323598,1.8184484137563317,-4317.601447204935), +TestValue(10233,1.5,0.065,-445.630392408013,283.3003194888179,-6515.787894589817), +TestValue(10233,1.5,4.42,-14020.648493631525,5092.706081081081,-1720.7211329093311), +TestValue(10233,1.5,800,-61412.52664040723,6808.234560199626,-10.142698900729565), +TestValue(10233,1.5,15324,-77272.09898456372,6820.332387197807,-0.15620659350885369), +TestValue(10233,1.5,150000,-79768.7827089832,6820.931790682093,-0.0022253931450428865), +TestValue(10233,8,0.0004,-17.56909362175793,0.06390305484725764,1221.8452476349516), +TestValue(10233,8,0.065,-94.45295843966596,10.30106943583385,-1247.5517925303861), +TestValue(10233,8,4.42,-4476.485408813824,454.85607890499193,-816.4371067130297), +TestValue(10233,8,800,-44371.840290708235,1265.470297029703,-10.040039157123783), +TestValue(10233,8,15324,-60153.13532501529,1277.4580941821027,-0.15592364901449507), +TestValue(10233,8,150000,-62645.92507437721,1278.056836968695,-0.002222438504382751), +TestValue(10233,180,0.0004,-17.08144177432405,0.00012411083530925487,2440.94300115826), +TestValue(10233,180,0.065,-15.542242814932251,0.020160775275594924,-38.6634853761835), +TestValue(10233,180,4.42,-235.49737914944126,1.3385587246502548,-50.37753458197702), +TestValue(10233,180,800,-14640.50246307096,45.59183673469388,-7.836489965276398), +TestValue(10233,180,15324,-28577.644697168085,55.2015866873065,-0.14858705144088802), +TestValue(10233,180,150000,-30968.941707557387,55.78306032760687,-0.0021450282568338253), +TestValue(10233,1123,0.0004,-17.063078998820856,2.8894734020457448e-6,2486.849880233364), +TestValue(10233,1123,0.065,-12.558918107941281,0.0004695124193805291,7.224124958319663), +TestValue(10233,1123,4.42,-35.45506157865748,0.031803517445555686,-5.756960605210265), +TestValue(10233,1123,800,-3343.1303902972795,3.3748099701370067,-2.9898053694742615), +TestValue(10233,1123,15324,-11352.060718035325,7.558299058347705,-0.11311918072723515), +TestValue(10233,1123,150000,-13237.322258064814,8.051917443787673,-0.0017468778907598903), +TestValue(10233,10586,0.0004,-17.060718192660715,-1.2600010324928188e-9,2492.7518943576556), +TestValue(10233,10586,0.065,-12.175300607224926,-2.047489183204549e-7,13.125723676609066), +TestValue(10233,10586,4.42,-9.430792045634007,-0.00001391720105013416,0.11674937200192481), +TestValue(10233,10586,800,-7.2703661972227565,-0.0023429424616141564,0.00008904830662359586), +TestValue(10233,10586,15324,-9.327824035135563,-0.019721845219427537,-0.00008059480749977865), +TestValue(10233,10586,150000,-11.132452601363184,-0.031147729489111892,-2.2067081495436014e-6),}; TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { using stan::math::is_nan; From 02865a9cbe6a45f4b3a3f85ee4fc8d5e9ab7c7fd Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Wed, 11 Dec 2019 08:14:45 +0000 Subject: [PATCH 12/82] [Jenkins] auto-formatting by clang-format version 5.0.0-3~16.04.1 (tags/RELEASE_500/final) --- .../rev/scal/prob/neg_binomial_2_test.cpp | 633 ++++++++++++------ 1 file changed, 422 insertions(+), 211 deletions(-) diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index cdfbf394855..50b917c30aa 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -51,217 +51,428 @@ struct TestValue { // WriteString[out,"};"]; // Close[out]; // FilePrint[%] -std::array testValues = { -TestValue(0,0.0000256,0.0004,-0.000024814156367780882,-0.9398496240601504,-0.0018850149796021398), -TestValue(0,0.0000256,0.065,-0.000025594960092480967,-0.9996063088998794,-7.751668684718993e-8), -TestValue(0,0.0000256,4.42,-0.000025599925864390194,-0.9999942081783417,-1.677258332222209e-11), -TestValue(0,0.0000256,800,-0.00002559999998652529,-0.999999968000001,-8.881784197001252e-16), -TestValue(0,0.0000256,15324,-0.000025599996959613236,-0.9999999983294179,0.), -TestValue(0,0.0000256,150000,-0.00002560005540885868,-0.9999999998293333,0.), -TestValue(0,0.314,0.0004,-0.002666782716971683,-0.001272264631043257,-5.66822905706025), -TestValue(0,0.314,0.065,-0.11460468078714132,-0.17150395778364116,-0.9346528929704305), -TestValue(0,0.314,4.42,-0.30334820230965986,-0.9336713138994508,-0.00230212890163628), -TestValue(0,0.314,800,-0.31393839362010567,-0.9996076539958066,-7.698783210940974e-8), -TestValue(0,0.314,15324,-0.31399678298770084,-0.9999795096863716,-2.099280749234822e-10), -TestValue(0,0.314,150000,-0.3139996713308335,-0.9999979066710487,-2.190247982980509e-12), -TestValue(0,1.5,0.0004,-0.003291911100032755,-0.00026659557451346307,-7.230044345656401), -TestValue(0,1.5,0.065,-0.2067814991501101,-0.04153354632587859,-2.2227873794044952), -TestValue(0,1.5,4.42,-1.2915096474038796,-0.7466216216216216,-0.03881837442792935), -TestValue(0,1.5,800,-1.4985955053447242,-0.9981285090455396,-1.7534272203079126e-6), -TestValue(0,1.5,15324,-1.499926590534038,-0.9999021239111285,-4.790177143831897e-9), -TestValue(0,1.5,150000,-1.4999925000758196,-0.999990000099999,-4.999911595859885e-11), -TestValue(0,8,0.0004,-0.003961415020514468,-0.00004999750012499375,-8.903587548786295), -TestValue(0,8,0.065,-0.3133586118431387,-0.008059516429014259,-3.8289612370926864), -TestValue(0,8,4.42,-4.566604241437509,-0.355877616747182,-0.3890459971629081), -TestValue(0,8,800,-7.9602646825343015,-0.9900990099009901,-0.000049340754157967126), -TestValue(0,8,15324,-7.99791249886043,-0.9994782154969998,-1.361769044194716e-7), -TestValue(0,8,150000,-7.999786674428577,-0.9999466695109595,-1.4221228639144101e-9), -TestValue(0,180,0.0004,-0.0052068020335865025,-2.2222172839615914e-6,-12.01700730618354), -TestValue(0,180,0.065,-0.5152345838836883,-0.00036098075694887956,-6.927046886659846), -TestValue(0,180,4.42,-16.491356225074536,-0.023967031775295522,-2.755043100796684), -TestValue(0,180,800,-162.35267519735217,-0.8163265306122449,-0.01926737460893513), -TestValue(0,180,15324,-178.95104102256036,-0.9883900928792569,-0.00006792118926490787), -TestValue(0,180,150000,-179.8920863223863,-0.9988014382740711,-7.188495541043949e-7), -TestValue(0,1123,0.0004,-0.005939122128713381,-3.5618865318302646e-7,-13.847805677972104), -TestValue(0,1123,0.065,-0.6342170147837343,-0.000057877326779839104,-8.75724272015346), -TestValue(0,1123,4.42,-24.493639593452325,-0.00392045555338738,-4.545467874886493), -TestValue(0,1123,800,-701.6240143366822,-0.4160166406656266,-0.29304665858647905), -TestValue(0,1123,15324,-1083.757151397245,-0.9317200705295798,-0.002442933450309326), -TestValue(0,1123,150000,-1118.817101006986,-0.9925689670003904,-0.000027747673771116865), -TestValue(0,10586,0.0004,-0.006836533480423993,-3.778575334268833e-8,-16.091333738845734), -TestValue(0,10586,0.065,-0.7800430171085975,-6.1401474485561915e-6,-11.00066794181818), -TestValue(0,10586,4.42,-34.3945190758502,-0.0004173583295091224,-6.781982760105572), -TestValue(0,10586,800,-2124.4224654744803,-0.07026172492534692,-1.7257898067684474), -TestValue(0,10586,15324,-8048.29915678056,-0.5914318795831726,-0.11664064731878732), -TestValue(0,10586,150000,-10229.149577360897,-0.9340789358972762,-0.0022732664130149516), -TestValue(7,0.0000256,0.0004,-29.445354199147125,256989.1917293233,-13944.92090243279), -TestValue(7,0.0000256,0.065,-59.40270770911646,273328.85048350185,-89.90748568276743), -TestValue(7,0.0000256,4.42,-79.18162818224879,273434.9163045572,-0.5615296684557465), -TestValue(7,0.0000256,800,-82.50943543843826,273436.49125003227,-0.00003263555538968177), -TestValue(7,0.0000256,15324,-82.5342442124603,273436.4995432019,-8.94022633701752e-8), -TestValue(7,0.0000256,150000,-82.53547440969385,273436.4999533335,-9.33299659777731e-10), -TestValue(7,0.314,0.0004,-9.780554584441889,0.027090322685207696,2474.516543534505), -TestValue(7,0.314,0.065,-5.954681567099272,3.6518326807051746,-1.661885301087814), -TestValue(7,0.314,4.42,-14.063434552944763,19.880657339909963,-0.4587955394328642), -TestValue(7,0.314,800,-16.924203575168434,21.284639409604978,-0.000029279795684011845), -TestValue(7,0.314,15324,-16.946467423587734,21.292557330455672,-8.025298470215603e-8), -TestValue(7,0.314,150000,-16.947571739258493,21.29294905733322,-8.378080451620917e-10), -TestValue(7,1.5,0.0004,-9.774134608119379,0.0009775171065493646,2490.5539367351803), -TestValue(7,1.5,0.065,-5.026800862430695,0.15228966986155484,11.046793754083321), -TestValue(7,1.5,4.42,-5.669765754393499,2.7376126126126126,-0.1990792406277535), -TestValue(7,1.5,800,-7.172434628346302,3.6598045331669784,-0.000018013716757359077), -TestValue(7,1.5,15324,-7.186147155348181,3.6663077876741377,-4.948342535726624e-8), -TestValue(7,1.5,150000,-7.1868281060611565,3.666630000366663,-5.166445049553658e-10), -TestValue(7,8,0.0004,-9.773287685468139,-6.249687515624219e-6,2492.6708598338487), -TestValue(7,8,0.065,-4.893078153217412,-0.0010074395536267824,13.045515423749752), -TestValue(7,8,4.42,-2.4138267066913563,-0.04448470209339775,0.06951848372348413), -TestValue(7,8,800,-1.972808375834589,-0.12376237623762376,4.6570738199136485e-6), -TestValue(7,8,15324,-1.9692663072788577,-0.12493477693712497,1.277112104958178e-8), -TestValue(7,8,150000,-1.9690905691403486,-0.12499333368886993,1.333280152948646e-10), -TestValue(7,180,0.0004,-9.774198636769189,-2.1357977229186406e-6,2490.3935075261693), -TestValue(7,180,0.065,-5.040836257459913,-0.00034694261640086756,10.776502846558865), -TestValue(7,180,4.42,-11.4293253460954,-0.023034980539589585,-1.770828372217259), -TestValue(7,180,800,-135.92154531818449,-0.7845804988662132,-0.017692867587181027), -TestValue(7,180,15324,-151.2058790199169,-0.949952700378397,-0.00006270718914258566), -TestValue(7,180,150000,-152.07480469327567,-0.9599591601189683,-6.638499794320296e-7), -TestValue(7,1123,0.0004,-9.77491789464706,-3.539684211507191e-7,2488.5953646554194), -TestValue(7,1123,0.065,-5.157696519888815,-0.00005751655982751597,8.978948920929607), -TestValue(7,1123,4.42,-19.28929343971758,-0.003896018163473122,-3.5295051749149056), -TestValue(7,1123,800,-667.0958939480461,-0.41342348262051587,-0.287969440027692), -TestValue(7,1123,15324,-1043.6096899099389,-0.9259123764122984,-0.0024118325958113473), -TestValue(7,1123,150000,-1078.228021151623,-0.9863819832345821,-0.000027401825537509694), -TestValue(7,10586,0.0004,-9.77581307717804,-3.7760767486519914e-8,2486.357408645293), -TestValue(7,10586,0.065,-5.303160350365611,-6.136087271705644e-6,6.741095395500565), -TestValue(7,10586,4.42,-29.16559791545973,-0.00041708235101804323,-5.760472168602957), -TestValue(7,10586,800,-2086.6391306495434,-0.0702152643099608,-1.7176872326969326), -TestValue(7,10586,15324,-7995.6283957432015,-0.5910407948337788,-0.11645410288972613), -TestValue(7,10586,150000,-10173.280945470673,-0.9334612755391352,-0.0022701910299964823), -TestValue(14,0.0000256,0.0004,-49.814562438358635,513979.32330827066,-30391.559221530802), -TestValue(14,0.0000256,0.065,-114.92817109028836,546658.7005733127,-196.83239209326592), -TestValue(14,0.0000256,4.42,-161.64931287705224,546870.8326033225,-1.650128690902025), -TestValue(14,0.0000256,800,-173.09898662779824,546873.9825000325,-0.00014060727924558591), -TestValue(14,0.0000256,15324,-173.20616504262574,546873.9990864021,-3.872936886750722e-7), -TestValue(14,0.0000256,150000,-173.21149502739468,546873.9999066668,-4.044185430984726e-9), -TestValue(14,0.314,0.0004,-10.482321240387563,0.05545291000145865,2452.982014445862), -TestValue(14,0.314,0.065,-7.917539720426937,7.4751693191939905,-19.40653851445296), -TestValue(14,0.314,4.42,-31.109603016060397,40.69498599371937,-1.4423583039713965), -TestValue(14,0.314,800,-41.61461010763844,43.568886473205765,-0.00013381877200302483), -TestValue(14,0.314,15324,-41.71664028188991,43.58509417059771,-3.687852014877535e-7), -TestValue(14,0.314,150000,-41.72171561524851,43.58589602133749,-3.851015506484146e-9), -TestValue(14,1.5,0.0004,-10.468856159359483,0.002221629787612192,2486.6186161358087), -TestValue(14,1.5,0.065,-5.969601492726813,0.34611288604898827,7.298954082323366), -TestValue(14,1.5,4.42,-13.334103973863655,6.221846846846847,-0.8864094608348823), -TestValue(14,1.5,800,-20.926415102269573,8.317737575379496,-0.00010961017476240897), -TestValue(14,1.5,15324,-21.010069937864472,8.332517699259403,-3.0266583905813604e-7), -TestValue(14,1.5,150000,-21.014235520108855,8.333250000833324,-3.160877781738236e-9), -TestValue(14,8,0.0004,-10.466492810136518,0.00003749812509374531,2492.526005536275), -TestValue(14,8,0.065,-5.595578961607217,0.006044637321760695,12.902571279344416), -TestValue(14,8,4.42,-3.5471312844257383,0.2669082125603865,0.0010136106025722125), -TestValue(14,8,800,-4.065493420056555,0.7425742574257426,-0.00001668126667020431), -TestValue(14,8,15324,-4.078322333399456,0.7496086616227498,-4.677001541608661e-8), -TestValue(14,8,150000,-4.0789662719144815,0.7499600021332196,-4.888125459956427e-10), -TestValue(14,180,0.0004,-10.467069325725546,-2.04937816187569e-6,2491.084720678314), -TestValue(14,180,0.065,-5.689219198051667,-0.0003329044758528556,11.4626317745298), -TestValue(14,180,4.42,-9.653376579596795,-0.022102929303883648,-1.313682997645138), -TestValue(14,180,800,-117.57055678993851,-0.7528344671201814,-0.016193696733894036), -TestValue(14,180,15324,-131.5984192349756,-0.911515307877537,-0.000057701678183974536), -TestValue(14,180,150000,-132.39809487222743,-0.9211168819638655,-6.110279944238073e-7), -TestValue(14,1123,0.0004,-10.467775521386166,-3.517481891184117e-7,2489.3192333086026), -TestValue(14,1123,0.065,-5.803957292009425,-0.000057155792875192846,9.697719756764902), -TestValue(14,1123,4.42,-17.37102939846337,-0.003871580773558864,-3.040611828950623), -TestValue(14,1123,800,-640.6479149103316,-0.4108303245754051,-0.2829675576373729), -TestValue(14,1123,15324,-1011.5999306403351,-0.920104682295017,-0.00238094023047708), -TestValue(14,1123,150000,-1045.7795131043224,-0.9801949994687738,-0.00002705815489179031), -TestValue(14,10586,0.0004,-10.468668475096411,-3.7735781630351504e-8,2487.0868493492235), -TestValue(14,10586,0.065,-5.949058950638154,-6.132027094855097e-6,7.465437927571536), -TestValue(14,10586,4.42,-27.2227588675498,-0.0004168063725269641,-5.266030931107645), -TestValue(14,10586,800,-2056.9359371755286,-0.07016880369457469,-1.7096599947938858), -TestValue(14,10586,15324,-7951.095336923546,-0.590649710084385,-0.11626776694982688), -TestValue(14,10586,150000,-10125.552885388513,-0.9328436151809941,-0.002267117824567677), -TestValue(1525,0.0000256,0.0004,-4301.784727467015,5.5987134868421055e7,-3.580668787634408e6), -TestValue(1525,0.0000256,0.065,-11965.467128123484,5.954685919853104e7,-23429.11268911477), -TestValue(1525,0.0000256,4.42,-18367.34289180058,5.956996647937967e7,-339.0570825343945), -TestValue(1525,0.0000256,800,-24826.22813563853,5.957030959375009e7,-0.8389762876176414), -TestValue(1525,0.0000256,15324,-25707.717028801628,5.957031140048291e7,-0.004643062913324059), -TestValue(1525,0.0000256,150000,-25773.43154710444,5.957031148983333e7,-0.00005129937594539058), -TestValue(1525,0.314,0.0004,-17.094738795518424,6.1777199721236284,-2348.2711549792057), -TestValue(1525,0.314,0.065,-296.58556828610017,832.7696922844226,-4001.4921811261693), -TestValue(1525,0.314,4.42,-4115.10160678526,4533.61649969458,-316.1764856190919), -TestValue(1525,0.314,800,-10469.94267675256,4853.782788344746,-0.8382285160349765), -TestValue(1525,0.314,15324,-11350.864477542971,4855.588403521258,-0.004641024152967077), -TestValue(1525,0.314,150000,-11416.550945303003,4855.677733537116,-0.00005127809769334135), -TestValue(1525,1.5,0.0004,-15.560537541616213,0.270772238514174,1484.280307752038), -TestValue(1525,1.5,0.065,-74.45092758687497,42.184238551650694,-953.4745083343279), -TestValue(1525,1.5,4.42,-2072.1910365790172,758.3186936936937,-251.67662613527665), -TestValue(1525,1.5,800,-8088.548799680884,1013.7658556872531,-0.8354105724129193), -TestValue(1525,1.5,15324,-8967.33164084002,1015.5672571857361,-0.004633327525485953), -TestValue(1525,1.5,150000,-9032.912208922884,1015.6565101015657,-0.00005119776202988646), -TestValue(1525,8,0.0004,-15.230842685268726,0.00948077596120194,2308.3869231549475), -TestValue(1525,8,0.065,-22.20647206997819,1.528285802851829,-169.72844230404513), -TestValue(1525,8,4.42,-652.6338020806143,67.48329307568439,-117.2113317142287), -TestValue(1525,8,800,-5554.513964530293,187.74752475247524,-0.8201519269955586), -TestValue(1525,8,15324,-6421.662226247852,189.52605661361858,-0.004591272777291877), -TestValue(1525,8,150000,-6486.664023141206,189.61488720601568,-0.00005075860649661479), -TestValue(1525,180,0.0004,-15.159228863591125,0.000016604901371824113,2487.4167692289852), -TestValue(1525,180,0.065,-10.618383986015033,0.0026973284338680167,7.7929628140754765), -TestValue(1525,180,4.42,-30.756932642065294,0.1790869874320693,-5.0606677133089075), -TestValue(1525,180,800,-1255.1060610431614,6.099773242630386,-0.5081161722061651), -TestValue(1525,180,15324,-1861.5172673616398,7.38547041623667,-0.0035556000115217756), -TestValue(1525,180,150000,-1912.1930479564326,7.463266302659031,-0.00003983284968711587), -TestValue(1525,1123,0.0004,-15.157115486355906,1.2750475385536657e-7,2492.70020501204), -TestValue(1525,1123,0.065,-10.275036857130544,0.000020718330690556827,13.074039765317043), -TestValue(1525,1123,4.42,-7.7548168672583415,0.0014034043922188128,0.0654298516080507), -TestValue(1525,1123,800,-30.39018204828426,0.14892136201921807,-0.018804728472968435), -TestValue(1525,1123,15324,-64.3938471491183,0.33352757644959136,-0.00029097614079454104), -TestValue(1525,1123,150000,-68.69059192176792,0.3553096391221344,-3.4982159551333325e-6), -TestValue(1525,10586,0.0004,-15.157527333190956,-3.234240610599839e-8,2491.6705880068075), -TestValue(1525,10586,0.065,-10.34196113541293,-5.255608920401252e-6,12.044448366424728), -TestValue(1525,10586,4.42,-12.301855613945008,-0.0003572344439525938,-0.9624372357797295), -TestValue(1525,10586,800,-744.0169167062886,-0.060139948001942986,-0.7924525685250288), -TestValue(1525,10586,15324,-4300.645593413912,-0.506231273465249,-0.08062419697917278), -TestValue(1525,10586,150000,-5850.263517824056,-0.799517215016552,-0.0016543683056511327), -TestValue(10233,0.0000256,0.0004,-28781.07085289515,3.7568285855263156e8,-2.4041193199521683e7), -TestValue(10233,0.0000256,0.065,-80237.4790550341,3.995691927102557e8,-157343.697098361), -TestValue(10233,0.0000256,4.42,-123371.16336416776,3.997242463550437e8,-2307.279979293951), -TestValue(10233,0.0000256,800,-173733.65594636812,3.997265487087504e8,-10.166635446653597), -TestValue(10233,0.0000256,15324,-189611.39394380094,3.9972656083222395e8,-0.15627194690990365), -TestValue(10233,0.0000256,150000,-192108.97687250923,3.9972656143178e8,-0.0022260752765799197), -TestValue(10233,0.314,0.0004,-30.083534640958533,41.460778593539814,-30043.568270589793), -TestValue(10233,0.314,0.065,-1936.716591758479,5589.00047056451,-26975.841613138524), -TestValue(10233,0.314,4.42,-27734.55588693275,30426.641345033488,-2153.7342775414127), -TestValue(10233,0.314,800,-77398.83453431107,32575.386135464123,-10.16161733713528), -TestValue(10233,0.314,15324,-93272.76691554434,32587.50423265796,-0.15625826529496223), -TestValue(10233,0.314,150000,-95770.16160401958,32588.103756758428,-0.0022259324835118832), -TestValue(10233,1.5,0.0004,-19.785223133323598,1.8184484137563317,-4317.601447204935), -TestValue(10233,1.5,0.065,-445.630392408013,283.3003194888179,-6515.787894589817), -TestValue(10233,1.5,4.42,-14020.648493631525,5092.706081081081,-1720.7211329093311), -TestValue(10233,1.5,800,-61412.52664040723,6808.234560199626,-10.142698900729565), -TestValue(10233,1.5,15324,-77272.09898456372,6820.332387197807,-0.15620659350885369), -TestValue(10233,1.5,150000,-79768.7827089832,6820.931790682093,-0.0022253931450428865), -TestValue(10233,8,0.0004,-17.56909362175793,0.06390305484725764,1221.8452476349516), -TestValue(10233,8,0.065,-94.45295843966596,10.30106943583385,-1247.5517925303861), -TestValue(10233,8,4.42,-4476.485408813824,454.85607890499193,-816.4371067130297), -TestValue(10233,8,800,-44371.840290708235,1265.470297029703,-10.040039157123783), -TestValue(10233,8,15324,-60153.13532501529,1277.4580941821027,-0.15592364901449507), -TestValue(10233,8,150000,-62645.92507437721,1278.056836968695,-0.002222438504382751), -TestValue(10233,180,0.0004,-17.08144177432405,0.00012411083530925487,2440.94300115826), -TestValue(10233,180,0.065,-15.542242814932251,0.020160775275594924,-38.6634853761835), -TestValue(10233,180,4.42,-235.49737914944126,1.3385587246502548,-50.37753458197702), -TestValue(10233,180,800,-14640.50246307096,45.59183673469388,-7.836489965276398), -TestValue(10233,180,15324,-28577.644697168085,55.2015866873065,-0.14858705144088802), -TestValue(10233,180,150000,-30968.941707557387,55.78306032760687,-0.0021450282568338253), -TestValue(10233,1123,0.0004,-17.063078998820856,2.8894734020457448e-6,2486.849880233364), -TestValue(10233,1123,0.065,-12.558918107941281,0.0004695124193805291,7.224124958319663), -TestValue(10233,1123,4.42,-35.45506157865748,0.031803517445555686,-5.756960605210265), -TestValue(10233,1123,800,-3343.1303902972795,3.3748099701370067,-2.9898053694742615), -TestValue(10233,1123,15324,-11352.060718035325,7.558299058347705,-0.11311918072723515), -TestValue(10233,1123,150000,-13237.322258064814,8.051917443787673,-0.0017468778907598903), -TestValue(10233,10586,0.0004,-17.060718192660715,-1.2600010324928188e-9,2492.7518943576556), -TestValue(10233,10586,0.065,-12.175300607224926,-2.047489183204549e-7,13.125723676609066), -TestValue(10233,10586,4.42,-9.430792045634007,-0.00001391720105013416,0.11674937200192481), -TestValue(10233,10586,800,-7.2703661972227565,-0.0023429424616141564,0.00008904830662359586), -TestValue(10233,10586,15324,-9.327824035135563,-0.019721845219427537,-0.00008059480749977865), -TestValue(10233,10586,150000,-11.132452601363184,-0.031147729489111892,-2.2067081495436014e-6),}; +std::array testValues = { + TestValue(0, 0.0000256, 0.0004, -0.000024814156367780882, + -0.9398496240601504, -0.0018850149796021398), + TestValue(0, 0.0000256, 0.065, -0.000025594960092480967, + -0.9996063088998794, -7.751668684718993e-8), + TestValue(0, 0.0000256, 4.42, -0.000025599925864390194, -0.9999942081783417, + -1.677258332222209e-11), + TestValue(0, 0.0000256, 800, -0.00002559999998652529, -0.999999968000001, + -8.881784197001252e-16), + TestValue(0, 0.0000256, 15324, -0.000025599996959613236, + -0.9999999983294179, 0.), + TestValue(0, 0.0000256, 150000, -0.00002560005540885868, + -0.9999999998293333, 0.), + TestValue(0, 0.314, 0.0004, -0.002666782716971683, -0.001272264631043257, + -5.66822905706025), + TestValue(0, 0.314, 0.065, -0.11460468078714132, -0.17150395778364116, + -0.9346528929704305), + TestValue(0, 0.314, 4.42, -0.30334820230965986, -0.9336713138994508, + -0.00230212890163628), + TestValue(0, 0.314, 800, -0.31393839362010567, -0.9996076539958066, + -7.698783210940974e-8), + TestValue(0, 0.314, 15324, -0.31399678298770084, -0.9999795096863716, + -2.099280749234822e-10), + TestValue(0, 0.314, 150000, -0.3139996713308335, -0.9999979066710487, + -2.190247982980509e-12), + TestValue(0, 1.5, 0.0004, -0.003291911100032755, -0.00026659557451346307, + -7.230044345656401), + TestValue(0, 1.5, 0.065, -0.2067814991501101, -0.04153354632587859, + -2.2227873794044952), + TestValue(0, 1.5, 4.42, -1.2915096474038796, -0.7466216216216216, + -0.03881837442792935), + TestValue(0, 1.5, 800, -1.4985955053447242, -0.9981285090455396, + -1.7534272203079126e-6), + TestValue(0, 1.5, 15324, -1.499926590534038, -0.9999021239111285, + -4.790177143831897e-9), + TestValue(0, 1.5, 150000, -1.4999925000758196, -0.999990000099999, + -4.999911595859885e-11), + TestValue(0, 8, 0.0004, -0.003961415020514468, -0.00004999750012499375, + -8.903587548786295), + TestValue(0, 8, 0.065, -0.3133586118431387, -0.008059516429014259, + -3.8289612370926864), + TestValue(0, 8, 4.42, -4.566604241437509, -0.355877616747182, + -0.3890459971629081), + TestValue(0, 8, 800, -7.9602646825343015, -0.9900990099009901, + -0.000049340754157967126), + TestValue(0, 8, 15324, -7.99791249886043, -0.9994782154969998, + -1.361769044194716e-7), + TestValue(0, 8, 150000, -7.999786674428577, -0.9999466695109595, + -1.4221228639144101e-9), + TestValue(0, 180, 0.0004, -0.0052068020335865025, -2.2222172839615914e-6, + -12.01700730618354), + TestValue(0, 180, 0.065, -0.5152345838836883, -0.00036098075694887956, + -6.927046886659846), + TestValue(0, 180, 4.42, -16.491356225074536, -0.023967031775295522, + -2.755043100796684), + TestValue(0, 180, 800, -162.35267519735217, -0.8163265306122449, + -0.01926737460893513), + TestValue(0, 180, 15324, -178.95104102256036, -0.9883900928792569, + -0.00006792118926490787), + TestValue(0, 180, 150000, -179.8920863223863, -0.9988014382740711, + -7.188495541043949e-7), + TestValue(0, 1123, 0.0004, -0.005939122128713381, -3.5618865318302646e-7, + -13.847805677972104), + TestValue(0, 1123, 0.065, -0.6342170147837343, -0.000057877326779839104, + -8.75724272015346), + TestValue(0, 1123, 4.42, -24.493639593452325, -0.00392045555338738, + -4.545467874886493), + TestValue(0, 1123, 800, -701.6240143366822, -0.4160166406656266, + -0.29304665858647905), + TestValue(0, 1123, 15324, -1083.757151397245, -0.9317200705295798, + -0.002442933450309326), + TestValue(0, 1123, 150000, -1118.817101006986, -0.9925689670003904, + -0.000027747673771116865), + TestValue(0, 10586, 0.0004, -0.006836533480423993, -3.778575334268833e-8, + -16.091333738845734), + TestValue(0, 10586, 0.065, -0.7800430171085975, -6.1401474485561915e-6, + -11.00066794181818), + TestValue(0, 10586, 4.42, -34.3945190758502, -0.0004173583295091224, + -6.781982760105572), + TestValue(0, 10586, 800, -2124.4224654744803, -0.07026172492534692, + -1.7257898067684474), + TestValue(0, 10586, 15324, -8048.29915678056, -0.5914318795831726, + -0.11664064731878732), + TestValue(0, 10586, 150000, -10229.149577360897, -0.9340789358972762, + -0.0022732664130149516), + TestValue(7, 0.0000256, 0.0004, -29.445354199147125, 256989.1917293233, + -13944.92090243279), + TestValue(7, 0.0000256, 0.065, -59.40270770911646, 273328.85048350185, + -89.90748568276743), + TestValue(7, 0.0000256, 4.42, -79.18162818224879, 273434.9163045572, + -0.5615296684557465), + TestValue(7, 0.0000256, 800, -82.50943543843826, 273436.49125003227, + -0.00003263555538968177), + TestValue(7, 0.0000256, 15324, -82.5342442124603, 273436.4995432019, + -8.94022633701752e-8), + TestValue(7, 0.0000256, 150000, -82.53547440969385, 273436.4999533335, + -9.33299659777731e-10), + TestValue(7, 0.314, 0.0004, -9.780554584441889, 0.027090322685207696, + 2474.516543534505), + TestValue(7, 0.314, 0.065, -5.954681567099272, 3.6518326807051746, + -1.661885301087814), + TestValue(7, 0.314, 4.42, -14.063434552944763, 19.880657339909963, + -0.4587955394328642), + TestValue(7, 0.314, 800, -16.924203575168434, 21.284639409604978, + -0.000029279795684011845), + TestValue(7, 0.314, 15324, -16.946467423587734, 21.292557330455672, + -8.025298470215603e-8), + TestValue(7, 0.314, 150000, -16.947571739258493, 21.29294905733322, + -8.378080451620917e-10), + TestValue(7, 1.5, 0.0004, -9.774134608119379, 0.0009775171065493646, + 2490.5539367351803), + TestValue(7, 1.5, 0.065, -5.026800862430695, 0.15228966986155484, + 11.046793754083321), + TestValue(7, 1.5, 4.42, -5.669765754393499, 2.7376126126126126, + -0.1990792406277535), + TestValue(7, 1.5, 800, -7.172434628346302, 3.6598045331669784, + -0.000018013716757359077), + TestValue(7, 1.5, 15324, -7.186147155348181, 3.6663077876741377, + -4.948342535726624e-8), + TestValue(7, 1.5, 150000, -7.1868281060611565, 3.666630000366663, + -5.166445049553658e-10), + TestValue(7, 8, 0.0004, -9.773287685468139, -6.249687515624219e-6, + 2492.6708598338487), + TestValue(7, 8, 0.065, -4.893078153217412, -0.0010074395536267824, + 13.045515423749752), + TestValue(7, 8, 4.42, -2.4138267066913563, -0.04448470209339775, + 0.06951848372348413), + TestValue(7, 8, 800, -1.972808375834589, -0.12376237623762376, + 4.6570738199136485e-6), + TestValue(7, 8, 15324, -1.9692663072788577, -0.12493477693712497, + 1.277112104958178e-8), + TestValue(7, 8, 150000, -1.9690905691403486, -0.12499333368886993, + 1.333280152948646e-10), + TestValue(7, 180, 0.0004, -9.774198636769189, -2.1357977229186406e-6, + 2490.3935075261693), + TestValue(7, 180, 0.065, -5.040836257459913, -0.00034694261640086756, + 10.776502846558865), + TestValue(7, 180, 4.42, -11.4293253460954, -0.023034980539589585, + -1.770828372217259), + TestValue(7, 180, 800, -135.92154531818449, -0.7845804988662132, + -0.017692867587181027), + TestValue(7, 180, 15324, -151.2058790199169, -0.949952700378397, + -0.00006270718914258566), + TestValue(7, 180, 150000, -152.07480469327567, -0.9599591601189683, + -6.638499794320296e-7), + TestValue(7, 1123, 0.0004, -9.77491789464706, -3.539684211507191e-7, + 2488.5953646554194), + TestValue(7, 1123, 0.065, -5.157696519888815, -0.00005751655982751597, + 8.978948920929607), + TestValue(7, 1123, 4.42, -19.28929343971758, -0.003896018163473122, + -3.5295051749149056), + TestValue(7, 1123, 800, -667.0958939480461, -0.41342348262051587, + -0.287969440027692), + TestValue(7, 1123, 15324, -1043.6096899099389, -0.9259123764122984, + -0.0024118325958113473), + TestValue(7, 1123, 150000, -1078.228021151623, -0.9863819832345821, + -0.000027401825537509694), + TestValue(7, 10586, 0.0004, -9.77581307717804, -3.7760767486519914e-8, + 2486.357408645293), + TestValue(7, 10586, 0.065, -5.303160350365611, -6.136087271705644e-6, + 6.741095395500565), + TestValue(7, 10586, 4.42, -29.16559791545973, -0.00041708235101804323, + -5.760472168602957), + TestValue(7, 10586, 800, -2086.6391306495434, -0.0702152643099608, + -1.7176872326969326), + TestValue(7, 10586, 15324, -7995.6283957432015, -0.5910407948337788, + -0.11645410288972613), + TestValue(7, 10586, 150000, -10173.280945470673, -0.9334612755391352, + -0.0022701910299964823), + TestValue(14, 0.0000256, 0.0004, -49.814562438358635, 513979.32330827066, + -30391.559221530802), + TestValue(14, 0.0000256, 0.065, -114.92817109028836, 546658.7005733127, + -196.83239209326592), + TestValue(14, 0.0000256, 4.42, -161.64931287705224, 546870.8326033225, + -1.650128690902025), + TestValue(14, 0.0000256, 800, -173.09898662779824, 546873.9825000325, + -0.00014060727924558591), + TestValue(14, 0.0000256, 15324, -173.20616504262574, 546873.9990864021, + -3.872936886750722e-7), + TestValue(14, 0.0000256, 150000, -173.21149502739468, 546873.9999066668, + -4.044185430984726e-9), + TestValue(14, 0.314, 0.0004, -10.482321240387563, 0.05545291000145865, + 2452.982014445862), + TestValue(14, 0.314, 0.065, -7.917539720426937, 7.4751693191939905, + -19.40653851445296), + TestValue(14, 0.314, 4.42, -31.109603016060397, 40.69498599371937, + -1.4423583039713965), + TestValue(14, 0.314, 800, -41.61461010763844, 43.568886473205765, + -0.00013381877200302483), + TestValue(14, 0.314, 15324, -41.71664028188991, 43.58509417059771, + -3.687852014877535e-7), + TestValue(14, 0.314, 150000, -41.72171561524851, 43.58589602133749, + -3.851015506484146e-9), + TestValue(14, 1.5, 0.0004, -10.468856159359483, 0.002221629787612192, + 2486.6186161358087), + TestValue(14, 1.5, 0.065, -5.969601492726813, 0.34611288604898827, + 7.298954082323366), + TestValue(14, 1.5, 4.42, -13.334103973863655, 6.221846846846847, + -0.8864094608348823), + TestValue(14, 1.5, 800, -20.926415102269573, 8.317737575379496, + -0.00010961017476240897), + TestValue(14, 1.5, 15324, -21.010069937864472, 8.332517699259403, + -3.0266583905813604e-7), + TestValue(14, 1.5, 150000, -21.014235520108855, 8.333250000833324, + -3.160877781738236e-9), + TestValue(14, 8, 0.0004, -10.466492810136518, 0.00003749812509374531, + 2492.526005536275), + TestValue(14, 8, 0.065, -5.595578961607217, 0.006044637321760695, + 12.902571279344416), + TestValue(14, 8, 4.42, -3.5471312844257383, 0.2669082125603865, + 0.0010136106025722125), + TestValue(14, 8, 800, -4.065493420056555, 0.7425742574257426, + -0.00001668126667020431), + TestValue(14, 8, 15324, -4.078322333399456, 0.7496086616227498, + -4.677001541608661e-8), + TestValue(14, 8, 150000, -4.0789662719144815, 0.7499600021332196, + -4.888125459956427e-10), + TestValue(14, 180, 0.0004, -10.467069325725546, -2.04937816187569e-6, + 2491.084720678314), + TestValue(14, 180, 0.065, -5.689219198051667, -0.0003329044758528556, + 11.4626317745298), + TestValue(14, 180, 4.42, -9.653376579596795, -0.022102929303883648, + -1.313682997645138), + TestValue(14, 180, 800, -117.57055678993851, -0.7528344671201814, + -0.016193696733894036), + TestValue(14, 180, 15324, -131.5984192349756, -0.911515307877537, + -0.000057701678183974536), + TestValue(14, 180, 150000, -132.39809487222743, -0.9211168819638655, + -6.110279944238073e-7), + TestValue(14, 1123, 0.0004, -10.467775521386166, -3.517481891184117e-7, + 2489.3192333086026), + TestValue(14, 1123, 0.065, -5.803957292009425, -0.000057155792875192846, + 9.697719756764902), + TestValue(14, 1123, 4.42, -17.37102939846337, -0.003871580773558864, + -3.040611828950623), + TestValue(14, 1123, 800, -640.6479149103316, -0.4108303245754051, + -0.2829675576373729), + TestValue(14, 1123, 15324, -1011.5999306403351, -0.920104682295017, + -0.00238094023047708), + TestValue(14, 1123, 150000, -1045.7795131043224, -0.9801949994687738, + -0.00002705815489179031), + TestValue(14, 10586, 0.0004, -10.468668475096411, -3.7735781630351504e-8, + 2487.0868493492235), + TestValue(14, 10586, 0.065, -5.949058950638154, -6.132027094855097e-6, + 7.465437927571536), + TestValue(14, 10586, 4.42, -27.2227588675498, -0.0004168063725269641, + -5.266030931107645), + TestValue(14, 10586, 800, -2056.9359371755286, -0.07016880369457469, + -1.7096599947938858), + TestValue(14, 10586, 15324, -7951.095336923546, -0.590649710084385, + -0.11626776694982688), + TestValue(14, 10586, 150000, -10125.552885388513, -0.9328436151809941, + -0.002267117824567677), + TestValue(1525, 0.0000256, 0.0004, -4301.784727467015, 5.5987134868421055e7, + -3.580668787634408e6), + TestValue(1525, 0.0000256, 0.065, -11965.467128123484, 5.954685919853104e7, + -23429.11268911477), + TestValue(1525, 0.0000256, 4.42, -18367.34289180058, 5.956996647937967e7, + -339.0570825343945), + TestValue(1525, 0.0000256, 800, -24826.22813563853, 5.957030959375009e7, + -0.8389762876176414), + TestValue(1525, 0.0000256, 15324, -25707.717028801628, 5.957031140048291e7, + -0.004643062913324059), + TestValue(1525, 0.0000256, 150000, -25773.43154710444, 5.957031148983333e7, + -0.00005129937594539058), + TestValue(1525, 0.314, 0.0004, -17.094738795518424, 6.1777199721236284, + -2348.2711549792057), + TestValue(1525, 0.314, 0.065, -296.58556828610017, 832.7696922844226, + -4001.4921811261693), + TestValue(1525, 0.314, 4.42, -4115.10160678526, 4533.61649969458, + -316.1764856190919), + TestValue(1525, 0.314, 800, -10469.94267675256, 4853.782788344746, + -0.8382285160349765), + TestValue(1525, 0.314, 15324, -11350.864477542971, 4855.588403521258, + -0.004641024152967077), + TestValue(1525, 0.314, 150000, -11416.550945303003, 4855.677733537116, + -0.00005127809769334135), + TestValue(1525, 1.5, 0.0004, -15.560537541616213, 0.270772238514174, + 1484.280307752038), + TestValue(1525, 1.5, 0.065, -74.45092758687497, 42.184238551650694, + -953.4745083343279), + TestValue(1525, 1.5, 4.42, -2072.1910365790172, 758.3186936936937, + -251.67662613527665), + TestValue(1525, 1.5, 800, -8088.548799680884, 1013.7658556872531, + -0.8354105724129193), + TestValue(1525, 1.5, 15324, -8967.33164084002, 1015.5672571857361, + -0.004633327525485953), + TestValue(1525, 1.5, 150000, -9032.912208922884, 1015.6565101015657, + -0.00005119776202988646), + TestValue(1525, 8, 0.0004, -15.230842685268726, 0.00948077596120194, + 2308.3869231549475), + TestValue(1525, 8, 0.065, -22.20647206997819, 1.528285802851829, + -169.72844230404513), + TestValue(1525, 8, 4.42, -652.6338020806143, 67.48329307568439, + -117.2113317142287), + TestValue(1525, 8, 800, -5554.513964530293, 187.74752475247524, + -0.8201519269955586), + TestValue(1525, 8, 15324, -6421.662226247852, 189.52605661361858, + -0.004591272777291877), + TestValue(1525, 8, 150000, -6486.664023141206, 189.61488720601568, + -0.00005075860649661479), + TestValue(1525, 180, 0.0004, -15.159228863591125, 0.000016604901371824113, + 2487.4167692289852), + TestValue(1525, 180, 0.065, -10.618383986015033, 0.0026973284338680167, + 7.7929628140754765), + TestValue(1525, 180, 4.42, -30.756932642065294, 0.1790869874320693, + -5.0606677133089075), + TestValue(1525, 180, 800, -1255.1060610431614, 6.099773242630386, + -0.5081161722061651), + TestValue(1525, 180, 15324, -1861.5172673616398, 7.38547041623667, + -0.0035556000115217756), + TestValue(1525, 180, 150000, -1912.1930479564326, 7.463266302659031, + -0.00003983284968711587), + TestValue(1525, 1123, 0.0004, -15.157115486355906, 1.2750475385536657e-7, + 2492.70020501204), + TestValue(1525, 1123, 0.065, -10.275036857130544, 0.000020718330690556827, + 13.074039765317043), + TestValue(1525, 1123, 4.42, -7.7548168672583415, 0.0014034043922188128, + 0.0654298516080507), + TestValue(1525, 1123, 800, -30.39018204828426, 0.14892136201921807, + -0.018804728472968435), + TestValue(1525, 1123, 15324, -64.3938471491183, 0.33352757644959136, + -0.00029097614079454104), + TestValue(1525, 1123, 150000, -68.69059192176792, 0.3553096391221344, + -3.4982159551333325e-6), + TestValue(1525, 10586, 0.0004, -15.157527333190956, -3.234240610599839e-8, + 2491.6705880068075), + TestValue(1525, 10586, 0.065, -10.34196113541293, -5.255608920401252e-6, + 12.044448366424728), + TestValue(1525, 10586, 4.42, -12.301855613945008, -0.0003572344439525938, + -0.9624372357797295), + TestValue(1525, 10586, 800, -744.0169167062886, -0.060139948001942986, + -0.7924525685250288), + TestValue(1525, 10586, 15324, -4300.645593413912, -0.506231273465249, + -0.08062419697917278), + TestValue(1525, 10586, 150000, -5850.263517824056, -0.799517215016552, + -0.0016543683056511327), + TestValue(10233, 0.0000256, 0.0004, -28781.07085289515, + 3.7568285855263156e8, -2.4041193199521683e7), + TestValue(10233, 0.0000256, 0.065, -80237.4790550341, 3.995691927102557e8, + -157343.697098361), + TestValue(10233, 0.0000256, 4.42, -123371.16336416776, 3.997242463550437e8, + -2307.279979293951), + TestValue(10233, 0.0000256, 800, -173733.65594636812, 3.997265487087504e8, + -10.166635446653597), + TestValue(10233, 0.0000256, 15324, -189611.39394380094, + 3.9972656083222395e8, -0.15627194690990365), + TestValue(10233, 0.0000256, 150000, -192108.97687250923, 3.9972656143178e8, + -0.0022260752765799197), + TestValue(10233, 0.314, 0.0004, -30.083534640958533, 41.460778593539814, + -30043.568270589793), + TestValue(10233, 0.314, 0.065, -1936.716591758479, 5589.00047056451, + -26975.841613138524), + TestValue(10233, 0.314, 4.42, -27734.55588693275, 30426.641345033488, + -2153.7342775414127), + TestValue(10233, 0.314, 800, -77398.83453431107, 32575.386135464123, + -10.16161733713528), + TestValue(10233, 0.314, 15324, -93272.76691554434, 32587.50423265796, + -0.15625826529496223), + TestValue(10233, 0.314, 150000, -95770.16160401958, 32588.103756758428, + -0.0022259324835118832), + TestValue(10233, 1.5, 0.0004, -19.785223133323598, 1.8184484137563317, + -4317.601447204935), + TestValue(10233, 1.5, 0.065, -445.630392408013, 283.3003194888179, + -6515.787894589817), + TestValue(10233, 1.5, 4.42, -14020.648493631525, 5092.706081081081, + -1720.7211329093311), + TestValue(10233, 1.5, 800, -61412.52664040723, 6808.234560199626, + -10.142698900729565), + TestValue(10233, 1.5, 15324, -77272.09898456372, 6820.332387197807, + -0.15620659350885369), + TestValue(10233, 1.5, 150000, -79768.7827089832, 6820.931790682093, + -0.0022253931450428865), + TestValue(10233, 8, 0.0004, -17.56909362175793, 0.06390305484725764, + 1221.8452476349516), + TestValue(10233, 8, 0.065, -94.45295843966596, 10.30106943583385, + -1247.5517925303861), + TestValue(10233, 8, 4.42, -4476.485408813824, 454.85607890499193, + -816.4371067130297), + TestValue(10233, 8, 800, -44371.840290708235, 1265.470297029703, + -10.040039157123783), + TestValue(10233, 8, 15324, -60153.13532501529, 1277.4580941821027, + -0.15592364901449507), + TestValue(10233, 8, 150000, -62645.92507437721, 1278.056836968695, + -0.002222438504382751), + TestValue(10233, 180, 0.0004, -17.08144177432405, 0.00012411083530925487, + 2440.94300115826), + TestValue(10233, 180, 0.065, -15.542242814932251, 0.020160775275594924, + -38.6634853761835), + TestValue(10233, 180, 4.42, -235.49737914944126, 1.3385587246502548, + -50.37753458197702), + TestValue(10233, 180, 800, -14640.50246307096, 45.59183673469388, + -7.836489965276398), + TestValue(10233, 180, 15324, -28577.644697168085, 55.2015866873065, + -0.14858705144088802), + TestValue(10233, 180, 150000, -30968.941707557387, 55.78306032760687, + -0.0021450282568338253), + TestValue(10233, 1123, 0.0004, -17.063078998820856, 2.8894734020457448e-6, + 2486.849880233364), + TestValue(10233, 1123, 0.065, -12.558918107941281, 0.0004695124193805291, + 7.224124958319663), + TestValue(10233, 1123, 4.42, -35.45506157865748, 0.031803517445555686, + -5.756960605210265), + TestValue(10233, 1123, 800, -3343.1303902972795, 3.3748099701370067, + -2.9898053694742615), + TestValue(10233, 1123, 15324, -11352.060718035325, 7.558299058347705, + -0.11311918072723515), + TestValue(10233, 1123, 150000, -13237.322258064814, 8.051917443787673, + -0.0017468778907598903), + TestValue(10233, 10586, 0.0004, -17.060718192660715, -1.2600010324928188e-9, + 2492.7518943576556), + TestValue(10233, 10586, 0.065, -12.175300607224926, -2.047489183204549e-7, + 13.125723676609066), + TestValue(10233, 10586, 4.42, -9.430792045634007, -0.00001391720105013416, + 0.11674937200192481), + TestValue(10233, 10586, 800, -7.2703661972227565, -0.0023429424616141564, + 0.00008904830662359586), + TestValue(10233, 10586, 15324, -9.327824035135563, -0.019721845219427537, + -0.00008059480749977865), + TestValue(10233, 10586, 150000, -11.132452601363184, -0.031147729489111892, + -2.2067081495436014e-6), +}; TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { using stan::math::is_nan; From abc6858009ebe0c4cf4f87062f78d701b5a9627c Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Wed, 11 Dec 2019 13:08:59 +0100 Subject: [PATCH 13/82] Changing order of operations, passing precomputed test --- stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp | 6 ++---- .../scal/fun/binomial_coefficient_log_test.cpp | 3 +++ .../math/rev/scal/prob/neg_binomial_2_test.cpp | 14 ++++++++++---- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp index 96b17de1589..1df8b2aa0e1 100644 --- a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp @@ -122,11 +122,9 @@ return_type_t neg_binomial_2_lpmf( if (include_summand::value) { logp += binomial_coefficient_log(n_plus_phi[i] - 1, n_vec[i]); } - if (include_summand::value) { - logp += multiply_log(phi__[i], phi__[i]); - } if (include_summand::value) { - logp -= (n_plus_phi[i]) * log_mu_plus_phi[i]; + logp += phi__[i] * (log(phi__[i]) - log(mu__[i] + phi__[i])) + - (n_vec[i]) * log_mu_plus_phi[i]; } if (include_summand::value) { logp += multiply_log(n_vec[i], mu__[i]); diff --git a/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp b/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp index 2bc50f0d4a9..554cd0b743a 100644 --- a/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp +++ b/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp @@ -20,6 +20,9 @@ TEST(MathFunctions, binomial_coefficient_log) { EXPECT_FLOAT_EQ(29979.16, binomial_coefficient_log(100000, 91116)); + EXPECT_EQ(binomial_coefficient_log(50, 0), 0); + EXPECT_EQ(binomial_coefficient_log(10000, 0), 0); + for (int n = 0; n < 1010; ++n) { test_binom_coefficient(1010, n); test_binom_coefficient(1010.0, n); diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index 50b917c30aa..4bbdd8982f2 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -479,6 +479,7 @@ TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { using stan::math::neg_binomial_2_log; using stan::math::value_of; using stan::math::var; + using stan::math::digamma; for (auto iter = testValues.begin(); iter != testValues.end(); ++iter) { TestValue t = *iter; @@ -498,12 +499,17 @@ TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { EXPECT_FALSE(is_nan(gradients[i])); } - EXPECT_NEAR(value_of(val), t.value, fabs(t.value * 1e-8)) + auto tolerance = [](double x) { + return std::max(fabs(x * 1e-8), 1e-14); + }; + + EXPECT_NEAR(value_of(val), t.value, tolerance(t.value)) << "value n = " << n << ", mu = " << t.mu << ", phi = " << t.phi; - EXPECT_NEAR(gradients[0], t.grad_mu, fabs(t.grad_mu * 1e-8)) + EXPECT_NEAR(gradients[0], t.grad_mu, tolerance(t.grad_mu)) << "grad_mu n = " << n << ", mu = " << t.mu << ", phi = " << t.phi; - EXPECT_NEAR(gradients[1], t.grad_phi, fabs(t.grad_phi * 1e-8)) - << "grad_phi n = " << n << ", mu = " << t.mu << ", phi = " << t.phi; + EXPECT_NEAR(gradients[1], t.grad_phi, tolerance(t.grad_phi)) + << "grad_phi n = " << n << ", mu = " << t.mu << ", phi = " << t.phi << + ", digamma = " << digamma(t.phi) << ", " << digamma(t.n + t.phi); } } From 2dcbb82b48e712ec655b94b4eee662363569a7ec Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Wed, 11 Dec 2019 07:09:54 -0500 Subject: [PATCH 14/82] [Jenkins] auto-formatting by clang-format version 6.0.0 (tags/google/stable/2017-11-14) --- stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp | 4 ++-- test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp | 10 ++++------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp index 1df8b2aa0e1..46a1aa68ac5 100644 --- a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp @@ -123,8 +123,8 @@ return_type_t neg_binomial_2_lpmf( logp += binomial_coefficient_log(n_plus_phi[i] - 1, n_vec[i]); } if (include_summand::value) { - logp += phi__[i] * (log(phi__[i]) - log(mu__[i] + phi__[i])) - - (n_vec[i]) * log_mu_plus_phi[i]; + logp += phi__[i] * (log(phi__[i]) - log(mu__[i] + phi__[i])) + - (n_vec[i]) * log_mu_plus_phi[i]; } if (include_summand::value) { logp += multiply_log(n_vec[i], mu__[i]); diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index 4bbdd8982f2..1b4a63638f9 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -475,11 +475,11 @@ std::array testValues = { }; TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { + using stan::math::digamma; using stan::math::is_nan; using stan::math::neg_binomial_2_log; using stan::math::value_of; using stan::math::var; - using stan::math::digamma; for (auto iter = testValues.begin(); iter != testValues.end(); ++iter) { TestValue t = *iter; @@ -499,17 +499,15 @@ TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { EXPECT_FALSE(is_nan(gradients[i])); } - auto tolerance = [](double x) { - return std::max(fabs(x * 1e-8), 1e-14); - }; + auto tolerance = [](double x) { return std::max(fabs(x * 1e-8), 1e-14); }; EXPECT_NEAR(value_of(val), t.value, tolerance(t.value)) << "value n = " << n << ", mu = " << t.mu << ", phi = " << t.phi; EXPECT_NEAR(gradients[0], t.grad_mu, tolerance(t.grad_mu)) << "grad_mu n = " << n << ", mu = " << t.mu << ", phi = " << t.phi; EXPECT_NEAR(gradients[1], t.grad_phi, tolerance(t.grad_phi)) - << "grad_phi n = " << n << ", mu = " << t.mu << ", phi = " << t.phi << - ", digamma = " << digamma(t.phi) << ", " << digamma(t.n + t.phi); + << "grad_phi n = " << n << ", mu = " << t.mu << ", phi = " << t.phi + << ", digamma = " << digamma(t.phi) << ", " << digamma(t.n + t.phi); } } From b6bf80c7435e8b2866590ee1686de8675ad66885 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Wed, 11 Dec 2019 13:11:01 +0100 Subject: [PATCH 15/82] Removed unnecessary debug info --- test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index 1b4a63638f9..c1d064f5140 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -475,7 +475,6 @@ std::array testValues = { }; TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { - using stan::math::digamma; using stan::math::is_nan; using stan::math::neg_binomial_2_log; using stan::math::value_of; @@ -506,8 +505,7 @@ TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { EXPECT_NEAR(gradients[0], t.grad_mu, tolerance(t.grad_mu)) << "grad_mu n = " << n << ", mu = " << t.mu << ", phi = " << t.phi; EXPECT_NEAR(gradients[1], t.grad_phi, tolerance(t.grad_phi)) - << "grad_phi n = " << n << ", mu = " << t.mu << ", phi = " << t.phi - << ", digamma = " << digamma(t.phi) << ", " << digamma(t.n + t.phi); + << "grad_phi n = " << n << ", mu = " << t.mu << ", phi = " << t.phi; } } From 85059fd15dd33c1c8b92393ea2073703be5be865 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Wed, 11 Dec 2019 13:22:54 +0100 Subject: [PATCH 16/82] Use precomputed values --- stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp index 46a1aa68ac5..0928d8503d8 100644 --- a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp @@ -123,7 +123,7 @@ return_type_t neg_binomial_2_lpmf( logp += binomial_coefficient_log(n_plus_phi[i] - 1, n_vec[i]); } if (include_summand::value) { - logp += phi__[i] * (log(phi__[i]) - log(mu__[i] + phi__[i])) + logp += phi__[i] * (log_phi[i] - log_mu_plus_phi[i]) - (n_vec[i]) * log_mu_plus_phi[i]; } if (include_summand::value) { From 788c894d7a0e53d53883b12a4bd9c9aeeafdebf9 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Wed, 11 Dec 2019 14:16:53 +0100 Subject: [PATCH 17/82] Test for continuity of gradients at cutoff Implemented gradient wrt. phi for Poisson approximation to make the test pass --- .../prim/scal/prob/neg_binomial_2_lpmf.hpp | 18 ++++-- .../rev/scal/prob/neg_binomial_2_test.cpp | 64 ++++++++++++++++++- 2 files changed, 76 insertions(+), 6 deletions(-) diff --git a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp index 0928d8503d8..d834e56ee1b 100644 --- a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -108,15 +109,22 @@ return_type_t neg_binomial_2_lpmf( // This is the Taylor series of the full derivative for phi -> Inf // Obtained in Mathematica via // Series[n/mu - (n + phi)/(mu+phi),{phi,Infinity, 1}] + // Currently ignoring the term (mu__[i] - n_vec[i]) / phi__[i] ops_partials.edge1_.partials_[i] - += n_vec[i] / mu__[i] + (mu__[i] - n_vec[i]) / phi__[i] - 1; + += n_vec[i] / mu__[i] - 1; } - // The derivative wrt. phi = 0 + O(1/neg_binomial_2_phi_cutoff^2) - // So ignoring here - // Obtained in Mathematica via + // The derivative wrt. phi = 0 + O(1/neg_binomial_2_phi_cutoff^2), + // But the quadratic term is big enough to warrant inclusion here + // (can be around 1e-6 at cutoff). + // Expansion obtained in Mathematica via // Series[1 - (n + phi) / (mu + phi) + Log[phi] - Log[mu + phi] - - // PolyGamma[phi] + PolyGamma[n + phi],{phi,Infinity, 1}] + // PolyGamma[phi] + PolyGamma[n + phi],{phi,Infinity, 2}] + if (!is_constant_all::value) { + ops_partials.edge2_.partials_[i] + += (mu__[i] * (-mu__[i] + 2 * n_vec[i]) + n_vec[i] * (1 - n_vec[i]) ) + / (2 * square(phi__[i])); + } } else { if (include_summand::value) { diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index c1d064f5140..0a8c78ccc63 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -587,4 +587,66 @@ TEST(ProbDistributionsNegativeBinomial2, proptoAtPoissonCutoff) { EXPECT_NEAR(value_of(value_before_cutoff), value_of(value_after_cutoff), 1); } -// TODO(martinmodrak) test continuity of derivatives at cutoff + +TEST(ProbDistributionsNegBinomial, derivativesAtCutoff) { + double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; + using stan::math::is_nan; + using stan::math::var; + + std::array mu_to_test + = {9.3e-6, 0.0028252, 4, 11, 8522, 984256, 5036842}; + std::array n_to_test + = {0, 1, 5, 48, 1158, 224582, 48235842, 20314458}; + for (auto mu_iter = mu_to_test.begin(); mu_iter != mu_to_test.end(); + ++mu_iter) { + double mu = *mu_iter; + for (auto n_iter = n_to_test.begin(); n_iter != n_to_test.end(); ++n_iter) { + unsigned int n = *n_iter; + var mu_before(mu); + var phi_before(phi_cutoff - 1e-8); + var value_before = neg_binomial_2_lpmf(n, mu_before, phi_before); + std::vector x_before; + x_before.push_back(mu_before); + x_before.push_back(phi_before); + + std::vector gradients_before; + value_before.grad(x_before, gradients_before); + + var mu_after(mu); + var phi_after(phi_cutoff + 1e-8); + var value_after = neg_binomial_2_lpmf(n, mu_after, phi_after); + std::vector x_after; + x_after.push_back(mu_after); + x_after.push_back(phi_after); + + std::vector gradients_after; + value_after.grad(x_after, gradients_after); + + + for (int i = 0; i < 2; ++i) { + EXPECT_FALSE(is_nan(gradients_before[i])); + EXPECT_FALSE(is_nan(gradients_after[i])); + } + + EXPECT_NEAR(value_of(value_before), value_of(value_after), + 1e-8 * fabs(value_of(value_after))) + << "value changes too much around phi cutoff for n = " + << n << ", mu = " << mu << ", cutoff = " << phi_cutoff + << " value at cutoff - 1e-8: " << value_of(value_before) + << ", value at cutoff + 1e-8: " << value_of(value_after); + EXPECT_NEAR(gradients_before[0], gradients_after[0], + 1e-8 * fabs(gradients_before[0])) + << "grad_mu changes too much around phi cutoff for n = " + << n << ", mu = " << mu << ", cutoff = " << phi_cutoff + << " grad_mu at cutoff - 1e-8: " << gradients_before[0] + << ", grad_mu at cutoff + 1e-8: " << gradients_after[0]; + + EXPECT_NEAR(gradients_before[1], gradients_after[1], + 1e-8 * fabs(gradients_before[1])) + << "grad_phi changes too much around phi cutoff for n = " + << n << ", mu = " << mu << ", cutoff = " << phi_cutoff + << " grad_phi at cutoff - 1e-8: " << gradients_before[1] + << ", grad_phi at cutoff + 1e-8: " << gradients_after[1]; + } + } +} From 8ec6a37cb73ac4d05945e846b2bc3cfae2633c69 Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Wed, 11 Dec 2019 08:17:47 -0500 Subject: [PATCH 18/82] [Jenkins] auto-formatting by clang-format version 6.0.0 (tags/google/stable/2017-11-14) --- .../prim/scal/prob/neg_binomial_2_lpmf.hpp | 7 ++--- .../rev/scal/prob/neg_binomial_2_test.cpp | 28 +++++++++---------- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp index d834e56ee1b..c2fa67dcbd3 100644 --- a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp @@ -110,8 +110,7 @@ return_type_t neg_binomial_2_lpmf( // Obtained in Mathematica via // Series[n/mu - (n + phi)/(mu+phi),{phi,Infinity, 1}] // Currently ignoring the term (mu__[i] - n_vec[i]) / phi__[i] - ops_partials.edge1_.partials_[i] - += n_vec[i] / mu__[i] - 1; + ops_partials.edge1_.partials_[i] += n_vec[i] / mu__[i] - 1; } // The derivative wrt. phi = 0 + O(1/neg_binomial_2_phi_cutoff^2), @@ -122,8 +121,8 @@ return_type_t neg_binomial_2_lpmf( // PolyGamma[phi] + PolyGamma[n + phi],{phi,Infinity, 2}] if (!is_constant_all::value) { ops_partials.edge2_.partials_[i] - += (mu__[i] * (-mu__[i] + 2 * n_vec[i]) + n_vec[i] * (1 - n_vec[i]) ) - / (2 * square(phi__[i])); + += (mu__[i] * (-mu__[i] + 2 * n_vec[i]) + n_vec[i] * (1 - n_vec[i])) + / (2 * square(phi__[i])); } } else { diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index 0a8c78ccc63..d6f75e40d40 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -587,7 +587,6 @@ TEST(ProbDistributionsNegativeBinomial2, proptoAtPoissonCutoff) { EXPECT_NEAR(value_of(value_before_cutoff), value_of(value_after_cutoff), 1); } - TEST(ProbDistributionsNegBinomial, derivativesAtCutoff) { double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; using stan::math::is_nan; @@ -622,31 +621,30 @@ TEST(ProbDistributionsNegBinomial, derivativesAtCutoff) { std::vector gradients_after; value_after.grad(x_after, gradients_after); - for (int i = 0; i < 2; ++i) { EXPECT_FALSE(is_nan(gradients_before[i])); EXPECT_FALSE(is_nan(gradients_after[i])); } - EXPECT_NEAR(value_of(value_before), value_of(value_after), - 1e-8 * fabs(value_of(value_after))) - << "value changes too much around phi cutoff for n = " - << n << ", mu = " << mu << ", cutoff = " << phi_cutoff + EXPECT_NEAR(value_of(value_before), value_of(value_after), + 1e-8 * fabs(value_of(value_after))) + << "value changes too much around phi cutoff for n = " << n + << ", mu = " << mu << ", cutoff = " << phi_cutoff << " value at cutoff - 1e-8: " << value_of(value_before) << ", value at cutoff + 1e-8: " << value_of(value_after); - EXPECT_NEAR(gradients_before[0], gradients_after[0], - 1e-8 * fabs(gradients_before[0])) - << "grad_mu changes too much around phi cutoff for n = " - << n << ", mu = " << mu << ", cutoff = " << phi_cutoff + EXPECT_NEAR(gradients_before[0], gradients_after[0], + 1e-8 * fabs(gradients_before[0])) + << "grad_mu changes too much around phi cutoff for n = " << n + << ", mu = " << mu << ", cutoff = " << phi_cutoff << " grad_mu at cutoff - 1e-8: " << gradients_before[0] << ", grad_mu at cutoff + 1e-8: " << gradients_after[0]; - EXPECT_NEAR(gradients_before[1], gradients_after[1], - 1e-8 * fabs(gradients_before[1])) - << "grad_phi changes too much around phi cutoff for n = " - << n << ", mu = " << mu << ", cutoff = " << phi_cutoff + EXPECT_NEAR(gradients_before[1], gradients_after[1], + 1e-8 * fabs(gradients_before[1])) + << "grad_phi changes too much around phi cutoff for n = " << n + << ", mu = " << mu << ", cutoff = " << phi_cutoff << " grad_phi at cutoff - 1e-8: " << gradients_before[1] - << ", grad_phi at cutoff + 1e-8: " << gradients_after[1]; + << ", grad_phi at cutoff + 1e-8: " << gradients_after[1]; } } } From eb7f7fc7d38600f0551fc99791efaf109a82dd25 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Wed, 11 Dec 2019 14:26:10 +0100 Subject: [PATCH 19/82] Updated Mathematica code+reference --- test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index d6f75e40d40..9036b3b14b4 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -21,14 +21,17 @@ struct TestValue { grad_phi(_grad_phi) {} }; -// Test data generated in Mathematica (Wolfram Cloud) via +// Test data generated in Mathematica (Wolfram Cloud). The code can be re-ran +// at https://www.wolframcloud.com/env/martin.modrak/NegBinomial2_Tests.nb +// but is also presented below for conveniece: +// // nb2[n_,mu_,phi_]:= LogGamma[n + phi] - LogGamma[n + 1] - LogGamma[phi ]+ // n * (Log[mu] - Log[mu + phi]) + phi * (Log[phi] - Log[mu + phi]) // nb2dmu[n_,mu_,phi_]= D[nb2[n, mu, phi],mu]; // nb2dphi[n_,mu_,phi_]= D[nb2[n, mu, phi],phi]; // out = OpenWrite["nb_test.txt"] -// mus= {256*10^-7,314*10^-3,15*10^-1,3,180, 1123,10586}; -// phis= {4*10^-4,65*10^-3,442*10^-2,800, 15324}; +// mus= {256*10^-7,314*10^-3,15*10^-1,8,180, 1123,10586}; +// phis= {4*10^-4,65*10^-3,442*10^-2,800, 15324,150000}; // ns = {0,6,14,1525,10233}; // WriteString[out, "std::array testValues = {"]; From d54bedd827dde61d8e6889f6e31d17877586c6e1 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Wed, 11 Dec 2019 14:29:36 +0100 Subject: [PATCH 20/82] Removing old code --- stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp index c2fa67dcbd3..fb2bccb3560 100644 --- a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp @@ -98,13 +98,6 @@ return_type_t neg_binomial_2_lpmf( logp += multiply_log(n_vec[i], mu__[i]) - mu__[i]; } - // if (include_summand::value) { - // logp += (mu__[i] * (mu__[i] - 2 * n_vec[i]) + - // n_vec[i] * (n_vec[i] - 1)) / ( 2 * phi__[i] ); - // // logp += (mu__[i] * mu__[i] - n_vec[i] - - // // 2 * mu__[i] * n_vec[i] + n_vec[i] * n_vec[i])/phi - // } - if (!is_constant_all::value) { // This is the Taylor series of the full derivative for phi -> Inf // Obtained in Mathematica via From c306f5abd101e75bccf05878a38213206df17e9e Mon Sep 17 00:00:00 2001 From: martinmodrak Date: Wed, 18 Dec 2019 16:39:34 +0100 Subject: [PATCH 21/82] Test with complex_step WIP --- .../math/rev/scal/prob/neg_binomial_2_test.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index 9036b3b14b4..3de6d5fd530 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -512,7 +513,16 @@ TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { } } -TEST(ProbDistributionsNegBinomial, derivativesFiniteDiffs) { +namespace test_internal { + template + double //TDO + nb2_log_for_test(int n, const T_mu& mu, const T_phi& phi) { + return binomial_coefficient_log(n + phi - 1, n) + phi__ * (log(phi) - log(mu + phi)) + - n * log(mu + phi) + multiply_log(n, mu); + } +} + +TEST(ProbDistributionsNegBinomial, derivativesComplexStep) { using stan::math::is_nan; using stan::math::neg_binomial_2_log; using stan::math::var; @@ -521,6 +531,9 @@ TEST(ProbDistributionsNegBinomial, derivativesFiniteDiffs) { std::array mu_to_test = {8, 24}; // std::array n_to_test = {0, 7, 100, 835}; // std::array mu_to_test = {0.8, 8, 24, 271}; + + + double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; for (auto mu_iter = mu_to_test.begin(); mu_iter != mu_to_test.end(); ++mu_iter) { From 2745243254b56bffe74c02ed7f832c7cd00215c4 Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Thu, 19 Dec 2019 10:58:49 +0000 Subject: [PATCH 22/82] [Jenkins] auto-formatting by clang-format version 5.0.0-3~16.04.1 (tags/RELEASE_500/final) --- stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp | 2 +- .../math/rev/scal/prob/neg_binomial_2_test.cpp | 15 +++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp index 942edf30938..b6b6b9fc779 100644 --- a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp @@ -124,7 +124,7 @@ return_type_t neg_binomial_2_lpmf( } logp += phi__[i] * (log_phi[i] - log_mu_plus_phi[i]) - - (n_vec[i]) * log_mu_plus_phi[i]; + - (n_vec[i]) * log_mu_plus_phi[i]; if (include_summand::value) { logp += multiply_log(n_vec[i], mu__[i]); diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index 3de6d5fd530..384133969c9 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -514,13 +514,14 @@ TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { } namespace test_internal { - template - double //TDO - nb2_log_for_test(int n, const T_mu& mu, const T_phi& phi) { - return binomial_coefficient_log(n + phi - 1, n) + phi__ * (log(phi) - log(mu + phi)) - - n * log(mu + phi) + multiply_log(n, mu); - } +template +double // TDO +nb2_log_for_test(int n, const T_mu& mu, const T_phi& phi) { + return binomial_coefficient_log(n + phi - 1, n) + + phi__ * (log(phi) - log(mu + phi)) - n * log(mu + phi) + + multiply_log(n, mu); } +} // namespace test_internal TEST(ProbDistributionsNegBinomial, derivativesComplexStep) { using stan::math::is_nan; @@ -532,8 +533,6 @@ TEST(ProbDistributionsNegBinomial, derivativesComplexStep) { // std::array n_to_test = {0, 7, 100, 835}; // std::array mu_to_test = {0.8, 8, 24, 271}; - - double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; for (auto mu_iter = mu_to_test.begin(); mu_iter != mu_to_test.end(); ++mu_iter) { From 06f926a18993cf0cfea5c9df6fe45298c0c3e490 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Thu, 19 Dec 2019 12:45:48 +0100 Subject: [PATCH 23/82] Changing finite diffs to complex step --- .../rev/scal/prob/neg_binomial_2_test.cpp | 70 ++++++++++--------- 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index 3de6d5fd530..359e47a8bb3 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -513,25 +514,29 @@ TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { } } -namespace test_internal { - template - double //TDO - nb2_log_for_test(int n, const T_mu& mu, const T_phi& phi) { - return binomial_coefficient_log(n + phi - 1, n) + phi__ * (log(phi) - log(mu + phi)) - - n * log(mu + phi) + multiply_log(n, mu); - } -} - TEST(ProbDistributionsNegBinomial, derivativesComplexStep) { using stan::math::is_nan; using stan::math::neg_binomial_2_log; using stan::math::var; + using boost::math::tools::complex_step_derivative; + + std::array n_to_test = {0, 7, 100, 835, 14238}; + std::array mu_to_test = {0.8, 8, 24, 271, 2586, 33294}; - std::array n_to_test = {7, 100, 835}; - std::array mu_to_test = {8, 24}; - // std::array n_to_test = {0, 7, 100, 835}; - // std::array mu_to_test = {0.8, 8, 24, 271}; + auto nb2_log_for_test = []( + int n, const std::complex& mu, const std::complex& phi) { + //Encoding the explicit derivative (digamma) so that it is compatible with + //Complex-step differentiation... + auto lgamma_c_approx = [](const std::complex& x) { + return std::complex( + lgamma(x.real()), x.imag() * boost::math::digamma(x.real())); + }; + + const double n_(n); + return lgamma_c_approx(n_ + phi) - lgamma(n + 1) - lgamma_c_approx(phi) + + phi * (log(phi) - log(mu + phi)) - n_ * log(mu + phi) + n_ * log(mu); + }; double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; @@ -545,7 +550,7 @@ TEST(ProbDistributionsNegBinomial, derivativesComplexStep) { for (int k = 0; k < 20; ++k) { var mu(mu_dbl); var phi(phi_dbl); - var val = neg_binomial_2_log(n, mu, phi); + var val = neg_binomial_2_lpmf(n, mu, phi); std::vector x; x.push_back(mu); @@ -561,26 +566,27 @@ TEST(ProbDistributionsNegBinomial, derivativesComplexStep) { EXPECT_FALSE(is_nan(gradients[i])); } - std::vector finite_diffs; - double eps = 1e-10; - double inv2e = 0.5 / eps; - double dmu = neg_binomial_2_log(n, mu_dbl + eps, phi_dbl) - - neg_binomial_2_log(n, mu_dbl - eps, phi_dbl); - double dphi = neg_binomial_2_log(n, mu_dbl, phi_dbl + eps) - - neg_binomial_2_log(n, mu_dbl, phi_dbl - eps); - finite_diffs.push_back(dmu * inv2e); - finite_diffs.push_back(dphi * inv2e); - - EXPECT_NEAR(gradients[0], finite_diffs[0], - std::max(1.0, gradients[0] * 1e-4)) + auto nb2_log_mu= [n, phi_dbl, nb2_log_for_test]( + const std::complex& mu) { + return nb2_log_for_test(n, mu, phi_dbl); + }; + auto nb2_log_phi = [n, mu_dbl, nb2_log_for_test]( + const std::complex& phi) { + return nb2_log_for_test(n, mu_dbl, phi); + }; + double complex_step_dmu = + complex_step_derivative(nb2_log_mu, mu_dbl); + double complex_step_dphi = + complex_step_derivative(nb2_log_phi, phi_dbl); + + EXPECT_NEAR(gradients[0], complex_step_dmu, + std::max(1e-10, fabs(gradients[0]) * 1e-5)) << "grad_mu, n = " << n << ", mu = " << mu_dbl - << " +/- epsilon, phi = " << phi_dbl - << " +/- epsilon, dmu = " << dmu; - EXPECT_NEAR(gradients[1], finite_diffs[1], - std::max(1.0, gradients[1] * 1e-4)) + << ", phi = " << phi_dbl; + EXPECT_NEAR(gradients[1], complex_step_dphi, + std::max(1e-10, fabs(gradients[1]) * 1e-5)) << "grad_phi, n = " << n << ", mu = " << mu_dbl - << " +/- epsilon, phi = " << phi_dbl - << " +/- epsilon, dphi = " << dphi; + << ", phi = " << phi_dbl; phi_dbl *= 10; } From 69083c7c158a36aa08d08652e59db76d7afc0b61 Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Thu, 19 Dec 2019 11:48:18 +0000 Subject: [PATCH 24/82] [Jenkins] auto-formatting by clang-format version 5.0.0-3~16.04.1 (tags/RELEASE_500/final) --- .../rev/scal/prob/neg_binomial_2_test.cpp | 44 +++++++++---------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index 359e47a8bb3..e13b66a58a8 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -515,30 +515,29 @@ TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { } TEST(ProbDistributionsNegBinomial, derivativesComplexStep) { + using boost::math::tools::complex_step_derivative; using stan::math::is_nan; using stan::math::neg_binomial_2_log; using stan::math::var; - using boost::math::tools::complex_step_derivative; std::array n_to_test = {0, 7, 100, 835, 14238}; std::array mu_to_test = {0.8, 8, 24, 271, 2586, 33294}; - auto nb2_log_for_test = []( - int n, const std::complex& mu, const std::complex& phi) { - //Encoding the explicit derivative (digamma) so that it is compatible with - //Complex-step differentiation... + auto nb2_log_for_test = [](int n, const std::complex& mu, + const std::complex& phi) { + // Encoding the explicit derivative (digamma) so that it is compatible with + // Complex-step differentiation... auto lgamma_c_approx = [](const std::complex& x) { - return std::complex( - lgamma(x.real()), x.imag() * boost::math::digamma(x.real())); + return std::complex(lgamma(x.real()), + x.imag() * boost::math::digamma(x.real())); }; - const double n_(n); - return lgamma_c_approx(n_ + phi) - lgamma(n + 1) - lgamma_c_approx(phi) + - phi * (log(phi) - log(mu + phi)) - n_ * log(mu + phi) + n_ * log(mu); + return lgamma_c_approx(n_ + phi) - lgamma(n + 1) - lgamma_c_approx(phi) + + phi * (log(phi) - log(mu + phi)) - n_ * log(mu + phi) + + n_ * log(mu); }; - double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; for (auto mu_iter = mu_to_test.begin(); mu_iter != mu_to_test.end(); ++mu_iter) { @@ -566,18 +565,17 @@ TEST(ProbDistributionsNegBinomial, derivativesComplexStep) { EXPECT_FALSE(is_nan(gradients[i])); } - auto nb2_log_mu= [n, phi_dbl, nb2_log_for_test]( - const std::complex& mu) { - return nb2_log_for_test(n, mu, phi_dbl); - }; - auto nb2_log_phi = [n, mu_dbl, nb2_log_for_test]( - const std::complex& phi) { - return nb2_log_for_test(n, mu_dbl, phi); - }; - double complex_step_dmu = - complex_step_derivative(nb2_log_mu, mu_dbl); - double complex_step_dphi = - complex_step_derivative(nb2_log_phi, phi_dbl); + auto nb2_log_mu + = [n, phi_dbl, nb2_log_for_test](const std::complex& mu) { + return nb2_log_for_test(n, mu, phi_dbl); + }; + auto nb2_log_phi + = [n, mu_dbl, nb2_log_for_test](const std::complex& phi) { + return nb2_log_for_test(n, mu_dbl, phi); + }; + double complex_step_dmu = complex_step_derivative(nb2_log_mu, mu_dbl); + double complex_step_dphi + = complex_step_derivative(nb2_log_phi, phi_dbl); EXPECT_NEAR(gradients[0], complex_step_dmu, std::max(1e-10, fabs(gradients[0]) * 1e-5)) From 6f5a9d2f54116f20b178f3115802d52a08c93a45 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Thu, 19 Dec 2019 13:54:38 +0100 Subject: [PATCH 25/82] Moved test values to separate namespace --- test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index e13b66a58a8..2eea9276132 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -5,6 +5,7 @@ #include #include +namespace neg_binomial_2_test_internal { struct TestValue { unsigned int n; double mu; @@ -479,11 +480,15 @@ std::array testValues = { -2.2067081495436014e-6), }; +} // namespace neg_binomial_2_test_internal + TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { using stan::math::is_nan; using stan::math::neg_binomial_2_log; using stan::math::value_of; using stan::math::var; + using neg_binomial_2_test_internal::TestValue; + using neg_binomial_2_test_internal::testValues; for (auto iter = testValues.begin(); iter != testValues.end(); ++iter) { TestValue t = *iter; From 9dd904f56a6940860fe5a9b77fb21ebbab919293 Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Thu, 19 Dec 2019 12:55:14 +0000 Subject: [PATCH 26/82] [Jenkins] auto-formatting by clang-format version 5.0.0-3~16.04.1 (tags/RELEASE_500/final) --- test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index 2eea9276132..a4dd4f22b55 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -480,15 +480,15 @@ std::array testValues = { -2.2067081495436014e-6), }; -} // namespace neg_binomial_2_test_internal +} // namespace neg_binomial_2_test_internal TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { + using neg_binomial_2_test_internal::TestValue; + using neg_binomial_2_test_internal::testValues; using stan::math::is_nan; using stan::math::neg_binomial_2_log; using stan::math::value_of; using stan::math::var; - using neg_binomial_2_test_internal::TestValue; - using neg_binomial_2_test_internal::testValues; for (auto iter = testValues.begin(); iter != testValues.end(); ++iter) { TestValue t = *iter; From dae4a78dd0a699e3c477a47c0c4d31442d22705b Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Thu, 19 Dec 2019 14:15:36 +0100 Subject: [PATCH 27/82] Updated comments --- test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index a4dd4f22b55..d7c9d1be6b3 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -26,7 +26,7 @@ struct TestValue { // Test data generated in Mathematica (Wolfram Cloud). The code can be re-ran // at https://www.wolframcloud.com/env/martin.modrak/NegBinomial2_Tests.nb -// but is also presented below for conveniece: +// but is also presented below for convenience: // // nb2[n_,mu_,phi_]:= LogGamma[n + phi] - LogGamma[n + 1] - LogGamma[phi ]+ // n * (Log[mu] - Log[mu + phi]) + phi * (Log[phi] - Log[mu + phi]) @@ -530,8 +530,9 @@ TEST(ProbDistributionsNegBinomial, derivativesComplexStep) { auto nb2_log_for_test = [](int n, const std::complex& mu, const std::complex& phi) { - // Encoding the explicit derivative (digamma) so that it is compatible with - // Complex-step differentiation... + // Using first-order Taylor expansion of lgamma(a + b*i) around b = 0 + // Which happens to work nice in this case, as b is always 0 or the very + // small complex step auto lgamma_c_approx = [](const std::complex& x) { return std::complex(lgamma(x.real()), x.imag() * boost::math::digamma(x.real())); From fe8a133558a4c02524d5eff52cd9097213151897 Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Thu, 19 Dec 2019 13:16:11 +0000 Subject: [PATCH 28/82] [Jenkins] auto-formatting by clang-format version 5.0.0-3~16.04.1 (tags/RELEASE_500/final) --- test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp index d7c9d1be6b3..7a6dc504982 100644 --- a/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/scal/prob/neg_binomial_2_test.cpp @@ -531,7 +531,7 @@ TEST(ProbDistributionsNegBinomial, derivativesComplexStep) { auto nb2_log_for_test = [](int n, const std::complex& mu, const std::complex& phi) { // Using first-order Taylor expansion of lgamma(a + b*i) around b = 0 - // Which happens to work nice in this case, as b is always 0 or the very + // Which happens to work nice in this case, as b is always 0 or the very // small complex step auto lgamma_c_approx = [](const std::complex& x) { return std::complex(lgamma(x.real()), From 6cd8b9d851fae3b388a4590a190e274b18012472 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Thu, 2 Jan 2020 11:21:08 +0100 Subject: [PATCH 29/82] Fixed #1531 for neg_binomial_2_lpmf --- .../prim/scal/prob/neg_binomial_2_lpmf.hpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp index b6b6b9fc779..030b8aba283 100644 --- a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp @@ -53,25 +53,24 @@ return_type_t neg_binomial_2_lpmf( scalar_seq_view n_vec(n); scalar_seq_view mu_vec(mu); scalar_seq_view phi_vec(phi); - size_t size = max_size(n, mu, phi); + size_t size_max = max_size(n, mu, phi); operands_and_partials ops_partials(mu, phi); size_t len_ep = max_size(mu, phi); size_t len_np = max_size(n, phi); - VectorBuilder mu__(length(mu)); - for (size_t i = 0, size = length(mu); i < size; ++i) { + size_t len_mu = length(mu); + VectorBuilder mu__(len_mu); + for (size_t i = 0; i < len_mu; ++i) { mu__[i] = value_of(mu_vec[i]); } - VectorBuilder phi__(length(phi)); - for (size_t i = 0, size = length(phi); i < size; ++i) { + size_t len_phi = length(phi); + VectorBuilder phi__(len_phi); + VectorBuilder log_phi(len_phi); + for (size_t i = 0; i < len_phi; ++i) { phi__[i] = value_of(phi_vec[i]); - } - - VectorBuilder log_phi(length(phi)); - for (size_t i = 0, size = length(phi); i < size; ++i) { log_phi[i] = log(phi__[i]); } @@ -86,7 +85,7 @@ return_type_t neg_binomial_2_lpmf( n_plus_phi[i] = n_vec[i] + phi__[i]; } - for (size_t i = 0; i < size; i++) { + for (size_t i = 0; i < size_max; i++) { if (phi__[i] > internal::neg_binomial_2_phi_cutoff) { // Phi is large, deferring to Poisson. // Copying the code here as just calling From fdab10cb0592cb437576a73090461c5a2dc50e6d Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Thu, 2 Jan 2020 11:54:18 +0100 Subject: [PATCH 30/82] Moved tests touched by the flattening --- .../math/prim/prob/neg_binomial_2_test.cpp | 70 +++++++++++++++++-- 1 file changed, 63 insertions(+), 7 deletions(-) diff --git a/test/unit/math/prim/prob/neg_binomial_2_test.cpp b/test/unit/math/prim/prob/neg_binomial_2_test.cpp index 2414d2026db..fed29c8eb2c 100644 --- a/test/unit/math/prim/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/prim/prob/neg_binomial_2_test.cpp @@ -239,16 +239,72 @@ TEST(ProbDistributionsNegBinomial, chiSquareGoodnessFitTest4) { } TEST(ProbDistributionsNegBinomial, extreme_values) { - int N = 100; - double mu = 8; - double phi = 1e12; - for (int n = 0; n < 10; ++n) { - phi *= 10; - double logp = stan::math::neg_binomial_2_log(N, mu, phi); - EXPECT_LT(logp, 0); + std::array n_to_test = {1, 5, 100, 12985, 1968422}; + std::array mu_to_test = {1e-5, 0.1, 8, 713, 28311, 19850054}; + double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; + for (auto mu_iter = mu_to_test.begin(); mu_iter != mu_to_test.end(); + ++mu_iter) { + for (auto n_iter = n_to_test.begin(); n_iter != n_to_test.end(); ++n_iter) { + double mu = *mu_iter; + unsigned int n = *n_iter; + // Test just before cutoff + double logp + = stan::math::neg_binomial_2_log(n, mu, phi_cutoff - 1e-8); + EXPECT_LT(logp, 0) << "n = " << n << ", mu = " << mu + << ", phi = " << (phi_cutoff - 1e-8); + + // Test across a range of phi + double phi = 1e12; + for (int i = 0; i < 10; ++i) { + phi *= 10; + double logp = stan::math::neg_binomial_2_log(n, mu, phi); + EXPECT_LT(logp, 0) << "n = " << n << ", mu = " << mu + << ", phi = " << phi; + } + } } } +TEST(ProbDistributionsNegativeBinomial2, poissonCutoff) { + double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; + std::array mu_to_test + = {2.345e-5, 0.2, 13, 150, 1621, 18432, 73582345}; + std::array n_to_test + = {0, 3, 16, 24, 181, 2132, 121358, 865422242}; + for (auto mu_iter = mu_to_test.begin(); mu_iter != mu_to_test.end(); + ++mu_iter) { + double mu = *mu_iter; + for (auto n_iter = n_to_test.begin(); n_iter != n_to_test.end(); ++n_iter) { + unsigned int n = *n_iter; + + double before_cutoff + = stan::math::neg_binomial_2_lpmf(n, mu, phi_cutoff - 1e-8); + double after_cutoff + = stan::math::neg_binomial_2_lpmf(n, mu, phi_cutoff + 1e-8); + double relative_error_at_cutoff = log(before_cutoff / after_cutoff); + EXPECT_NEAR(relative_error_at_cutoff, 0, 1e-8) + << "neg_binomial_2_lpmf changes too much around phi cutoff for n = " + << n << ", mu = " << mu << ", cutoff = " << phi_cutoff + << " value at cutoff - 1e-8: " << before_cutoff + << ", value at cutoff + 1e-8: " << after_cutoff; + } + } +} + +TEST(ProbDistributionsNegativeBinomial2, vectorAroundCutoff) { + int y = 10; + double mu = 9.36; + std::vector phi; + phi.push_back(1); + phi.push_back(stan::math::internal::neg_binomial_2_phi_cutoff + 1); + double vector_value = stan::math::neg_binomial_2_lpmf(y, mu, phi); + double scalar_value = stan::math::neg_binomial_2_lpmf(y, mu, phi[0]) + + stan::math::neg_binomial_2_lpmf(y, mu, phi[1]); + + EXPECT_FLOAT_EQ(vector_value, scalar_value); +} + + TEST(ProbDistributionsNegativeBinomial2Log, distributionCheck) { check_counts_real_real(NegativeBinomial2LogTestRig()); } From 8c8283d562a5e02eb1eb66bd6a24a480538be832 Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Thu, 2 Jan 2020 10:54:52 +0000 Subject: [PATCH 31/82] [Jenkins] auto-formatting by clang-format version 5.0.0-3~16.04.1 (tags/RELEASE_500/final) --- test/unit/math/prim/prob/neg_binomial_2_test.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/test/unit/math/prim/prob/neg_binomial_2_test.cpp b/test/unit/math/prim/prob/neg_binomial_2_test.cpp index fed29c8eb2c..edd30b227d4 100644 --- a/test/unit/math/prim/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/prim/prob/neg_binomial_2_test.cpp @@ -304,7 +304,6 @@ TEST(ProbDistributionsNegativeBinomial2, vectorAroundCutoff) { EXPECT_FLOAT_EQ(vector_value, scalar_value); } - TEST(ProbDistributionsNegativeBinomial2Log, distributionCheck) { check_counts_real_real(NegativeBinomial2LogTestRig()); } From d19a2a4fd9016de5f155532c860a36619a28bdfc Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Thu, 2 Jan 2020 12:05:17 +0100 Subject: [PATCH 32/82] Fixed missing length reference --- stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp index b3c9b66afed..975e7d37933 100644 --- a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp @@ -58,13 +58,13 @@ return_type_t neg_binomial_2_lpmf( size_t len_ep = max_size(mu, phi); size_t len_np = max_size(n, phi); - size_t len_mu = length(mu); + size_t len_mu = size(mu); VectorBuilder mu__(len_mu); for (size_t i = 0; i < len_mu; ++i) { mu__[i] = value_of(mu_vec[i]); } - size_t len_phi = length(phi); + size_t len_phi = size(phi); VectorBuilder phi__(len_phi); VectorBuilder log_phi(len_phi); for (size_t i = 0; i < len_phi; ++i) { @@ -83,7 +83,7 @@ return_type_t neg_binomial_2_lpmf( n_plus_phi[i] = n_vec[i] + phi__[i]; } - for (size_t i = 0; i < size_max; i++) { + for (size_t i = 0; i < max_size_seq_view; i++) { if (phi__[i] > internal::neg_binomial_2_phi_cutoff) { // Phi is large, deferring to Poisson. // Copying the code here as just calling From 3493b1476336bc640957180751331c5ee76fe2bf Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Thu, 2 Jan 2020 14:19:35 +0100 Subject: [PATCH 33/82] Using for range-based for loops --- .../unit/math/prim/prob/neg_binomial_2_test.cpp | 15 ++++----------- test/unit/math/rev/prob/neg_binomial_2_test.cpp | 17 +++++------------ 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/test/unit/math/prim/prob/neg_binomial_2_test.cpp b/test/unit/math/prim/prob/neg_binomial_2_test.cpp index edd30b227d4..76863aff375 100644 --- a/test/unit/math/prim/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/prim/prob/neg_binomial_2_test.cpp @@ -242,11 +242,8 @@ TEST(ProbDistributionsNegBinomial, extreme_values) { std::array n_to_test = {1, 5, 100, 12985, 1968422}; std::array mu_to_test = {1e-5, 0.1, 8, 713, 28311, 19850054}; double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; - for (auto mu_iter = mu_to_test.begin(); mu_iter != mu_to_test.end(); - ++mu_iter) { - for (auto n_iter = n_to_test.begin(); n_iter != n_to_test.end(); ++n_iter) { - double mu = *mu_iter; - unsigned int n = *n_iter; + for (double mu : mu_to_test) { + for (unsigned int n : n_to_test) { // Test just before cutoff double logp = stan::math::neg_binomial_2_log(n, mu, phi_cutoff - 1e-8); @@ -271,12 +268,8 @@ TEST(ProbDistributionsNegativeBinomial2, poissonCutoff) { = {2.345e-5, 0.2, 13, 150, 1621, 18432, 73582345}; std::array n_to_test = {0, 3, 16, 24, 181, 2132, 121358, 865422242}; - for (auto mu_iter = mu_to_test.begin(); mu_iter != mu_to_test.end(); - ++mu_iter) { - double mu = *mu_iter; - for (auto n_iter = n_to_test.begin(); n_iter != n_to_test.end(); ++n_iter) { - unsigned int n = *n_iter; - + for (double mu : mu_to_test) { + for (unsigned int n : n_to_test) { double before_cutoff = stan::math::neg_binomial_2_lpmf(n, mu, phi_cutoff - 1e-8); double after_cutoff diff --git a/test/unit/math/rev/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/prob/neg_binomial_2_test.cpp index 7a6dc504982..772b5e3e40e 100644 --- a/test/unit/math/rev/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/prob/neg_binomial_2_test.cpp @@ -490,8 +490,7 @@ TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { using stan::math::value_of; using stan::math::var; - for (auto iter = testValues.begin(); iter != testValues.end(); ++iter) { - TestValue t = *iter; + for (TestValue t: testValues) { unsigned int n = t.n; var mu(t.mu); var phi(t.phi); @@ -545,11 +544,8 @@ TEST(ProbDistributionsNegBinomial, derivativesComplexStep) { }; double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; - for (auto mu_iter = mu_to_test.begin(); mu_iter != mu_to_test.end(); - ++mu_iter) { - for (auto n_iter = n_to_test.begin(); n_iter != n_to_test.end(); ++n_iter) { - double mu_dbl = *mu_iter; - unsigned int n = *n_iter; + for (double mu_dbl : mu_to_test) { + for (unsigned int n : n_to_test) { double phi_dbl = 1.5; for (int k = 0; k < 20; ++k) { @@ -622,11 +618,8 @@ TEST(ProbDistributionsNegBinomial, derivativesAtCutoff) { = {9.3e-6, 0.0028252, 4, 11, 8522, 984256, 5036842}; std::array n_to_test = {0, 1, 5, 48, 1158, 224582, 48235842, 20314458}; - for (auto mu_iter = mu_to_test.begin(); mu_iter != mu_to_test.end(); - ++mu_iter) { - double mu = *mu_iter; - for (auto n_iter = n_to_test.begin(); n_iter != n_to_test.end(); ++n_iter) { - unsigned int n = *n_iter; + for (double mu : mu_to_test) { + for (unsigned int n : n_to_test) { var mu_before(mu); var phi_before(phi_cutoff - 1e-8); var value_before = neg_binomial_2_lpmf(n, mu_before, phi_before); From 699ca2525e1718a1c5851970dcbfbc357c61ff38 Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Thu, 2 Jan 2020 08:20:28 -0500 Subject: [PATCH 34/82] [Jenkins] auto-formatting by clang-format version 6.0.0 (tags/google/stable/2017-11-14) --- test/unit/math/rev/prob/neg_binomial_2_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/math/rev/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/prob/neg_binomial_2_test.cpp index 772b5e3e40e..fa14bde0406 100644 --- a/test/unit/math/rev/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/prob/neg_binomial_2_test.cpp @@ -490,7 +490,7 @@ TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { using stan::math::value_of; using stan::math::var; - for (TestValue t: testValues) { + for (TestValue t : testValues) { unsigned int n = t.n; var mu(t.mu); var phi(t.phi); From f5bee192932b54a22ec8fa7d49c3439300634a4d Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Fri, 3 Jan 2020 09:02:37 +0100 Subject: [PATCH 35/82] Addressing review --- .../prim/scal/prob/neg_binomial_2_lpmf.hpp | 34 +++++++++---------- .../math/prim/prob/neg_binomial_2_test.cpp | 12 +++---- .../math/rev/prob/neg_binomial_2_test.cpp | 19 ++++------- 3 files changed, 29 insertions(+), 36 deletions(-) diff --git a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp index 975e7d37933..99f28accde8 100644 --- a/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/scal/prob/neg_binomial_2_lpmf.hpp @@ -87,7 +87,21 @@ return_type_t neg_binomial_2_lpmf( if (phi__[i] > internal::neg_binomial_2_phi_cutoff) { // Phi is large, deferring to Poisson. // Copying the code here as just calling - // poisson_lpmf does not preserve propto logic correctly + // poisson_lpmf does not preserve propto logic correctly. + // Note that Poisson can be seen as first term of Taylor series for + // phi -> Inf. Similarly, the derivativew wrt. mu and phi can be obtained + // via the Same Taylor expansions: + // + // For mu, the expansions can be obtained in Mathematica via + // Series[n/mu - (n + phi)/(mu+phi),{phi,Infinity, 1}] + // Currently ignoring the 2nd order term (mu__[i] - n_vec[i]) / phi__[i] + // + // The derivative wrt. phi = 0 + O(1/neg_binomial_2_phi_cutoff^2), + // But the quadratic term is big enough to warrant inclusion here + // (can be around 1e-6 at cutoff). + // Expansion obtained in Mathematica via + // Series[1 - (n + phi) / (mu + phi) + Log[phi] - Log[mu + phi] - + // PolyGamma[phi] + PolyGamma[n + phi],{phi,Infinity, 2}] if (include_summand::value) { logp -= lgamma(n_vec[i] + 1.0); } @@ -96,36 +110,22 @@ return_type_t neg_binomial_2_lpmf( } if (!is_constant_all::value) { - // This is the Taylor series of the full derivative for phi -> Inf - // Obtained in Mathematica via - // Series[n/mu - (n + phi)/(mu+phi),{phi,Infinity, 1}] - // Currently ignoring the term (mu__[i] - n_vec[i]) / phi__[i] ops_partials.edge1_.partials_[i] += n_vec[i] / mu__[i] - 1; } - - // The derivative wrt. phi = 0 + O(1/neg_binomial_2_phi_cutoff^2), - // But the quadratic term is big enough to warrant inclusion here - // (can be around 1e-6 at cutoff). - // Expansion obtained in Mathematica via - // Series[1 - (n + phi) / (mu + phi) + Log[phi] - Log[mu + phi] - - // PolyGamma[phi] + PolyGamma[n + phi],{phi,Infinity, 2}] if (!is_constant_all::value) { ops_partials.edge2_.partials_[i] += (mu__[i] * (-mu__[i] + 2 * n_vec[i]) + n_vec[i] * (1 - n_vec[i])) / (2 * square(phi__[i])); } - } else { if (include_summand::value) { logp += binomial_coefficient_log(n_plus_phi[i] - 1, n_vec[i]); } - - logp += phi__[i] * (log_phi[i] - log_mu_plus_phi[i]) - - (n_vec[i]) * log_mu_plus_phi[i]; - if (include_summand::value) { logp += multiply_log(n_vec[i], mu__[i]); } + logp += phi__[i] * (log_phi[i] - log_mu_plus_phi[i]) + - n_vec[i] * log_mu_plus_phi[i]; if (!is_constant_all::value) { ops_partials.edge1_.partials_[i] diff --git a/test/unit/math/prim/prob/neg_binomial_2_test.cpp b/test/unit/math/prim/prob/neg_binomial_2_test.cpp index 76863aff375..b30ca51d33a 100644 --- a/test/unit/math/prim/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/prim/prob/neg_binomial_2_test.cpp @@ -239,8 +239,8 @@ TEST(ProbDistributionsNegBinomial, chiSquareGoodnessFitTest4) { } TEST(ProbDistributionsNegBinomial, extreme_values) { - std::array n_to_test = {1, 5, 100, 12985, 1968422}; - std::array mu_to_test = {1e-5, 0.1, 8, 713, 28311, 19850054}; + std::vector n_to_test = {1, 5, 100, 12985, 1968422}; + std::vector mu_to_test = {1e-5, 0.1, 8, 713, 28311, 19850054}; double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; for (double mu : mu_to_test) { for (unsigned int n : n_to_test) { @@ -251,9 +251,7 @@ TEST(ProbDistributionsNegBinomial, extreme_values) { << ", phi = " << (phi_cutoff - 1e-8); // Test across a range of phi - double phi = 1e12; - for (int i = 0; i < 10; ++i) { - phi *= 10; + for (double phi = 1e12; phi < 1e22; phi *= 10) { double logp = stan::math::neg_binomial_2_log(n, mu, phi); EXPECT_LT(logp, 0) << "n = " << n << ", mu = " << mu << ", phi = " << phi; @@ -264,9 +262,9 @@ TEST(ProbDistributionsNegBinomial, extreme_values) { TEST(ProbDistributionsNegativeBinomial2, poissonCutoff) { double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; - std::array mu_to_test + std::vector mu_to_test = {2.345e-5, 0.2, 13, 150, 1621, 18432, 73582345}; - std::array n_to_test + std::vector n_to_test = {0, 3, 16, 24, 181, 2132, 121358, 865422242}; for (double mu : mu_to_test) { for (unsigned int n : n_to_test) { diff --git a/test/unit/math/rev/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/prob/neg_binomial_2_test.cpp index fa14bde0406..b8bf3d69966 100644 --- a/test/unit/math/rev/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/prob/neg_binomial_2_test.cpp @@ -36,8 +36,7 @@ struct TestValue { // mus= {256*10^-7,314*10^-3,15*10^-1,8,180, 1123,10586}; // phis= {4*10^-4,65*10^-3,442*10^-2,800, 15324,150000}; // ns = {0,6,14,1525,10233}; -// WriteString[out, "std::array testValues = {"]; +// WriteString[out, "std::vector testValues = {"]; // Block[{$MaxPrecision = 80, $MinPrecision = 40}, { // For[i = 1, i <= Length[mus], i++, { // For[j = 1, j <= Length[phis], j++, { @@ -57,7 +56,7 @@ struct TestValue { // WriteString[out,"};"]; // Close[out]; // FilePrint[%] -std::array testValues = { +std::vector testValues = { TestValue(0, 0.0000256, 0.0004, -0.000024814156367780882, -0.9398496240601504, -0.0018850149796021398), TestValue(0, 0.0000256, 0.065, -0.000025594960092480967, @@ -524,8 +523,8 @@ TEST(ProbDistributionsNegBinomial, derivativesComplexStep) { using stan::math::neg_binomial_2_log; using stan::math::var; - std::array n_to_test = {0, 7, 100, 835, 14238}; - std::array mu_to_test = {0.8, 8, 24, 271, 2586, 33294}; + std::vector n_to_test = {0, 7, 100, 835, 14238}; + std::vector mu_to_test = {0.8, 8, 24, 271, 2586, 33294}; auto nb2_log_for_test = [](int n, const std::complex& mu, const std::complex& phi) { @@ -546,9 +545,7 @@ TEST(ProbDistributionsNegBinomial, derivativesComplexStep) { double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; for (double mu_dbl : mu_to_test) { for (unsigned int n : n_to_test) { - double phi_dbl = 1.5; - - for (int k = 0; k < 20; ++k) { + for (double phi_dbl = 1.5; phi_dbl < 1e22; phi_dbl *= 10) { var mu(mu_dbl); var phi(phi_dbl); var val = neg_binomial_2_lpmf(n, mu, phi); @@ -587,8 +584,6 @@ TEST(ProbDistributionsNegBinomial, derivativesComplexStep) { std::max(1e-10, fabs(gradients[1]) * 1e-5)) << "grad_phi, n = " << n << ", mu = " << mu_dbl << ", phi = " << phi_dbl; - - phi_dbl *= 10; } } } @@ -614,9 +609,9 @@ TEST(ProbDistributionsNegBinomial, derivativesAtCutoff) { using stan::math::is_nan; using stan::math::var; - std::array mu_to_test + std::vector mu_to_test = {9.3e-6, 0.0028252, 4, 11, 8522, 984256, 5036842}; - std::array n_to_test + std::vector n_to_test = {0, 1, 5, 48, 1158, 224582, 48235842, 20314458}; for (double mu : mu_to_test) { for (unsigned int n : n_to_test) { From b5f40b18a05a876c0f122210aef9d16e78fe5120 Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Fri, 3 Jan 2020 03:13:49 -0500 Subject: [PATCH 36/82] [Jenkins] auto-formatting by clang-format version 6.0.0 (tags/google/stable/2017-11-14) --- stan/math/prim/prob/neg_binomial_2_lpmf.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp index dbde4e66d97..2189a1897ce 100644 --- a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp @@ -88,10 +88,10 @@ return_type_t neg_binomial_2_lpmf( // Phi is large, deferring to Poisson. // Copying the code here as just calling // poisson_lpmf does not preserve propto logic correctly. - // Note that Poisson can be seen as first term of Taylor series for + // Note that Poisson can be seen as first term of Taylor series for // phi -> Inf. Similarly, the derivativew wrt. mu and phi can be obtained // via the Same Taylor expansions: - // + // // For mu, the expansions can be obtained in Mathematica via // Series[n/mu - (n + phi)/(mu+phi),{phi,Infinity, 1}] // Currently ignoring the 2nd order term (mu__[i] - n_vec[i]) / phi__[i] From 00f612abf7f94f18db9ed7ca5860933aeff20fcf Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Fri, 3 Jan 2020 11:50:04 +0100 Subject: [PATCH 37/82] Test large n in derivativesComplexStep, correctly name tests --- .../math/prim/prob/neg_binomial_2_test.cpp | 12 +++---- .../math/rev/prob/neg_binomial_2_test.cpp | 31 ++++++++++++------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/test/unit/math/prim/prob/neg_binomial_2_test.cpp b/test/unit/math/prim/prob/neg_binomial_2_test.cpp index b30ca51d33a..ec75f6c215b 100644 --- a/test/unit/math/prim/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/prim/prob/neg_binomial_2_test.cpp @@ -30,11 +30,11 @@ class NegativeBinomial2TestRig : public VectorIntRNGTestRig { } }; -TEST(ProbDistributionsNegativeBinomial2, errorCheck) { +TEST(ProbDistributionsNegBinomial2, errorCheck) { check_dist_throws_all_types(NegativeBinomial2TestRig()); } -TEST(ProbDistributionsNegativeBinomial2, distributionCheck) { +TEST(ProbDistributionsNegBinomial2, distributionCheck) { check_counts_real_real(NegativeBinomial2TestRig()); } @@ -201,7 +201,7 @@ TEST(ProbDistributionsNegBinomial2, chiSquareGoodnessFitTest3) { EXPECT_TRUE(chi < quantile(complement(mydist, 1e-6))); } -TEST(ProbDistributionsNegBinomial, chiSquareGoodnessFitTest4) { +TEST(ProbDistributionsNegBinomial2, chiSquareGoodnessFitTest4) { boost::random::mt19937 rng; int N = 1000; int K = stan::math::round(2 * std::pow(N, 0.4)); @@ -238,7 +238,7 @@ TEST(ProbDistributionsNegBinomial, chiSquareGoodnessFitTest4) { EXPECT_TRUE(chi < quantile(complement(mydist, 1e-6))); } -TEST(ProbDistributionsNegBinomial, extreme_values) { +TEST(ProbDistributionsNegBinomial2, extreme_values) { std::vector n_to_test = {1, 5, 100, 12985, 1968422}; std::vector mu_to_test = {1e-5, 0.1, 8, 713, 28311, 19850054}; double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; @@ -260,7 +260,7 @@ TEST(ProbDistributionsNegBinomial, extreme_values) { } } -TEST(ProbDistributionsNegativeBinomial2, poissonCutoff) { +TEST(ProbDistributionsNegBinomial2, poissonCutoff) { double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; std::vector mu_to_test = {2.345e-5, 0.2, 13, 150, 1621, 18432, 73582345}; @@ -282,7 +282,7 @@ TEST(ProbDistributionsNegativeBinomial2, poissonCutoff) { } } -TEST(ProbDistributionsNegativeBinomial2, vectorAroundCutoff) { +TEST(ProbDistributionsNegBinomial2, vectorAroundCutoff) { int y = 10; double mu = 9.36; std::vector phi; diff --git a/test/unit/math/rev/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/prob/neg_binomial_2_test.cpp index b8bf3d69966..72a10d7d4e4 100644 --- a/test/unit/math/rev/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/prob/neg_binomial_2_test.cpp @@ -481,7 +481,7 @@ std::vector testValues = { } // namespace neg_binomial_2_test_internal -TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { +TEST(ProbDistributionsNegativeBinomial2, derivativesPrecomputed) { using neg_binomial_2_test_internal::TestValue; using neg_binomial_2_test_internal::testValues; using stan::math::is_nan; @@ -517,13 +517,14 @@ TEST(ProbDistributionsNegBinomial, derivativesPrecomputed) { } } -TEST(ProbDistributionsNegBinomial, derivativesComplexStep) { +TEST(ProbDistributionsNegBinomial2, derivativesComplexStep) { using boost::math::tools::complex_step_derivative; using stan::math::is_nan; using stan::math::neg_binomial_2_log; using stan::math::var; - std::vector n_to_test = {0, 7, 100, 835, 14238}; + std::vector n_to_test = + {0, 7, 100, 835, 14238, 385000, 1000000}; std::vector mu_to_test = {0.8, 8, 24, 271, 2586, 33294}; auto nb2_log_for_test = [](int n, const std::complex& mu, @@ -576,20 +577,28 @@ TEST(ProbDistributionsNegBinomial, derivativesComplexStep) { double complex_step_dphi = complex_step_derivative(nb2_log_phi, phi_dbl); + std::ostringstream message; + message << ", n = " << n << ", mu = " << mu_dbl + << ", phi = " << phi_dbl; + EXPECT_NEAR(gradients[0], complex_step_dmu, std::max(1e-10, fabs(gradients[0]) * 1e-5)) - << "grad_mu, n = " << n << ", mu = " << mu_dbl - << ", phi = " << phi_dbl; - EXPECT_NEAR(gradients[1], complex_step_dphi, - std::max(1e-10, fabs(gradients[1]) * 1e-5)) - << "grad_phi, n = " << n << ", mu = " << mu_dbl - << ", phi = " << phi_dbl; + << "grad_mu" << message.str(); + + double tolerance_phi; + if(phi < phi_cutoff || n < 100000) { + tolerance_phi = std::max(1e-10, fabs(gradients[1]) * 1e-5); + } else { + tolerance_phi = std::max(1e-8, fabs(gradients[1]) * 1e-5); + } + EXPECT_NEAR(gradients[1], complex_step_dphi, tolerance_phi) + << "grad_phi" << message.str(); } } } } -TEST(ProbDistributionsNegativeBinomial2, proptoAtPoissonCutoff) { +TEST(ProbDistributionsNegBinomial2, proptoAtPoissonCutoff) { using stan::math::internal::neg_binomial_2_phi_cutoff; using stan::math::neg_binomial_2_lpmf; using stan::math::var; @@ -604,7 +613,7 @@ TEST(ProbDistributionsNegativeBinomial2, proptoAtPoissonCutoff) { EXPECT_NEAR(value_of(value_before_cutoff), value_of(value_after_cutoff), 1); } -TEST(ProbDistributionsNegBinomial, derivativesAtCutoff) { +TEST(ProbDistributionsNegBinomial2, derivativesAtCutoff) { double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; using stan::math::is_nan; using stan::math::var; From 5fcc1d4b55b46942daf1e643271b6f8279c8c3ed Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Fri, 3 Jan 2020 10:50:53 +0000 Subject: [PATCH 38/82] [Jenkins] auto-formatting by clang-format version 5.0.0-3~16.04.1 (tags/RELEASE_500/final) --- test/unit/math/rev/prob/neg_binomial_2_test.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/unit/math/rev/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/prob/neg_binomial_2_test.cpp index 72a10d7d4e4..b3b7bc0bc10 100644 --- a/test/unit/math/rev/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/prob/neg_binomial_2_test.cpp @@ -523,8 +523,8 @@ TEST(ProbDistributionsNegBinomial2, derivativesComplexStep) { using stan::math::neg_binomial_2_log; using stan::math::var; - std::vector n_to_test = - {0, 7, 100, 835, 14238, 385000, 1000000}; + std::vector n_to_test + = {0, 7, 100, 835, 14238, 385000, 1000000}; std::vector mu_to_test = {0.8, 8, 24, 271, 2586, 33294}; auto nb2_log_for_test = [](int n, const std::complex& mu, @@ -578,20 +578,20 @@ TEST(ProbDistributionsNegBinomial2, derivativesComplexStep) { = complex_step_derivative(nb2_log_phi, phi_dbl); std::ostringstream message; - message << ", n = " << n << ", mu = " << mu_dbl - << ", phi = " << phi_dbl; + message << ", n = " << n << ", mu = " << mu_dbl + << ", phi = " << phi_dbl; EXPECT_NEAR(gradients[0], complex_step_dmu, std::max(1e-10, fabs(gradients[0]) * 1e-5)) << "grad_mu" << message.str(); double tolerance_phi; - if(phi < phi_cutoff || n < 100000) { + if (phi < phi_cutoff || n < 100000) { tolerance_phi = std::max(1e-10, fabs(gradients[1]) * 1e-5); } else { tolerance_phi = std::max(1e-8, fabs(gradients[1]) * 1e-5); } - EXPECT_NEAR(gradients[1], complex_step_dphi, tolerance_phi) + EXPECT_NEAR(gradients[1], complex_step_dphi, tolerance_phi) << "grad_phi" << message.str(); } } From faaf5800c59fe1870e710620c8c85580d30fb75f Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Mon, 6 Jan 2020 12:20:02 +0100 Subject: [PATCH 39/82] Addressing review, boost upgrade --- stan/math/prim/prob/neg_binomial_2_lpmf.hpp | 44 +++++++++---------- .../math/rev/prob/neg_binomial_2_test.cpp | 4 +- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp index 2189a1897ce..5edb5af97f2 100644 --- a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp @@ -59,44 +59,44 @@ return_type_t neg_binomial_2_lpmf( size_t len_np = max_size(n, phi); size_t len_mu = size(mu); - VectorBuilder mu__(len_mu); + VectorBuilder mu_val(len_mu); for (size_t i = 0; i < len_mu; ++i) { - mu__[i] = value_of(mu_vec[i]); + mu_val[i] = value_of(mu_vec[i]); } size_t len_phi = size(phi); - VectorBuilder phi__(len_phi); + VectorBuilder phi_val(len_phi); VectorBuilder log_phi(len_phi); for (size_t i = 0; i < len_phi; ++i) { - phi__[i] = value_of(phi_vec[i]); - log_phi[i] = log(phi__[i]); + phi_val[i] = value_of(phi_vec[i]); + log_phi[i] = log(phi_val[i]); } VectorBuilder log_mu_plus_phi(len_ep); for (size_t i = 0; i < len_ep; ++i) { - log_mu_plus_phi[i] = log(mu__[i] + phi__[i]); + log_mu_plus_phi[i] = log(mu_val[i] + phi_val[i]); } VectorBuilder n_plus_phi(len_np); for (size_t i = 0; i < len_np; ++i) { - n_plus_phi[i] = n_vec[i] + phi__[i]; + n_plus_phi[i] = n_vec[i] + phi_val[i]; } for (size_t i = 0; i < max_size_seq_view; i++) { - if (phi__[i] > internal::neg_binomial_2_phi_cutoff) { - // Phi is large, deferring to Poisson. + if (phi_val[i] > internal::neg_binomial_2_phi_cutoff) { + // Phi is large, delegate to Poisson. // Copying the code here as just calling // poisson_lpmf does not preserve propto logic correctly. // Note that Poisson can be seen as first term of Taylor series for - // phi -> Inf. Similarly, the derivativew wrt. mu and phi can be obtained + // phi -> Inf. Similarly, the derivative wrt mu and phi can be obtained // via the Same Taylor expansions: // // For mu, the expansions can be obtained in Mathematica via // Series[n/mu - (n + phi)/(mu+phi),{phi,Infinity, 1}] - // Currently ignoring the 2nd order term (mu__[i] - n_vec[i]) / phi__[i] + // Currently ignoring the 2nd order term (mu_val[i] - n_vec[i]) / phi_val[i] // - // The derivative wrt. phi = 0 + O(1/neg_binomial_2_phi_cutoff^2), + // The derivative wrt phi = 0 + O(1/phi^2), // But the quadratic term is big enough to warrant inclusion here // (can be around 1e-6 at cutoff). // Expansion obtained in Mathematica via @@ -106,36 +106,36 @@ return_type_t neg_binomial_2_lpmf( logp -= lgamma(n_vec[i] + 1.0); } if (include_summand::value) { - logp += multiply_log(n_vec[i], mu__[i]) - mu__[i]; + logp += multiply_log(n_vec[i], mu_val[i]) - mu_val[i]; } if (!is_constant_all::value) { - ops_partials.edge1_.partials_[i] += n_vec[i] / mu__[i] - 1; + ops_partials.edge1_.partials_[i] += n_vec[i] / mu_val[i] - 1; } if (!is_constant_all::value) { ops_partials.edge2_.partials_[i] - += (mu__[i] * (-mu__[i] + 2 * n_vec[i]) + n_vec[i] * (1 - n_vec[i])) - / (2 * square(phi__[i])); + += (mu_val[i] * (-mu_val[i] + 2 * n_vec[i]) + n_vec[i] * (1 - n_vec[i])) + / (2 * square(phi_val[i])); } } else { if (include_summand::value) { logp += binomial_coefficient_log(n_plus_phi[i] - 1, n_vec[i]); } if (include_summand::value) { - logp += multiply_log(n_vec[i], mu__[i]); + logp += multiply_log(n_vec[i], mu_val[i]); } - logp += phi__[i] * (log_phi[i] - log_mu_plus_phi[i]) + logp += phi_val[i] * (log_phi[i] - log_mu_plus_phi[i]) - n_vec[i] * log_mu_plus_phi[i]; if (!is_constant_all::value) { ops_partials.edge1_.partials_[i] - += n_vec[i] / mu__[i] - - (n_vec[i] + phi__[i]) / (mu__[i] + phi__[i]); + += n_vec[i] / mu_val[i] + - (n_vec[i] + phi_val[i]) / (mu_val[i] + phi_val[i]); } if (!is_constant_all::value) { ops_partials.edge2_.partials_[i] - += 1.0 - n_plus_phi[i] / (mu__[i] + phi__[i]) + log_phi[i] - - log_mu_plus_phi[i] - digamma(phi__[i]) + += 1.0 - n_plus_phi[i] / (mu_val[i] + phi_val[i]) + log_phi[i] + - log_mu_plus_phi[i] - digamma(phi_val[i]) + digamma(n_plus_phi[i]); } } diff --git a/test/unit/math/rev/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/prob/neg_binomial_2_test.cpp index b3b7bc0bc10..ba6a9213fa5 100644 --- a/test/unit/math/rev/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/prob/neg_binomial_2_test.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include #include @@ -518,7 +518,7 @@ TEST(ProbDistributionsNegativeBinomial2, derivativesPrecomputed) { } TEST(ProbDistributionsNegBinomial2, derivativesComplexStep) { - using boost::math::tools::complex_step_derivative; + using boost::math::differentiation::complex_step_derivative; using stan::math::is_nan; using stan::math::neg_binomial_2_log; using stan::math::var; From 90add5d5cee373702f07c8d6fb18bf85530a4b32 Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Mon, 6 Jan 2020 11:20:52 +0000 Subject: [PATCH 40/82] [Jenkins] auto-formatting by clang-format version 5.0.0-3~16.04.1 (tags/RELEASE_500/final) --- stan/math/prim/prob/neg_binomial_2_lpmf.hpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp index 5edb5af97f2..8d3b5ebb115 100644 --- a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp @@ -94,7 +94,8 @@ return_type_t neg_binomial_2_lpmf( // // For mu, the expansions can be obtained in Mathematica via // Series[n/mu - (n + phi)/(mu+phi),{phi,Infinity, 1}] - // Currently ignoring the 2nd order term (mu_val[i] - n_vec[i]) / phi_val[i] + // Currently ignoring the 2nd order term (mu_val[i] - n_vec[i]) / + // phi_val[i] // // The derivative wrt phi = 0 + O(1/phi^2), // But the quadratic term is big enough to warrant inclusion here @@ -114,7 +115,8 @@ return_type_t neg_binomial_2_lpmf( } if (!is_constant_all::value) { ops_partials.edge2_.partials_[i] - += (mu_val[i] * (-mu_val[i] + 2 * n_vec[i]) + n_vec[i] * (1 - n_vec[i])) + += (mu_val[i] * (-mu_val[i] + 2 * n_vec[i]) + + n_vec[i] * (1 - n_vec[i])) / (2 * square(phi_val[i])); } } else { From f186b88e986982a744722cddeba1c4bc7f19f73d Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Mon, 6 Jan 2020 12:30:28 +0100 Subject: [PATCH 41/82] Fixed include typo --- test/unit/math/rev/prob/neg_binomial_2_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/math/rev/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/prob/neg_binomial_2_test.cpp index ba6a9213fa5..62b9dd93a05 100644 --- a/test/unit/math/rev/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/prob/neg_binomial_2_test.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include #include From d051928c6da4a6d6618a9b43f98fa12cb10f3870 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Mon, 6 Jan 2020 12:51:35 +0100 Subject: [PATCH 42/82] Removed use of unsigned int --- stan/math/prim/scal/fun/lgamma.hpp | 11 ----------- test/unit/math/prim/prob/neg_binomial_2_test.cpp | 8 ++++---- test/unit/math/rev/prob/neg_binomial_2_test.cpp | 14 +++++++------- 3 files changed, 11 insertions(+), 22 deletions(-) diff --git a/stan/math/prim/scal/fun/lgamma.hpp b/stan/math/prim/scal/fun/lgamma.hpp index 6b5794855a5..43d74f1b684 100644 --- a/stan/math/prim/scal/fun/lgamma.hpp +++ b/stan/math/prim/scal/fun/lgamma.hpp @@ -89,17 +89,6 @@ inline double lgamma(int x) { #endif } -inline double lgamma(unsigned int x) { -#if !__MINGW32__ - int sign = 1; - return ::lgamma_r(x, &sign); -#else - if (unlikely(x == 0.0)) - return std::numeric_limits::infinity(); - return boost::math::lgamma(x, boost_policy_t()); -#endif -} - } // namespace math } // namespace stan #endif diff --git a/test/unit/math/prim/prob/neg_binomial_2_test.cpp b/test/unit/math/prim/prob/neg_binomial_2_test.cpp index ec75f6c215b..6aabc0b4cdf 100644 --- a/test/unit/math/prim/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/prim/prob/neg_binomial_2_test.cpp @@ -239,11 +239,11 @@ TEST(ProbDistributionsNegBinomial2, chiSquareGoodnessFitTest4) { } TEST(ProbDistributionsNegBinomial2, extreme_values) { - std::vector n_to_test = {1, 5, 100, 12985, 1968422}; + std::vector n_to_test = {1, 5, 100, 12985, 1968422}; std::vector mu_to_test = {1e-5, 0.1, 8, 713, 28311, 19850054}; double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; for (double mu : mu_to_test) { - for (unsigned int n : n_to_test) { + for (int n : n_to_test) { // Test just before cutoff double logp = stan::math::neg_binomial_2_log(n, mu, phi_cutoff - 1e-8); @@ -264,10 +264,10 @@ TEST(ProbDistributionsNegBinomial2, poissonCutoff) { double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; std::vector mu_to_test = {2.345e-5, 0.2, 13, 150, 1621, 18432, 73582345}; - std::vector n_to_test + std::vector n_to_test = {0, 3, 16, 24, 181, 2132, 121358, 865422242}; for (double mu : mu_to_test) { - for (unsigned int n : n_to_test) { + for (int n : n_to_test) { double before_cutoff = stan::math::neg_binomial_2_lpmf(n, mu, phi_cutoff - 1e-8); double after_cutoff diff --git a/test/unit/math/rev/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/prob/neg_binomial_2_test.cpp index 62b9dd93a05..ac3e02d64dd 100644 --- a/test/unit/math/rev/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/prob/neg_binomial_2_test.cpp @@ -7,14 +7,14 @@ namespace neg_binomial_2_test_internal { struct TestValue { - unsigned int n; + int n; double mu; double phi; double value; double grad_mu; double grad_phi; - TestValue(unsigned int _n, double _mu, double _phi, double _value, + TestValue(int _n, double _mu, double _phi, double _value, double _grad_mu, double _grad_phi) : n(_n), mu(_mu), @@ -490,7 +490,7 @@ TEST(ProbDistributionsNegativeBinomial2, derivativesPrecomputed) { using stan::math::var; for (TestValue t : testValues) { - unsigned int n = t.n; + int n = t.n; var mu(t.mu); var phi(t.phi); var val = neg_binomial_2_log(n, mu, phi); @@ -523,7 +523,7 @@ TEST(ProbDistributionsNegBinomial2, derivativesComplexStep) { using stan::math::neg_binomial_2_log; using stan::math::var; - std::vector n_to_test + std::vector n_to_test = {0, 7, 100, 835, 14238, 385000, 1000000}; std::vector mu_to_test = {0.8, 8, 24, 271, 2586, 33294}; @@ -545,7 +545,7 @@ TEST(ProbDistributionsNegBinomial2, derivativesComplexStep) { double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; for (double mu_dbl : mu_to_test) { - for (unsigned int n : n_to_test) { + for (int n : n_to_test) { for (double phi_dbl = 1.5; phi_dbl < 1e22; phi_dbl *= 10) { var mu(mu_dbl); var phi(phi_dbl); @@ -620,10 +620,10 @@ TEST(ProbDistributionsNegBinomial2, derivativesAtCutoff) { std::vector mu_to_test = {9.3e-6, 0.0028252, 4, 11, 8522, 984256, 5036842}; - std::vector n_to_test + std::vector n_to_test = {0, 1, 5, 48, 1158, 224582, 48235842, 20314458}; for (double mu : mu_to_test) { - for (unsigned int n : n_to_test) { + for (int n : n_to_test) { var mu_before(mu); var phi_before(phi_cutoff - 1e-8); var value_before = neg_binomial_2_lpmf(n, mu_before, phi_before); From ab8827c06e5d56ec4308ef7300fcd7a667b1c643 Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Mon, 6 Jan 2020 11:52:11 +0000 Subject: [PATCH 43/82] [Jenkins] auto-formatting by clang-format version 5.0.0-3~16.04.1 (tags/RELEASE_500/final) --- test/unit/math/prim/prob/neg_binomial_2_test.cpp | 3 +-- test/unit/math/rev/prob/neg_binomial_2_test.cpp | 10 ++++------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/test/unit/math/prim/prob/neg_binomial_2_test.cpp b/test/unit/math/prim/prob/neg_binomial_2_test.cpp index 6aabc0b4cdf..b71056a2aa4 100644 --- a/test/unit/math/prim/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/prim/prob/neg_binomial_2_test.cpp @@ -264,8 +264,7 @@ TEST(ProbDistributionsNegBinomial2, poissonCutoff) { double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; std::vector mu_to_test = {2.345e-5, 0.2, 13, 150, 1621, 18432, 73582345}; - std::vector n_to_test - = {0, 3, 16, 24, 181, 2132, 121358, 865422242}; + std::vector n_to_test = {0, 3, 16, 24, 181, 2132, 121358, 865422242}; for (double mu : mu_to_test) { for (int n : n_to_test) { double before_cutoff diff --git a/test/unit/math/rev/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/prob/neg_binomial_2_test.cpp index ac3e02d64dd..46c385816cf 100644 --- a/test/unit/math/rev/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/prob/neg_binomial_2_test.cpp @@ -14,8 +14,8 @@ struct TestValue { double grad_mu; double grad_phi; - TestValue(int _n, double _mu, double _phi, double _value, - double _grad_mu, double _grad_phi) + TestValue(int _n, double _mu, double _phi, double _value, double _grad_mu, + double _grad_phi) : n(_n), mu(_mu), phi(_phi), @@ -523,8 +523,7 @@ TEST(ProbDistributionsNegBinomial2, derivativesComplexStep) { using stan::math::neg_binomial_2_log; using stan::math::var; - std::vector n_to_test - = {0, 7, 100, 835, 14238, 385000, 1000000}; + std::vector n_to_test = {0, 7, 100, 835, 14238, 385000, 1000000}; std::vector mu_to_test = {0.8, 8, 24, 271, 2586, 33294}; auto nb2_log_for_test = [](int n, const std::complex& mu, @@ -620,8 +619,7 @@ TEST(ProbDistributionsNegBinomial2, derivativesAtCutoff) { std::vector mu_to_test = {9.3e-6, 0.0028252, 4, 11, 8522, 984256, 5036842}; - std::vector n_to_test - = {0, 1, 5, 48, 1158, 224582, 48235842, 20314458}; + std::vector n_to_test = {0, 1, 5, 48, 1158, 224582, 48235842, 20314458}; for (double mu : mu_to_test) { for (int n : n_to_test) { var mu_before(mu); From f15e7e0a5323258b5e24233db8e0fa7dda1ecc3f Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Mon, 6 Jan 2020 13:24:38 +0100 Subject: [PATCH 44/82] Tightened test acuraccy --- .../unit/math/rev/prob/neg_binomial_2_test.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/test/unit/math/rev/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/prob/neg_binomial_2_test.cpp index 46c385816cf..d70b7c6b31b 100644 --- a/test/unit/math/rev/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/prob/neg_binomial_2_test.cpp @@ -580,16 +580,24 @@ TEST(ProbDistributionsNegBinomial2, derivativesComplexStep) { message << ", n = " << n << ", mu = " << mu_dbl << ", phi = " << phi_dbl; - EXPECT_NEAR(gradients[0], complex_step_dmu, - std::max(1e-10, fabs(gradients[0]) * 1e-5)) - << "grad_mu" << message.str(); - double tolerance_phi; + double tolerance_mu; if (phi < phi_cutoff || n < 100000) { - tolerance_phi = std::max(1e-10, fabs(gradients[1]) * 1e-5); + tolerance_phi = std::max(1e-10, fabs(gradients[1]) * 1e-8); } else { tolerance_phi = std::max(1e-8, fabs(gradients[1]) * 1e-5); } + + if (phi < phi_cutoff) { + tolerance_mu = std::max(1e-10, fabs(gradients[0]) * 1e-8); + } else { + tolerance_mu = std::max(1e-8, fabs(gradients[0]) * 1e-5); + } + + + EXPECT_NEAR(gradients[0], complex_step_dmu, tolerance_mu) + << "grad_mu" << message.str(); + EXPECT_NEAR(gradients[1], complex_step_dphi, tolerance_phi) << "grad_phi" << message.str(); } From cbd023409f18068173119d320595b00ff8f5ef2c Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Mon, 6 Jan 2020 12:25:14 +0000 Subject: [PATCH 45/82] [Jenkins] auto-formatting by clang-format version 5.0.0-3~16.04.1 (tags/RELEASE_500/final) --- test/unit/math/rev/prob/neg_binomial_2_test.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/test/unit/math/rev/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/prob/neg_binomial_2_test.cpp index d70b7c6b31b..70a4f51c381 100644 --- a/test/unit/math/rev/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/prob/neg_binomial_2_test.cpp @@ -594,7 +594,6 @@ TEST(ProbDistributionsNegBinomial2, derivativesComplexStep) { tolerance_mu = std::max(1e-8, fabs(gradients[0]) * 1e-5); } - EXPECT_NEAR(gradients[0], complex_step_dmu, tolerance_mu) << "grad_mu" << message.str(); From 315d9b161a00a1a561e7f904b124d02f0b103bfd Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Tue, 7 Jan 2020 16:38:03 +0100 Subject: [PATCH 46/82] Precomputed (failing) test for binomial_coefficient_log --- .../fun/binomial_coefficient_log_test.cpp | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp b/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp index d2a40da0887..1e3063f992e 100644 --- a/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp +++ b/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -41,3 +42,28 @@ TEST(MathFunctions, binomial_coefficient_log_nan) { EXPECT_TRUE(std::isnan(stan::math::binomial_coefficient_log(nan, 2.0))); EXPECT_TRUE(std::isnan(stan::math::binomial_coefficient_log(nan, nan))); } + +namespace binomial_coefficient_test_internal { + struct TestValue { + double n; + double k; + double val; + }; + +std::vector testValues = { {0.00003,3.e-20,1.4804082055036736261e-24}, {0.00003,3.e-15,1.4804082053556342859e-19}, {0.00003,3.e-10,1.4803934014216156867e-14}, {0.00003,3.e-7,1.4656041234443424231e-11}, {0.00003,6.e-6,2.3686531286936713477e-10}, {0.00003,0.000015,3.7010205134852404454e-10}, {0.00003,0.0000291,4.3079878779785775469e-11}, {0.00003,0.0000299999982,8.8824487000750964998e-17}, {0.00003,0.00003,1.4804082055036751063e-28}, {0.002,2.e-18,6.5701370962226547789e-21}, {0.002,2.e-13,6.5701370955656467768e-16}, {0.002,2.e-8,6.5700713947654458316e-11}, {0.002,0.00002,6.5044356407218957555e-8}, {0.002,0.0004,1.0512217145828735086e-6}, {0.002,0.001,1.6425337349621531325e-6}, {0.002,0.00194,1.9119098219591897636e-7}, {0.002,0.00199999988,3.9420820212083508274e-13}, {0.002,0.002,6.5701370962226613484e-25}, {1,1.e-15,9.999999999999988551e-16}, {1,1.e-10,9.999999998855065933e-11}, {1,0.00001,9.9998855069266455991e-6}, {1,0.01,0.0098858370348613105263}, {1,0.2,0.15645796291768801671}, {1,0.5,0.24156447527049044469}, {1,0.97,0.028978328236256312961}, {1,0.99999994,5.9999995878237431346e-8}, {1,1.,9.999999999999999999e-20}, {8,8.e-15,2.1742857142857086459e-14}, {8,8.e-10,2.1742857137217315398e-9}, {8,0.00008,0.00021742293180507342042}, {8,0.08,0.21198226737825583898}, {8,1.6,2.9067860629113428343}, {8,4,4.2484952420493589891}, {8,7.76,0.60627458624545365112}, {8,7.99999952,1.3045712255376840361e-6}, {8,8.,2.1742857142857142852e-18}, {1325,1.325e-12,1.0290957946506935679e-11}, {1325,1.325e-7,1.0290957802047796044e-6}, {1325,0.01325,0.10276604269137043037}, {1325,13.25,71.989832127409062998}, {1325,265,659.43564932902941932}, {1325,662.5,914.5994503408452751}, {1325,1285.25,175.78626065119186267}, {1325,1324.9999205,0.00061745227641045219017}, {1325,1325.,1.029095794650838014e-15}, {845000,8.45e-10,1.2019540397111151912e-8}, {845000,0.0000845,0.0012019481673871213658}, {845000,8.45,103.7383038277367436}, {845000,8450,47315.861645757620061}, {845000,169000,422833.22169549650655}, {845000,422500,585702.31823555211409}, {845000,819650,113851.15813267856212}, {845000,844999.9493,0.7191087768194817628}, {845000,845000.,1.2019540397698355631e-12}, {3000000000000000.0,3,105.12040658150832885}, {3000000000000000.0,100,3199.999492802314355}, {3000000000000000.0,12895,350387.52436058836877}, {100000000000000000000.0,3,136.36334611041468604}, {100000000000000000000.0,100,4241.4308104325278778}, {100000000000000000000.0,12895,484680.0927690319003},}; + +} + +TEST(MathFunctions, binomial_coefficient_log_precomputed) { + using binomial_coefficient_test_internal::TestValue; + using binomial_coefficient_test_internal::testValues; + using stan::test::expect_near_rel; + + for (TestValue t : testValues) { + double val = stan::math::binomial_coefficient_log(t.n, t.k); + + std::ostringstream msg; + msg << "n = " << t.n << ", k = " << t.k; + expect_near_rel(msg.str(), val, t.val); + } +} From c070cc6e9ccdf1e1bc8dcd3d73f9905320789005 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Tue, 7 Jan 2020 17:03:46 +0100 Subject: [PATCH 47/82] More tests, avoiding Poisson --- stan/math/prim/prob/neg_binomial_2_lpmf.hpp | 48 +- .../math/prim/prob/neg_binomial_2_test.cpp | 60 ++- .../prim/prob/neg_binomial_2_test_tools.hpp | 17 + .../math/rev/prob/neg_binomial_2_test.cpp | 505 +++--------------- 4 files changed, 159 insertions(+), 471 deletions(-) create mode 100644 test/unit/math/prim/prob/neg_binomial_2_test_tools.hpp diff --git a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp index 8d3b5ebb115..740620f463c 100644 --- a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp @@ -17,10 +17,10 @@ namespace stan { namespace math { namespace internal { -// Exposing to let me us this in tests +// When to switch to approximations for neg. binom for large phi // The current tests fail when the cutoff is 1e8 and pass with 1e9, // setting 1e10 to be safe -constexpr double neg_binomial_2_phi_cutoff = 1e10; +constexpr double neg_binomial_2_phi_cutoff = 1e15; } // namespace internal // NegBinomial(n|mu, phi) [mu >= 0; phi > 0; n >= 0] @@ -84,12 +84,13 @@ return_type_t neg_binomial_2_lpmf( } for (size_t i = 0; i < max_size_seq_view; i++) { - if (phi_val[i] > internal::neg_binomial_2_phi_cutoff) { + if(false) { + //if (phi_val[i] > internal::neg_binomial_2_phi_cutoff) { // Phi is large, delegate to Poisson. // Copying the code here as just calling // poisson_lpmf does not preserve propto logic correctly. // Note that Poisson can be seen as first term of Taylor series for - // phi -> Inf. Similarly, the derivative wrt mu and phi can be obtained + // phi -> Inf. Similarly, the derivative w.r.t. mu and phi can be obtained // via the Same Taylor expansions: // // For mu, the expansions can be obtained in Mathematica via @@ -97,27 +98,31 @@ return_type_t neg_binomial_2_lpmf( // Currently ignoring the 2nd order term (mu_val[i] - n_vec[i]) / // phi_val[i] // - // The derivative wrt phi = 0 + O(1/phi^2), + // The derivative w.r.t. phi = 0 + O(1/phi^2), // But the quadratic term is big enough to warrant inclusion here // (can be around 1e-6 at cutoff). // Expansion obtained in Mathematica via // Series[1 - (n + phi) / (mu + phi) + Log[phi] - Log[mu + phi] - // PolyGamma[phi] + PolyGamma[n + phi],{phi,Infinity, 2}] - if (include_summand::value) { - logp -= lgamma(n_vec[i] + 1.0); - } - if (include_summand::value) { - logp += multiply_log(n_vec[i], mu_val[i]) - mu_val[i]; - } - - if (!is_constant_all::value) { - ops_partials.edge1_.partials_[i] += n_vec[i] / mu_val[i] - 1; - } - if (!is_constant_all::value) { - ops_partials.edge2_.partials_[i] - += (mu_val[i] * (-mu_val[i] + 2 * n_vec[i]) - + n_vec[i] * (1 - n_vec[i])) - / (2 * square(phi_val[i])); + if(n_vec[i] == 0) { + logp += phi_val[i] * (-log1p(mu_val[i] / phi_val[i])); + } else { + if (include_summand::value) { + logp -= lgamma(n_vec[i] + 1.0); + } + if (include_summand::value) { + logp += multiply_log(n_vec[i], mu_val[i]) - mu_val[i]; + } + + if (!is_constant_all::value) { + ops_partials.edge1_.partials_[i] += n_vec[i] / mu_val[i] - 1; + } + if (!is_constant_all::value) { + ops_partials.edge2_.partials_[i] + += (mu_val[i] * (-mu_val[i] + 2 * n_vec[i]) + + n_vec[i] * (1 - n_vec[i])) + / (2 * square(phi_val[i])); + } } } else { if (include_summand::value) { @@ -126,7 +131,8 @@ return_type_t neg_binomial_2_lpmf( if (include_summand::value) { logp += multiply_log(n_vec[i], mu_val[i]); } - logp += phi_val[i] * (log_phi[i] - log_mu_plus_phi[i]) + // logp += phi_val[i] * (log_phi[i] - log_mu_plus_phi[i]) + logp += - phi_val[i] * (log1p(mu_val[i] / phi_val[i])) - n_vec[i] * log_mu_plus_phi[i]; if (!is_constant_all::value) { diff --git a/test/unit/math/prim/prob/neg_binomial_2_test.cpp b/test/unit/math/prim/prob/neg_binomial_2_test.cpp index b71056a2aa4..1091a946652 100644 --- a/test/unit/math/prim/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/prim/prob/neg_binomial_2_test.cpp @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include #include #include @@ -239,7 +241,7 @@ TEST(ProbDistributionsNegBinomial2, chiSquareGoodnessFitTest4) { } TEST(ProbDistributionsNegBinomial2, extreme_values) { - std::vector n_to_test = {1, 5, 100, 12985, 1968422}; + std::vector n_to_test = {0, 1, 5, 100, 12985, 1968422}; std::vector mu_to_test = {1e-5, 0.1, 8, 713, 28311, 19850054}; double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; for (double mu : mu_to_test) { @@ -261,26 +263,60 @@ TEST(ProbDistributionsNegBinomial2, extreme_values) { } TEST(ProbDistributionsNegBinomial2, poissonCutoff) { - double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; + using stan::test::expect_near_rel; + using namespace stan::test::neg_binomial_2_test_internal; + + // std::vector mu_to_test + // = {2.345e-5, 0.2, 13, 150, 1621, 18432, 73582345, + // static_cast(std::numeric_limits::max()) }; + // std::vector n_to_test = {0, 1, 3, 16, 24, 181, 2132, 121358, 865422242}; std::vector mu_to_test - = {2.345e-5, 0.2, 13, 150, 1621, 18432, 73582345}; - std::vector n_to_test = {0, 3, 16, 24, 181, 2132, 121358, 865422242}; + = {10}; + std::vector n_to_test = {16}; for (double mu : mu_to_test) { for (int n : n_to_test) { double before_cutoff - = stan::math::neg_binomial_2_lpmf(n, mu, phi_cutoff - 1e-8); + = stan::math::neg_binomial_2_lpmf(n, mu, just_below_phi_cutoff); double after_cutoff - = stan::math::neg_binomial_2_lpmf(n, mu, phi_cutoff + 1e-8); - double relative_error_at_cutoff = log(before_cutoff / after_cutoff); - EXPECT_NEAR(relative_error_at_cutoff, 0, 1e-8) - << "neg_binomial_2_lpmf changes too much around phi cutoff for n = " - << n << ", mu = " << mu << ", cutoff = " << phi_cutoff - << " value at cutoff - 1e-8: " << before_cutoff - << ", value at cutoff + 1e-8: " << after_cutoff; + = stan::math::neg_binomial_2_lpmf(n, mu, just_above_phi_cutoff); + std::ostringstream msg; + msg << "neg_binomial_2_lpmf changes too much around phi cutoff for n = " + << std::setprecision(17) << n << ", mu = " << mu + << ", below cutoff = " << just_below_phi_cutoff + << ", above cutoff = " << just_above_phi_cutoff; + expect_near_rel(msg.str(), before_cutoff, after_cutoff); + } } } +TEST(ProbDistributionsNegBinomial2, zeroOne) { + using stan::test::expect_near_rel; + using namespace stan::test::neg_binomial_2_test_internal; + + std::vector mu_to_test + = {2.345e-5, 0.2, 13, 150, 1621, 18432, phi_cutoff }; + double phi_start = 1e-8; + double phi_max = just_above_phi_cutoff * 1e10; + for (double mu : mu_to_test) { + for(double phi = phi_start; phi < phi_max; + phi *= stan::math::pi()) { + + std::ostringstream msg; + msg << ", mu = " << mu << ", phi = " << phi; + + double expected_value_0 = phi * (-log1p(mu / phi)); + double value_0 = stan::math::neg_binomial_2_lpmf(0, mu, phi); + expect_near_rel("n = 0 " + msg.str(), value_0, expected_value_0); + + double expected_value_1 = (phi + 1) * (-log1p(mu / phi)) + log(mu); + double value_1 = stan::math::neg_binomial_2_lpmf(1, mu, phi); + expect_near_rel("n = 1 " + msg.str(), value_1, expected_value_1); + } + } + +} + TEST(ProbDistributionsNegBinomial2, vectorAroundCutoff) { int y = 10; double mu = 9.36; diff --git a/test/unit/math/prim/prob/neg_binomial_2_test_tools.hpp b/test/unit/math/prim/prob/neg_binomial_2_test_tools.hpp new file mode 100644 index 00000000000..97eb4bb33fc --- /dev/null +++ b/test/unit/math/prim/prob/neg_binomial_2_test_tools.hpp @@ -0,0 +1,17 @@ +#ifndef STAN_TEST_UNIT_PRIM_PROB_NEG_BINOMIAL_2_TEST_TOOLS_HPP +#define STAN_TEST_UNIT_PRIM_PROB_NEG_BINOMIAL_2_TEST_TOOLS_HPP + +#include +#include +#include + +namespace stan { namespace test { +namespace neg_binomial_2_test_internal { + double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; + double just_below_phi_cutoff = std::nextafter(phi_cutoff, 0); + double just_above_phi_cutoff = + std::nextafter(phi_cutoff, std::numeric_limits::infinity()); +} +}} + +#endif \ No newline at end of file diff --git a/test/unit/math/rev/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/prob/neg_binomial_2_test.cpp index 70a4f51c381..424380f0b1a 100644 --- a/test/unit/math/rev/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/prob/neg_binomial_2_test.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -28,462 +29,39 @@ struct TestValue { // at https://www.wolframcloud.com/env/martin.modrak/NegBinomial2_Tests.nb // but is also presented below for convenience: // -// nb2[n_,mu_,phi_]:= LogGamma[n + phi] - LogGamma[n + 1] - LogGamma[phi ]+ -// n * (Log[mu] - Log[mu + phi]) + phi * (Log[phi] - Log[mu + phi]) +// nb2[n_,mu_,phi_]:= LogGamma[n + phi] - LogGamma[n + 1] - LogGamma[phi] + +// n * (Log[mu] - Log[mu + phi]) + phi * (Log[phi] - Log[mu + phi]) // nb2dmu[n_,mu_,phi_]= D[nb2[n, mu, phi],mu]; // nb2dphi[n_,mu_,phi_]= D[nb2[n, mu, phi],phi]; -// out = OpenWrite["nb_test.txt"] -// mus= {256*10^-7,314*10^-3,15*10^-1,8,180, 1123,10586}; -// phis= {4*10^-4,65*10^-3,442*10^-2,800, 15324,150000}; +// out = OpenWrite["nb_test.txt"] +// mus= {256*10^-7,314*10^-3,15*10^-1,3,180, 1123,10586}; +// phis= {4*10^-4,65*10^-3,442*10^-2,800, 15324}; // ns = {0,6,14,1525,10233}; // WriteString[out, "std::vector testValues = {"]; -// Block[{$MaxPrecision = 80, $MinPrecision = 40}, { -// For[i = 1, i <= Length[mus], i++, { +// For[k = 1, k <= Length[ns], k++, { +// For[i = 1, i <= Length[mus], i++, { // For[j = 1, j <= Length[phis], j++, { -// For[k = 1, k <= Length[ns], k++, { // cmu = mus[[i]]; // cphi = phis[[j]]; // cn=ns[[k]]; -// val = N[nb2[cn,cmu,cphi]]; -// ddmu= N[nb2dmu[cn,cmu,cphi]]; -// ddphi= N[nb2dphi[cn,cmu,cphi]]; -// WriteString[out," TestValue(",CForm[cn],",",CForm[cmu],",", -// CForm[cphi],",", CForm[val],","CForm[ddmu],",",CForm[ddphi],"),"] +// val = N[nb2[cn,cmu,cphi], 20]; +// ddmu= N[nb2dmu[cn,cmu,cphi], 20]; +// ddphi= N[nb2dphi[cn,cmu,cphi], 20]; +// WriteString[out," TestValue(",CForm[cn],",",CForm[cmu],",", +// CForm[cphi],",", CForm[val],",",CForm[ddmu],",",CForm[ddphi],"),"] // }] // }] // }] -// }]; -// WriteString[out,"};"]; +// WriteString[out,"};"]; // Close[out]; // FilePrint[%] -std::vector testValues = { - TestValue(0, 0.0000256, 0.0004, -0.000024814156367780882, - -0.9398496240601504, -0.0018850149796021398), - TestValue(0, 0.0000256, 0.065, -0.000025594960092480967, - -0.9996063088998794, -7.751668684718993e-8), - TestValue(0, 0.0000256, 4.42, -0.000025599925864390194, -0.9999942081783417, - -1.677258332222209e-11), - TestValue(0, 0.0000256, 800, -0.00002559999998652529, -0.999999968000001, - -8.881784197001252e-16), - TestValue(0, 0.0000256, 15324, -0.000025599996959613236, - -0.9999999983294179, 0.), - TestValue(0, 0.0000256, 150000, -0.00002560005540885868, - -0.9999999998293333, 0.), - TestValue(0, 0.314, 0.0004, -0.002666782716971683, -0.001272264631043257, - -5.66822905706025), - TestValue(0, 0.314, 0.065, -0.11460468078714132, -0.17150395778364116, - -0.9346528929704305), - TestValue(0, 0.314, 4.42, -0.30334820230965986, -0.9336713138994508, - -0.00230212890163628), - TestValue(0, 0.314, 800, -0.31393839362010567, -0.9996076539958066, - -7.698783210940974e-8), - TestValue(0, 0.314, 15324, -0.31399678298770084, -0.9999795096863716, - -2.099280749234822e-10), - TestValue(0, 0.314, 150000, -0.3139996713308335, -0.9999979066710487, - -2.190247982980509e-12), - TestValue(0, 1.5, 0.0004, -0.003291911100032755, -0.00026659557451346307, - -7.230044345656401), - TestValue(0, 1.5, 0.065, -0.2067814991501101, -0.04153354632587859, - -2.2227873794044952), - TestValue(0, 1.5, 4.42, -1.2915096474038796, -0.7466216216216216, - -0.03881837442792935), - TestValue(0, 1.5, 800, -1.4985955053447242, -0.9981285090455396, - -1.7534272203079126e-6), - TestValue(0, 1.5, 15324, -1.499926590534038, -0.9999021239111285, - -4.790177143831897e-9), - TestValue(0, 1.5, 150000, -1.4999925000758196, -0.999990000099999, - -4.999911595859885e-11), - TestValue(0, 8, 0.0004, -0.003961415020514468, -0.00004999750012499375, - -8.903587548786295), - TestValue(0, 8, 0.065, -0.3133586118431387, -0.008059516429014259, - -3.8289612370926864), - TestValue(0, 8, 4.42, -4.566604241437509, -0.355877616747182, - -0.3890459971629081), - TestValue(0, 8, 800, -7.9602646825343015, -0.9900990099009901, - -0.000049340754157967126), - TestValue(0, 8, 15324, -7.99791249886043, -0.9994782154969998, - -1.361769044194716e-7), - TestValue(0, 8, 150000, -7.999786674428577, -0.9999466695109595, - -1.4221228639144101e-9), - TestValue(0, 180, 0.0004, -0.0052068020335865025, -2.2222172839615914e-6, - -12.01700730618354), - TestValue(0, 180, 0.065, -0.5152345838836883, -0.00036098075694887956, - -6.927046886659846), - TestValue(0, 180, 4.42, -16.491356225074536, -0.023967031775295522, - -2.755043100796684), - TestValue(0, 180, 800, -162.35267519735217, -0.8163265306122449, - -0.01926737460893513), - TestValue(0, 180, 15324, -178.95104102256036, -0.9883900928792569, - -0.00006792118926490787), - TestValue(0, 180, 150000, -179.8920863223863, -0.9988014382740711, - -7.188495541043949e-7), - TestValue(0, 1123, 0.0004, -0.005939122128713381, -3.5618865318302646e-7, - -13.847805677972104), - TestValue(0, 1123, 0.065, -0.6342170147837343, -0.000057877326779839104, - -8.75724272015346), - TestValue(0, 1123, 4.42, -24.493639593452325, -0.00392045555338738, - -4.545467874886493), - TestValue(0, 1123, 800, -701.6240143366822, -0.4160166406656266, - -0.29304665858647905), - TestValue(0, 1123, 15324, -1083.757151397245, -0.9317200705295798, - -0.002442933450309326), - TestValue(0, 1123, 150000, -1118.817101006986, -0.9925689670003904, - -0.000027747673771116865), - TestValue(0, 10586, 0.0004, -0.006836533480423993, -3.778575334268833e-8, - -16.091333738845734), - TestValue(0, 10586, 0.065, -0.7800430171085975, -6.1401474485561915e-6, - -11.00066794181818), - TestValue(0, 10586, 4.42, -34.3945190758502, -0.0004173583295091224, - -6.781982760105572), - TestValue(0, 10586, 800, -2124.4224654744803, -0.07026172492534692, - -1.7257898067684474), - TestValue(0, 10586, 15324, -8048.29915678056, -0.5914318795831726, - -0.11664064731878732), - TestValue(0, 10586, 150000, -10229.149577360897, -0.9340789358972762, - -0.0022732664130149516), - TestValue(7, 0.0000256, 0.0004, -29.445354199147125, 256989.1917293233, - -13944.92090243279), - TestValue(7, 0.0000256, 0.065, -59.40270770911646, 273328.85048350185, - -89.90748568276743), - TestValue(7, 0.0000256, 4.42, -79.18162818224879, 273434.9163045572, - -0.5615296684557465), - TestValue(7, 0.0000256, 800, -82.50943543843826, 273436.49125003227, - -0.00003263555538968177), - TestValue(7, 0.0000256, 15324, -82.5342442124603, 273436.4995432019, - -8.94022633701752e-8), - TestValue(7, 0.0000256, 150000, -82.53547440969385, 273436.4999533335, - -9.33299659777731e-10), - TestValue(7, 0.314, 0.0004, -9.780554584441889, 0.027090322685207696, - 2474.516543534505), - TestValue(7, 0.314, 0.065, -5.954681567099272, 3.6518326807051746, - -1.661885301087814), - TestValue(7, 0.314, 4.42, -14.063434552944763, 19.880657339909963, - -0.4587955394328642), - TestValue(7, 0.314, 800, -16.924203575168434, 21.284639409604978, - -0.000029279795684011845), - TestValue(7, 0.314, 15324, -16.946467423587734, 21.292557330455672, - -8.025298470215603e-8), - TestValue(7, 0.314, 150000, -16.947571739258493, 21.29294905733322, - -8.378080451620917e-10), - TestValue(7, 1.5, 0.0004, -9.774134608119379, 0.0009775171065493646, - 2490.5539367351803), - TestValue(7, 1.5, 0.065, -5.026800862430695, 0.15228966986155484, - 11.046793754083321), - TestValue(7, 1.5, 4.42, -5.669765754393499, 2.7376126126126126, - -0.1990792406277535), - TestValue(7, 1.5, 800, -7.172434628346302, 3.6598045331669784, - -0.000018013716757359077), - TestValue(7, 1.5, 15324, -7.186147155348181, 3.6663077876741377, - -4.948342535726624e-8), - TestValue(7, 1.5, 150000, -7.1868281060611565, 3.666630000366663, - -5.166445049553658e-10), - TestValue(7, 8, 0.0004, -9.773287685468139, -6.249687515624219e-6, - 2492.6708598338487), - TestValue(7, 8, 0.065, -4.893078153217412, -0.0010074395536267824, - 13.045515423749752), - TestValue(7, 8, 4.42, -2.4138267066913563, -0.04448470209339775, - 0.06951848372348413), - TestValue(7, 8, 800, -1.972808375834589, -0.12376237623762376, - 4.6570738199136485e-6), - TestValue(7, 8, 15324, -1.9692663072788577, -0.12493477693712497, - 1.277112104958178e-8), - TestValue(7, 8, 150000, -1.9690905691403486, -0.12499333368886993, - 1.333280152948646e-10), - TestValue(7, 180, 0.0004, -9.774198636769189, -2.1357977229186406e-6, - 2490.3935075261693), - TestValue(7, 180, 0.065, -5.040836257459913, -0.00034694261640086756, - 10.776502846558865), - TestValue(7, 180, 4.42, -11.4293253460954, -0.023034980539589585, - -1.770828372217259), - TestValue(7, 180, 800, -135.92154531818449, -0.7845804988662132, - -0.017692867587181027), - TestValue(7, 180, 15324, -151.2058790199169, -0.949952700378397, - -0.00006270718914258566), - TestValue(7, 180, 150000, -152.07480469327567, -0.9599591601189683, - -6.638499794320296e-7), - TestValue(7, 1123, 0.0004, -9.77491789464706, -3.539684211507191e-7, - 2488.5953646554194), - TestValue(7, 1123, 0.065, -5.157696519888815, -0.00005751655982751597, - 8.978948920929607), - TestValue(7, 1123, 4.42, -19.28929343971758, -0.003896018163473122, - -3.5295051749149056), - TestValue(7, 1123, 800, -667.0958939480461, -0.41342348262051587, - -0.287969440027692), - TestValue(7, 1123, 15324, -1043.6096899099389, -0.9259123764122984, - -0.0024118325958113473), - TestValue(7, 1123, 150000, -1078.228021151623, -0.9863819832345821, - -0.000027401825537509694), - TestValue(7, 10586, 0.0004, -9.77581307717804, -3.7760767486519914e-8, - 2486.357408645293), - TestValue(7, 10586, 0.065, -5.303160350365611, -6.136087271705644e-6, - 6.741095395500565), - TestValue(7, 10586, 4.42, -29.16559791545973, -0.00041708235101804323, - -5.760472168602957), - TestValue(7, 10586, 800, -2086.6391306495434, -0.0702152643099608, - -1.7176872326969326), - TestValue(7, 10586, 15324, -7995.6283957432015, -0.5910407948337788, - -0.11645410288972613), - TestValue(7, 10586, 150000, -10173.280945470673, -0.9334612755391352, - -0.0022701910299964823), - TestValue(14, 0.0000256, 0.0004, -49.814562438358635, 513979.32330827066, - -30391.559221530802), - TestValue(14, 0.0000256, 0.065, -114.92817109028836, 546658.7005733127, - -196.83239209326592), - TestValue(14, 0.0000256, 4.42, -161.64931287705224, 546870.8326033225, - -1.650128690902025), - TestValue(14, 0.0000256, 800, -173.09898662779824, 546873.9825000325, - -0.00014060727924558591), - TestValue(14, 0.0000256, 15324, -173.20616504262574, 546873.9990864021, - -3.872936886750722e-7), - TestValue(14, 0.0000256, 150000, -173.21149502739468, 546873.9999066668, - -4.044185430984726e-9), - TestValue(14, 0.314, 0.0004, -10.482321240387563, 0.05545291000145865, - 2452.982014445862), - TestValue(14, 0.314, 0.065, -7.917539720426937, 7.4751693191939905, - -19.40653851445296), - TestValue(14, 0.314, 4.42, -31.109603016060397, 40.69498599371937, - -1.4423583039713965), - TestValue(14, 0.314, 800, -41.61461010763844, 43.568886473205765, - -0.00013381877200302483), - TestValue(14, 0.314, 15324, -41.71664028188991, 43.58509417059771, - -3.687852014877535e-7), - TestValue(14, 0.314, 150000, -41.72171561524851, 43.58589602133749, - -3.851015506484146e-9), - TestValue(14, 1.5, 0.0004, -10.468856159359483, 0.002221629787612192, - 2486.6186161358087), - TestValue(14, 1.5, 0.065, -5.969601492726813, 0.34611288604898827, - 7.298954082323366), - TestValue(14, 1.5, 4.42, -13.334103973863655, 6.221846846846847, - -0.8864094608348823), - TestValue(14, 1.5, 800, -20.926415102269573, 8.317737575379496, - -0.00010961017476240897), - TestValue(14, 1.5, 15324, -21.010069937864472, 8.332517699259403, - -3.0266583905813604e-7), - TestValue(14, 1.5, 150000, -21.014235520108855, 8.333250000833324, - -3.160877781738236e-9), - TestValue(14, 8, 0.0004, -10.466492810136518, 0.00003749812509374531, - 2492.526005536275), - TestValue(14, 8, 0.065, -5.595578961607217, 0.006044637321760695, - 12.902571279344416), - TestValue(14, 8, 4.42, -3.5471312844257383, 0.2669082125603865, - 0.0010136106025722125), - TestValue(14, 8, 800, -4.065493420056555, 0.7425742574257426, - -0.00001668126667020431), - TestValue(14, 8, 15324, -4.078322333399456, 0.7496086616227498, - -4.677001541608661e-8), - TestValue(14, 8, 150000, -4.0789662719144815, 0.7499600021332196, - -4.888125459956427e-10), - TestValue(14, 180, 0.0004, -10.467069325725546, -2.04937816187569e-6, - 2491.084720678314), - TestValue(14, 180, 0.065, -5.689219198051667, -0.0003329044758528556, - 11.4626317745298), - TestValue(14, 180, 4.42, -9.653376579596795, -0.022102929303883648, - -1.313682997645138), - TestValue(14, 180, 800, -117.57055678993851, -0.7528344671201814, - -0.016193696733894036), - TestValue(14, 180, 15324, -131.5984192349756, -0.911515307877537, - -0.000057701678183974536), - TestValue(14, 180, 150000, -132.39809487222743, -0.9211168819638655, - -6.110279944238073e-7), - TestValue(14, 1123, 0.0004, -10.467775521386166, -3.517481891184117e-7, - 2489.3192333086026), - TestValue(14, 1123, 0.065, -5.803957292009425, -0.000057155792875192846, - 9.697719756764902), - TestValue(14, 1123, 4.42, -17.37102939846337, -0.003871580773558864, - -3.040611828950623), - TestValue(14, 1123, 800, -640.6479149103316, -0.4108303245754051, - -0.2829675576373729), - TestValue(14, 1123, 15324, -1011.5999306403351, -0.920104682295017, - -0.00238094023047708), - TestValue(14, 1123, 150000, -1045.7795131043224, -0.9801949994687738, - -0.00002705815489179031), - TestValue(14, 10586, 0.0004, -10.468668475096411, -3.7735781630351504e-8, - 2487.0868493492235), - TestValue(14, 10586, 0.065, -5.949058950638154, -6.132027094855097e-6, - 7.465437927571536), - TestValue(14, 10586, 4.42, -27.2227588675498, -0.0004168063725269641, - -5.266030931107645), - TestValue(14, 10586, 800, -2056.9359371755286, -0.07016880369457469, - -1.7096599947938858), - TestValue(14, 10586, 15324, -7951.095336923546, -0.590649710084385, - -0.11626776694982688), - TestValue(14, 10586, 150000, -10125.552885388513, -0.9328436151809941, - -0.002267117824567677), - TestValue(1525, 0.0000256, 0.0004, -4301.784727467015, 5.5987134868421055e7, - -3.580668787634408e6), - TestValue(1525, 0.0000256, 0.065, -11965.467128123484, 5.954685919853104e7, - -23429.11268911477), - TestValue(1525, 0.0000256, 4.42, -18367.34289180058, 5.956996647937967e7, - -339.0570825343945), - TestValue(1525, 0.0000256, 800, -24826.22813563853, 5.957030959375009e7, - -0.8389762876176414), - TestValue(1525, 0.0000256, 15324, -25707.717028801628, 5.957031140048291e7, - -0.004643062913324059), - TestValue(1525, 0.0000256, 150000, -25773.43154710444, 5.957031148983333e7, - -0.00005129937594539058), - TestValue(1525, 0.314, 0.0004, -17.094738795518424, 6.1777199721236284, - -2348.2711549792057), - TestValue(1525, 0.314, 0.065, -296.58556828610017, 832.7696922844226, - -4001.4921811261693), - TestValue(1525, 0.314, 4.42, -4115.10160678526, 4533.61649969458, - -316.1764856190919), - TestValue(1525, 0.314, 800, -10469.94267675256, 4853.782788344746, - -0.8382285160349765), - TestValue(1525, 0.314, 15324, -11350.864477542971, 4855.588403521258, - -0.004641024152967077), - TestValue(1525, 0.314, 150000, -11416.550945303003, 4855.677733537116, - -0.00005127809769334135), - TestValue(1525, 1.5, 0.0004, -15.560537541616213, 0.270772238514174, - 1484.280307752038), - TestValue(1525, 1.5, 0.065, -74.45092758687497, 42.184238551650694, - -953.4745083343279), - TestValue(1525, 1.5, 4.42, -2072.1910365790172, 758.3186936936937, - -251.67662613527665), - TestValue(1525, 1.5, 800, -8088.548799680884, 1013.7658556872531, - -0.8354105724129193), - TestValue(1525, 1.5, 15324, -8967.33164084002, 1015.5672571857361, - -0.004633327525485953), - TestValue(1525, 1.5, 150000, -9032.912208922884, 1015.6565101015657, - -0.00005119776202988646), - TestValue(1525, 8, 0.0004, -15.230842685268726, 0.00948077596120194, - 2308.3869231549475), - TestValue(1525, 8, 0.065, -22.20647206997819, 1.528285802851829, - -169.72844230404513), - TestValue(1525, 8, 4.42, -652.6338020806143, 67.48329307568439, - -117.2113317142287), - TestValue(1525, 8, 800, -5554.513964530293, 187.74752475247524, - -0.8201519269955586), - TestValue(1525, 8, 15324, -6421.662226247852, 189.52605661361858, - -0.004591272777291877), - TestValue(1525, 8, 150000, -6486.664023141206, 189.61488720601568, - -0.00005075860649661479), - TestValue(1525, 180, 0.0004, -15.159228863591125, 0.000016604901371824113, - 2487.4167692289852), - TestValue(1525, 180, 0.065, -10.618383986015033, 0.0026973284338680167, - 7.7929628140754765), - TestValue(1525, 180, 4.42, -30.756932642065294, 0.1790869874320693, - -5.0606677133089075), - TestValue(1525, 180, 800, -1255.1060610431614, 6.099773242630386, - -0.5081161722061651), - TestValue(1525, 180, 15324, -1861.5172673616398, 7.38547041623667, - -0.0035556000115217756), - TestValue(1525, 180, 150000, -1912.1930479564326, 7.463266302659031, - -0.00003983284968711587), - TestValue(1525, 1123, 0.0004, -15.157115486355906, 1.2750475385536657e-7, - 2492.70020501204), - TestValue(1525, 1123, 0.065, -10.275036857130544, 0.000020718330690556827, - 13.074039765317043), - TestValue(1525, 1123, 4.42, -7.7548168672583415, 0.0014034043922188128, - 0.0654298516080507), - TestValue(1525, 1123, 800, -30.39018204828426, 0.14892136201921807, - -0.018804728472968435), - TestValue(1525, 1123, 15324, -64.3938471491183, 0.33352757644959136, - -0.00029097614079454104), - TestValue(1525, 1123, 150000, -68.69059192176792, 0.3553096391221344, - -3.4982159551333325e-6), - TestValue(1525, 10586, 0.0004, -15.157527333190956, -3.234240610599839e-8, - 2491.6705880068075), - TestValue(1525, 10586, 0.065, -10.34196113541293, -5.255608920401252e-6, - 12.044448366424728), - TestValue(1525, 10586, 4.42, -12.301855613945008, -0.0003572344439525938, - -0.9624372357797295), - TestValue(1525, 10586, 800, -744.0169167062886, -0.060139948001942986, - -0.7924525685250288), - TestValue(1525, 10586, 15324, -4300.645593413912, -0.506231273465249, - -0.08062419697917278), - TestValue(1525, 10586, 150000, -5850.263517824056, -0.799517215016552, - -0.0016543683056511327), - TestValue(10233, 0.0000256, 0.0004, -28781.07085289515, - 3.7568285855263156e8, -2.4041193199521683e7), - TestValue(10233, 0.0000256, 0.065, -80237.4790550341, 3.995691927102557e8, - -157343.697098361), - TestValue(10233, 0.0000256, 4.42, -123371.16336416776, 3.997242463550437e8, - -2307.279979293951), - TestValue(10233, 0.0000256, 800, -173733.65594636812, 3.997265487087504e8, - -10.166635446653597), - TestValue(10233, 0.0000256, 15324, -189611.39394380094, - 3.9972656083222395e8, -0.15627194690990365), - TestValue(10233, 0.0000256, 150000, -192108.97687250923, 3.9972656143178e8, - -0.0022260752765799197), - TestValue(10233, 0.314, 0.0004, -30.083534640958533, 41.460778593539814, - -30043.568270589793), - TestValue(10233, 0.314, 0.065, -1936.716591758479, 5589.00047056451, - -26975.841613138524), - TestValue(10233, 0.314, 4.42, -27734.55588693275, 30426.641345033488, - -2153.7342775414127), - TestValue(10233, 0.314, 800, -77398.83453431107, 32575.386135464123, - -10.16161733713528), - TestValue(10233, 0.314, 15324, -93272.76691554434, 32587.50423265796, - -0.15625826529496223), - TestValue(10233, 0.314, 150000, -95770.16160401958, 32588.103756758428, - -0.0022259324835118832), - TestValue(10233, 1.5, 0.0004, -19.785223133323598, 1.8184484137563317, - -4317.601447204935), - TestValue(10233, 1.5, 0.065, -445.630392408013, 283.3003194888179, - -6515.787894589817), - TestValue(10233, 1.5, 4.42, -14020.648493631525, 5092.706081081081, - -1720.7211329093311), - TestValue(10233, 1.5, 800, -61412.52664040723, 6808.234560199626, - -10.142698900729565), - TestValue(10233, 1.5, 15324, -77272.09898456372, 6820.332387197807, - -0.15620659350885369), - TestValue(10233, 1.5, 150000, -79768.7827089832, 6820.931790682093, - -0.0022253931450428865), - TestValue(10233, 8, 0.0004, -17.56909362175793, 0.06390305484725764, - 1221.8452476349516), - TestValue(10233, 8, 0.065, -94.45295843966596, 10.30106943583385, - -1247.5517925303861), - TestValue(10233, 8, 4.42, -4476.485408813824, 454.85607890499193, - -816.4371067130297), - TestValue(10233, 8, 800, -44371.840290708235, 1265.470297029703, - -10.040039157123783), - TestValue(10233, 8, 15324, -60153.13532501529, 1277.4580941821027, - -0.15592364901449507), - TestValue(10233, 8, 150000, -62645.92507437721, 1278.056836968695, - -0.002222438504382751), - TestValue(10233, 180, 0.0004, -17.08144177432405, 0.00012411083530925487, - 2440.94300115826), - TestValue(10233, 180, 0.065, -15.542242814932251, 0.020160775275594924, - -38.6634853761835), - TestValue(10233, 180, 4.42, -235.49737914944126, 1.3385587246502548, - -50.37753458197702), - TestValue(10233, 180, 800, -14640.50246307096, 45.59183673469388, - -7.836489965276398), - TestValue(10233, 180, 15324, -28577.644697168085, 55.2015866873065, - -0.14858705144088802), - TestValue(10233, 180, 150000, -30968.941707557387, 55.78306032760687, - -0.0021450282568338253), - TestValue(10233, 1123, 0.0004, -17.063078998820856, 2.8894734020457448e-6, - 2486.849880233364), - TestValue(10233, 1123, 0.065, -12.558918107941281, 0.0004695124193805291, - 7.224124958319663), - TestValue(10233, 1123, 4.42, -35.45506157865748, 0.031803517445555686, - -5.756960605210265), - TestValue(10233, 1123, 800, -3343.1303902972795, 3.3748099701370067, - -2.9898053694742615), - TestValue(10233, 1123, 15324, -11352.060718035325, 7.558299058347705, - -0.11311918072723515), - TestValue(10233, 1123, 150000, -13237.322258064814, 8.051917443787673, - -0.0017468778907598903), - TestValue(10233, 10586, 0.0004, -17.060718192660715, -1.2600010324928188e-9, - 2492.7518943576556), - TestValue(10233, 10586, 0.065, -12.175300607224926, -2.047489183204549e-7, - 13.125723676609066), - TestValue(10233, 10586, 4.42, -9.430792045634007, -0.00001391720105013416, - 0.11674937200192481), - TestValue(10233, 10586, 800, -7.2703661972227565, -0.0023429424616141564, - 0.00008904830662359586), - TestValue(10233, 10586, 15324, -9.327824035135563, -0.019721845219427537, - -0.00008059480749977865), - TestValue(10233, 10586, 150000, -11.132452601363184, -0.031147729489111892, - -2.2067081495436014e-6), -}; - +std::vector testValues = { TestValue(0,0.0000256,0.0004,-0.000024814156367781056525,-0.93984962406015037594,-0.001885014979603017252), TestValue(0,0.0000256,0.065,-0.000025594960092486140389,-0.9996063088998794321,-7.7516686911183493794e-8), TestValue(0,0.0000256,4.42,-0.000025599925864539648095,-0.9999942081783417725,-1.6772663823239562834e-11), TestValue(0,0.0000256,800,-0.000025599999590400008738,-0.999999968000001024,-5.119999781546674531e-16), TestValue(0,0.0000256,15324,-0.000025599999978616549228,-0.99999999832941790934,-1.3954222623666383236e-18), TestValue(0,0.314,0.0004,-0.002666782716971682618,-0.0012722646310432569975,-5.668229057060249802), TestValue(0,0.314,0.065,-0.11460468078714130042,-0.17150395778364116095,-0.93465289297043039811), TestValue(0,0.314,4.42,-0.30334820230965961631,-0.93367131389945078158,-0.0023021289016362151355), TestValue(0,0.314,800,-0.313938393619808991,-0.99960765399580664589,-7.6987831407130236997e-8), TestValue(0,0.314,15324,-0.3139967829987878124,-0.99997950968637160528,-2.0992934397861783072e-10), TestValue(0,1.5,0.0004,-0.0032919111000327549336,-0.00026659557451346307651,-7.2300443456564007971), TestValue(0,1.5,0.065,-0.20678149915011007124,-0.041533546325878594249,-2.2227873794044950749), TestValue(0,1.5,4.42,-1.2915096474038793989,-0.74662162162162162162,-0.038818374427929177938), TestValue(0,1.5,800,-1.4985955053442782733,-0.99812850904553961323,-1.7534272199610668797e-6), TestValue(0,1.5,15324,-1.4999265905382969801,-0.9999021239111285113,-4.7901769514626171505e-9), TestValue(0,3,0.0004,-0.003569116649587854519,-0.00013331555792560991868,-7.9229249395275619074), TestValue(0,3,0.065,-0.25047201260085385312,-0.021207177814029363785,-2.8746227562887040272), TestValue(0,3,4.42,-2.2897339760163958674,-0.59568733153638814016,-0.11372669262607046311), TestValue(0,3,800,-2.9943890230675014931,-0.99626400996264009963,-6.9962414744764927742e-6), TestValue(0,3,15324,-2.9997063813121767354,-0.99980426697983949892,-1.9158207560574170962e-8), TestValue(0,180,0.0004,-0.0052068020335865022334,-2.2222172839615911965e-6,-12.017007306183539545), TestValue(0,180,0.065,-0.51523458388368826209,-0.00036098075694887957127,-6.9270468866598452194), TestValue(0,180,4.42,-16.491356225074536835,-0.023967031775295521093,-2.7550431007966839452), TestValue(0,180,800,-162.35267519735224589,-0.81632653061224489796,-0.019267374608935205317), TestValue(0,180,15324,-178.95104102256056893,-0.98839009287925696594,-0.000067921189264833924309), TestValue(0,1123,0.0004,-0.0059391221287133807664,-3.5618865318302647087e-7,-13.847805677972105099), TestValue(0,1123,0.065,-0.63421701478373420435,-0.000057877326779839101032,-8.7572427201534599061), TestValue(0,1123,4.42,-24.493639593452325812,-0.0039204555533873800358,-4.5454678748864927673), TestValue(0,1123,800,-701.62401433668194795,-0.41601664066562662507,-0.29304665858647906001), TestValue(0,1123,15324,-1083.7571513972578336,-0.93172007052957986259,-0.0024429334503092957394), TestValue(0,10586,0.0004,-0.0068365334804239916148,-3.7785753342688330146e-8,-16.09133373884573238), TestValue(0,10586,0.065,-0.78004301710859758932,-6.1401474485561915594e-6,-11.0006679418181807), TestValue(0,10586,4.42,-34.39451907585020003,-0.00041735832950912239552,-6.7819827601055724777), TestValue(0,10586,800,-2124.4224654744799162,-0.070261724925346917267,-1.7257898067684468125), TestValue(0,10586,15324,-8048.2991567805804192,-0.59143187958317252026,-0.11664064731878857477), TestValue(6,0.0000256,0.0004,-26.480362597222490265,220276.31578947368421,-11595.463497838709543), TestValue(6,0.0000256,0.065,-51.419388136448102673,234281.72904210034202,-74.693807545973030394), TestValue(6,0.0000256,4.42,-67.52038137511190777,234372.64254759067459,-0.43125592475849002503), TestValue(6,0.0000256,800,-69.998079065742703551,234373.99250003224,-0.000023330384471037817491), TestValue(6,0.0000256,15324,-70.015807321298395432,234373.99960845899308,-6.3861427657507748849e-8), TestValue(6,0.314,0.0004,-9.6251974944123758225,0.023038524497171844865,2477.5305495558165941), TestValue(6,0.314,0.065,-5.6231627412658002701,3.1056417323496294304,0.81175666468752807101), TestValue(6,0.314,4.42,-11.748118636048988335,16.907181817937188357,-0.34352697543671422216), TestValue(6,0.314,800,-13.827010724885832016,18.101175543376294868,-0.000020465017270475111936), TestValue(6,0.314,15324,-13.842565956985816742,18.107909210435378814,-5.6049178830042368725e-8), TestValue(6,1.5,0.0004,-9.6197839616192332262,0.00079978672354038922954,2491.0537701151673519), TestValue(6,1.5,0.065,-4.8410045398874440986,0.12460063897763578275,11.520890928200777244), TestValue(6,1.5,4.42,-4.6947113008756524511,2.2398648648648648649,-0.12612961153608977325), TestValue(6,1.5,800,-5.6375883578559464151,2.9943855271366188397,-0.000011047869532026303582), TestValue(6,1.5,15324,-5.6459956995659817151,2.9997063717333855339,-3.0329592747982916341e-8), TestValue(6,3,0.0004,-9.6192613271356102502,0.00013331555792560991868,2492.3600897701139881), TestValue(6,3,0.065,-4.7587824423548651205,0.021207177814029363785,12.745335721641112642), TestValue(6,3,4.42,-2.8891081958287456629,0.59568733153638814016,0.0038502468520587354154), TestValue(6,3,800,-2.9857172436024219525,0.99626400996264009963,-2.3069406647953774853e-6), TestValue(6,3,15324,-2.9874796347761073428,0.99980426697983949892,-6.3824584044662864326e-9), TestValue(6,180,0.0004,-9.620112399166720505,-2.1481433744962048232e-6,2490.2324075130827354), TestValue(6,180,0.065,-4.897099604874425479,-0.00034894806505058358556,10.617175935000477685), TestValue(6,180,4.42,-11.802883319144519128,-0.023168130716119003723,-1.861375256665487843), TestValue(6,180,800,-138.97312319086169782,-0.78911564625850340136,-0.01791315421299756019), TestValue(6,180,15324,-154.44163935948173426,-0.95544375644994840041,-0.000063439277219443465219), TestValue(6,1123,0.0004,-9.6208335230756285524,-3.5428559715533443274e-7,2488.4295995707558483), TestValue(6,1123,0.065,-5.0142630342277769584,-0.000057568097963562133439,8.8149588796763128876), TestValue(6,1123,4.42,-19.683182166303213058,-0.0038995092191751589493,-3.6245874838477290528), TestValue(6,1123,800,-671.30418475064697583,-0.4137939337698174,-0.28869011401594177783), TestValue(6,1123,15324,-1048.6172073187539315,-0.92674204700048148398,-0.0024162628059421836267), TestValue(6,10586,0.0004,-9.6217290240095637933,-3.7764336894543976284e-8,2486.1908475533798261), TestValue(6,10586,0.065,-5.1597786035400147054,-6.1366672969700081899e-6,6.576309397642172055), TestValue(6,10586,4.42,-29.562997357281896989,-0.00041712177651676884042,-5.856347033468783979), TestValue(6,10586,800,-2091.3124520859014907,-0.07022190154073024605,-1.7188401003298574325), TestValue(6,10586,15324,-8002.4249559448888988,-0.59109666408369216554,-0.11648073932479483488), TestValue(14,0.0000256,0.0004,-49.814562438358640072,513979.32330827067669,-30391.559221530806766), TestValue(14,0.0000256,0.065,-114.92817109028837255,546658.70057331266455,-196.8323920932659291), TestValue(14,0.0000256,4.42,-161.64931287705226916,546870.83260332247849,-1.6501286909020252132), TestValue(14,0.0000256,800,-173.09898662779720676,546873.98250003256,-0.00014060727924520899117), TestValue(14,0.0000256,15324,-173.2061650426294071,546873.99908640208975,-3.8729368917100577369e-7), TestValue(14,0.314,0.0004,-10.482321240387567839,0.055452910001458647348,2452.9820144458617505), TestValue(14,0.314,0.065,-7.9175397204269351928,7.475169319193990219,-19.406538514452968028), TestValue(14,0.314,4.42,-31.109603016060397045,40.694985993719373875,-1.442358303971396938), TestValue(14,0.314,800,-41.614610107637548392,43.568886473205763553,-0.00013381877200270250453), TestValue(14,0.314,15324,-41.716640281901644559,43.585094170597712707,-3.6878520278347562598e-7), TestValue(14,1.5,0.0004,-10.468856159359487018,0.0022216297876121923043,2486.6186161358083867), TestValue(14,1.5,0.065,-5.9696014927268124315,0.34611288604898828541,7.2989540823233662764), TestValue(14,1.5,4.42,-13.334103973863653606,6.2218468468468468468,-0.88640946083488260684), TestValue(14,1.5,800,-20.926415102268522946,8.3177375753794967769,-0.00010961017476158336951), TestValue(14,1.5,15324,-21.010069937869350607,8.3325176992594042609,-3.0266583844869157132e-7), TestValue(14,3,0.0004,-10.467267071498293274,0.00048882371239390303515,2490.5905361225120861), TestValue(14,3,0.065,-5.7194959138831364402,0.077759651984774333877,11.025105769529760809), TestValue(14,3,4.42,-7.7900642906041824751,2.1841868823000898473,-0.48324536699834770639), TestValue(14,3,800,-12.744324478712668241,3.6529680365296803653,-0.000082224255065357307428), TestValue(14,3,15324,-12.807159398994470731,3.6659489789260781627,-2.2763181750167069646e-7), TestValue(14,180,0.0004,-10.467069325725552339,-2.049378161875689659e-6,2491.0847206783138), TestValue(14,180,0.065,-5.6892191980516647312,-0.00033290447585285560461,11.462631774529800832), TestValue(14,180,4.42,-9.6533765795967992717,-0.02210292930388364723,-1.3136829976451384132), TestValue(14,180,800,-117.57055678993798607,-0.7528344671201814059,-0.016193696733894170103), TestValue(14,180,15324,-131.59841923497641062,-0.9115153078775369797,-0.000057701678183561534688), TestValue(14,1123,0.0004,-10.467775521386168611,-3.5174818911841171522e-7,2489.3192333086024842), TestValue(14,1123,0.065,-5.8039572920094235935,-0.000057155792875192843316,9.6977197567649025541), TestValue(14,1123,4.42,-17.371029398463366472,-0.0038715807735588641672,-3.0406118289506228066), TestValue(14,1123,800,-640.64791491033069867,-0.41083032457540509991,-0.28296755763737220502), TestValue(14,1123,15324,-1011.5999306403485179,-0.92010468229501697917,-0.0023809402304773394913), TestValue(14,10586,0.0004,-10.468668475096403359,-3.7735781630351504468e-8,2487.0868493492232687), TestValue(14,10586,0.065,-5.9490589506381604899,-6.1320270948550970306e-6,7.4654379275715350026), TestValue(14,10586,4.42,-27.222758867549796685,-0.00041680637252696410027,-5.2660309311076446873), TestValue(14,10586,800,-2056.9359371755272758,-0.070168803694574684427,-1.7096599947938850626), TestValue(14,10586,15324,-7951.0953369235666607,-0.5906497100843850259,-0.11626776694982782037), TestValue(1525,0.0000256,0.0004,-4301.7847274670157821,5.5987134868421052632e7,-3.5806687876344080158e6), TestValue(1525,0.0000256,0.065,-11965.467128123482119,5.9546859198531040083e7,-23429.112689114767404), TestValue(1525,0.0000256,4.42,-18367.342891800584413,5.9569966479379666941e7,-339.05708253439450269), TestValue(1525,0.0000256,800,-24826.228135638531385,5.9570309593750093e7,-0.83897628761764105052), TestValue(1525,0.0000256,15324,-25707.717028801610058,5.9570311400482904473e7,-0.0046430629133236893109), TestValue(1525,0.314,0.0004,-17.094738795518807033,6.1777199721236284663,-2348.2711549792054389), TestValue(1525,0.314,0.065,-296.5855682860990671,832.76969228442263415,-4001.4921811261694014), TestValue(1525,0.314,4.42,-4115.1016067852616032,4533.6164996945796636,-316.17648561909186371), TestValue(1525,0.314,800,-10469.942676752557863,4853.7827883447466615,-0.83822851603497641238), TestValue(1525,0.314,15324,-11350.864477542964446,4855.5884035212585267,-0.0046410241529681445478), TestValue(1525,1.5,0.0004,-15.560537541616769004,0.27077223851417399804,1484.2803077520377337), TestValue(1525,1.5,0.065,-74.450927586875279684,42.184238551650692226,-953.4745083343278627), TestValue(1525,1.5,4.42,-2072.1910365790187577,758.31869369369369369,-251.67662613527664787), TestValue(1525,1.5,800,-8088.5487996808837997,1013.7658556872530672,-0.8354105724129184353), TestValue(1525,1.5,15324,-8967.3316408400039725,1015.5672571857361913,-0.0046333275254863264045), TestValue(1525,3,0.0004,-15.357522072066896545,0.067635426387592765409,1991.7174903993567368), TestValue(1525,3,0.065,-42.491829475398155315,10.75910821098423056,-477.23846708705704922), TestValue(1525,3,4.42,-1360.5497881858611964,302.21203953279424978,-199.67578957112613322), TestValue(1525,3,800,-7035.8464992378503203,505.43794105437941054,-0.83186161385039575293), TestValue(1525,3,15324,-7911.9312240083236782,507.23403144777190579,-0.0046236034557581425194), TestValue(1525,180,0.0004,-15.159228863591761992,0.000016604901371824111996,2487.4167692289850077), TestValue(1525,180,0.065,-10.618383986015501881,0.0026973284338680167964,7.7929628140754776749), TestValue(1525,180,4.42,-30.75693264206759737,0.17908698743206931039,-5.0606677133089086733), TestValue(1525,180,800,-1255.1060610431618143,6.0997732426303854875,-0.50811617220616562857), TestValue(1525,180,15324,-1861.5172673616192307,7.3854704162366701066,-0.0035556000115225182714), TestValue(1525,1123,0.0004,-15.157115486356269288,1.2750475385536655502e-7,2492.7002050120397202), TestValue(1525,1123,0.065,-10.275036857130705184,0.000020718330690556828686,13.074039765317043251), TestValue(1525,1123,4.42,-7.754816867258728553,0.0014034043922188128,0.065429851608050629578), TestValue(1525,1123,800,-30.390182048283734404,0.1489213620192180795,-0.018804728472968400557), TestValue(1525,1123,15324,-64.393847149111855643,0.33352757644959136666,-0.00029097614079605979039), TestValue(1525,10586,0.0004,-15.157527333190073382,-3.2342406105998390275e-8,2491.6705880068073821), TestValue(1525,10586,0.065,-10.341961135413218919,-5.2556089204012518156e-6,12.04444836642472918), TestValue(1525,10586,4.42,-12.301855613945737855,-0.00035723444395259380558,-0.96243723577972978183), TestValue(1525,10586,800,-744.01691670628731344,-0.060139948001942982935,-0.79245256852502796007), TestValue(1525,10586,15324,-4300.6455934139147727,-0.50623127346524902759,-0.080624196979174112178), TestValue(10233,0.0000256,0.0004,-28781.070852895156444,3.7568285855263157895e8,-2.4041193199521680582e7), TestValue(10233,0.0000256,0.065,-80237.47905503410844,3.9956919271025565316e8,-157343.69709836101487), TestValue(10233,0.0000256,4.42,-123371.16336416773985,3.9972424635504373549e8,-2307.2799792939510176), TestValue(10233,0.0000256,800,-173733.65594636811604,3.9972654870875044132e8,-10.166635446653598855), TestValue(10233,0.0000256,15324,-189611.39394380092393,3.997265608322239652e8,-0.1562719469099034673), TestValue(10233,0.314,0.0004,-30.083534640956912654,41.460778593539812969,-30043.568270589792096), TestValue(10233,0.314,0.065,-1936.7165917584869886,5589.0004705645093525,-26975.841613138526635), TestValue(10233,0.314,4.42,-27734.555886932752049,30426.6413450334886,-2153.7342775414124626), TestValue(10233,0.314,800,-77398.834534311059049,32575.386135464123325,-10.161617337135278412), TestValue(10233,0.314,15324,-93272.766915544350705,32587.504232657958969,-0.15625826529496379204), TestValue(10233,1.5,0.0004,-19.785223133324616937,1.8184484137563316449,-4317.6014472049352643), TestValue(10233,1.5,0.065,-445.63039240802026812,283.30031948881789137,-6515.7878945898169301), TestValue(10233,1.5,4.42,-14020.648493631530079,5092.7060810810810811,-1720.7211329093311099), TestValue(10233,1.5,800,-61412.526640407231264,6808.2345601996257018,-10.142698900729563784), TestValue(10233,1.5,15324,-77272.098984563728691,6820.3323871978075756,-0.15620659350885388317), TestValue(10233,3,0.0004,-18.421373162288964031,0.45460605252632982269,-908.65830344005301507), TestValue(10233,3,0.065,-230.93012488941404482,72.316476345840130506,-3316.4438994781907491), TestValue(10233,3,4.42,-9239.7190298539962311,2031.293800539083558,-1371.3592560596120078), TestValue(10233,3,800,-54340.180404088611315,3397.2602739726027397,-10.118854869649679896), TestValue(10233,3,15324,-70181.625182690519906,3409.3325504012526913,-0.15614126136305778491), TestValue(10233,180,0.0004,-17.081441774321808558,0.00012411083530925486832,2440.9430011582593451), TestValue(10233,180,0.065,-15.542242814932986052,0.020160775275594924055,-38.663485376183506373), TestValue(10233,180,4.42,-235.49737914944659778,1.3385587246502548531,-50.377534581977016966), TestValue(10233,180,800,-14640.502463070959489,45.591836734693877551,-7.8364899652763980015), TestValue(10233,180,15324,-28577.644697168082129,55.201586687306501548,-0.14858705144088737228), TestValue(10233,1123,0.0004,-17.063078998820718915,2.8894734020457445678e-6,2486.8498802333634116), TestValue(10233,1123,0.065,-12.558918107945625621,0.00046951241938052912769,7.2241249583196655846), TestValue(10233,1123,4.42,-35.455061578657784001,0.031803517445555683105,-5.7569606052102630188), TestValue(10233,1123,800,-3343.1303902972739556,3.3748099701370067269,-2.9898053694742608731), TestValue(10233,1123,15324,-11352.060718035326883,7.5582990583477048515,-0.11311918072723555384), TestValue(10233,10586,0.0004,-17.060718192656536162,-1.2600010324928188685e-9,2492.7518943576552348), TestValue(10233,10586,0.065,-12.175300607237463447,-2.0474891832045490463e-7,13.125723676609068062), TestValue(10233,10586,4.42,-9.4307920456266217014,-0.000013917201050134158853,0.11674937200192659959), TestValue(10233,10586,800,-7.2703661972122617808,-0.0023429424616141566026,0.00008904830662418682316), TestValue(10233,10586,15324,-9.3278240351663417157,-0.019721845219427536336,-0.00008059480750115928323),}; } // namespace neg_binomial_2_test_internal TEST(ProbDistributionsNegativeBinomial2, derivativesPrecomputed) { using neg_binomial_2_test_internal::TestValue; using neg_binomial_2_test_internal::testValues; + using stan::test::internal::expect_near_rel_finite; using stan::math::is_nan; using stan::math::neg_binomial_2_log; using stan::math::value_of; @@ -518,6 +96,7 @@ TEST(ProbDistributionsNegativeBinomial2, derivativesPrecomputed) { } TEST(ProbDistributionsNegBinomial2, derivativesComplexStep) { + using stan::test::internal::expect_near_rel_finite; using boost::math::differentiation::complex_step_derivative; using stan::math::is_nan; using stan::math::neg_binomial_2_log; @@ -604,6 +183,56 @@ TEST(ProbDistributionsNegBinomial2, derivativesComplexStep) { } } +TEST(ProbDistributionsNegBinomial2, derivativesZeroOne) { + using stan::test::expect_near_rel; + using stan::math::var; + + std::vector mu_to_test + = {2.345e-5, 0.2, 13, 150, 1621, 18432, 1e10 }; + double phi_start = 1e-8; + double phi_max = 1e20; + for (double mu_dbl : mu_to_test) { + for(double phi_dbl = phi_start; phi_dbl < phi_max; + phi_dbl *= stan::math::pi()) { + + std::ostringstream msg; + msg << ", mu = " << mu_dbl << ", phi = " << phi_dbl; + + var mu0(mu_dbl); + var phi0(phi_dbl); + var val0 = neg_binomial_2_lpmf(0, mu0, phi0); + + std::vector x0; + x0.push_back(mu0); + x0.push_back(phi0); + + std::vector gradients0; + val0.grad(x0, gradients0); + + var mu1(mu_dbl); + var phi1(phi_dbl); + var val1 = neg_binomial_2_lpmf(1, mu1, phi1); + + std::vector x1; + x1.push_back(mu1); + x1.push_back(phi1); + + std::vector gradients1; + val1.grad(x1, gradients1); + + double expected_dmu_0 = - phi_dbl / (mu_dbl + phi_dbl); + double expected_dphi_0 = mu_dbl / (mu_dbl + phi_dbl) + - log1p(mu_dbl / phi_dbl); + expect_near_rel("dmu, n = 0 " + msg.str(), gradients0[0], expected_dmu_0); + expect_near_rel("dphi, n = 0 " + msg.str(), gradients0[1], expected_dphi_0); + + double expected_dmu_1 = (phi_dbl * (1 - mu_dbl)) / (mu_dbl * (mu_dbl + phi_dbl)); + expect_near_rel("dmu, n = 1 " + msg.str(), gradients1[0], expected_dmu_1); + } + } + +} + TEST(ProbDistributionsNegBinomial2, proptoAtPoissonCutoff) { using stan::math::internal::neg_binomial_2_phi_cutoff; using stan::math::neg_binomial_2_lpmf; From 7c4a8195cfcb7f1110577d98de1291e1a5e90f5a Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Tue, 7 Jan 2020 11:04:42 -0500 Subject: [PATCH 48/82] [Jenkins] auto-formatting by clang-format version 5.0.2-svn328729-1~exp1~20180509124008.99 (branches/release_50) --- stan/math/prim/prob/neg_binomial_2_lpmf.hpp | 10 +- .../math/prim/prob/neg_binomial_2_test.cpp | 24 +- .../prim/prob/neg_binomial_2_test_tools.hpp | 22 +- .../fun/binomial_coefficient_log_test.cpp | 75 +++- .../math/rev/prob/neg_binomial_2_test.cpp | 386 +++++++++++++++++- 5 files changed, 463 insertions(+), 54 deletions(-) diff --git a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp index 740620f463c..f9e867d23a9 100644 --- a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp @@ -84,8 +84,8 @@ return_type_t neg_binomial_2_lpmf( } for (size_t i = 0; i < max_size_seq_view; i++) { - if(false) { - //if (phi_val[i] > internal::neg_binomial_2_phi_cutoff) { + if (false) { + // if (phi_val[i] > internal::neg_binomial_2_phi_cutoff) { // Phi is large, delegate to Poisson. // Copying the code here as just calling // poisson_lpmf does not preserve propto logic correctly. @@ -104,7 +104,7 @@ return_type_t neg_binomial_2_lpmf( // Expansion obtained in Mathematica via // Series[1 - (n + phi) / (mu + phi) + Log[phi] - Log[mu + phi] - // PolyGamma[phi] + PolyGamma[n + phi],{phi,Infinity, 2}] - if(n_vec[i] == 0) { + if (n_vec[i] == 0) { logp += phi_val[i] * (-log1p(mu_val[i] / phi_val[i])); } else { if (include_summand::value) { @@ -121,7 +121,7 @@ return_type_t neg_binomial_2_lpmf( ops_partials.edge2_.partials_[i] += (mu_val[i] * (-mu_val[i] + 2 * n_vec[i]) + n_vec[i] * (1 - n_vec[i])) - / (2 * square(phi_val[i])); + / (2 * square(phi_val[i])); } } } else { @@ -132,7 +132,7 @@ return_type_t neg_binomial_2_lpmf( logp += multiply_log(n_vec[i], mu_val[i]); } // logp += phi_val[i] * (log_phi[i] - log_mu_plus_phi[i]) - logp += - phi_val[i] * (log1p(mu_val[i] / phi_val[i])) + logp += -phi_val[i] * (log1p(mu_val[i] / phi_val[i])) - n_vec[i] * log_mu_plus_phi[i]; if (!is_constant_all::value) { diff --git a/test/unit/math/prim/prob/neg_binomial_2_test.cpp b/test/unit/math/prim/prob/neg_binomial_2_test.cpp index 1091a946652..cacabc9ff2b 100644 --- a/test/unit/math/prim/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/prim/prob/neg_binomial_2_test.cpp @@ -267,11 +267,11 @@ TEST(ProbDistributionsNegBinomial2, poissonCutoff) { using namespace stan::test::neg_binomial_2_test_internal; // std::vector mu_to_test - // = {2.345e-5, 0.2, 13, 150, 1621, 18432, 73582345, + // = {2.345e-5, 0.2, 13, 150, 1621, 18432, 73582345, // static_cast(std::numeric_limits::max()) }; - // std::vector n_to_test = {0, 1, 3, 16, 24, 181, 2132, 121358, 865422242}; - std::vector mu_to_test - = {10}; + // std::vector n_to_test = {0, 1, 3, 16, 24, 181, 2132, 121358, + // 865422242}; + std::vector mu_to_test = {10}; std::vector n_to_test = {16}; for (double mu : mu_to_test) { for (int n : n_to_test) { @@ -281,31 +281,28 @@ TEST(ProbDistributionsNegBinomial2, poissonCutoff) { = stan::math::neg_binomial_2_lpmf(n, mu, just_above_phi_cutoff); std::ostringstream msg; msg << "neg_binomial_2_lpmf changes too much around phi cutoff for n = " - << std::setprecision(17) << n << ", mu = " << mu - << ", below cutoff = " << just_below_phi_cutoff + << std::setprecision(17) << n << ", mu = " << mu + << ", below cutoff = " << just_below_phi_cutoff << ", above cutoff = " << just_above_phi_cutoff; expect_near_rel(msg.str(), before_cutoff, after_cutoff); - } } } -TEST(ProbDistributionsNegBinomial2, zeroOne) { +TEST(ProbDistributionsNegBinomial2, zeroOne) { using stan::test::expect_near_rel; using namespace stan::test::neg_binomial_2_test_internal; std::vector mu_to_test - = {2.345e-5, 0.2, 13, 150, 1621, 18432, phi_cutoff }; + = {2.345e-5, 0.2, 13, 150, 1621, 18432, phi_cutoff}; double phi_start = 1e-8; double phi_max = just_above_phi_cutoff * 1e10; for (double mu : mu_to_test) { - for(double phi = phi_start; phi < phi_max; - phi *= stan::math::pi()) { - + for (double phi = phi_start; phi < phi_max; phi *= stan::math::pi()) { std::ostringstream msg; msg << ", mu = " << mu << ", phi = " << phi; - double expected_value_0 = phi * (-log1p(mu / phi)); + double expected_value_0 = phi * (-log1p(mu / phi)); double value_0 = stan::math::neg_binomial_2_lpmf(0, mu, phi); expect_near_rel("n = 0 " + msg.str(), value_0, expected_value_0); @@ -314,7 +311,6 @@ TEST(ProbDistributionsNegBinomial2, zeroOne) { expect_near_rel("n = 1 " + msg.str(), value_1, expected_value_1); } } - } TEST(ProbDistributionsNegBinomial2, vectorAroundCutoff) { diff --git a/test/unit/math/prim/prob/neg_binomial_2_test_tools.hpp b/test/unit/math/prim/prob/neg_binomial_2_test_tools.hpp index 97eb4bb33fc..36d82734bae 100644 --- a/test/unit/math/prim/prob/neg_binomial_2_test_tools.hpp +++ b/test/unit/math/prim/prob/neg_binomial_2_test_tools.hpp @@ -1,17 +1,19 @@ #ifndef STAN_TEST_UNIT_PRIM_PROB_NEG_BINOMIAL_2_TEST_TOOLS_HPP #define STAN_TEST_UNIT_PRIM_PROB_NEG_BINOMIAL_2_TEST_TOOLS_HPP -#include -#include -#include +#include +#include +#include -namespace stan { namespace test { +namespace stan { +namespace test { namespace neg_binomial_2_test_internal { - double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; - double just_below_phi_cutoff = std::nextafter(phi_cutoff, 0); - double just_above_phi_cutoff = - std::nextafter(phi_cutoff, std::numeric_limits::infinity()); -} -}} +double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; +double just_below_phi_cutoff = std::nextafter(phi_cutoff, 0); +double just_above_phi_cutoff + = std::nextafter(phi_cutoff, std::numeric_limits::infinity()); +} // namespace neg_binomial_2_test_internal +} // namespace test +} // namespace stan #endif \ No newline at end of file diff --git a/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp b/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp index 1e3063f992e..a8e59a736b7 100644 --- a/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp +++ b/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp @@ -44,15 +44,76 @@ TEST(MathFunctions, binomial_coefficient_log_nan) { } namespace binomial_coefficient_test_internal { - struct TestValue { - double n; - double k; - double val; - }; +struct TestValue { + double n; + double k; + double val; +}; -std::vector testValues = { {0.00003,3.e-20,1.4804082055036736261e-24}, {0.00003,3.e-15,1.4804082053556342859e-19}, {0.00003,3.e-10,1.4803934014216156867e-14}, {0.00003,3.e-7,1.4656041234443424231e-11}, {0.00003,6.e-6,2.3686531286936713477e-10}, {0.00003,0.000015,3.7010205134852404454e-10}, {0.00003,0.0000291,4.3079878779785775469e-11}, {0.00003,0.0000299999982,8.8824487000750964998e-17}, {0.00003,0.00003,1.4804082055036751063e-28}, {0.002,2.e-18,6.5701370962226547789e-21}, {0.002,2.e-13,6.5701370955656467768e-16}, {0.002,2.e-8,6.5700713947654458316e-11}, {0.002,0.00002,6.5044356407218957555e-8}, {0.002,0.0004,1.0512217145828735086e-6}, {0.002,0.001,1.6425337349621531325e-6}, {0.002,0.00194,1.9119098219591897636e-7}, {0.002,0.00199999988,3.9420820212083508274e-13}, {0.002,0.002,6.5701370962226613484e-25}, {1,1.e-15,9.999999999999988551e-16}, {1,1.e-10,9.999999998855065933e-11}, {1,0.00001,9.9998855069266455991e-6}, {1,0.01,0.0098858370348613105263}, {1,0.2,0.15645796291768801671}, {1,0.5,0.24156447527049044469}, {1,0.97,0.028978328236256312961}, {1,0.99999994,5.9999995878237431346e-8}, {1,1.,9.999999999999999999e-20}, {8,8.e-15,2.1742857142857086459e-14}, {8,8.e-10,2.1742857137217315398e-9}, {8,0.00008,0.00021742293180507342042}, {8,0.08,0.21198226737825583898}, {8,1.6,2.9067860629113428343}, {8,4,4.2484952420493589891}, {8,7.76,0.60627458624545365112}, {8,7.99999952,1.3045712255376840361e-6}, {8,8.,2.1742857142857142852e-18}, {1325,1.325e-12,1.0290957946506935679e-11}, {1325,1.325e-7,1.0290957802047796044e-6}, {1325,0.01325,0.10276604269137043037}, {1325,13.25,71.989832127409062998}, {1325,265,659.43564932902941932}, {1325,662.5,914.5994503408452751}, {1325,1285.25,175.78626065119186267}, {1325,1324.9999205,0.00061745227641045219017}, {1325,1325.,1.029095794650838014e-15}, {845000,8.45e-10,1.2019540397111151912e-8}, {845000,0.0000845,0.0012019481673871213658}, {845000,8.45,103.7383038277367436}, {845000,8450,47315.861645757620061}, {845000,169000,422833.22169549650655}, {845000,422500,585702.31823555211409}, {845000,819650,113851.15813267856212}, {845000,844999.9493,0.7191087768194817628}, {845000,845000.,1.2019540397698355631e-12}, {3000000000000000.0,3,105.12040658150832885}, {3000000000000000.0,100,3199.999492802314355}, {3000000000000000.0,12895,350387.52436058836877}, {100000000000000000000.0,3,136.36334611041468604}, {100000000000000000000.0,100,4241.4308104325278778}, {100000000000000000000.0,12895,484680.0927690319003},}; +std::vector testValues = { + {0.00003, 3.e-20, 1.4804082055036736261e-24}, + {0.00003, 3.e-15, 1.4804082053556342859e-19}, + {0.00003, 3.e-10, 1.4803934014216156867e-14}, + {0.00003, 3.e-7, 1.4656041234443424231e-11}, + {0.00003, 6.e-6, 2.3686531286936713477e-10}, + {0.00003, 0.000015, 3.7010205134852404454e-10}, + {0.00003, 0.0000291, 4.3079878779785775469e-11}, + {0.00003, 0.0000299999982, 8.8824487000750964998e-17}, + {0.00003, 0.00003, 1.4804082055036751063e-28}, + {0.002, 2.e-18, 6.5701370962226547789e-21}, + {0.002, 2.e-13, 6.5701370955656467768e-16}, + {0.002, 2.e-8, 6.5700713947654458316e-11}, + {0.002, 0.00002, 6.5044356407218957555e-8}, + {0.002, 0.0004, 1.0512217145828735086e-6}, + {0.002, 0.001, 1.6425337349621531325e-6}, + {0.002, 0.00194, 1.9119098219591897636e-7}, + {0.002, 0.00199999988, 3.9420820212083508274e-13}, + {0.002, 0.002, 6.5701370962226613484e-25}, + {1, 1.e-15, 9.999999999999988551e-16}, + {1, 1.e-10, 9.999999998855065933e-11}, + {1, 0.00001, 9.9998855069266455991e-6}, + {1, 0.01, 0.0098858370348613105263}, + {1, 0.2, 0.15645796291768801671}, + {1, 0.5, 0.24156447527049044469}, + {1, 0.97, 0.028978328236256312961}, + {1, 0.99999994, 5.9999995878237431346e-8}, + {1, 1., 9.999999999999999999e-20}, + {8, 8.e-15, 2.1742857142857086459e-14}, + {8, 8.e-10, 2.1742857137217315398e-9}, + {8, 0.00008, 0.00021742293180507342042}, + {8, 0.08, 0.21198226737825583898}, + {8, 1.6, 2.9067860629113428343}, + {8, 4, 4.2484952420493589891}, + {8, 7.76, 0.60627458624545365112}, + {8, 7.99999952, 1.3045712255376840361e-6}, + {8, 8., 2.1742857142857142852e-18}, + {1325, 1.325e-12, 1.0290957946506935679e-11}, + {1325, 1.325e-7, 1.0290957802047796044e-6}, + {1325, 0.01325, 0.10276604269137043037}, + {1325, 13.25, 71.989832127409062998}, + {1325, 265, 659.43564932902941932}, + {1325, 662.5, 914.5994503408452751}, + {1325, 1285.25, 175.78626065119186267}, + {1325, 1324.9999205, 0.00061745227641045219017}, + {1325, 1325., 1.029095794650838014e-15}, + {845000, 8.45e-10, 1.2019540397111151912e-8}, + {845000, 0.0000845, 0.0012019481673871213658}, + {845000, 8.45, 103.7383038277367436}, + {845000, 8450, 47315.861645757620061}, + {845000, 169000, 422833.22169549650655}, + {845000, 422500, 585702.31823555211409}, + {845000, 819650, 113851.15813267856212}, + {845000, 844999.9493, 0.7191087768194817628}, + {845000, 845000., 1.2019540397698355631e-12}, + {3000000000000000.0, 3, 105.12040658150832885}, + {3000000000000000.0, 100, 3199.999492802314355}, + {3000000000000000.0, 12895, 350387.52436058836877}, + {100000000000000000000.0, 3, 136.36334611041468604}, + {100000000000000000000.0, 100, 4241.4308104325278778}, + {100000000000000000000.0, 12895, 484680.0927690319003}, +}; -} +} // namespace binomial_coefficient_test_internal TEST(MathFunctions, binomial_coefficient_log_precomputed) { using binomial_coefficient_test_internal::TestValue; diff --git a/test/unit/math/rev/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/prob/neg_binomial_2_test.cpp index 424380f0b1a..77c28956c4a 100644 --- a/test/unit/math/rev/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/prob/neg_binomial_2_test.cpp @@ -29,11 +29,11 @@ struct TestValue { // at https://www.wolframcloud.com/env/martin.modrak/NegBinomial2_Tests.nb // but is also presented below for convenience: // -// nb2[n_,mu_,phi_]:= LogGamma[n + phi] - LogGamma[n + 1] - LogGamma[phi] + +// nb2[n_,mu_,phi_]:= LogGamma[n + phi] - LogGamma[n + 1] - LogGamma[phi] + // n * (Log[mu] - Log[mu + phi]) + phi * (Log[phi] - Log[mu + phi]) // nb2dmu[n_,mu_,phi_]= D[nb2[n, mu, phi],mu]; // nb2dphi[n_,mu_,phi_]= D[nb2[n, mu, phi],phi]; -// out = OpenWrite["nb_test.txt"] +// out = OpenWrite["nb_test.txt"] // mus= {256*10^-7,314*10^-3,15*10^-1,3,180, 1123,10586}; // phis= {4*10^-4,65*10^-3,442*10^-2,800, 15324}; // ns = {0,6,14,1525,10233}; @@ -55,17 +55,368 @@ struct TestValue { // WriteString[out,"};"]; // Close[out]; // FilePrint[%] -std::vector testValues = { TestValue(0,0.0000256,0.0004,-0.000024814156367781056525,-0.93984962406015037594,-0.001885014979603017252), TestValue(0,0.0000256,0.065,-0.000025594960092486140389,-0.9996063088998794321,-7.7516686911183493794e-8), TestValue(0,0.0000256,4.42,-0.000025599925864539648095,-0.9999942081783417725,-1.6772663823239562834e-11), TestValue(0,0.0000256,800,-0.000025599999590400008738,-0.999999968000001024,-5.119999781546674531e-16), TestValue(0,0.0000256,15324,-0.000025599999978616549228,-0.99999999832941790934,-1.3954222623666383236e-18), TestValue(0,0.314,0.0004,-0.002666782716971682618,-0.0012722646310432569975,-5.668229057060249802), TestValue(0,0.314,0.065,-0.11460468078714130042,-0.17150395778364116095,-0.93465289297043039811), TestValue(0,0.314,4.42,-0.30334820230965961631,-0.93367131389945078158,-0.0023021289016362151355), TestValue(0,0.314,800,-0.313938393619808991,-0.99960765399580664589,-7.6987831407130236997e-8), TestValue(0,0.314,15324,-0.3139967829987878124,-0.99997950968637160528,-2.0992934397861783072e-10), TestValue(0,1.5,0.0004,-0.0032919111000327549336,-0.00026659557451346307651,-7.2300443456564007971), TestValue(0,1.5,0.065,-0.20678149915011007124,-0.041533546325878594249,-2.2227873794044950749), TestValue(0,1.5,4.42,-1.2915096474038793989,-0.74662162162162162162,-0.038818374427929177938), TestValue(0,1.5,800,-1.4985955053442782733,-0.99812850904553961323,-1.7534272199610668797e-6), TestValue(0,1.5,15324,-1.4999265905382969801,-0.9999021239111285113,-4.7901769514626171505e-9), TestValue(0,3,0.0004,-0.003569116649587854519,-0.00013331555792560991868,-7.9229249395275619074), TestValue(0,3,0.065,-0.25047201260085385312,-0.021207177814029363785,-2.8746227562887040272), TestValue(0,3,4.42,-2.2897339760163958674,-0.59568733153638814016,-0.11372669262607046311), TestValue(0,3,800,-2.9943890230675014931,-0.99626400996264009963,-6.9962414744764927742e-6), TestValue(0,3,15324,-2.9997063813121767354,-0.99980426697983949892,-1.9158207560574170962e-8), TestValue(0,180,0.0004,-0.0052068020335865022334,-2.2222172839615911965e-6,-12.017007306183539545), TestValue(0,180,0.065,-0.51523458388368826209,-0.00036098075694887957127,-6.9270468866598452194), TestValue(0,180,4.42,-16.491356225074536835,-0.023967031775295521093,-2.7550431007966839452), TestValue(0,180,800,-162.35267519735224589,-0.81632653061224489796,-0.019267374608935205317), TestValue(0,180,15324,-178.95104102256056893,-0.98839009287925696594,-0.000067921189264833924309), TestValue(0,1123,0.0004,-0.0059391221287133807664,-3.5618865318302647087e-7,-13.847805677972105099), TestValue(0,1123,0.065,-0.63421701478373420435,-0.000057877326779839101032,-8.7572427201534599061), TestValue(0,1123,4.42,-24.493639593452325812,-0.0039204555533873800358,-4.5454678748864927673), TestValue(0,1123,800,-701.62401433668194795,-0.41601664066562662507,-0.29304665858647906001), TestValue(0,1123,15324,-1083.7571513972578336,-0.93172007052957986259,-0.0024429334503092957394), TestValue(0,10586,0.0004,-0.0068365334804239916148,-3.7785753342688330146e-8,-16.09133373884573238), TestValue(0,10586,0.065,-0.78004301710859758932,-6.1401474485561915594e-6,-11.0006679418181807), TestValue(0,10586,4.42,-34.39451907585020003,-0.00041735832950912239552,-6.7819827601055724777), TestValue(0,10586,800,-2124.4224654744799162,-0.070261724925346917267,-1.7257898067684468125), TestValue(0,10586,15324,-8048.2991567805804192,-0.59143187958317252026,-0.11664064731878857477), TestValue(6,0.0000256,0.0004,-26.480362597222490265,220276.31578947368421,-11595.463497838709543), TestValue(6,0.0000256,0.065,-51.419388136448102673,234281.72904210034202,-74.693807545973030394), TestValue(6,0.0000256,4.42,-67.52038137511190777,234372.64254759067459,-0.43125592475849002503), TestValue(6,0.0000256,800,-69.998079065742703551,234373.99250003224,-0.000023330384471037817491), TestValue(6,0.0000256,15324,-70.015807321298395432,234373.99960845899308,-6.3861427657507748849e-8), TestValue(6,0.314,0.0004,-9.6251974944123758225,0.023038524497171844865,2477.5305495558165941), TestValue(6,0.314,0.065,-5.6231627412658002701,3.1056417323496294304,0.81175666468752807101), TestValue(6,0.314,4.42,-11.748118636048988335,16.907181817937188357,-0.34352697543671422216), TestValue(6,0.314,800,-13.827010724885832016,18.101175543376294868,-0.000020465017270475111936), TestValue(6,0.314,15324,-13.842565956985816742,18.107909210435378814,-5.6049178830042368725e-8), TestValue(6,1.5,0.0004,-9.6197839616192332262,0.00079978672354038922954,2491.0537701151673519), TestValue(6,1.5,0.065,-4.8410045398874440986,0.12460063897763578275,11.520890928200777244), TestValue(6,1.5,4.42,-4.6947113008756524511,2.2398648648648648649,-0.12612961153608977325), TestValue(6,1.5,800,-5.6375883578559464151,2.9943855271366188397,-0.000011047869532026303582), TestValue(6,1.5,15324,-5.6459956995659817151,2.9997063717333855339,-3.0329592747982916341e-8), TestValue(6,3,0.0004,-9.6192613271356102502,0.00013331555792560991868,2492.3600897701139881), TestValue(6,3,0.065,-4.7587824423548651205,0.021207177814029363785,12.745335721641112642), TestValue(6,3,4.42,-2.8891081958287456629,0.59568733153638814016,0.0038502468520587354154), TestValue(6,3,800,-2.9857172436024219525,0.99626400996264009963,-2.3069406647953774853e-6), TestValue(6,3,15324,-2.9874796347761073428,0.99980426697983949892,-6.3824584044662864326e-9), TestValue(6,180,0.0004,-9.620112399166720505,-2.1481433744962048232e-6,2490.2324075130827354), TestValue(6,180,0.065,-4.897099604874425479,-0.00034894806505058358556,10.617175935000477685), TestValue(6,180,4.42,-11.802883319144519128,-0.023168130716119003723,-1.861375256665487843), TestValue(6,180,800,-138.97312319086169782,-0.78911564625850340136,-0.01791315421299756019), TestValue(6,180,15324,-154.44163935948173426,-0.95544375644994840041,-0.000063439277219443465219), TestValue(6,1123,0.0004,-9.6208335230756285524,-3.5428559715533443274e-7,2488.4295995707558483), TestValue(6,1123,0.065,-5.0142630342277769584,-0.000057568097963562133439,8.8149588796763128876), TestValue(6,1123,4.42,-19.683182166303213058,-0.0038995092191751589493,-3.6245874838477290528), TestValue(6,1123,800,-671.30418475064697583,-0.4137939337698174,-0.28869011401594177783), TestValue(6,1123,15324,-1048.6172073187539315,-0.92674204700048148398,-0.0024162628059421836267), TestValue(6,10586,0.0004,-9.6217290240095637933,-3.7764336894543976284e-8,2486.1908475533798261), TestValue(6,10586,0.065,-5.1597786035400147054,-6.1366672969700081899e-6,6.576309397642172055), TestValue(6,10586,4.42,-29.562997357281896989,-0.00041712177651676884042,-5.856347033468783979), TestValue(6,10586,800,-2091.3124520859014907,-0.07022190154073024605,-1.7188401003298574325), TestValue(6,10586,15324,-8002.4249559448888988,-0.59109666408369216554,-0.11648073932479483488), TestValue(14,0.0000256,0.0004,-49.814562438358640072,513979.32330827067669,-30391.559221530806766), TestValue(14,0.0000256,0.065,-114.92817109028837255,546658.70057331266455,-196.8323920932659291), TestValue(14,0.0000256,4.42,-161.64931287705226916,546870.83260332247849,-1.6501286909020252132), TestValue(14,0.0000256,800,-173.09898662779720676,546873.98250003256,-0.00014060727924520899117), TestValue(14,0.0000256,15324,-173.2061650426294071,546873.99908640208975,-3.8729368917100577369e-7), TestValue(14,0.314,0.0004,-10.482321240387567839,0.055452910001458647348,2452.9820144458617505), TestValue(14,0.314,0.065,-7.9175397204269351928,7.475169319193990219,-19.406538514452968028), TestValue(14,0.314,4.42,-31.109603016060397045,40.694985993719373875,-1.442358303971396938), TestValue(14,0.314,800,-41.614610107637548392,43.568886473205763553,-0.00013381877200270250453), TestValue(14,0.314,15324,-41.716640281901644559,43.585094170597712707,-3.6878520278347562598e-7), TestValue(14,1.5,0.0004,-10.468856159359487018,0.0022216297876121923043,2486.6186161358083867), TestValue(14,1.5,0.065,-5.9696014927268124315,0.34611288604898828541,7.2989540823233662764), TestValue(14,1.5,4.42,-13.334103973863653606,6.2218468468468468468,-0.88640946083488260684), TestValue(14,1.5,800,-20.926415102268522946,8.3177375753794967769,-0.00010961017476158336951), TestValue(14,1.5,15324,-21.010069937869350607,8.3325176992594042609,-3.0266583844869157132e-7), TestValue(14,3,0.0004,-10.467267071498293274,0.00048882371239390303515,2490.5905361225120861), TestValue(14,3,0.065,-5.7194959138831364402,0.077759651984774333877,11.025105769529760809), TestValue(14,3,4.42,-7.7900642906041824751,2.1841868823000898473,-0.48324536699834770639), TestValue(14,3,800,-12.744324478712668241,3.6529680365296803653,-0.000082224255065357307428), TestValue(14,3,15324,-12.807159398994470731,3.6659489789260781627,-2.2763181750167069646e-7), TestValue(14,180,0.0004,-10.467069325725552339,-2.049378161875689659e-6,2491.0847206783138), TestValue(14,180,0.065,-5.6892191980516647312,-0.00033290447585285560461,11.462631774529800832), TestValue(14,180,4.42,-9.6533765795967992717,-0.02210292930388364723,-1.3136829976451384132), TestValue(14,180,800,-117.57055678993798607,-0.7528344671201814059,-0.016193696733894170103), TestValue(14,180,15324,-131.59841923497641062,-0.9115153078775369797,-0.000057701678183561534688), TestValue(14,1123,0.0004,-10.467775521386168611,-3.5174818911841171522e-7,2489.3192333086024842), TestValue(14,1123,0.065,-5.8039572920094235935,-0.000057155792875192843316,9.6977197567649025541), TestValue(14,1123,4.42,-17.371029398463366472,-0.0038715807735588641672,-3.0406118289506228066), TestValue(14,1123,800,-640.64791491033069867,-0.41083032457540509991,-0.28296755763737220502), TestValue(14,1123,15324,-1011.5999306403485179,-0.92010468229501697917,-0.0023809402304773394913), TestValue(14,10586,0.0004,-10.468668475096403359,-3.7735781630351504468e-8,2487.0868493492232687), TestValue(14,10586,0.065,-5.9490589506381604899,-6.1320270948550970306e-6,7.4654379275715350026), TestValue(14,10586,4.42,-27.222758867549796685,-0.00041680637252696410027,-5.2660309311076446873), TestValue(14,10586,800,-2056.9359371755272758,-0.070168803694574684427,-1.7096599947938850626), TestValue(14,10586,15324,-7951.0953369235666607,-0.5906497100843850259,-0.11626776694982782037), TestValue(1525,0.0000256,0.0004,-4301.7847274670157821,5.5987134868421052632e7,-3.5806687876344080158e6), TestValue(1525,0.0000256,0.065,-11965.467128123482119,5.9546859198531040083e7,-23429.112689114767404), TestValue(1525,0.0000256,4.42,-18367.342891800584413,5.9569966479379666941e7,-339.05708253439450269), TestValue(1525,0.0000256,800,-24826.228135638531385,5.9570309593750093e7,-0.83897628761764105052), TestValue(1525,0.0000256,15324,-25707.717028801610058,5.9570311400482904473e7,-0.0046430629133236893109), TestValue(1525,0.314,0.0004,-17.094738795518807033,6.1777199721236284663,-2348.2711549792054389), TestValue(1525,0.314,0.065,-296.5855682860990671,832.76969228442263415,-4001.4921811261694014), TestValue(1525,0.314,4.42,-4115.1016067852616032,4533.6164996945796636,-316.17648561909186371), TestValue(1525,0.314,800,-10469.942676752557863,4853.7827883447466615,-0.83822851603497641238), TestValue(1525,0.314,15324,-11350.864477542964446,4855.5884035212585267,-0.0046410241529681445478), TestValue(1525,1.5,0.0004,-15.560537541616769004,0.27077223851417399804,1484.2803077520377337), TestValue(1525,1.5,0.065,-74.450927586875279684,42.184238551650692226,-953.4745083343278627), TestValue(1525,1.5,4.42,-2072.1910365790187577,758.31869369369369369,-251.67662613527664787), TestValue(1525,1.5,800,-8088.5487996808837997,1013.7658556872530672,-0.8354105724129184353), TestValue(1525,1.5,15324,-8967.3316408400039725,1015.5672571857361913,-0.0046333275254863264045), TestValue(1525,3,0.0004,-15.357522072066896545,0.067635426387592765409,1991.7174903993567368), TestValue(1525,3,0.065,-42.491829475398155315,10.75910821098423056,-477.23846708705704922), TestValue(1525,3,4.42,-1360.5497881858611964,302.21203953279424978,-199.67578957112613322), TestValue(1525,3,800,-7035.8464992378503203,505.43794105437941054,-0.83186161385039575293), TestValue(1525,3,15324,-7911.9312240083236782,507.23403144777190579,-0.0046236034557581425194), TestValue(1525,180,0.0004,-15.159228863591761992,0.000016604901371824111996,2487.4167692289850077), TestValue(1525,180,0.065,-10.618383986015501881,0.0026973284338680167964,7.7929628140754776749), TestValue(1525,180,4.42,-30.75693264206759737,0.17908698743206931039,-5.0606677133089086733), TestValue(1525,180,800,-1255.1060610431618143,6.0997732426303854875,-0.50811617220616562857), TestValue(1525,180,15324,-1861.5172673616192307,7.3854704162366701066,-0.0035556000115225182714), TestValue(1525,1123,0.0004,-15.157115486356269288,1.2750475385536655502e-7,2492.7002050120397202), TestValue(1525,1123,0.065,-10.275036857130705184,0.000020718330690556828686,13.074039765317043251), TestValue(1525,1123,4.42,-7.754816867258728553,0.0014034043922188128,0.065429851608050629578), TestValue(1525,1123,800,-30.390182048283734404,0.1489213620192180795,-0.018804728472968400557), TestValue(1525,1123,15324,-64.393847149111855643,0.33352757644959136666,-0.00029097614079605979039), TestValue(1525,10586,0.0004,-15.157527333190073382,-3.2342406105998390275e-8,2491.6705880068073821), TestValue(1525,10586,0.065,-10.341961135413218919,-5.2556089204012518156e-6,12.04444836642472918), TestValue(1525,10586,4.42,-12.301855613945737855,-0.00035723444395259380558,-0.96243723577972978183), TestValue(1525,10586,800,-744.01691670628731344,-0.060139948001942982935,-0.79245256852502796007), TestValue(1525,10586,15324,-4300.6455934139147727,-0.50623127346524902759,-0.080624196979174112178), TestValue(10233,0.0000256,0.0004,-28781.070852895156444,3.7568285855263157895e8,-2.4041193199521680582e7), TestValue(10233,0.0000256,0.065,-80237.47905503410844,3.9956919271025565316e8,-157343.69709836101487), TestValue(10233,0.0000256,4.42,-123371.16336416773985,3.9972424635504373549e8,-2307.2799792939510176), TestValue(10233,0.0000256,800,-173733.65594636811604,3.9972654870875044132e8,-10.166635446653598855), TestValue(10233,0.0000256,15324,-189611.39394380092393,3.997265608322239652e8,-0.1562719469099034673), TestValue(10233,0.314,0.0004,-30.083534640956912654,41.460778593539812969,-30043.568270589792096), TestValue(10233,0.314,0.065,-1936.7165917584869886,5589.0004705645093525,-26975.841613138526635), TestValue(10233,0.314,4.42,-27734.555886932752049,30426.6413450334886,-2153.7342775414124626), TestValue(10233,0.314,800,-77398.834534311059049,32575.386135464123325,-10.161617337135278412), TestValue(10233,0.314,15324,-93272.766915544350705,32587.504232657958969,-0.15625826529496379204), TestValue(10233,1.5,0.0004,-19.785223133324616937,1.8184484137563316449,-4317.6014472049352643), TestValue(10233,1.5,0.065,-445.63039240802026812,283.30031948881789137,-6515.7878945898169301), TestValue(10233,1.5,4.42,-14020.648493631530079,5092.7060810810810811,-1720.7211329093311099), TestValue(10233,1.5,800,-61412.526640407231264,6808.2345601996257018,-10.142698900729563784), TestValue(10233,1.5,15324,-77272.098984563728691,6820.3323871978075756,-0.15620659350885388317), TestValue(10233,3,0.0004,-18.421373162288964031,0.45460605252632982269,-908.65830344005301507), TestValue(10233,3,0.065,-230.93012488941404482,72.316476345840130506,-3316.4438994781907491), TestValue(10233,3,4.42,-9239.7190298539962311,2031.293800539083558,-1371.3592560596120078), TestValue(10233,3,800,-54340.180404088611315,3397.2602739726027397,-10.118854869649679896), TestValue(10233,3,15324,-70181.625182690519906,3409.3325504012526913,-0.15614126136305778491), TestValue(10233,180,0.0004,-17.081441774321808558,0.00012411083530925486832,2440.9430011582593451), TestValue(10233,180,0.065,-15.542242814932986052,0.020160775275594924055,-38.663485376183506373), TestValue(10233,180,4.42,-235.49737914944659778,1.3385587246502548531,-50.377534581977016966), TestValue(10233,180,800,-14640.502463070959489,45.591836734693877551,-7.8364899652763980015), TestValue(10233,180,15324,-28577.644697168082129,55.201586687306501548,-0.14858705144088737228), TestValue(10233,1123,0.0004,-17.063078998820718915,2.8894734020457445678e-6,2486.8498802333634116), TestValue(10233,1123,0.065,-12.558918107945625621,0.00046951241938052912769,7.2241249583196655846), TestValue(10233,1123,4.42,-35.455061578657784001,0.031803517445555683105,-5.7569606052102630188), TestValue(10233,1123,800,-3343.1303902972739556,3.3748099701370067269,-2.9898053694742608731), TestValue(10233,1123,15324,-11352.060718035326883,7.5582990583477048515,-0.11311918072723555384), TestValue(10233,10586,0.0004,-17.060718192656536162,-1.2600010324928188685e-9,2492.7518943576552348), TestValue(10233,10586,0.065,-12.175300607237463447,-2.0474891832045490463e-7,13.125723676609068062), TestValue(10233,10586,4.42,-9.4307920456266217014,-0.000013917201050134158853,0.11674937200192659959), TestValue(10233,10586,800,-7.2703661972122617808,-0.0023429424616141566026,0.00008904830662418682316), TestValue(10233,10586,15324,-9.3278240351663417157,-0.019721845219427536336,-0.00008059480750115928323),}; +std::vector testValues = { + TestValue(0, 0.0000256, 0.0004, -0.000024814156367781056525, + -0.93984962406015037594, -0.001885014979603017252), + TestValue(0, 0.0000256, 0.065, -0.000025594960092486140389, + -0.9996063088998794321, -7.7516686911183493794e-8), + TestValue(0, 0.0000256, 4.42, -0.000025599925864539648095, + -0.9999942081783417725, -1.6772663823239562834e-11), + TestValue(0, 0.0000256, 800, -0.000025599999590400008738, + -0.999999968000001024, -5.119999781546674531e-16), + TestValue(0, 0.0000256, 15324, -0.000025599999978616549228, + -0.99999999832941790934, -1.3954222623666383236e-18), + TestValue(0, 0.314, 0.0004, -0.002666782716971682618, + -0.0012722646310432569975, -5.668229057060249802), + TestValue(0, 0.314, 0.065, -0.11460468078714130042, -0.17150395778364116095, + -0.93465289297043039811), + TestValue(0, 0.314, 4.42, -0.30334820230965961631, -0.93367131389945078158, + -0.0023021289016362151355), + TestValue(0, 0.314, 800, -0.313938393619808991, -0.99960765399580664589, + -7.6987831407130236997e-8), + TestValue(0, 0.314, 15324, -0.3139967829987878124, -0.99997950968637160528, + -2.0992934397861783072e-10), + TestValue(0, 1.5, 0.0004, -0.0032919111000327549336, + -0.00026659557451346307651, -7.2300443456564007971), + TestValue(0, 1.5, 0.065, -0.20678149915011007124, -0.041533546325878594249, + -2.2227873794044950749), + TestValue(0, 1.5, 4.42, -1.2915096474038793989, -0.74662162162162162162, + -0.038818374427929177938), + TestValue(0, 1.5, 800, -1.4985955053442782733, -0.99812850904553961323, + -1.7534272199610668797e-6), + TestValue(0, 1.5, 15324, -1.4999265905382969801, -0.9999021239111285113, + -4.7901769514626171505e-9), + TestValue(0, 3, 0.0004, -0.003569116649587854519, + -0.00013331555792560991868, -7.9229249395275619074), + TestValue(0, 3, 0.065, -0.25047201260085385312, -0.021207177814029363785, + -2.8746227562887040272), + TestValue(0, 3, 4.42, -2.2897339760163958674, -0.59568733153638814016, + -0.11372669262607046311), + TestValue(0, 3, 800, -2.9943890230675014931, -0.99626400996264009963, + -6.9962414744764927742e-6), + TestValue(0, 3, 15324, -2.9997063813121767354, -0.99980426697983949892, + -1.9158207560574170962e-8), + TestValue(0, 180, 0.0004, -0.0052068020335865022334, + -2.2222172839615911965e-6, -12.017007306183539545), + TestValue(0, 180, 0.065, -0.51523458388368826209, + -0.00036098075694887957127, -6.9270468866598452194), + TestValue(0, 180, 4.42, -16.491356225074536835, -0.023967031775295521093, + -2.7550431007966839452), + TestValue(0, 180, 800, -162.35267519735224589, -0.81632653061224489796, + -0.019267374608935205317), + TestValue(0, 180, 15324, -178.95104102256056893, -0.98839009287925696594, + -0.000067921189264833924309), + TestValue(0, 1123, 0.0004, -0.0059391221287133807664, + -3.5618865318302647087e-7, -13.847805677972105099), + TestValue(0, 1123, 0.065, -0.63421701478373420435, + -0.000057877326779839101032, -8.7572427201534599061), + TestValue(0, 1123, 4.42, -24.493639593452325812, -0.0039204555533873800358, + -4.5454678748864927673), + TestValue(0, 1123, 800, -701.62401433668194795, -0.41601664066562662507, + -0.29304665858647906001), + TestValue(0, 1123, 15324, -1083.7571513972578336, -0.93172007052957986259, + -0.0024429334503092957394), + TestValue(0, 10586, 0.0004, -0.0068365334804239916148, + -3.7785753342688330146e-8, -16.09133373884573238), + TestValue(0, 10586, 0.065, -0.78004301710859758932, + -6.1401474485561915594e-6, -11.0006679418181807), + TestValue(0, 10586, 4.42, -34.39451907585020003, -0.00041735832950912239552, + -6.7819827601055724777), + TestValue(0, 10586, 800, -2124.4224654744799162, -0.070261724925346917267, + -1.7257898067684468125), + TestValue(0, 10586, 15324, -8048.2991567805804192, -0.59143187958317252026, + -0.11664064731878857477), + TestValue(6, 0.0000256, 0.0004, -26.480362597222490265, + 220276.31578947368421, -11595.463497838709543), + TestValue(6, 0.0000256, 0.065, -51.419388136448102673, + 234281.72904210034202, -74.693807545973030394), + TestValue(6, 0.0000256, 4.42, -67.52038137511190777, 234372.64254759067459, + -0.43125592475849002503), + TestValue(6, 0.0000256, 800, -69.998079065742703551, 234373.99250003224, + -0.000023330384471037817491), + TestValue(6, 0.0000256, 15324, -70.015807321298395432, + 234373.99960845899308, -6.3861427657507748849e-8), + TestValue(6, 0.314, 0.0004, -9.6251974944123758225, 0.023038524497171844865, + 2477.5305495558165941), + TestValue(6, 0.314, 0.065, -5.6231627412658002701, 3.1056417323496294304, + 0.81175666468752807101), + TestValue(6, 0.314, 4.42, -11.748118636048988335, 16.907181817937188357, + -0.34352697543671422216), + TestValue(6, 0.314, 800, -13.827010724885832016, 18.101175543376294868, + -0.000020465017270475111936), + TestValue(6, 0.314, 15324, -13.842565956985816742, 18.107909210435378814, + -5.6049178830042368725e-8), + TestValue(6, 1.5, 0.0004, -9.6197839616192332262, 0.00079978672354038922954, + 2491.0537701151673519), + TestValue(6, 1.5, 0.065, -4.8410045398874440986, 0.12460063897763578275, + 11.520890928200777244), + TestValue(6, 1.5, 4.42, -4.6947113008756524511, 2.2398648648648648649, + -0.12612961153608977325), + TestValue(6, 1.5, 800, -5.6375883578559464151, 2.9943855271366188397, + -0.000011047869532026303582), + TestValue(6, 1.5, 15324, -5.6459956995659817151, 2.9997063717333855339, + -3.0329592747982916341e-8), + TestValue(6, 3, 0.0004, -9.6192613271356102502, 0.00013331555792560991868, + 2492.3600897701139881), + TestValue(6, 3, 0.065, -4.7587824423548651205, 0.021207177814029363785, + 12.745335721641112642), + TestValue(6, 3, 4.42, -2.8891081958287456629, 0.59568733153638814016, + 0.0038502468520587354154), + TestValue(6, 3, 800, -2.9857172436024219525, 0.99626400996264009963, + -2.3069406647953774853e-6), + TestValue(6, 3, 15324, -2.9874796347761073428, 0.99980426697983949892, + -6.3824584044662864326e-9), + TestValue(6, 180, 0.0004, -9.620112399166720505, -2.1481433744962048232e-6, + 2490.2324075130827354), + TestValue(6, 180, 0.065, -4.897099604874425479, -0.00034894806505058358556, + 10.617175935000477685), + TestValue(6, 180, 4.42, -11.802883319144519128, -0.023168130716119003723, + -1.861375256665487843), + TestValue(6, 180, 800, -138.97312319086169782, -0.78911564625850340136, + -0.01791315421299756019), + TestValue(6, 180, 15324, -154.44163935948173426, -0.95544375644994840041, + -0.000063439277219443465219), + TestValue(6, 1123, 0.0004, -9.6208335230756285524, + -3.5428559715533443274e-7, 2488.4295995707558483), + TestValue(6, 1123, 0.065, -5.0142630342277769584, + -0.000057568097963562133439, 8.8149588796763128876), + TestValue(6, 1123, 4.42, -19.683182166303213058, -0.0038995092191751589493, + -3.6245874838477290528), + TestValue(6, 1123, 800, -671.30418475064697583, -0.4137939337698174, + -0.28869011401594177783), + TestValue(6, 1123, 15324, -1048.6172073187539315, -0.92674204700048148398, + -0.0024162628059421836267), + TestValue(6, 10586, 0.0004, -9.6217290240095637933, + -3.7764336894543976284e-8, 2486.1908475533798261), + TestValue(6, 10586, 0.065, -5.1597786035400147054, + -6.1366672969700081899e-6, 6.576309397642172055), + TestValue(6, 10586, 4.42, -29.562997357281896989, + -0.00041712177651676884042, -5.856347033468783979), + TestValue(6, 10586, 800, -2091.3124520859014907, -0.07022190154073024605, + -1.7188401003298574325), + TestValue(6, 10586, 15324, -8002.4249559448888988, -0.59109666408369216554, + -0.11648073932479483488), + TestValue(14, 0.0000256, 0.0004, -49.814562438358640072, + 513979.32330827067669, -30391.559221530806766), + TestValue(14, 0.0000256, 0.065, -114.92817109028837255, + 546658.70057331266455, -196.8323920932659291), + TestValue(14, 0.0000256, 4.42, -161.64931287705226916, + 546870.83260332247849, -1.6501286909020252132), + TestValue(14, 0.0000256, 800, -173.09898662779720676, 546873.98250003256, + -0.00014060727924520899117), + TestValue(14, 0.0000256, 15324, -173.2061650426294071, + 546873.99908640208975, -3.8729368917100577369e-7), + TestValue(14, 0.314, 0.0004, -10.482321240387567839, + 0.055452910001458647348, 2452.9820144458617505), + TestValue(14, 0.314, 0.065, -7.9175397204269351928, 7.475169319193990219, + -19.406538514452968028), + TestValue(14, 0.314, 4.42, -31.109603016060397045, 40.694985993719373875, + -1.442358303971396938), + TestValue(14, 0.314, 800, -41.614610107637548392, 43.568886473205763553, + -0.00013381877200270250453), + TestValue(14, 0.314, 15324, -41.716640281901644559, 43.585094170597712707, + -3.6878520278347562598e-7), + TestValue(14, 1.5, 0.0004, -10.468856159359487018, 0.0022216297876121923043, + 2486.6186161358083867), + TestValue(14, 1.5, 0.065, -5.9696014927268124315, 0.34611288604898828541, + 7.2989540823233662764), + TestValue(14, 1.5, 4.42, -13.334103973863653606, 6.2218468468468468468, + -0.88640946083488260684), + TestValue(14, 1.5, 800, -20.926415102268522946, 8.3177375753794967769, + -0.00010961017476158336951), + TestValue(14, 1.5, 15324, -21.010069937869350607, 8.3325176992594042609, + -3.0266583844869157132e-7), + TestValue(14, 3, 0.0004, -10.467267071498293274, 0.00048882371239390303515, + 2490.5905361225120861), + TestValue(14, 3, 0.065, -5.7194959138831364402, 0.077759651984774333877, + 11.025105769529760809), + TestValue(14, 3, 4.42, -7.7900642906041824751, 2.1841868823000898473, + -0.48324536699834770639), + TestValue(14, 3, 800, -12.744324478712668241, 3.6529680365296803653, + -0.000082224255065357307428), + TestValue(14, 3, 15324, -12.807159398994470731, 3.6659489789260781627, + -2.2763181750167069646e-7), + TestValue(14, 180, 0.0004, -10.467069325725552339, -2.049378161875689659e-6, + 2491.0847206783138), + TestValue(14, 180, 0.065, -5.6892191980516647312, + -0.00033290447585285560461, 11.462631774529800832), + TestValue(14, 180, 4.42, -9.6533765795967992717, -0.02210292930388364723, + -1.3136829976451384132), + TestValue(14, 180, 800, -117.57055678993798607, -0.7528344671201814059, + -0.016193696733894170103), + TestValue(14, 180, 15324, -131.59841923497641062, -0.9115153078775369797, + -0.000057701678183561534688), + TestValue(14, 1123, 0.0004, -10.467775521386168611, + -3.5174818911841171522e-7, 2489.3192333086024842), + TestValue(14, 1123, 0.065, -5.8039572920094235935, + -0.000057155792875192843316, 9.6977197567649025541), + TestValue(14, 1123, 4.42, -17.371029398463366472, -0.0038715807735588641672, + -3.0406118289506228066), + TestValue(14, 1123, 800, -640.64791491033069867, -0.41083032457540509991, + -0.28296755763737220502), + TestValue(14, 1123, 15324, -1011.5999306403485179, -0.92010468229501697917, + -0.0023809402304773394913), + TestValue(14, 10586, 0.0004, -10.468668475096403359, + -3.7735781630351504468e-8, 2487.0868493492232687), + TestValue(14, 10586, 0.065, -5.9490589506381604899, + -6.1320270948550970306e-6, 7.4654379275715350026), + TestValue(14, 10586, 4.42, -27.222758867549796685, + -0.00041680637252696410027, -5.2660309311076446873), + TestValue(14, 10586, 800, -2056.9359371755272758, -0.070168803694574684427, + -1.7096599947938850626), + TestValue(14, 10586, 15324, -7951.0953369235666607, -0.5906497100843850259, + -0.11626776694982782037), + TestValue(1525, 0.0000256, 0.0004, -4301.7847274670157821, + 5.5987134868421052632e7, -3.5806687876344080158e6), + TestValue(1525, 0.0000256, 0.065, -11965.467128123482119, + 5.9546859198531040083e7, -23429.112689114767404), + TestValue(1525, 0.0000256, 4.42, -18367.342891800584413, + 5.9569966479379666941e7, -339.05708253439450269), + TestValue(1525, 0.0000256, 800, -24826.228135638531385, + 5.9570309593750093e7, -0.83897628761764105052), + TestValue(1525, 0.0000256, 15324, -25707.717028801610058, + 5.9570311400482904473e7, -0.0046430629133236893109), + TestValue(1525, 0.314, 0.0004, -17.094738795518807033, + 6.1777199721236284663, -2348.2711549792054389), + TestValue(1525, 0.314, 0.065, -296.5855682860990671, 832.76969228442263415, + -4001.4921811261694014), + TestValue(1525, 0.314, 4.42, -4115.1016067852616032, 4533.6164996945796636, + -316.17648561909186371), + TestValue(1525, 0.314, 800, -10469.942676752557863, 4853.7827883447466615, + -0.83822851603497641238), + TestValue(1525, 0.314, 15324, -11350.864477542964446, 4855.5884035212585267, + -0.0046410241529681445478), + TestValue(1525, 1.5, 0.0004, -15.560537541616769004, 0.27077223851417399804, + 1484.2803077520377337), + TestValue(1525, 1.5, 0.065, -74.450927586875279684, 42.184238551650692226, + -953.4745083343278627), + TestValue(1525, 1.5, 4.42, -2072.1910365790187577, 758.31869369369369369, + -251.67662613527664787), + TestValue(1525, 1.5, 800, -8088.5487996808837997, 1013.7658556872530672, + -0.8354105724129184353), + TestValue(1525, 1.5, 15324, -8967.3316408400039725, 1015.5672571857361913, + -0.0046333275254863264045), + TestValue(1525, 3, 0.0004, -15.357522072066896545, 0.067635426387592765409, + 1991.7174903993567368), + TestValue(1525, 3, 0.065, -42.491829475398155315, 10.75910821098423056, + -477.23846708705704922), + TestValue(1525, 3, 4.42, -1360.5497881858611964, 302.21203953279424978, + -199.67578957112613322), + TestValue(1525, 3, 800, -7035.8464992378503203, 505.43794105437941054, + -0.83186161385039575293), + TestValue(1525, 3, 15324, -7911.9312240083236782, 507.23403144777190579, + -0.0046236034557581425194), + TestValue(1525, 180, 0.0004, -15.159228863591761992, + 0.000016604901371824111996, 2487.4167692289850077), + TestValue(1525, 180, 0.065, -10.618383986015501881, + 0.0026973284338680167964, 7.7929628140754776749), + TestValue(1525, 180, 4.42, -30.75693264206759737, 0.17908698743206931039, + -5.0606677133089086733), + TestValue(1525, 180, 800, -1255.1060610431618143, 6.0997732426303854875, + -0.50811617220616562857), + TestValue(1525, 180, 15324, -1861.5172673616192307, 7.3854704162366701066, + -0.0035556000115225182714), + TestValue(1525, 1123, 0.0004, -15.157115486356269288, + 1.2750475385536655502e-7, 2492.7002050120397202), + TestValue(1525, 1123, 0.065, -10.275036857130705184, + 0.000020718330690556828686, 13.074039765317043251), + TestValue(1525, 1123, 4.42, -7.754816867258728553, 0.0014034043922188128, + 0.065429851608050629578), + TestValue(1525, 1123, 800, -30.390182048283734404, 0.1489213620192180795, + -0.018804728472968400557), + TestValue(1525, 1123, 15324, -64.393847149111855643, 0.33352757644959136666, + -0.00029097614079605979039), + TestValue(1525, 10586, 0.0004, -15.157527333190073382, + -3.2342406105998390275e-8, 2491.6705880068073821), + TestValue(1525, 10586, 0.065, -10.341961135413218919, + -5.2556089204012518156e-6, 12.04444836642472918), + TestValue(1525, 10586, 4.42, -12.301855613945737855, + -0.00035723444395259380558, -0.96243723577972978183), + TestValue(1525, 10586, 800, -744.01691670628731344, + -0.060139948001942982935, -0.79245256852502796007), + TestValue(1525, 10586, 15324, -4300.6455934139147727, + -0.50623127346524902759, -0.080624196979174112178), + TestValue(10233, 0.0000256, 0.0004, -28781.070852895156444, + 3.7568285855263157895e8, -2.4041193199521680582e7), + TestValue(10233, 0.0000256, 0.065, -80237.47905503410844, + 3.9956919271025565316e8, -157343.69709836101487), + TestValue(10233, 0.0000256, 4.42, -123371.16336416773985, + 3.9972424635504373549e8, -2307.2799792939510176), + TestValue(10233, 0.0000256, 800, -173733.65594636811604, + 3.9972654870875044132e8, -10.166635446653598855), + TestValue(10233, 0.0000256, 15324, -189611.39394380092393, + 3.997265608322239652e8, -0.1562719469099034673), + TestValue(10233, 0.314, 0.0004, -30.083534640956912654, + 41.460778593539812969, -30043.568270589792096), + TestValue(10233, 0.314, 0.065, -1936.7165917584869886, + 5589.0004705645093525, -26975.841613138526635), + TestValue(10233, 0.314, 4.42, -27734.555886932752049, 30426.6413450334886, + -2153.7342775414124626), + TestValue(10233, 0.314, 800, -77398.834534311059049, 32575.386135464123325, + -10.161617337135278412), + TestValue(10233, 0.314, 15324, -93272.766915544350705, + 32587.504232657958969, -0.15625826529496379204), + TestValue(10233, 1.5, 0.0004, -19.785223133324616937, 1.8184484137563316449, + -4317.6014472049352643), + TestValue(10233, 1.5, 0.065, -445.63039240802026812, 283.30031948881789137, + -6515.7878945898169301), + TestValue(10233, 1.5, 4.42, -14020.648493631530079, 5092.7060810810810811, + -1720.7211329093311099), + TestValue(10233, 1.5, 800, -61412.526640407231264, 6808.2345601996257018, + -10.142698900729563784), + TestValue(10233, 1.5, 15324, -77272.098984563728691, 6820.3323871978075756, + -0.15620659350885388317), + TestValue(10233, 3, 0.0004, -18.421373162288964031, 0.45460605252632982269, + -908.65830344005301507), + TestValue(10233, 3, 0.065, -230.93012488941404482, 72.316476345840130506, + -3316.4438994781907491), + TestValue(10233, 3, 4.42, -9239.7190298539962311, 2031.293800539083558, + -1371.3592560596120078), + TestValue(10233, 3, 800, -54340.180404088611315, 3397.2602739726027397, + -10.118854869649679896), + TestValue(10233, 3, 15324, -70181.625182690519906, 3409.3325504012526913, + -0.15614126136305778491), + TestValue(10233, 180, 0.0004, -17.081441774321808558, + 0.00012411083530925486832, 2440.9430011582593451), + TestValue(10233, 180, 0.065, -15.542242814932986052, + 0.020160775275594924055, -38.663485376183506373), + TestValue(10233, 180, 4.42, -235.49737914944659778, 1.3385587246502548531, + -50.377534581977016966), + TestValue(10233, 180, 800, -14640.502463070959489, 45.591836734693877551, + -7.8364899652763980015), + TestValue(10233, 180, 15324, -28577.644697168082129, 55.201586687306501548, + -0.14858705144088737228), + TestValue(10233, 1123, 0.0004, -17.063078998820718915, + 2.8894734020457445678e-6, 2486.8498802333634116), + TestValue(10233, 1123, 0.065, -12.558918107945625621, + 0.00046951241938052912769, 7.2241249583196655846), + TestValue(10233, 1123, 4.42, -35.455061578657784001, + 0.031803517445555683105, -5.7569606052102630188), + TestValue(10233, 1123, 800, -3343.1303902972739556, 3.3748099701370067269, + -2.9898053694742608731), + TestValue(10233, 1123, 15324, -11352.060718035326883, 7.5582990583477048515, + -0.11311918072723555384), + TestValue(10233, 10586, 0.0004, -17.060718192656536162, + -1.2600010324928188685e-9, 2492.7518943576552348), + TestValue(10233, 10586, 0.065, -12.175300607237463447, + -2.0474891832045490463e-7, 13.125723676609068062), + TestValue(10233, 10586, 4.42, -9.4307920456266217014, + -0.000013917201050134158853, 0.11674937200192659959), + TestValue(10233, 10586, 800, -7.2703661972122617808, + -0.0023429424616141566026, 0.00008904830662418682316), + TestValue(10233, 10586, 15324, -9.3278240351663417157, + -0.019721845219427536336, -0.00008059480750115928323), +}; } // namespace neg_binomial_2_test_internal TEST(ProbDistributionsNegativeBinomial2, derivativesPrecomputed) { using neg_binomial_2_test_internal::TestValue; using neg_binomial_2_test_internal::testValues; - using stan::test::internal::expect_near_rel_finite; using stan::math::is_nan; using stan::math::neg_binomial_2_log; using stan::math::value_of; using stan::math::var; + using stan::test::internal::expect_near_rel_finite; for (TestValue t : testValues) { int n = t.n; @@ -96,11 +447,11 @@ TEST(ProbDistributionsNegativeBinomial2, derivativesPrecomputed) { } TEST(ProbDistributionsNegBinomial2, derivativesComplexStep) { - using stan::test::internal::expect_near_rel_finite; using boost::math::differentiation::complex_step_derivative; using stan::math::is_nan; using stan::math::neg_binomial_2_log; using stan::math::var; + using stan::test::internal::expect_near_rel_finite; std::vector n_to_test = {0, 7, 100, 835, 14238, 385000, 1000000}; std::vector mu_to_test = {0.8, 8, 24, 271, 2586, 33294}; @@ -183,18 +534,16 @@ TEST(ProbDistributionsNegBinomial2, derivativesComplexStep) { } } -TEST(ProbDistributionsNegBinomial2, derivativesZeroOne) { - using stan::test::expect_near_rel; +TEST(ProbDistributionsNegBinomial2, derivativesZeroOne) { using stan::math::var; + using stan::test::expect_near_rel; - std::vector mu_to_test - = {2.345e-5, 0.2, 13, 150, 1621, 18432, 1e10 }; + std::vector mu_to_test = {2.345e-5, 0.2, 13, 150, 1621, 18432, 1e10}; double phi_start = 1e-8; double phi_max = 1e20; for (double mu_dbl : mu_to_test) { - for(double phi_dbl = phi_start; phi_dbl < phi_max; - phi_dbl *= stan::math::pi()) { - + for (double phi_dbl = phi_start; phi_dbl < phi_max; + phi_dbl *= stan::math::pi()) { std::ostringstream msg; msg << ", mu = " << mu_dbl << ", phi = " << phi_dbl; @@ -220,17 +569,18 @@ TEST(ProbDistributionsNegBinomial2, derivativesZeroOne) { std::vector gradients1; val1.grad(x1, gradients1); - double expected_dmu_0 = - phi_dbl / (mu_dbl + phi_dbl); - double expected_dphi_0 = mu_dbl / (mu_dbl + phi_dbl) - - log1p(mu_dbl / phi_dbl); + double expected_dmu_0 = -phi_dbl / (mu_dbl + phi_dbl); + double expected_dphi_0 + = mu_dbl / (mu_dbl + phi_dbl) - log1p(mu_dbl / phi_dbl); expect_near_rel("dmu, n = 0 " + msg.str(), gradients0[0], expected_dmu_0); - expect_near_rel("dphi, n = 0 " + msg.str(), gradients0[1], expected_dphi_0); + expect_near_rel("dphi, n = 0 " + msg.str(), gradients0[1], + expected_dphi_0); - double expected_dmu_1 = (phi_dbl * (1 - mu_dbl)) / (mu_dbl * (mu_dbl + phi_dbl)); + double expected_dmu_1 + = (phi_dbl * (1 - mu_dbl)) / (mu_dbl * (mu_dbl + phi_dbl)); expect_near_rel("dmu, n = 1 " + msg.str(), gradients1[0], expected_dmu_1); } } - } TEST(ProbDistributionsNegBinomial2, proptoAtPoissonCutoff) { From 70fedb4243a35b020a13b7f0b8830c77bc6a4538 Mon Sep 17 00:00:00 2001 From: martinmodrak Date: Wed, 8 Jan 2020 15:11:29 +0100 Subject: [PATCH 49/82] Dummy and failing test for lgamma_stirling_diff --- .../prim/scal/fun/lgamma_stirling_diff.hpp | 15 ++++++++++ .../scal/fun/lgamma_stirling_diff_test.cpp | 28 +++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 stan/math/prim/scal/fun/lgamma_stirling_diff.hpp create mode 100644 test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp diff --git a/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp b/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp new file mode 100644 index 00000000000..eb593dc17fc --- /dev/null +++ b/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp @@ -0,0 +1,15 @@ +#ifndef STAN_MATH_PRIM_SCAL_FUN_LGAMMA_STIRLING_DIFF_HPP +#define STAN_MATH_PRIM_SCAL_FUN_LGAMMA_STIRLING_DIFF_HPP + +#include + +namespace stan { +namespace math { + +double lgamma_stirling_diff(const double x) { + return std::log1p(1 / (12 * x)); +} + +}} //namespace + +#endif diff --git a/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp b/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp new file mode 100644 index 00000000000..5bed2348434 --- /dev/null +++ b/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp @@ -0,0 +1,28 @@ +#include +#include +#include +#include +#include +#include + +TEST(MathFunctions, lgamma_stirling_diff_errors) { + //TODO[martinmodrak] nan, negative values, ... +} + +TEST(MathFunctions, lgamma_stirling_diff_accuracy) { + using stan::math::lgamma_stirling_diff; + using stan::test::expect_near_rel; + + double start = std::nextafter(10, 11); + for(double x = start; x < 1e150; x *= 1.5) { + double stirling = x * (log(x) - 1) + log(x) + + 0.5 * (stan::math::LOG_SQRT_PI + stan::math::LOG_TWO - log(x)); + double lgamma_res = stan::math::lgamma(x); + double diff = lgamma_stirling_diff(x); + + std::ostringstream msg; + msg << "x = " << x; + expect_near_rel(msg.str(), stirling + diff, lgamma_res); + } +} + From 08e4203e8422e8b206a85a95de8bfc2c3a318ca3 Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Wed, 8 Jan 2020 10:50:49 -0500 Subject: [PATCH 50/82] [Jenkins] auto-formatting by clang-format version 6.0.0 (tags/google/stable/2017-11-14) --- .../prim/scal/fun/lgamma_stirling_diff.hpp | 7 +++---- .../scal/fun/lgamma_stirling_diff_test.cpp | 20 +++++++++---------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp b/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp index eb593dc17fc..8e217aedaec 100644 --- a/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp +++ b/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp @@ -6,10 +6,9 @@ namespace stan { namespace math { -double lgamma_stirling_diff(const double x) { - return std::log1p(1 / (12 * x)); -} +double lgamma_stirling_diff(const double x) { return std::log1p(1 / (12 * x)); } -}} //namespace +} // namespace math +} // namespace stan #endif diff --git a/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp b/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp index 5bed2348434..8d8f6c1fb48 100644 --- a/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp +++ b/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp @@ -6,7 +6,7 @@ #include TEST(MathFunctions, lgamma_stirling_diff_errors) { - //TODO[martinmodrak] nan, negative values, ... + // TODO[martinmodrak] nan, negative values, ... } TEST(MathFunctions, lgamma_stirling_diff_accuracy) { @@ -14,15 +14,15 @@ TEST(MathFunctions, lgamma_stirling_diff_accuracy) { using stan::test::expect_near_rel; double start = std::nextafter(10, 11); - for(double x = start; x < 1e150; x *= 1.5) { - double stirling = x * (log(x) - 1) + log(x) - + 0.5 * (stan::math::LOG_SQRT_PI + stan::math::LOG_TWO - log(x)); - double lgamma_res = stan::math::lgamma(x); - double diff = lgamma_stirling_diff(x); + for (double x = start; x < 1e150; x *= 1.5) { + double stirling + = x * (log(x) - 1) + log(x) + + 0.5 * (stan::math::LOG_SQRT_PI + stan::math::LOG_TWO - log(x)); + double lgamma_res = stan::math::lgamma(x); + double diff = lgamma_stirling_diff(x); - std::ostringstream msg; - msg << "x = " << x; - expect_near_rel(msg.str(), stirling + diff, lgamma_res); + std::ostringstream msg; + msg << "x = " << x; + expect_near_rel(msg.str(), stirling + diff, lgamma_res); } } - From 45d9f992ad635d7aa9ce15abdff33c6cff1d0c2e Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Thu, 9 Jan 2020 18:52:42 +0100 Subject: [PATCH 51/82] Some progress towards better binomial_coefficient_log (messy) --- .../scal/fun/binomial_coefficient_log.hpp | 55 +++++++++++++++++-- stan/math/prim/scal/fun/lgamma_stirling.hpp | 20 +++++++ .../prim/scal/fun/lgamma_stirling_diff.hpp | 39 ++++++++++++- .../fun/binomial_coefficient_log_test.cpp | 2 +- .../scal/fun/lgamma_stirling_diff_test.cpp | 13 +++-- 5 files changed, 117 insertions(+), 12 deletions(-) create mode 100644 stan/math/prim/scal/fun/lgamma_stirling.hpp diff --git a/stan/math/prim/scal/fun/binomial_coefficient_log.hpp b/stan/math/prim/scal/fun/binomial_coefficient_log.hpp index b7d2900ac1b..06a625d2473 100644 --- a/stan/math/prim/scal/fun/binomial_coefficient_log.hpp +++ b/stan/math/prim/scal/fun/binomial_coefficient_log.hpp @@ -4,10 +4,15 @@ #include #include #include +#include +#include +#include +#include #include namespace stan { namespace math { + /** * Return the log of the binomial coefficient for the specified * arguments. @@ -58,18 +63,56 @@ namespace math { * @param n number of objects chosen. * @return log (N choose n). */ + +namespace internal { + constexpr double lbeta_stirling_bound = 10; +} + +inline double lbeta(const double a, const double b) { + double x; //x is the smaller of the two + double y; + if( a < b ) { + x = a; + y = b; + } else { + x = b; + y = a; + } + + if(y < internal::lbeta_stirling_bound) { + //both small + return lgamma(x) + lgamma(y) - lgamma(x + y); + } else if (x < internal::lbeta_stirling_bound) { + //y large, x small + double stirling_diff = lgamma_stirling_diff(y) - lgamma_stirling_diff(x + y); + double log_x_y = log(x + y);//log_sum_exp(log(x), log(y)); + double stirling = (y - 0.5) * log1p(-x/(x+y)) + x * (1 - log_x_y); + // std::cout << std::setprecision(18) << x << " " << y << std::endl; + // std::cout << std::setprecision(18) << lgamma_stirling_diff(y) << " " << lgamma(y) << " " << lgamma_stirling_diff(x + y) << " " << lgamma(x + y) << std::endl; + return stirling + lgamma(x) + stirling_diff; + } else { + //both large + double stirling_diff = lgamma_stirling_diff(x) + lgamma_stirling_diff(y) - lgamma_stirling_diff(x + y); + double stirling = (x - 0.5) *log(x/(x+y)) + y * log1p(- x /(x+y)) + 0.5*( log(2 * stan::math::pi()) -log(y)); + return stirling + stirling_diff; + } +} + template inline return_type_t binomial_coefficient_log(const T_N N, const T_n n) { const double CUTOFF = 1000; - if (N - n < CUTOFF) { - const T_N N_plus_1 = N + 1; + const T_N N_plus_1 = N + 1; + if(n == 0) { + return 0; + } else if (N - n < CUTOFF) { return lgamma(N_plus_1) - lgamma(n + 1) - lgamma(N_plus_1 - n); } else { - return_type_t N_minus_n = N - n; - const double one_twelfth = inv(12); - return multiply_log(n, N_minus_n) + multiply_log((N + 0.5), N / N_minus_n) - + one_twelfth / N - n - one_twelfth / N_minus_n - lgamma(n + 1); + return -lbeta(N - n + 1, n + 1) - log(N_plus_1); + // return_type_t N_minus_n = N - n; + // const double one_twelfth = inv(12); + // return multiply_log(n, N_minus_n) + multiply_log((N + 0.5), N / N_minus_n) + // + one_twelfth / N - n - one_twelfth / N_minus_n - lgamma(n + 1); } } diff --git a/stan/math/prim/scal/fun/lgamma_stirling.hpp b/stan/math/prim/scal/fun/lgamma_stirling.hpp new file mode 100644 index 00000000000..32d8a82de0d --- /dev/null +++ b/stan/math/prim/scal/fun/lgamma_stirling.hpp @@ -0,0 +1,20 @@ +#ifndef STAN_MATH_PRIM_SCAL_FUN_LGAMMA_STIRLING_HPP +#define STAN_MATH_PRIM_SCAL_FUN_LGAMMA_STIRLING_HPP + +#include +#include +#include + + +namespace stan { +namespace math { + +template +T lgamma_stirling(const T x) { + return 0.5 * log(2*stan::math::pi()) + (x - 0.5)*log(x) -x; +} + +} // namespace math +} // namespace stan + +#endif diff --git a/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp b/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp index 8e217aedaec..c33f3e0dd46 100644 --- a/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp +++ b/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp @@ -2,11 +2,48 @@ #define STAN_MATH_PRIM_SCAL_FUN_LGAMMA_STIRLING_DIFF_HPP #include +//#include +#include +#include +#include + namespace stan { namespace math { -double lgamma_stirling_diff(const double x) { return std::log1p(1 / (12 * x)); } +// namespace internal { +// boost::math::chebyshev_transform build_lgamma_stirling_diff_chebyshev() { +// auto f = [](double t) { +// double x = 10 * sqrt(2 / (t + 1)); +// double stirling = 0.5 * log(2*stan::math::pi()) + (x - 0.5)*log(x) -x; +// return (lgamma(x) - stirling); +// }; +// auto transform = boost::math::chebyshev_transform(f, -1, 1, 1e-10); +// std::cout << "Coeffs: " << transform.coefficients().size() << std::endl; +// //std::cout << transform.coefficients()[0]; +// for(const double c : transform.coefficients()) { +// std::cout << c << " "; +// } +// return transform; +// } + +// boost::math::chebyshev_transform lgamma_stirling_diff_chebyshev = build_lgamma_stirling_diff_chebyshev(); +// } + +namespace internal { + constexpr double lgamma_stirling_diff_big = 1e5; +} + +double lgamma_stirling_diff(const double x) { + if(x < internal::lgamma_stirling_diff_big) { + return lgamma(x) - lgamma_stirling(x); + } else { + return 1.0 / (12.0 * x) + 1.0 / (288 * x * x); + } + // double ten_over_x = 10.0 / x; + // double t = ten_over_x * ten_over_x * 2 - 1; + // return internal::lgamma_stirling_diff_chebyshev(t); +} } // namespace math } // namespace stan diff --git a/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp b/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp index a8e59a736b7..da1d49bf60f 100644 --- a/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp +++ b/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp @@ -8,7 +8,7 @@ template void test_binom_coefficient(const T_N& N, const T_n& n) { using stan::math::binomial_coefficient_log; EXPECT_FLOAT_EQ(lgamma(N + 1) - lgamma(n + 1) - lgamma(N - n + 1), - binomial_coefficient_log(N, n)); + binomial_coefficient_log(N, n)) << "N = " << N << ", n = " << n; } TEST(MathFunctions, binomial_coefficient_log) { diff --git a/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp b/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp index 8d8f6c1fb48..3b54d98ecad 100644 --- a/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp +++ b/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp @@ -12,17 +12,22 @@ TEST(MathFunctions, lgamma_stirling_diff_errors) { TEST(MathFunctions, lgamma_stirling_diff_accuracy) { using stan::math::lgamma_stirling_diff; using stan::test::expect_near_rel; + using stan::math::internal::lgamma_stirling_diff_big; double start = std::nextafter(10, 11); - for (double x = start; x < 1e150; x *= 1.5) { +// for (double x = start; x < 1e150; x *= 1.5) { + for (double x = start; x < 100; x *= 1.5) { double stirling - = x * (log(x) - 1) + log(x) - + 0.5 * (stan::math::LOG_SQRT_PI + stan::math::LOG_TWO - log(x)); + = 0.5 * log(2*stan::math::pi()) + (x - 0.5)*log(x) -x; double lgamma_res = stan::math::lgamma(x); double diff = lgamma_stirling_diff(x); std::ostringstream msg; - msg << "x = " << x; + msg << "x = " << x << "; diff = " << diff << "; diff_actual = " << (lgamma_res - stirling); expect_near_rel(msg.str(), stirling + diff, lgamma_res); } + + double before_big = std::nextafter(lgamma_stirling_diff_big, 0); + double after_big = std::nextafter(lgamma_stirling_diff_big, stan::math::positive_infinity()); + expect_near_rel("big cutoff", lgamma_stirling_diff(before_big), lgamma_stirling_diff(after_big)); } From fb8718bf014d2cf2a0b68ab8a1ca3a9f9daa7c86 Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Thu, 9 Jan 2020 17:55:58 +0000 Subject: [PATCH 52/82] [Jenkins] auto-formatting by clang-format version 5.0.0-3~16.04.1 (tags/RELEASE_500/final) --- .../scal/fun/binomial_coefficient_log.hpp | 36 +++++++++++-------- stan/math/prim/scal/fun/lgamma_stirling.hpp | 5 ++- .../prim/scal/fun/lgamma_stirling_diff.hpp | 36 ++++++++++--------- .../fun/binomial_coefficient_log_test.cpp | 3 +- .../scal/fun/lgamma_stirling_diff_test.cpp | 16 +++++---- 5 files changed, 53 insertions(+), 43 deletions(-) diff --git a/stan/math/prim/scal/fun/binomial_coefficient_log.hpp b/stan/math/prim/scal/fun/binomial_coefficient_log.hpp index 06a625d2473..04a8b561046 100644 --- a/stan/math/prim/scal/fun/binomial_coefficient_log.hpp +++ b/stan/math/prim/scal/fun/binomial_coefficient_log.hpp @@ -65,13 +65,13 @@ namespace math { */ namespace internal { - constexpr double lbeta_stirling_bound = 10; +constexpr double lbeta_stirling_bound = 10; } inline double lbeta(const double a, const double b) { - double x; //x is the smaller of the two + double x; // x is the smaller of the two double y; - if( a < b ) { + if (a < b) { x = a; y = b; } else { @@ -79,21 +79,26 @@ inline double lbeta(const double a, const double b) { y = a; } - if(y < internal::lbeta_stirling_bound) { - //both small + if (y < internal::lbeta_stirling_bound) { + // both small return lgamma(x) + lgamma(y) - lgamma(x + y); } else if (x < internal::lbeta_stirling_bound) { - //y large, x small - double stirling_diff = lgamma_stirling_diff(y) - lgamma_stirling_diff(x + y); - double log_x_y = log(x + y);//log_sum_exp(log(x), log(y)); - double stirling = (y - 0.5) * log1p(-x/(x+y)) + x * (1 - log_x_y); + // y large, x small + double stirling_diff + = lgamma_stirling_diff(y) - lgamma_stirling_diff(x + y); + double log_x_y = log(x + y); // log_sum_exp(log(x), log(y)); + double stirling = (y - 0.5) * log1p(-x / (x + y)) + x * (1 - log_x_y); // std::cout << std::setprecision(18) << x << " " << y << std::endl; - // std::cout << std::setprecision(18) << lgamma_stirling_diff(y) << " " << lgamma(y) << " " << lgamma_stirling_diff(x + y) << " " << lgamma(x + y) << std::endl; + // std::cout << std::setprecision(18) << lgamma_stirling_diff(y) << " " << + // lgamma(y) << " " << lgamma_stirling_diff(x + y) << " " << lgamma(x + y) + // << std::endl; return stirling + lgamma(x) + stirling_diff; } else { - //both large - double stirling_diff = lgamma_stirling_diff(x) + lgamma_stirling_diff(y) - lgamma_stirling_diff(x + y); - double stirling = (x - 0.5) *log(x/(x+y)) + y * log1p(- x /(x+y)) + 0.5*( log(2 * stan::math::pi()) -log(y)); + // both large + double stirling_diff = lgamma_stirling_diff(x) + lgamma_stirling_diff(y) + - lgamma_stirling_diff(x + y); + double stirling = (x - 0.5) * log(x / (x + y)) + y * log1p(-x / (x + y)) + + 0.5 * (log(2 * stan::math::pi()) - log(y)); return stirling + stirling_diff; } } @@ -103,7 +108,7 @@ inline return_type_t binomial_coefficient_log(const T_N N, const T_n n) { const double CUTOFF = 1000; const T_N N_plus_1 = N + 1; - if(n == 0) { + if (n == 0) { return 0; } else if (N - n < CUTOFF) { return lgamma(N_plus_1) - lgamma(n + 1) - lgamma(N_plus_1 - n); @@ -111,7 +116,8 @@ inline return_type_t binomial_coefficient_log(const T_N N, return -lbeta(N - n + 1, n + 1) - log(N_plus_1); // return_type_t N_minus_n = N - n; // const double one_twelfth = inv(12); - // return multiply_log(n, N_minus_n) + multiply_log((N + 0.5), N / N_minus_n) + // return multiply_log(n, N_minus_n) + multiply_log((N + 0.5), N / + // N_minus_n) // + one_twelfth / N - n - one_twelfth / N_minus_n - lgamma(n + 1); } } diff --git a/stan/math/prim/scal/fun/lgamma_stirling.hpp b/stan/math/prim/scal/fun/lgamma_stirling.hpp index 32d8a82de0d..66810bc5cf3 100644 --- a/stan/math/prim/scal/fun/lgamma_stirling.hpp +++ b/stan/math/prim/scal/fun/lgamma_stirling.hpp @@ -5,13 +5,12 @@ #include #include - namespace stan { namespace math { template -T lgamma_stirling(const T x) { - return 0.5 * log(2*stan::math::pi()) + (x - 0.5)*log(x) -x; +T lgamma_stirling(const T x) { + return 0.5 * log(2 * stan::math::pi()) + (x - 0.5) * log(x) - x; } } // namespace math diff --git a/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp b/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp index c33f3e0dd46..89c26590b4a 100644 --- a/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp +++ b/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp @@ -7,19 +7,20 @@ #include #include - namespace stan { namespace math { // namespace internal { -// boost::math::chebyshev_transform build_lgamma_stirling_diff_chebyshev() { +// boost::math::chebyshev_transform +// build_lgamma_stirling_diff_chebyshev() { // auto f = [](double t) { // double x = 10 * sqrt(2 / (t + 1)); -// double stirling = 0.5 * log(2*stan::math::pi()) + (x - 0.5)*log(x) -x; -// return (lgamma(x) - stirling); +// double stirling = 0.5 * log(2*stan::math::pi()) + (x - +// 0.5)*log(x) -x; return (lgamma(x) - stirling); // }; -// auto transform = boost::math::chebyshev_transform(f, -1, 1, 1e-10); -// std::cout << "Coeffs: " << transform.coefficients().size() << std::endl; +// auto transform = boost::math::chebyshev_transform(f, -1, 1, +// 1e-10); std::cout << "Coeffs: " << transform.coefficients().size() << +// std::endl; // //std::cout << transform.coefficients()[0]; // for(const double c : transform.coefficients()) { // std::cout << c << " "; @@ -27,22 +28,23 @@ namespace math { // return transform; // } -// boost::math::chebyshev_transform lgamma_stirling_diff_chebyshev = build_lgamma_stirling_diff_chebyshev(); +// boost::math::chebyshev_transform lgamma_stirling_diff_chebyshev = +// build_lgamma_stirling_diff_chebyshev(); // } namespace internal { - constexpr double lgamma_stirling_diff_big = 1e5; +constexpr double lgamma_stirling_diff_big = 1e5; } -double lgamma_stirling_diff(const double x) { - if(x < internal::lgamma_stirling_diff_big) { - return lgamma(x) - lgamma_stirling(x); - } else { - return 1.0 / (12.0 * x) + 1.0 / (288 * x * x); - } - // double ten_over_x = 10.0 / x; - // double t = ten_over_x * ten_over_x * 2 - 1; - // return internal::lgamma_stirling_diff_chebyshev(t); +double lgamma_stirling_diff(const double x) { + if (x < internal::lgamma_stirling_diff_big) { + return lgamma(x) - lgamma_stirling(x); + } else { + return 1.0 / (12.0 * x) + 1.0 / (288 * x * x); + } + // double ten_over_x = 10.0 / x; + // double t = ten_over_x * ten_over_x * 2 - 1; + // return internal::lgamma_stirling_diff_chebyshev(t); } } // namespace math diff --git a/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp b/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp index da1d49bf60f..dc89b20f0a1 100644 --- a/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp +++ b/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp @@ -8,7 +8,8 @@ template void test_binom_coefficient(const T_N& N, const T_n& n) { using stan::math::binomial_coefficient_log; EXPECT_FLOAT_EQ(lgamma(N + 1) - lgamma(n + 1) - lgamma(N - n + 1), - binomial_coefficient_log(N, n)) << "N = " << N << ", n = " << n; + binomial_coefficient_log(N, n)) + << "N = " << N << ", n = " << n; } TEST(MathFunctions, binomial_coefficient_log) { diff --git a/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp b/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp index 3b54d98ecad..886aab54901 100644 --- a/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp +++ b/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp @@ -10,24 +10,26 @@ TEST(MathFunctions, lgamma_stirling_diff_errors) { } TEST(MathFunctions, lgamma_stirling_diff_accuracy) { + using stan::math::internal::lgamma_stirling_diff_big; using stan::math::lgamma_stirling_diff; using stan::test::expect_near_rel; - using stan::math::internal::lgamma_stirling_diff_big; double start = std::nextafter(10, 11); -// for (double x = start; x < 1e150; x *= 1.5) { + // for (double x = start; x < 1e150; x *= 1.5) { for (double x = start; x < 100; x *= 1.5) { - double stirling - = 0.5 * log(2*stan::math::pi()) + (x - 0.5)*log(x) -x; + double stirling = 0.5 * log(2 * stan::math::pi()) + (x - 0.5) * log(x) - x; double lgamma_res = stan::math::lgamma(x); double diff = lgamma_stirling_diff(x); std::ostringstream msg; - msg << "x = " << x << "; diff = " << diff << "; diff_actual = " << (lgamma_res - stirling); + msg << "x = " << x << "; diff = " << diff + << "; diff_actual = " << (lgamma_res - stirling); expect_near_rel(msg.str(), stirling + diff, lgamma_res); } double before_big = std::nextafter(lgamma_stirling_diff_big, 0); - double after_big = std::nextafter(lgamma_stirling_diff_big, stan::math::positive_infinity()); - expect_near_rel("big cutoff", lgamma_stirling_diff(before_big), lgamma_stirling_diff(after_big)); + double after_big = std::nextafter(lgamma_stirling_diff_big, + stan::math::positive_infinity()); + expect_near_rel("big cutoff", lgamma_stirling_diff(before_big), + lgamma_stirling_diff(after_big)); } From 8e461ad017a74ecb5c6a85fb04f92405acd7a49f Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Fri, 10 Jan 2020 13:39:19 +0100 Subject: [PATCH 53/82] Some more tweaks to stirling_diff --- .../prim/scal/fun/lgamma_stirling_diff.hpp | 64 +++++++++++-------- .../scal/fun/lgamma_stirling_diff_test.cpp | 20 +++--- 2 files changed, 51 insertions(+), 33 deletions(-) diff --git a/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp b/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp index 89c26590b4a..2dd15b6c8d1 100644 --- a/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp +++ b/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp @@ -7,44 +7,58 @@ #include #include + namespace stan { namespace math { -// namespace internal { -// boost::math::chebyshev_transform +namespace internal { + constexpr double lgamma_stirling_diff_big = 1e10; +} + + +// namespace lgamma_stirling_diff_internal { +// typedef long double Real; + +// boost::math::chebyshev_transform // build_lgamma_stirling_diff_chebyshev() { -// auto f = [](double t) { -// double x = 10 * sqrt(2 / (t + 1)); -// double stirling = 0.5 * log(2*stan::math::pi()) + (x - -// 0.5)*log(x) -x; return (lgamma(x) - stirling); +// std::cout << "Size: " << sizeof(Real) << std::endl; +// auto f = [](Real t) { +// Real x = 10 * std::sqrt(2 / (t + 1)); +// if(x > internal::lgamma_stirling_diff_big) { +// return 1.0 / (12.0 * x); +// } else { +// Real stirling = 0.5 +// * std::log(2* static_cast(stan::math::pi())) +// + (x - 0.5)*std::log(x) -x; +// return (std::lgamma(x) - stirling); +// } // }; -// auto transform = boost::math::chebyshev_transform(f, -1, 1, -// 1e-10); std::cout << "Coeffs: " << transform.coefficients().size() << -// std::endl; +// auto transform = boost::math::chebyshev_transform(f, -1, 1, 1e-8); +// std::cout << "Coeffs: " << transform.coefficients().size() << std::endl; // //std::cout << transform.coefficients()[0]; -// for(const double c : transform.coefficients()) { -// std::cout << c << " "; +// size_t coeffs_to_print = +// std::min(size_t(20), transform.coefficients().size()); +// for(size_t i = 0; i < coeffs_to_print ; i ++) { +// std::cout << std::setprecision(17) << transform.coefficients()[i] +// << std::endl; // } // return transform; // } -// boost::math::chebyshev_transform lgamma_stirling_diff_chebyshev = -// build_lgamma_stirling_diff_chebyshev(); +// boost::math::chebyshev_transform lgamma_stirling_diff_chebyshev = +// build_lgamma_stirling_diff_chebyshev(); // } -namespace internal { -constexpr double lgamma_stirling_diff_big = 1e5; -} -double lgamma_stirling_diff(const double x) { - if (x < internal::lgamma_stirling_diff_big) { - return lgamma(x) - lgamma_stirling(x); - } else { - return 1.0 / (12.0 * x) + 1.0 / (288 * x * x); - } - // double ten_over_x = 10.0 / x; - // double t = ten_over_x * ten_over_x * 2 - 1; - // return internal::lgamma_stirling_diff_chebyshev(t); +double lgamma_stirling_diff(const double x) { + if (x < internal::lgamma_stirling_diff_big) { + return std::lgamma(x) - lgamma_stirling(x); + // double ten_over_x = 10.0 / x; + // double t = ten_over_x * ten_over_x * 2 - 1; + // return internal::lgamma_stirling_diff_chebyshev(t); + } else { + return 1.0 / (12.0 * x); + } } } // namespace math diff --git a/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp b/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp index 886aab54901..947d0e996a1 100644 --- a/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp +++ b/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp @@ -14,17 +14,21 @@ TEST(MathFunctions, lgamma_stirling_diff_accuracy) { using stan::math::lgamma_stirling_diff; using stan::test::expect_near_rel; - double start = std::nextafter(10, 11); - // for (double x = start; x < 1e150; x *= 1.5) { - for (double x = start; x < 100; x *= 1.5) { - double stirling = 0.5 * log(2 * stan::math::pi()) + (x - 0.5) * log(x) - x; - double lgamma_res = stan::math::lgamma(x); + long double start = std::nextafter(10, 11); + for (long double x = start; x < lgamma_stirling_diff_big; x *= 1.5) { + //for (long double x = start; x < 1e150; x *= 1.5) { + //for (double x = start; x < 100; x *= 1.5) { + long double stirling = 0.5 + * std::log(2 * static_cast(stan::math::pi())) + + (x - 0.5) * std::log(x) - x; + long double lgamma_res = std::lgamma(x); + double diff_actual = static_cast(lgamma_res - stirling); double diff = lgamma_stirling_diff(x); std::ostringstream msg; - msg << "x = " << x << "; diff = " << diff - << "; diff_actual = " << (lgamma_res - stirling); - expect_near_rel(msg.str(), stirling + diff, lgamma_res); + msg << "x = " << x << "; lgamma = " << lgamma_res + << "; stirling = " << stirling; + expect_near_rel(msg.str(), diff, diff_actual, 1e-4); } double before_big = std::nextafter(lgamma_stirling_diff_big, 0); From 1d38cf32431e32c84851a7f22b99813766fea735 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Fri, 10 Jan 2020 15:35:34 +0100 Subject: [PATCH 54/82] More (still failing) work on lgamma_stirling_diff --- stan/math/prim/scal/fun/lgamma_stirling.hpp | 1 + .../prim/scal/fun/lgamma_stirling_diff.hpp | 3 ++- .../scal/fun/lgamma_stirling_diff_test.cpp | 25 ++++++++++++++++--- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/stan/math/prim/scal/fun/lgamma_stirling.hpp b/stan/math/prim/scal/fun/lgamma_stirling.hpp index 66810bc5cf3..209de3cb24c 100644 --- a/stan/math/prim/scal/fun/lgamma_stirling.hpp +++ b/stan/math/prim/scal/fun/lgamma_stirling.hpp @@ -10,6 +10,7 @@ namespace math { template T lgamma_stirling(const T x) { + using std::log; return 0.5 * log(2 * stan::math::pi()) + (x - 0.5) * log(x) - x; } diff --git a/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp b/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp index 2dd15b6c8d1..ec2e89f5778 100644 --- a/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp +++ b/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp @@ -52,7 +52,8 @@ namespace internal { double lgamma_stirling_diff(const double x) { if (x < internal::lgamma_stirling_diff_big) { - return std::lgamma(x) - lgamma_stirling(x); + return std::lgamma(static_cast(x)) - lgamma_stirling(static_cast(x)); + // double ten_over_x = 10.0 / x; // double t = ten_over_x * ten_over_x * 2 - 1; // return internal::lgamma_stirling_diff_chebyshev(t); diff --git a/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp b/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp index 947d0e996a1..f271f5d6453 100644 --- a/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp +++ b/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp @@ -15,9 +15,7 @@ TEST(MathFunctions, lgamma_stirling_diff_accuracy) { using stan::test::expect_near_rel; long double start = std::nextafter(10, 11); - for (long double x = start; x < lgamma_stirling_diff_big; x *= 1.5) { - //for (long double x = start; x < 1e150; x *= 1.5) { - //for (double x = start; x < 100; x *= 1.5) { + for (long double x = start; x < 2 * lgamma_stirling_diff_big; x *= 1.5) { long double stirling = 0.5 * std::log(2 * static_cast(stan::math::pi())) + (x - 0.5) * std::log(x) - x; @@ -37,3 +35,24 @@ TEST(MathFunctions, lgamma_stirling_diff_accuracy) { expect_near_rel("big cutoff", lgamma_stirling_diff(before_big), lgamma_stirling_diff(after_big)); } + +namespace lgamma_stirling_diff_test_internal { + struct TestValue { + double x; + double val; + }; + + std::vector testValues = { {10.049787068367863943,0.0082893206359322200849}, {10.135335283236612692,0.0082193992370778811855}, {10.367879441171442322,0.0080351590240775284273}, {11.,0.007573675487951840795}, {12.718281828459045235,0.0065508998676477812047}, {17.389056098930650227,0.0047917583976502091168}, {30.085536923187667741,0.0027697782366142911547}, {64.598150033144239078,0.0012900163188678122747}, {158.41315910257660342,0.00052604987562270910548}, {413.42879349273512261,0.0002015663117649479817}, {1106.6331584284585993,0.000075303482848309432847}, {2990.9579870417282747,0.000027861753118520084151}, {8113.0839275753840077,0.000010271474329002342817}, {22036.465794806716517,3.7816106313768371052e-6}, {59884.141715197818455,1.3915759823173656792e-6}, {162764.79141900392081,5.1198623858832122975e-7}, {442423.39200892050333,1.8835652643709875774e-7}, {1.2026142841647767777e6,6.9293483730078043652e-8}, {3.2690273724721106393e6,2.5491782061865871668e-8}, {8.8861205205078726368e6,9.3779206731455076929e-9}, {2.4154962753575298215e7,3.4499466707312036902e-9}, {6.5659979137330511139e7,1.2691647854325126115e-9}, {1.7848231096318726084e8,4.6689967696866715977e-10}, {4.8516520540979027797e8,1.717627983295846792e-10}, {1.3188157444832146972e9,6.318800308680570434e-11}, {3.5849128561315915617e9,2.3245567375731604902e-11}, {9.7448034562489026e9,8.5515663509760607976e-12}, {2.6489122139843472294e10,3.1459454523782780579e-12}, {7.2004899347385872524e10,1.1573286552529392289e-12},}; +} + +TEST(MathFunctions, lgamma_stirling_diff_precomputed) { + using stan::math::lgamma_stirling_diff; + using stan::test::expect_near_rel; + using namespace lgamma_stirling_diff_test_internal; + + for(TestValue t : testValues) { + std::ostringstream msg; + msg << "x = " << t.x; + expect_near_rel(msg.str(), lgamma_stirling_diff(t.x), t.val); + } +} \ No newline at end of file From 3f129062a8515326503b19f9912c688adac3b593 Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Fri, 10 Jan 2020 14:36:15 +0000 Subject: [PATCH 55/82] [Jenkins] auto-formatting by clang-format version 5.0.0-3~16.04.1 (tags/RELEASE_500/final) --- .../prim/scal/fun/lgamma_stirling_diff.hpp | 43 ++++++++-------- .../scal/fun/lgamma_stirling_diff_test.cpp | 50 +++++++++++++++---- 2 files changed, 61 insertions(+), 32 deletions(-) diff --git a/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp b/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp index ec2e89f5778..645444d4212 100644 --- a/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp +++ b/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp @@ -7,19 +7,17 @@ #include #include - namespace stan { namespace math { namespace internal { - constexpr double lgamma_stirling_diff_big = 1e10; +constexpr double lgamma_stirling_diff_big = 1e10; } - -// namespace lgamma_stirling_diff_internal { +// namespace lgamma_stirling_diff_internal { // typedef long double Real; -// boost::math::chebyshev_transform +// boost::math::chebyshev_transform // build_lgamma_stirling_diff_chebyshev() { // std::cout << "Size: " << sizeof(Real) << std::endl; // auto f = [](Real t) { @@ -27,39 +25,40 @@ namespace internal { // if(x > internal::lgamma_stirling_diff_big) { // return 1.0 / (12.0 * x); // } else { -// Real stirling = 0.5 -// * std::log(2* static_cast(stan::math::pi())) +// Real stirling = 0.5 +// * std::log(2* static_cast(stan::math::pi())) // + (x - 0.5)*std::log(x) -x; // return (std::lgamma(x) - stirling); // } // }; -// auto transform = boost::math::chebyshev_transform(f, -1, 1, 1e-8); -// std::cout << "Coeffs: " << transform.coefficients().size() << std::endl; +// auto transform = boost::math::chebyshev_transform(f, -1, 1, +// 1e-8); std::cout << "Coeffs: " << transform.coefficients().size() << +// std::endl; // //std::cout << transform.coefficients()[0]; -// size_t coeffs_to_print = +// size_t coeffs_to_print = // std::min(size_t(20), transform.coefficients().size()); // for(size_t i = 0; i < coeffs_to_print ; i ++) { -// std::cout << std::setprecision(17) << transform.coefficients()[i] +// std::cout << std::setprecision(17) << transform.coefficients()[i] // << std::endl; // } // return transform; // } -// boost::math::chebyshev_transform lgamma_stirling_diff_chebyshev = +// boost::math::chebyshev_transform lgamma_stirling_diff_chebyshev = // build_lgamma_stirling_diff_chebyshev(); // } +double lgamma_stirling_diff(const double x) { + if (x < internal::lgamma_stirling_diff_big) { + return std::lgamma(static_cast(x)) + - lgamma_stirling(static_cast(x)); -double lgamma_stirling_diff(const double x) { - if (x < internal::lgamma_stirling_diff_big) { - return std::lgamma(static_cast(x)) - lgamma_stirling(static_cast(x)); - - // double ten_over_x = 10.0 / x; - // double t = ten_over_x * ten_over_x * 2 - 1; - // return internal::lgamma_stirling_diff_chebyshev(t); - } else { - return 1.0 / (12.0 * x); - } + // double ten_over_x = 10.0 / x; + // double t = ten_over_x * ten_over_x * 2 - 1; + // return internal::lgamma_stirling_diff_chebyshev(t); + } else { + return 1.0 / (12.0 * x); + } } } // namespace math diff --git a/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp b/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp index f271f5d6453..e7c96deeeb0 100644 --- a/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp +++ b/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp @@ -16,9 +16,9 @@ TEST(MathFunctions, lgamma_stirling_diff_accuracy) { long double start = std::nextafter(10, 11); for (long double x = start; x < 2 * lgamma_stirling_diff_big; x *= 1.5) { - long double stirling = 0.5 - * std::log(2 * static_cast(stan::math::pi())) - + (x - 0.5) * std::log(x) - x; + long double stirling + = 0.5 * std::log(2 * static_cast(stan::math::pi())) + + (x - 0.5) * std::log(x) - x; long double lgamma_res = std::lgamma(x); double diff_actual = static_cast(lgamma_res - stirling); double diff = lgamma_stirling_diff(x); @@ -37,20 +37,50 @@ TEST(MathFunctions, lgamma_stirling_diff_accuracy) { } namespace lgamma_stirling_diff_test_internal { - struct TestValue { - double x; - double val; - }; +struct TestValue { + double x; + double val; +}; - std::vector testValues = { {10.049787068367863943,0.0082893206359322200849}, {10.135335283236612692,0.0082193992370778811855}, {10.367879441171442322,0.0080351590240775284273}, {11.,0.007573675487951840795}, {12.718281828459045235,0.0065508998676477812047}, {17.389056098930650227,0.0047917583976502091168}, {30.085536923187667741,0.0027697782366142911547}, {64.598150033144239078,0.0012900163188678122747}, {158.41315910257660342,0.00052604987562270910548}, {413.42879349273512261,0.0002015663117649479817}, {1106.6331584284585993,0.000075303482848309432847}, {2990.9579870417282747,0.000027861753118520084151}, {8113.0839275753840077,0.000010271474329002342817}, {22036.465794806716517,3.7816106313768371052e-6}, {59884.141715197818455,1.3915759823173656792e-6}, {162764.79141900392081,5.1198623858832122975e-7}, {442423.39200892050333,1.8835652643709875774e-7}, {1.2026142841647767777e6,6.9293483730078043652e-8}, {3.2690273724721106393e6,2.5491782061865871668e-8}, {8.8861205205078726368e6,9.3779206731455076929e-9}, {2.4154962753575298215e7,3.4499466707312036902e-9}, {6.5659979137330511139e7,1.2691647854325126115e-9}, {1.7848231096318726084e8,4.6689967696866715977e-10}, {4.8516520540979027797e8,1.717627983295846792e-10}, {1.3188157444832146972e9,6.318800308680570434e-11}, {3.5849128561315915617e9,2.3245567375731604902e-11}, {9.7448034562489026e9,8.5515663509760607976e-12}, {2.6489122139843472294e10,3.1459454523782780579e-12}, {7.2004899347385872524e10,1.1573286552529392289e-12},}; -} +std::vector testValues = { + {10.049787068367863943, 0.0082893206359322200849}, + {10.135335283236612692, 0.0082193992370778811855}, + {10.367879441171442322, 0.0080351590240775284273}, + {11., 0.007573675487951840795}, + {12.718281828459045235, 0.0065508998676477812047}, + {17.389056098930650227, 0.0047917583976502091168}, + {30.085536923187667741, 0.0027697782366142911547}, + {64.598150033144239078, 0.0012900163188678122747}, + {158.41315910257660342, 0.00052604987562270910548}, + {413.42879349273512261, 0.0002015663117649479817}, + {1106.6331584284585993, 0.000075303482848309432847}, + {2990.9579870417282747, 0.000027861753118520084151}, + {8113.0839275753840077, 0.000010271474329002342817}, + {22036.465794806716517, 3.7816106313768371052e-6}, + {59884.141715197818455, 1.3915759823173656792e-6}, + {162764.79141900392081, 5.1198623858832122975e-7}, + {442423.39200892050333, 1.8835652643709875774e-7}, + {1.2026142841647767777e6, 6.9293483730078043652e-8}, + {3.2690273724721106393e6, 2.5491782061865871668e-8}, + {8.8861205205078726368e6, 9.3779206731455076929e-9}, + {2.4154962753575298215e7, 3.4499466707312036902e-9}, + {6.5659979137330511139e7, 1.2691647854325126115e-9}, + {1.7848231096318726084e8, 4.6689967696866715977e-10}, + {4.8516520540979027797e8, 1.717627983295846792e-10}, + {1.3188157444832146972e9, 6.318800308680570434e-11}, + {3.5849128561315915617e9, 2.3245567375731604902e-11}, + {9.7448034562489026e9, 8.5515663509760607976e-12}, + {2.6489122139843472294e10, 3.1459454523782780579e-12}, + {7.2004899347385872524e10, 1.1573286552529392289e-12}, +}; +} // namespace lgamma_stirling_diff_test_internal TEST(MathFunctions, lgamma_stirling_diff_precomputed) { using stan::math::lgamma_stirling_diff; using stan::test::expect_near_rel; using namespace lgamma_stirling_diff_test_internal; - for(TestValue t : testValues) { + for (TestValue t : testValues) { std::ostringstream msg; msg << "x = " << t.x; expect_near_rel(msg.str(), lgamma_stirling_diff(t.x), t.val); From a85623aa21ae11d37c472c42e915d84baf1d8f33 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Mon, 13 Jan 2020 19:13:48 +0100 Subject: [PATCH 56/82] Failing test for lbeta (#1611) --- test/unit/math/prim/scal/fun/lbeta_test.cpp | 28 +++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/test/unit/math/prim/scal/fun/lbeta_test.cpp b/test/unit/math/prim/scal/fun/lbeta_test.cpp index 7c7bc3825f7..512a103bd44 100644 --- a/test/unit/math/prim/scal/fun/lbeta_test.cpp +++ b/test/unit/math/prim/scal/fun/lbeta_test.cpp @@ -1,7 +1,10 @@ +#include #include #include #include #include +#include + TEST(MathFunctions, lbeta) { using stan::math::lbeta; @@ -21,3 +24,28 @@ TEST(MathFunctions, lbeta_nan) { EXPECT_TRUE(std::isnan(stan::math::lbeta(nan, nan))); } + +namespace lbeta_test_internal { + struct TestValue { + double x; + double y; + double val; + }; + +std::vector testValues = { {8.e-8,7.e-11,23.3834004912898500586445}, {8.e-8,0.00002,16.3452312235394351410033}, {8.e-8,1.000000000001,16.3412392022725295437606}, {8.e-8,0.5,16.3412393131760679059067}, {8.e-8,2,16.3412391222725327438921}, {8.e-8,1624,16.3412385647081130254943}, {0.004,7.e-11,23.3825258913787298259023}, {0.004,0.00002,10.8247656947117878792194}, {0.004,1.000000000001,5.52146091786223987264715}, {0.004,0.5,5.52697992926150653113797}, {0.004,2,5.51746889659270898022044}, {0.004,1624,5.48959582574332555214719}, {1,7.e-11,23.3825258738791892190926}, {1,0.00002,10.8197782844102831106727}, {1,1.000000000001,-9.999999999995e-13}, {1,0.5,0.693147180559945309417232}, {1,2,-0.693147180559945309417232}, {1,1624,-7.39264752072162326054032}, {1.00000001,7.e-11,23.3825258738791892179411}, {1.00000001,0.00002,10.8197782844099541286699}, {1.00000001,1.000000000001,-1.00009999500064491739816e-8}, {1.00000001,0.5,0.693147174422888956122731}, {1.00000001,2,-0.693147195559945246917232}, {1.00000001,1624,-7.39264760042333353631934}, {5,7.e-11,23.3825258737333558857627}, {5,0.00002,10.8197366180283355258393}, {5,1.000000000001,-1.60943791243638370793409}, {5,0.5,-0.207395194346070587158746}, {5,2,-3.40119738166215537541324}, {5,1624,-33.7913357290267948074624}, {23,7.e-11,23.3825258736208322915813}, {23,0.00002,10.819704468465374949026}, {23,1.000000000001,-3.13549421593288398231784}, {23,0.5,-0.989947810259228199543883}, {23,2,-6.31354804627709531045369}, {23,1624,-121.714785277510463870251}, {19845,7.e-11,23.3825258731460863706715}, {19845,0.00002,10.8195688267825637640878}, {19845,1.000000000001,-9.89570736522763869861762}, {19845,0.5,-4.37548244086806082919414}, {19845,2,-19.7914651196913525680177}, {19845,1624,-5756.4146766727238501215}, {3000000000000000.0,3,-106.219018870176440545578}, {3000000000000000.0,100,-3204.60466298830574639047}, {3000000000000000.0,12895,-350396.988955562106921852}, {100000000000000000000.0,3,-137.461958399082795731692}, {100000000000000000000.0,100,-4246.03598061851596930944}, {100000000000000000000.0,12895,-484689.557363950217404711},}; +} + +TEST(MathFunctions, lbeta_precomputed) { + using lbeta_test_internal::TestValue; + using lbeta_test_internal::testValues; + using stan::test::expect_near_rel; + + for (TestValue t : testValues) { + + std::ostringstream msg; + msg << std::setprecision(22) << "x = " << t.x << ", y = " << t.y; + + double val = stan::math::lbeta(t.x, t.y); + expect_near_rel(msg.str(), val, t.val); + } +} From d2f955a77621d4f5c2d9ca188a5d66bd79281a72 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Mon, 13 Jan 2020 19:33:35 +0100 Subject: [PATCH 57/82] More strict criteria in expect_near_rel --- test/unit/math/expect_near_rel.hpp | 38 +++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/test/unit/math/expect_near_rel.hpp b/test/unit/math/expect_near_rel.hpp index 37d12c266cb..4093aba00fe 100644 --- a/test/unit/math/expect_near_rel.hpp +++ b/test/unit/math/expect_near_rel.hpp @@ -5,6 +5,7 @@ #include #include #include +#include namespace stan { namespace test { @@ -32,23 +33,37 @@ namespace internal { */ template ...> void expect_near_rel_finite(const std::string& msg, const T1& x1, const T2& x2, - double tol = 1e-8) { + double tol_rel = 1e-8, + double tol_min = std::numeric_limits::quiet_NaN()) { using stan::math::fabs; // if either arg near zero, must use absolute tolerance as rel tol -> 2 - if (fabs(x1) < tol || fabs(x2) < tol) { - EXPECT_NEAR(x1, x2, tol) << "expect_near_rel_finite(" << x1 << ", " << x2 - << ", absolute tolerance = " << tol << ")" - << "; absolute diff = " << fabs(x1 - x2) - << " in: " << msg << std::endl; - return; + // if (fabs(x1) < tol || fabs(x2) < tol) { + // EXPECT_NEAR(x1, x2, tol) << "expect_near_rel_finite(" << x1 << ", " << x2 + // << ", absolute tolerance = " << tol << ")" + // << "; absolute diff = " << fabs(x1 - x2) + // << " in: " << msg << std::endl; + // return; + // } + // auto avg = 0.5 * (fabs(x1) + fabs(x2)); + // auto relative_diff = (x1 - x2) / avg; + // EXPECT_NEAR(0, relative_diff, tol) + // << "expect_near_rel_finite(" << x1 << ", " << x2 + // << ", relative tolerance = " << tol << ")" + // << "; relative diff = " << relative_diff << std::endl + // << " in: " << msg << std::endl; + if(stan::math::is_nan(tol_min)) { + tol_min = tol_rel * tol_rel; } auto avg = 0.5 * (fabs(x1) + fabs(x2)); + auto tol = std::max(avg * tol_rel, tol_min); auto relative_diff = (x1 - x2) / avg; - EXPECT_NEAR(0, relative_diff, tol) + EXPECT_NEAR(x1, x2, tol) << "expect_near_rel_finite(" << x1 << ", " << x2 - << ", relative tolerance = " << tol << ")" + << ", relative tolerance = " << tol_rel << ")" + << ", minimum tolerance = " << tol_min << ")" << "; relative diff = " << relative_diff << std::endl << " in: " << msg << std::endl; + } template & x1, */ template ...> void expect_near_rel(const std::string& msg, const T1& x1, const T2& x2, - double tol = 1e-8) { + double tol_rel = 1e-8, + double tol_min = std::numeric_limits::quiet_NaN()) { if (stan::math::is_nan(x1) || stan::math::is_nan(x2)) EXPECT_TRUE(stan::math::is_nan(x1) && stan::math::is_nan(x2)) << "expect_near_rel(" << x1 << ", " << x2 << ")" << std::endl @@ -99,7 +115,7 @@ void expect_near_rel(const std::string& msg, const T1& x1, const T2& x2, << std::endl << msg << std::endl; else - internal::expect_near_rel_finite(msg, x1, x2, tol); + internal::expect_near_rel_finite(msg, x1, x2, tol_rel, tol_min); } /** From 9e708aff848165dac06c2108da96c4cc9cd46dcb Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Mon, 13 Jan 2020 19:50:03 +0100 Subject: [PATCH 58/82] Fixing lbeta and binomial_coefficient_log (#1611, #1592) --- .../scal/fun/binomial_coefficient_log.hpp | 82 ++++++---------- stan/math/prim/scal/fun/lbeta.hpp | 52 +++++++++- stan/math/prim/scal/fun/lgamma_stirling.hpp | 14 +++ .../prim/scal/fun/lgamma_stirling_diff.hpp | 96 ++++++++++--------- .../fun/binomial_coefficient_log_test.cpp | 93 ++++++------------ test/unit/math/prim/scal/fun/lbeta_test.cpp | 33 +++++++ .../scal/fun/lgamma_stirling_diff_test.cpp | 50 +++------- 7 files changed, 214 insertions(+), 206 deletions(-) diff --git a/stan/math/prim/scal/fun/binomial_coefficient_log.hpp b/stan/math/prim/scal/fun/binomial_coefficient_log.hpp index 04a8b561046..7c17f4d996e 100644 --- a/stan/math/prim/scal/fun/binomial_coefficient_log.hpp +++ b/stan/math/prim/scal/fun/binomial_coefficient_log.hpp @@ -2,13 +2,11 @@ #define STAN_MATH_PRIM_SCAL_FUN_BINOMIAL_COEFFICIENT_LOG_HPP #include -#include #include +#include #include -#include -#include -#include -#include +#include +#include namespace stan { namespace math { @@ -27,12 +25,15 @@ namespace math { * * \f$ \log {N \choose n} * = \log \ \Gamma(N+1) - \log \Gamma(n+1) - \log \Gamma(N-n+1)\f$. + * * + * TODO[martinmodrak] figure out the cases for x < 0 and for partials \f[ \mbox{binomial\_coefficient\_log}(x, y) = \begin{cases} - \textrm{error} & \mbox{if } y > x \textrm{ or } y < 0\\ - \ln\Gamma(x+1) & \mbox{if } 0\leq y \leq x \\ + \textrm{error} & \mbox{if } y > x + 1 \textrm{ or } y < -1 \textrm{ or } x < 0\\ + \textrm{-\infty} & \mbox{if } y = x + 1 \textrm{ or } y = -1\\ + \ln\Gamma(x+1) & \mbox{if } -1 < y < x + 1 \\ \quad -\ln\Gamma(y+1)& \\ \quad -\ln\Gamma(x-y+1)& \\[6pt] \textrm{NaN} & \mbox{if } x = \textrm{NaN or } y = \textrm{NaN} @@ -59,66 +60,39 @@ namespace math { \end{cases} \f] * + * This function is numerically more stable than naive evaluation via lgamma + * * @param N total number of objects. * @param n number of objects chosen. * @return log (N choose n). */ -namespace internal { -constexpr double lbeta_stirling_bound = 10; -} - -inline double lbeta(const double a, const double b) { - double x; // x is the smaller of the two - double y; - if (a < b) { - x = a; - y = b; - } else { - x = b; - y = a; - } - - if (y < internal::lbeta_stirling_bound) { - // both small - return lgamma(x) + lgamma(y) - lgamma(x + y); - } else if (x < internal::lbeta_stirling_bound) { - // y large, x small - double stirling_diff - = lgamma_stirling_diff(y) - lgamma_stirling_diff(x + y); - double log_x_y = log(x + y); // log_sum_exp(log(x), log(y)); - double stirling = (y - 0.5) * log1p(-x / (x + y)) + x * (1 - log_x_y); - // std::cout << std::setprecision(18) << x << " " << y << std::endl; - // std::cout << std::setprecision(18) << lgamma_stirling_diff(y) << " " << - // lgamma(y) << " " << lgamma_stirling_diff(x + y) << " " << lgamma(x + y) - // << std::endl; - return stirling + lgamma(x) + stirling_diff; - } else { - // both large - double stirling_diff = lgamma_stirling_diff(x) + lgamma_stirling_diff(y) - - lgamma_stirling_diff(x + y); - double stirling = (x - 0.5) * log(x / (x + y)) + y * log1p(-x / (x + y)) - + 0.5 * (log(2 * stan::math::pi()) - log(y)); - return stirling + stirling_diff; - } -} - template inline return_type_t binomial_coefficient_log(const T_N N, const T_n n) { - const double CUTOFF = 1000; - const T_N N_plus_1 = N + 1; + if(is_nan(value_of_rec(N)) || is_nan(value_of_rec(n))) { + return std::numeric_limits::quiet_NaN(); + } + + // For some uses it is important this works even when N < 0 and therefore + // it is before checks if (n == 0) { return 0; - } else if (N - n < CUTOFF) { + } + const T_N N_plus_1 = N + 1; + + static const char* function = "binomial_coefficient_log"; + check_nonnegative(function, "first argument", N); + check_greater_or_equal(function, "second argument", n, -1); + check_greater_or_equal(function, "(first argument - second argument + 1)", + N - n + 1, 0.0); + + if (N / 2 < n) { + return binomial_coefficient_log(N, N - n); + } else if (N_plus_1 < lgamma_stirling_diff_useful) { return lgamma(N_plus_1) - lgamma(n + 1) - lgamma(N_plus_1 - n); } else { return -lbeta(N - n + 1, n + 1) - log(N_plus_1); - // return_type_t N_minus_n = N - n; - // const double one_twelfth = inv(12); - // return multiply_log(n, N_minus_n) + multiply_log((N + 0.5), N / - // N_minus_n) - // + one_twelfth / N - n - one_twelfth / N_minus_n - lgamma(n + 1); } } diff --git a/stan/math/prim/scal/fun/lbeta.hpp b/stan/math/prim/scal/fun/lbeta.hpp index 8b5af38646e..fca51ac0081 100644 --- a/stan/math/prim/scal/fun/lbeta.hpp +++ b/stan/math/prim/scal/fun/lbeta.hpp @@ -3,6 +3,12 @@ #include #include +#include +#include +#include +#include +#include +#include namespace stan { namespace math { @@ -22,7 +28,7 @@ namespace math { * * See stan::math::lgamma() for the double-based and stan::math for the * variable-based log Gamma function. - * + * This function is numerically more stable than naive evaluation via lgamma * \f[ \mbox{lbeta}(\alpha, \beta) = @@ -55,7 +61,49 @@ namespace math { */ template inline return_type_t lbeta(const T1 a, const T2 b) { - return lgamma(a) + lgamma(b) - lgamma(a + b); + typedef return_type_t T_ret; + + if(is_nan(value_of_rec(a)) || is_nan(value_of_rec(b))) { + return std::numeric_limits::quiet_NaN(); + } + + static const char* function = "lbeta"; + check_nonnegative(function, "first argument", a); + check_nonnegative(function, "second argument", b); + T_ret x; // x is the smaller of the two + T_ret y; + if (a < b) { + x = a; + y = b; + } else { + x = b; + y = a; + } + + // For large x or y, separate the lgamma values into Stirling approximations + // and appropriate corrections. The Stirling approximations allow for + // analytic simplifaction and the corrections are added later. + // + // The overall approach is inspired by the code in R, where the algorithm is + // credited to W. Fullerton of Los Alamos Scientific Laboratory + if (y < lgamma_stirling_diff_useful) { + // both small + return lgamma(x) + lgamma(y) - lgamma(x + y); + } else if (x < lgamma_stirling_diff_useful) { + // y large, x small + T_ret stirling_diff + = lgamma_stirling_diff(y) - lgamma_stirling_diff(x + y); + T_ret log_x_y = log(x + y); + T_ret stirling = (y - 0.5) * log1p(-x / (x + y)) + x * (1 - log_x_y); + return stirling + lgamma(x) + stirling_diff; + } else { + // both large + T_ret stirling_diff = lgamma_stirling_diff(x) + lgamma_stirling_diff(y) + - lgamma_stirling_diff(x + y); + T_ret stirling = (x - 0.5) * log(x / (x + y)) + y * log1p(-x / (x + y)) + + 0.5 * (log(2 * stan::math::pi()) - log(y)); + return stirling + stirling_diff; + } } } // namespace math diff --git a/stan/math/prim/scal/fun/lgamma_stirling.hpp b/stan/math/prim/scal/fun/lgamma_stirling.hpp index 209de3cb24c..ced1fd6584f 100644 --- a/stan/math/prim/scal/fun/lgamma_stirling.hpp +++ b/stan/math/prim/scal/fun/lgamma_stirling.hpp @@ -8,6 +8,20 @@ namespace stan { namespace math { +/** + * Return the Stirling approximation to the gamma function. + * + + \f[ + \mbox{lgamma_stirling}(x) = + \frac{1}{2} \log(2\pi) + (x-\frac{1}{2})*\log(x) - x + \f] + + * + * @param x value + * @return Stirling's approximation to lgamma(x). + * @tparam T Type of value. + */ template T lgamma_stirling(const T x) { using std::log; diff --git a/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp b/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp index 645444d4212..2c24f45cbaf 100644 --- a/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp +++ b/stan/math/prim/scal/fun/lgamma_stirling_diff.hpp @@ -2,63 +2,67 @@ #define STAN_MATH_PRIM_SCAL_FUN_LGAMMA_STIRLING_DIFF_HPP #include -//#include +#include #include #include +#include +#include #include +#include + namespace stan { namespace math { -namespace internal { -constexpr double lgamma_stirling_diff_big = 1e10; -} - -// namespace lgamma_stirling_diff_internal { -// typedef long double Real; +constexpr double lgamma_stirling_diff_useful = 10; -// boost::math::chebyshev_transform -// build_lgamma_stirling_diff_chebyshev() { -// std::cout << "Size: " << sizeof(Real) << std::endl; -// auto f = [](Real t) { -// Real x = 10 * std::sqrt(2 / (t + 1)); -// if(x > internal::lgamma_stirling_diff_big) { -// return 1.0 / (12.0 * x); -// } else { -// Real stirling = 0.5 -// * std::log(2* static_cast(stan::math::pi())) -// + (x - 0.5)*std::log(x) -x; -// return (std::lgamma(x) - stirling); -// } -// }; -// auto transform = boost::math::chebyshev_transform(f, -1, 1, -// 1e-8); std::cout << "Coeffs: " << transform.coefficients().size() << -// std::endl; -// //std::cout << transform.coefficients()[0]; -// size_t coeffs_to_print = -// std::min(size_t(20), transform.coefficients().size()); -// for(size_t i = 0; i < coeffs_to_print ; i ++) { -// std::cout << std::setprecision(17) << transform.coefficients()[i] -// << std::endl; -// } -// return transform; -// } +/** + * Return the difference between log of the gamma function and it's Stirling + * approximation. + * This is useful to stably compute log of ratios of gamma functions with large + * arguments where the Stirling approximation allows for analytic solution + * and the (small) differences can be added afterwards. + * This is for example used in the implementation of lbeta. + * + * The function will return correct value for all arguments, but the can add + * precision only when x >= lgamma_stirling_diff_useful. + * + \f[ + \mbox{lgamma_stirling_diff}(x) = + \log(\Gamma(x)) - \frac{1}{2} \log(2\pi) + + (x-\frac{1}{2})*\log(x) - x + \f] -// boost::math::chebyshev_transform lgamma_stirling_diff_chebyshev = -// build_lgamma_stirling_diff_chebyshev(); -// } + * + * @param x value + * @return Difference between lgamma(x) and it's Stirling approximation. + * @tparam T Type of value. + */ -double lgamma_stirling_diff(const double x) { - if (x < internal::lgamma_stirling_diff_big) { - return std::lgamma(static_cast(x)) - - lgamma_stirling(static_cast(x)); +template +T lgamma_stirling_diff(const T x) { + static const char* function = "lgamma_stirling_diff"; + check_nonnegative(function, "argument", x); - // double ten_over_x = 10.0 / x; - // double t = ten_over_x * ten_over_x * 2 - 1; - // return internal::lgamma_stirling_diff_chebyshev(t); - } else { - return 1.0 / (12.0 * x); - } + if (value_of(x) < lgamma_stirling_diff_useful) { + return lgamma(x) - lgamma_stirling(x); + } else { + // Using the Stirling series as expressed in formula 5.11.1. at + // https://dlmf.nist.gov/5.11 + constexpr double stirling_series[] = { + 0.0833333333333333333333333, -0.00277777777777777777777778, + 0.000793650793650793650793651,-0.000595238095238095238095238, + }; + constexpr int n_stirling_terms = 3; + T result(0.0); + T multiplier = inv(x); + T inv_x_squared = inv(square(x)); + for(int n = 0; n < n_stirling_terms; + n++, multiplier *= inv_x_squared) { + result += stirling_series[n] * multiplier; + } + return result; + } } } // namespace math diff --git a/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp b/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp index dc89b20f0a1..5a86fd89bf1 100644 --- a/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp +++ b/test/unit/math/prim/scal/fun/binomial_coefficient_log_test.cpp @@ -21,9 +21,13 @@ TEST(MathFunctions, binomial_coefficient_log) { EXPECT_FLOAT_EQ(29979.16, binomial_coefficient_log(100000, 91116)); + EXPECT_EQ(binomial_coefficient_log(-1, 0), 0); // Needed for neg_binomial_2 EXPECT_EQ(binomial_coefficient_log(50, 0), 0); EXPECT_EQ(binomial_coefficient_log(10000, 0), 0); + EXPECT_EQ(binomial_coefficient_log(10, 11), -std::numeric_limits::infinity()); + EXPECT_EQ(binomial_coefficient_log(10, -1), -std::numeric_limits::infinity()); + for (int n = 0; n < 1010; ++n) { test_binom_coefficient(1010, n); test_binom_coefficient(1010.0, n); @@ -44,6 +48,15 @@ TEST(MathFunctions, binomial_coefficient_log_nan) { EXPECT_TRUE(std::isnan(stan::math::binomial_coefficient_log(nan, nan))); } +TEST(MathFunctions, binomial_coefficient_log_errors) { + using stan::math::binomial_coefficient_log; + EXPECT_NO_THROW(binomial_coefficient_log(10, 11)); + EXPECT_THROW(binomial_coefficient_log(10, 11.01), std::domain_error); + EXPECT_THROW(binomial_coefficient_log(-1, 0.3), std::domain_error); + EXPECT_THROW(binomial_coefficient_log(10, -1.1), std::domain_error); + EXPECT_NO_THROW(binomial_coefficient_log(10, -0.9)); +} + namespace binomial_coefficient_test_internal { struct TestValue { double n; @@ -51,69 +64,7 @@ struct TestValue { double val; }; -std::vector testValues = { - {0.00003, 3.e-20, 1.4804082055036736261e-24}, - {0.00003, 3.e-15, 1.4804082053556342859e-19}, - {0.00003, 3.e-10, 1.4803934014216156867e-14}, - {0.00003, 3.e-7, 1.4656041234443424231e-11}, - {0.00003, 6.e-6, 2.3686531286936713477e-10}, - {0.00003, 0.000015, 3.7010205134852404454e-10}, - {0.00003, 0.0000291, 4.3079878779785775469e-11}, - {0.00003, 0.0000299999982, 8.8824487000750964998e-17}, - {0.00003, 0.00003, 1.4804082055036751063e-28}, - {0.002, 2.e-18, 6.5701370962226547789e-21}, - {0.002, 2.e-13, 6.5701370955656467768e-16}, - {0.002, 2.e-8, 6.5700713947654458316e-11}, - {0.002, 0.00002, 6.5044356407218957555e-8}, - {0.002, 0.0004, 1.0512217145828735086e-6}, - {0.002, 0.001, 1.6425337349621531325e-6}, - {0.002, 0.00194, 1.9119098219591897636e-7}, - {0.002, 0.00199999988, 3.9420820212083508274e-13}, - {0.002, 0.002, 6.5701370962226613484e-25}, - {1, 1.e-15, 9.999999999999988551e-16}, - {1, 1.e-10, 9.999999998855065933e-11}, - {1, 0.00001, 9.9998855069266455991e-6}, - {1, 0.01, 0.0098858370348613105263}, - {1, 0.2, 0.15645796291768801671}, - {1, 0.5, 0.24156447527049044469}, - {1, 0.97, 0.028978328236256312961}, - {1, 0.99999994, 5.9999995878237431346e-8}, - {1, 1., 9.999999999999999999e-20}, - {8, 8.e-15, 2.1742857142857086459e-14}, - {8, 8.e-10, 2.1742857137217315398e-9}, - {8, 0.00008, 0.00021742293180507342042}, - {8, 0.08, 0.21198226737825583898}, - {8, 1.6, 2.9067860629113428343}, - {8, 4, 4.2484952420493589891}, - {8, 7.76, 0.60627458624545365112}, - {8, 7.99999952, 1.3045712255376840361e-6}, - {8, 8., 2.1742857142857142852e-18}, - {1325, 1.325e-12, 1.0290957946506935679e-11}, - {1325, 1.325e-7, 1.0290957802047796044e-6}, - {1325, 0.01325, 0.10276604269137043037}, - {1325, 13.25, 71.989832127409062998}, - {1325, 265, 659.43564932902941932}, - {1325, 662.5, 914.5994503408452751}, - {1325, 1285.25, 175.78626065119186267}, - {1325, 1324.9999205, 0.00061745227641045219017}, - {1325, 1325., 1.029095794650838014e-15}, - {845000, 8.45e-10, 1.2019540397111151912e-8}, - {845000, 0.0000845, 0.0012019481673871213658}, - {845000, 8.45, 103.7383038277367436}, - {845000, 8450, 47315.861645757620061}, - {845000, 169000, 422833.22169549650655}, - {845000, 422500, 585702.31823555211409}, - {845000, 819650, 113851.15813267856212}, - {845000, 844999.9493, 0.7191087768194817628}, - {845000, 845000., 1.2019540397698355631e-12}, - {3000000000000000.0, 3, 105.12040658150832885}, - {3000000000000000.0, 100, 3199.999492802314355}, - {3000000000000000.0, 12895, 350387.52436058836877}, - {100000000000000000000.0, 3, 136.36334611041468604}, - {100000000000000000000.0, 100, 4241.4308104325278778}, - {100000000000000000000.0, 12895, 484680.0927690319003}, -}; - +std::vector testValues = { {0.00003,-0.9,-2.21375637737528044964112}, {0.00003,3.e-15,1.48040820535563428588846e-19}, {0.00003,3.e-10,1.48039340142161568666212e-14}, {0.00003,3.e-7,1.46560412344434242311062e-11}, {0.00003,6.e-6,2.36865312869367134774661e-10}, {0.00003,0.000015,3.70102051348524044535716e-10}, {0.00003,0.0000291,4.30798787797857754693695e-11}, {0.00003,0.0000299999982,8.88244870007509649977929e-17}, {0.00003,0.00002999999991,4.44122460318735146597007e-18}, {0.00003,0.90003,-2.21375637737528044964112}, {0.002,-0.9,-2.21559326412971099686943}, {0.002,2.e-13,6.57013709556564677684856e-16}, {0.002,2.e-8,6.57007139476544583161173e-11}, {0.002,0.00002,6.50443564072189575550994e-8}, {0.002,0.0004,1.05122171458287350859763e-6}, {0.002,0.001,1.64253373496215313253469e-6}, {0.002,0.00194,1.91190982195918976356429e-7}, {0.002,0.00199999988,3.94208202120835082737684e-13}, {0.002,0.001999999994,1.97104112295366725515452e-14}, {0.002,0.902,-2.21559326412971099686943}, {1,-0.9,-2.85558226198351740582195}, {1,1.e-10,9.9999999988550659331851e-11}, {1,0.00001,9.99988550692664559909352e-6}, {1,0.01,0.00988583703486131052627978}, {1,0.2,0.156457962917688016707705}, {1,0.5,0.241564475270490444691037}, {1,0.97,0.028978328236256312960776}, {1,0.99999994,5.99999958782374313463811e-8}, {1,0.999999997,2.99999998969559340736596e-9}, {1,1.9,-2.85558226198351740582195}, {8,-0.9,-4.22528965320883461943031}, {8,8.e-10,2.17428571372173153982474e-9}, {8,0.00008,0.000217422931805073420417006}, {8,0.08,0.211982267378255838975509}, {8,1.6,2.90678606291134283426263}, {8,4,4.24849524204935898912334}, {8,7.76,0.606274586245453651115361}, {8,7.99999952,1.30457122553768403613331e-6}, {8,7.999999976,6.52285709209869625945566e-8}, {8,8.9,-4.22528965320883461943031}, {1325,-0.9,-8.72360867216657209762532}, {1325,1.325e-7,1.02909578020477960435539e-6}, {1325,0.01325,0.102766042691370430370992}, {1325,13.25,71.9898321274090629975055}, {1325,265,659.435649329029419323398}, {1325,662.5,914.599450340845275100724}, {1325,1285.25,175.786260651191862665015}, {1325,1324.9999205,0.000617452276410452190170437}, {1325,1324.999996025,0.0000308728608380968862741097}, {1325,1325.9,-8.72360867216657209762532}, {845000,-0.9,-14.5350963792733464918229}, {845000,0.0000845,0.00120194816738712136581358}, {845000,8.45,103.738303827736743600251}, {845000,8450,47315.8616457576200611209}, {845000,169000,422833.221695496506553128}, {845000,422500,585702.318235552114086514}, {845000,819650,113851.158132678562120685}, {845000,844999.9493,0.719108776819481762797449}, {845000,844999.997465,0.036053342347290003917417}, {845000,845000.9,-14.5350963792733464918229}, {3000000000000000.0,3,105.120406581508328854183}, {3000000000000000.0,100,3199.99949280231435502243}, {3000000000000000.0,12895,350387.5243605883687667}, {100000000000000000000.0,3,136.363346110414686040237}, {100000000000000000000.0,100,4241.4308104325278778424}, {100000000000000000000.0,12895,484680.092769031900296878},}; } // namespace binomial_coefficient_test_internal TEST(MathFunctions, binomial_coefficient_log_precomputed) { @@ -122,10 +73,22 @@ TEST(MathFunctions, binomial_coefficient_log_precomputed) { using stan::test::expect_near_rel; for (TestValue t : testValues) { - double val = stan::math::binomial_coefficient_log(t.n, t.k); std::ostringstream msg; - msg << "n = " << t.n << ", k = " << t.k; + msg << std::setprecision(22) << "n = " << t.n << ", k = " << t.k; + + double val = stan::math::binomial_coefficient_log(t.n, t.k); expect_near_rel(msg.str(), val, t.val); + + if(t.k > t.n / 10) { + // Testing the mirrored binomial coefficient is not performed for + // small k, as we may loose so much precision computing k2 + // that the test becomes invalid + std::ostringstream msg2; + double k2 = t.n - t.k; + msg2 << std::setprecision(22) << "n = " << t.n << ", k = " << k2; + double val2 = stan::math::binomial_coefficient_log(t.n, k2); + expect_near_rel(msg2.str(), val2, t.val); + } } } diff --git a/test/unit/math/prim/scal/fun/lbeta_test.cpp b/test/unit/math/prim/scal/fun/lbeta_test.cpp index 512a103bd44..d924680f1ce 100644 --- a/test/unit/math/prim/scal/fun/lbeta_test.cpp +++ b/test/unit/math/prim/scal/fun/lbeta_test.cpp @@ -32,6 +32,39 @@ namespace lbeta_test_internal { double val; }; +// Test values generated in Mathematice, reproducible notebook at +// https://www.wolframcloud.com/obj/martin.modrak/Published/lbeta.nb +// Mathematica Code reproduced below for convenience: +// +// lbeta[x_,y_]:= LogGamma[x] + LogGamma[y] - LogGamma[x + y] +// out = OpenWrite["lbeta_test.txt"] +// xs= {8*10^-8,4*10^-3,1,1+10^-8,5,23, 19845}; +// ys = {7*10^-11,2*10^-5,1+10^-12,1/2,2,1624}; +// WriteString[out, "std::vector testValues = {"]; +// For[i = 1, i <= Length[xs], i++, { +// For[j = 1, j <= Length[ys], j++, { +// cx = xs[[i]]; +// cy = ys[[j]]; + +// val = N[lbeta[cx,cy],24]; +// WriteString[out," {",CForm[cx],",",CForm[cy],",", +// CForm[val],"},"] +// }] +// }] +// extremeXs = {3*10^15,10^20}; +// lowYs = {3, 100, 12895}; +// For[i = 1, i <= Length[extremeXs], i++, { +// For[j = 1, j <= Length[lowYs], j++, { +// cx = extremeXs[[i]]; +// cy = lowYs[[j]]; +// val = N[lbeta[cx,cy],24]; +// WriteString[out," {",CForm[cx],".0,",CForm[cy],",", +// CForm[val],"},"] +// }] +// }] +// WriteString[out,"};"]; +// Close[out]; +// FilePrint[%] std::vector testValues = { {8.e-8,7.e-11,23.3834004912898500586445}, {8.e-8,0.00002,16.3452312235394351410033}, {8.e-8,1.000000000001,16.3412392022725295437606}, {8.e-8,0.5,16.3412393131760679059067}, {8.e-8,2,16.3412391222725327438921}, {8.e-8,1624,16.3412385647081130254943}, {0.004,7.e-11,23.3825258913787298259023}, {0.004,0.00002,10.8247656947117878792194}, {0.004,1.000000000001,5.52146091786223987264715}, {0.004,0.5,5.52697992926150653113797}, {0.004,2,5.51746889659270898022044}, {0.004,1624,5.48959582574332555214719}, {1,7.e-11,23.3825258738791892190926}, {1,0.00002,10.8197782844102831106727}, {1,1.000000000001,-9.999999999995e-13}, {1,0.5,0.693147180559945309417232}, {1,2,-0.693147180559945309417232}, {1,1624,-7.39264752072162326054032}, {1.00000001,7.e-11,23.3825258738791892179411}, {1.00000001,0.00002,10.8197782844099541286699}, {1.00000001,1.000000000001,-1.00009999500064491739816e-8}, {1.00000001,0.5,0.693147174422888956122731}, {1.00000001,2,-0.693147195559945246917232}, {1.00000001,1624,-7.39264760042333353631934}, {5,7.e-11,23.3825258737333558857627}, {5,0.00002,10.8197366180283355258393}, {5,1.000000000001,-1.60943791243638370793409}, {5,0.5,-0.207395194346070587158746}, {5,2,-3.40119738166215537541324}, {5,1624,-33.7913357290267948074624}, {23,7.e-11,23.3825258736208322915813}, {23,0.00002,10.819704468465374949026}, {23,1.000000000001,-3.13549421593288398231784}, {23,0.5,-0.989947810259228199543883}, {23,2,-6.31354804627709531045369}, {23,1624,-121.714785277510463870251}, {19845,7.e-11,23.3825258731460863706715}, {19845,0.00002,10.8195688267825637640878}, {19845,1.000000000001,-9.89570736522763869861762}, {19845,0.5,-4.37548244086806082919414}, {19845,2,-19.7914651196913525680177}, {19845,1624,-5756.4146766727238501215}, {3000000000000000.0,3,-106.219018870176440545578}, {3000000000000000.0,100,-3204.60466298830574639047}, {3000000000000000.0,12895,-350396.988955562106921852}, {100000000000000000000.0,3,-137.461958399082795731692}, {100000000000000000000.0,100,-4246.03598061851596930944}, {100000000000000000000.0,12895,-484689.557363950217404711},}; } diff --git a/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp b/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp index e7c96deeeb0..35c4c08f048 100644 --- a/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp +++ b/test/unit/math/prim/scal/fun/lgamma_stirling_diff_test.cpp @@ -10,16 +10,17 @@ TEST(MathFunctions, lgamma_stirling_diff_errors) { } TEST(MathFunctions, lgamma_stirling_diff_accuracy) { - using stan::math::internal::lgamma_stirling_diff_big; + using stan::math::lgamma_stirling_diff_useful; using stan::math::lgamma_stirling_diff; using stan::test::expect_near_rel; - long double start = std::nextafter(10, 11); - for (long double x = start; x < 2 * lgamma_stirling_diff_big; x *= 1.5) { + double start = std::nextafter(10, 11); + for (double x = start; x < 1e8; x *= 1.5) { + long double x_l = static_cast(x); long double stirling = 0.5 * std::log(2 * static_cast(stan::math::pi())) - + (x - 0.5) * std::log(x) - x; - long double lgamma_res = std::lgamma(x); + + (x_l - 0.5) * std::log(x_l) - x_l; + long double lgamma_res = std::lgamma(x_l); double diff_actual = static_cast(lgamma_res - stirling); double diff = lgamma_stirling_diff(x); @@ -29,8 +30,8 @@ TEST(MathFunctions, lgamma_stirling_diff_accuracy) { expect_near_rel(msg.str(), diff, diff_actual, 1e-4); } - double before_big = std::nextafter(lgamma_stirling_diff_big, 0); - double after_big = std::nextafter(lgamma_stirling_diff_big, + double before_big = std::nextafter(lgamma_stirling_diff_useful, 0); + double after_big = std::nextafter(lgamma_stirling_diff_useful, stan::math::positive_infinity()); expect_near_rel("big cutoff", lgamma_stirling_diff(before_big), lgamma_stirling_diff(after_big)); @@ -42,37 +43,8 @@ struct TestValue { double val; }; -std::vector testValues = { - {10.049787068367863943, 0.0082893206359322200849}, - {10.135335283236612692, 0.0082193992370778811855}, - {10.367879441171442322, 0.0080351590240775284273}, - {11., 0.007573675487951840795}, - {12.718281828459045235, 0.0065508998676477812047}, - {17.389056098930650227, 0.0047917583976502091168}, - {30.085536923187667741, 0.0027697782366142911547}, - {64.598150033144239078, 0.0012900163188678122747}, - {158.41315910257660342, 0.00052604987562270910548}, - {413.42879349273512261, 0.0002015663117649479817}, - {1106.6331584284585993, 0.000075303482848309432847}, - {2990.9579870417282747, 0.000027861753118520084151}, - {8113.0839275753840077, 0.000010271474329002342817}, - {22036.465794806716517, 3.7816106313768371052e-6}, - {59884.141715197818455, 1.3915759823173656792e-6}, - {162764.79141900392081, 5.1198623858832122975e-7}, - {442423.39200892050333, 1.8835652643709875774e-7}, - {1.2026142841647767777e6, 6.9293483730078043652e-8}, - {3.2690273724721106393e6, 2.5491782061865871668e-8}, - {8.8861205205078726368e6, 9.3779206731455076929e-9}, - {2.4154962753575298215e7, 3.4499466707312036902e-9}, - {6.5659979137330511139e7, 1.2691647854325126115e-9}, - {1.7848231096318726084e8, 4.6689967696866715977e-10}, - {4.8516520540979027797e8, 1.717627983295846792e-10}, - {1.3188157444832146972e9, 6.318800308680570434e-11}, - {3.5849128561315915617e9, 2.3245567375731604902e-11}, - {9.7448034562489026e9, 8.5515663509760607976e-12}, - {2.6489122139843472294e10, 3.1459454523782780579e-12}, - {7.2004899347385872524e10, 1.1573286552529392289e-12}, -}; +std::vector testValues = { {1.049787068367863943,0.077388806767834476832}, {1.1353352832366126919,0.071790358566585005482}, {1.3678794411714423216,0.059960812482712981438}, {2.,0.041340695955409294094}, {3.7182818284590452354,0.022358812123082674471}, {8.3890560989306502272,0.0099288907523535997267}, {21.085536923187667741,0.0039518599801395734578}, {55.598150033144239078,0.0014988346688724404687}, {149.41315910257660342,0.0005577367442531155476}, {404.42879349273512261,0.00020605188772717995062}, {1097.6331584284585993,0.000075920930766205666598}, {2981.9579870417282747,0.00002794584410078046085}, {8104.0839275753840077,0.000010282881326966996581}, {22027.465794806716517,3.7831557249429676373e-6}, {59875.141715197818455,1.3917851539949910276e-6}, {162755.79141900392081,5.1201455018391551878e-7}, {442414.39200892050333,1.8836035815859912686e-7}, {1.2026052841647767777e6,6.9294002305342748064e-8}, {3.2690183724721106393e6,2.5491852243801980915e-8}, {8.8861115205078726368e6,9.3779301712579119232e-9}, {2.4154953753575298215e7,3.4499479561619419703e-9}, {6.5659970137330511139e7,1.2691649593966957356e-9}, {1.7848230196318726084e8,4.6689970051216164913e-10}, {4.8516519640979027797e8,1.7176280151585029843e-10}, {1.3188157354832146972e9,6.3188003518019870566e-11}, {3.5849128471315915617e9,2.3245567434090096532e-11}, {9.7448034472489026e9,8.5515663588740238069e-12}, {2.6489122130843472294e10,3.1459454534471511195e-12}, {7.2004899338385872524e10,1.1573286553975954675e-12}, {1.9572960942983876427e11,4.2575741900310182743e-13}, {5.3204824060279861668e11,1.5662740137796255552e-13}, {1.4462570642924751737e12,5.7620000891128517638e-14},}; + } // namespace lgamma_stirling_diff_test_internal TEST(MathFunctions, lgamma_stirling_diff_precomputed) { @@ -83,6 +55,6 @@ TEST(MathFunctions, lgamma_stirling_diff_precomputed) { for (TestValue t : testValues) { std::ostringstream msg; msg << "x = " << t.x; - expect_near_rel(msg.str(), lgamma_stirling_diff(t.x), t.val); + expect_near_rel(msg.str(), lgamma_stirling_diff(t.x), t.val, 1e-10); } } \ No newline at end of file From a791f8ffd08737c63705079a665ea1b5a94ef70a Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Mon, 13 Jan 2020 19:50:41 +0100 Subject: [PATCH 59/82] Fixing derivative w.r.t. phi for large difference between mu and phi --- stan/math/prim/prob/neg_binomial_2_lpmf.hpp | 12 +- .../math/rev/prob/neg_binomial_2_test.cpp | 570 ++++++------------ 2 files changed, 189 insertions(+), 393 deletions(-) diff --git a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp index f9e867d23a9..e07abc03d6e 100644 --- a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp @@ -141,10 +141,16 @@ return_type_t neg_binomial_2_lpmf( - (n_vec[i] + phi_val[i]) / (mu_val[i] + phi_val[i]); } if (!is_constant_all::value) { + T_partials_return log_term; + if(mu_val[i] < phi_val[i]) { + log_term = log1p(-mu_val[i]/(mu_val[i] + phi_val[i])); + } else { + log_term = log_phi[i] - log_mu_plus_phi[i]; + } ops_partials.edge2_.partials_[i] - += 1.0 - n_plus_phi[i] / (mu_val[i] + phi_val[i]) + log_phi[i] - - log_mu_plus_phi[i] - digamma(phi_val[i]) - + digamma(n_plus_phi[i]); + += (mu_val[i] - n_vec[i]) / (mu_val[i] + phi_val[i]) + + log_term + - (digamma(phi_val[i]) - digamma(n_plus_phi[i])); } } } diff --git a/test/unit/math/rev/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/prob/neg_binomial_2_test.cpp index 10aad48bb84..4ca9374cd6d 100644 --- a/test/unit/math/rev/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/prob/neg_binomial_2_test.cpp @@ -13,401 +13,190 @@ struct TestValue { double phi; double value; double grad_mu; - double grad_phi; - - TestValue(int _n, double _mu, double _phi, double _value, double _grad_mu, - double _grad_phi) - : n(_n), - mu(_mu), - phi(_phi), - value(_value), - grad_mu(_grad_mu), - grad_phi(_grad_phi) {} + double grad_phi; }; // Test data generated in Mathematica (Wolfram Cloud). The code can be re-ran // at https://www.wolframcloud.com/env/martin.modrak/NegBinomial2_Tests.nb // but is also presented below for convenience: // -// nb2[n_,mu_,phi_]:= LogGamma[n + phi] - LogGamma[n + 1] - LogGamma[phi] + -// n * (Log[mu] - Log[mu + phi]) + phi * (Log[phi] - Log[mu + phi]) -// nb2dmu[n_,mu_,phi_]= D[nb2[n, mu, phi],mu]; -// nb2dphi[n_,mu_,phi_]= D[nb2[n, mu, phi],phi]; -// out = OpenWrite["nb_test.txt"] -// mus= {256*10^-7,314*10^-3,15*10^-1,3,180, 1123,10586}; -// phis= {4*10^-4,65*10^-3,442*10^-2,800, 15324}; -// ns = {0,6,14,1525,10233}; -// WriteString[out, "std::vector testValues = {"]; -// For[k = 1, k <= Length[ns], k++, { -// For[i = 1, i <= Length[mus], i++, { -// For[j = 1, j <= Length[phis], j++, { -// cmu = mus[[i]]; -// cphi = phis[[j]]; -// cn=ns[[k]]; -// val = N[nb2[cn,cmu,cphi], 20]; -// ddmu= N[nb2dmu[cn,cmu,cphi], 20]; -// ddphi= N[nb2dphi[cn,cmu,cphi], 20]; -// WriteString[out," TestValue(",CForm[cn],",",CForm[cmu],",", -// CForm[cphi],",", CForm[val],",",CForm[ddmu],",",CForm[ddphi],"),"] -// }] -// }] -// }] -// WriteString[out,"};"]; -// Close[out]; -// FilePrint[%] -std::vector testValues = { - TestValue(0, 0.0000256, 0.0004, -0.000024814156367781056525, - -0.93984962406015037594, -0.001885014979603017252), - TestValue(0, 0.0000256, 0.065, -0.000025594960092486140389, - -0.9996063088998794321, -7.7516686911183493794e-8), - TestValue(0, 0.0000256, 4.42, -0.000025599925864539648095, - -0.9999942081783417725, -1.6772663823239562834e-11), - TestValue(0, 0.0000256, 800, -0.000025599999590400008738, - -0.999999968000001024, -5.119999781546674531e-16), - TestValue(0, 0.0000256, 15324, -0.000025599999978616549228, - -0.99999999832941790934, -1.3954222623666383236e-18), - TestValue(0, 0.314, 0.0004, -0.002666782716971682618, - -0.0012722646310432569975, -5.668229057060249802), - TestValue(0, 0.314, 0.065, -0.11460468078714130042, -0.17150395778364116095, - -0.93465289297043039811), - TestValue(0, 0.314, 4.42, -0.30334820230965961631, -0.93367131389945078158, - -0.0023021289016362151355), - TestValue(0, 0.314, 800, -0.313938393619808991, -0.99960765399580664589, - -7.6987831407130236997e-8), - TestValue(0, 0.314, 15324, -0.3139967829987878124, -0.99997950968637160528, - -2.0992934397861783072e-10), - TestValue(0, 1.5, 0.0004, -0.0032919111000327549336, - -0.00026659557451346307651, -7.2300443456564007971), - TestValue(0, 1.5, 0.065, -0.20678149915011007124, -0.041533546325878594249, - -2.2227873794044950749), - TestValue(0, 1.5, 4.42, -1.2915096474038793989, -0.74662162162162162162, - -0.038818374427929177938), - TestValue(0, 1.5, 800, -1.4985955053442782733, -0.99812850904553961323, - -1.7534272199610668797e-6), - TestValue(0, 1.5, 15324, -1.4999265905382969801, -0.9999021239111285113, - -4.7901769514626171505e-9), - TestValue(0, 3, 0.0004, -0.003569116649587854519, - -0.00013331555792560991868, -7.9229249395275619074), - TestValue(0, 3, 0.065, -0.25047201260085385312, -0.021207177814029363785, - -2.8746227562887040272), - TestValue(0, 3, 4.42, -2.2897339760163958674, -0.59568733153638814016, - -0.11372669262607046311), - TestValue(0, 3, 800, -2.9943890230675014931, -0.99626400996264009963, - -6.9962414744764927742e-6), - TestValue(0, 3, 15324, -2.9997063813121767354, -0.99980426697983949892, - -1.9158207560574170962e-8), - TestValue(0, 180, 0.0004, -0.0052068020335865022334, - -2.2222172839615911965e-6, -12.017007306183539545), - TestValue(0, 180, 0.065, -0.51523458388368826209, - -0.00036098075694887957127, -6.9270468866598452194), - TestValue(0, 180, 4.42, -16.491356225074536835, -0.023967031775295521093, - -2.7550431007966839452), - TestValue(0, 180, 800, -162.35267519735224589, -0.81632653061224489796, - -0.019267374608935205317), - TestValue(0, 180, 15324, -178.95104102256056893, -0.98839009287925696594, - -0.000067921189264833924309), - TestValue(0, 1123, 0.0004, -0.0059391221287133807664, - -3.5618865318302647087e-7, -13.847805677972105099), - TestValue(0, 1123, 0.065, -0.63421701478373420435, - -0.000057877326779839101032, -8.7572427201534599061), - TestValue(0, 1123, 4.42, -24.493639593452325812, -0.0039204555533873800358, - -4.5454678748864927673), - TestValue(0, 1123, 800, -701.62401433668194795, -0.41601664066562662507, - -0.29304665858647906001), - TestValue(0, 1123, 15324, -1083.7571513972578336, -0.93172007052957986259, - -0.0024429334503092957394), - TestValue(0, 10586, 0.0004, -0.0068365334804239916148, - -3.7785753342688330146e-8, -16.09133373884573238), - TestValue(0, 10586, 0.065, -0.78004301710859758932, - -6.1401474485561915594e-6, -11.0006679418181807), - TestValue(0, 10586, 4.42, -34.39451907585020003, -0.00041735832950912239552, - -6.7819827601055724777), - TestValue(0, 10586, 800, -2124.4224654744799162, -0.070261724925346917267, - -1.7257898067684468125), - TestValue(0, 10586, 15324, -8048.2991567805804192, -0.59143187958317252026, - -0.11664064731878857477), - TestValue(6, 0.0000256, 0.0004, -26.480362597222490265, - 220276.31578947368421, -11595.463497838709543), - TestValue(6, 0.0000256, 0.065, -51.419388136448102673, - 234281.72904210034202, -74.693807545973030394), - TestValue(6, 0.0000256, 4.42, -67.52038137511190777, 234372.64254759067459, - -0.43125592475849002503), - TestValue(6, 0.0000256, 800, -69.998079065742703551, 234373.99250003224, - -0.000023330384471037817491), - TestValue(6, 0.0000256, 15324, -70.015807321298395432, - 234373.99960845899308, -6.3861427657507748849e-8), - TestValue(6, 0.314, 0.0004, -9.6251974944123758225, 0.023038524497171844865, - 2477.5305495558165941), - TestValue(6, 0.314, 0.065, -5.6231627412658002701, 3.1056417323496294304, - 0.81175666468752807101), - TestValue(6, 0.314, 4.42, -11.748118636048988335, 16.907181817937188357, - -0.34352697543671422216), - TestValue(6, 0.314, 800, -13.827010724885832016, 18.101175543376294868, - -0.000020465017270475111936), - TestValue(6, 0.314, 15324, -13.842565956985816742, 18.107909210435378814, - -5.6049178830042368725e-8), - TestValue(6, 1.5, 0.0004, -9.6197839616192332262, 0.00079978672354038922954, - 2491.0537701151673519), - TestValue(6, 1.5, 0.065, -4.8410045398874440986, 0.12460063897763578275, - 11.520890928200777244), - TestValue(6, 1.5, 4.42, -4.6947113008756524511, 2.2398648648648648649, - -0.12612961153608977325), - TestValue(6, 1.5, 800, -5.6375883578559464151, 2.9943855271366188397, - -0.000011047869532026303582), - TestValue(6, 1.5, 15324, -5.6459956995659817151, 2.9997063717333855339, - -3.0329592747982916341e-8), - TestValue(6, 3, 0.0004, -9.6192613271356102502, 0.00013331555792560991868, - 2492.3600897701139881), - TestValue(6, 3, 0.065, -4.7587824423548651205, 0.021207177814029363785, - 12.745335721641112642), - TestValue(6, 3, 4.42, -2.8891081958287456629, 0.59568733153638814016, - 0.0038502468520587354154), - TestValue(6, 3, 800, -2.9857172436024219525, 0.99626400996264009963, - -2.3069406647953774853e-6), - TestValue(6, 3, 15324, -2.9874796347761073428, 0.99980426697983949892, - -6.3824584044662864326e-9), - TestValue(6, 180, 0.0004, -9.620112399166720505, -2.1481433744962048232e-6, - 2490.2324075130827354), - TestValue(6, 180, 0.065, -4.897099604874425479, -0.00034894806505058358556, - 10.617175935000477685), - TestValue(6, 180, 4.42, -11.802883319144519128, -0.023168130716119003723, - -1.861375256665487843), - TestValue(6, 180, 800, -138.97312319086169782, -0.78911564625850340136, - -0.01791315421299756019), - TestValue(6, 180, 15324, -154.44163935948173426, -0.95544375644994840041, - -0.000063439277219443465219), - TestValue(6, 1123, 0.0004, -9.6208335230756285524, - -3.5428559715533443274e-7, 2488.4295995707558483), - TestValue(6, 1123, 0.065, -5.0142630342277769584, - -0.000057568097963562133439, 8.8149588796763128876), - TestValue(6, 1123, 4.42, -19.683182166303213058, -0.0038995092191751589493, - -3.6245874838477290528), - TestValue(6, 1123, 800, -671.30418475064697583, -0.4137939337698174, - -0.28869011401594177783), - TestValue(6, 1123, 15324, -1048.6172073187539315, -0.92674204700048148398, - -0.0024162628059421836267), - TestValue(6, 10586, 0.0004, -9.6217290240095637933, - -3.7764336894543976284e-8, 2486.1908475533798261), - TestValue(6, 10586, 0.065, -5.1597786035400147054, - -6.1366672969700081899e-6, 6.576309397642172055), - TestValue(6, 10586, 4.42, -29.562997357281896989, - -0.00041712177651676884042, -5.856347033468783979), - TestValue(6, 10586, 800, -2091.3124520859014907, -0.07022190154073024605, - -1.7188401003298574325), - TestValue(6, 10586, 15324, -8002.4249559448888988, -0.59109666408369216554, - -0.11648073932479483488), - TestValue(14, 0.0000256, 0.0004, -49.814562438358640072, - 513979.32330827067669, -30391.559221530806766), - TestValue(14, 0.0000256, 0.065, -114.92817109028837255, - 546658.70057331266455, -196.8323920932659291), - TestValue(14, 0.0000256, 4.42, -161.64931287705226916, - 546870.83260332247849, -1.6501286909020252132), - TestValue(14, 0.0000256, 800, -173.09898662779720676, 546873.98250003256, - -0.00014060727924520899117), - TestValue(14, 0.0000256, 15324, -173.2061650426294071, - 546873.99908640208975, -3.8729368917100577369e-7), - TestValue(14, 0.314, 0.0004, -10.482321240387567839, - 0.055452910001458647348, 2452.9820144458617505), - TestValue(14, 0.314, 0.065, -7.9175397204269351928, 7.475169319193990219, - -19.406538514452968028), - TestValue(14, 0.314, 4.42, -31.109603016060397045, 40.694985993719373875, - -1.442358303971396938), - TestValue(14, 0.314, 800, -41.614610107637548392, 43.568886473205763553, - -0.00013381877200270250453), - TestValue(14, 0.314, 15324, -41.716640281901644559, 43.585094170597712707, - -3.6878520278347562598e-7), - TestValue(14, 1.5, 0.0004, -10.468856159359487018, 0.0022216297876121923043, - 2486.6186161358083867), - TestValue(14, 1.5, 0.065, -5.9696014927268124315, 0.34611288604898828541, - 7.2989540823233662764), - TestValue(14, 1.5, 4.42, -13.334103973863653606, 6.2218468468468468468, - -0.88640946083488260684), - TestValue(14, 1.5, 800, -20.926415102268522946, 8.3177375753794967769, - -0.00010961017476158336951), - TestValue(14, 1.5, 15324, -21.010069937869350607, 8.3325176992594042609, - -3.0266583844869157132e-7), - TestValue(14, 3, 0.0004, -10.467267071498293274, 0.00048882371239390303515, - 2490.5905361225120861), - TestValue(14, 3, 0.065, -5.7194959138831364402, 0.077759651984774333877, - 11.025105769529760809), - TestValue(14, 3, 4.42, -7.7900642906041824751, 2.1841868823000898473, - -0.48324536699834770639), - TestValue(14, 3, 800, -12.744324478712668241, 3.6529680365296803653, - -0.000082224255065357307428), - TestValue(14, 3, 15324, -12.807159398994470731, 3.6659489789260781627, - -2.2763181750167069646e-7), - TestValue(14, 180, 0.0004, -10.467069325725552339, -2.049378161875689659e-6, - 2491.0847206783138), - TestValue(14, 180, 0.065, -5.6892191980516647312, - -0.00033290447585285560461, 11.462631774529800832), - TestValue(14, 180, 4.42, -9.6533765795967992717, -0.02210292930388364723, - -1.3136829976451384132), - TestValue(14, 180, 800, -117.57055678993798607, -0.7528344671201814059, - -0.016193696733894170103), - TestValue(14, 180, 15324, -131.59841923497641062, -0.9115153078775369797, - -0.000057701678183561534688), - TestValue(14, 1123, 0.0004, -10.467775521386168611, - -3.5174818911841171522e-7, 2489.3192333086024842), - TestValue(14, 1123, 0.065, -5.8039572920094235935, - -0.000057155792875192843316, 9.6977197567649025541), - TestValue(14, 1123, 4.42, -17.371029398463366472, -0.0038715807735588641672, - -3.0406118289506228066), - TestValue(14, 1123, 800, -640.64791491033069867, -0.41083032457540509991, - -0.28296755763737220502), - TestValue(14, 1123, 15324, -1011.5999306403485179, -0.92010468229501697917, - -0.0023809402304773394913), - TestValue(14, 10586, 0.0004, -10.468668475096403359, - -3.7735781630351504468e-8, 2487.0868493492232687), - TestValue(14, 10586, 0.065, -5.9490589506381604899, - -6.1320270948550970306e-6, 7.4654379275715350026), - TestValue(14, 10586, 4.42, -27.222758867549796685, - -0.00041680637252696410027, -5.2660309311076446873), - TestValue(14, 10586, 800, -2056.9359371755272758, -0.070168803694574684427, - -1.7096599947938850626), - TestValue(14, 10586, 15324, -7951.0953369235666607, -0.5906497100843850259, - -0.11626776694982782037), - TestValue(1525, 0.0000256, 0.0004, -4301.7847274670157821, - 5.5987134868421052632e7, -3.5806687876344080158e6), - TestValue(1525, 0.0000256, 0.065, -11965.467128123482119, - 5.9546859198531040083e7, -23429.112689114767404), - TestValue(1525, 0.0000256, 4.42, -18367.342891800584413, - 5.9569966479379666941e7, -339.05708253439450269), - TestValue(1525, 0.0000256, 800, -24826.228135638531385, - 5.9570309593750093e7, -0.83897628761764105052), - TestValue(1525, 0.0000256, 15324, -25707.717028801610058, - 5.9570311400482904473e7, -0.0046430629133236893109), - TestValue(1525, 0.314, 0.0004, -17.094738795518807033, - 6.1777199721236284663, -2348.2711549792054389), - TestValue(1525, 0.314, 0.065, -296.5855682860990671, 832.76969228442263415, - -4001.4921811261694014), - TestValue(1525, 0.314, 4.42, -4115.1016067852616032, 4533.6164996945796636, - -316.17648561909186371), - TestValue(1525, 0.314, 800, -10469.942676752557863, 4853.7827883447466615, - -0.83822851603497641238), - TestValue(1525, 0.314, 15324, -11350.864477542964446, 4855.5884035212585267, - -0.0046410241529681445478), - TestValue(1525, 1.5, 0.0004, -15.560537541616769004, 0.27077223851417399804, - 1484.2803077520377337), - TestValue(1525, 1.5, 0.065, -74.450927586875279684, 42.184238551650692226, - -953.4745083343278627), - TestValue(1525, 1.5, 4.42, -2072.1910365790187577, 758.31869369369369369, - -251.67662613527664787), - TestValue(1525, 1.5, 800, -8088.5487996808837997, 1013.7658556872530672, - -0.8354105724129184353), - TestValue(1525, 1.5, 15324, -8967.3316408400039725, 1015.5672571857361913, - -0.0046333275254863264045), - TestValue(1525, 3, 0.0004, -15.357522072066896545, 0.067635426387592765409, - 1991.7174903993567368), - TestValue(1525, 3, 0.065, -42.491829475398155315, 10.75910821098423056, - -477.23846708705704922), - TestValue(1525, 3, 4.42, -1360.5497881858611964, 302.21203953279424978, - -199.67578957112613322), - TestValue(1525, 3, 800, -7035.8464992378503203, 505.43794105437941054, - -0.83186161385039575293), - TestValue(1525, 3, 15324, -7911.9312240083236782, 507.23403144777190579, - -0.0046236034557581425194), - TestValue(1525, 180, 0.0004, -15.159228863591761992, - 0.000016604901371824111996, 2487.4167692289850077), - TestValue(1525, 180, 0.065, -10.618383986015501881, - 0.0026973284338680167964, 7.7929628140754776749), - TestValue(1525, 180, 4.42, -30.75693264206759737, 0.17908698743206931039, - -5.0606677133089086733), - TestValue(1525, 180, 800, -1255.1060610431618143, 6.0997732426303854875, - -0.50811617220616562857), - TestValue(1525, 180, 15324, -1861.5172673616192307, 7.3854704162366701066, - -0.0035556000115225182714), - TestValue(1525, 1123, 0.0004, -15.157115486356269288, - 1.2750475385536655502e-7, 2492.7002050120397202), - TestValue(1525, 1123, 0.065, -10.275036857130705184, - 0.000020718330690556828686, 13.074039765317043251), - TestValue(1525, 1123, 4.42, -7.754816867258728553, 0.0014034043922188128, - 0.065429851608050629578), - TestValue(1525, 1123, 800, -30.390182048283734404, 0.1489213620192180795, - -0.018804728472968400557), - TestValue(1525, 1123, 15324, -64.393847149111855643, 0.33352757644959136666, - -0.00029097614079605979039), - TestValue(1525, 10586, 0.0004, -15.157527333190073382, - -3.2342406105998390275e-8, 2491.6705880068073821), - TestValue(1525, 10586, 0.065, -10.341961135413218919, - -5.2556089204012518156e-6, 12.04444836642472918), - TestValue(1525, 10586, 4.42, -12.301855613945737855, - -0.00035723444395259380558, -0.96243723577972978183), - TestValue(1525, 10586, 800, -744.01691670628731344, - -0.060139948001942982935, -0.79245256852502796007), - TestValue(1525, 10586, 15324, -4300.6455934139147727, - -0.50623127346524902759, -0.080624196979174112178), - TestValue(10233, 0.0000256, 0.0004, -28781.070852895156444, - 3.7568285855263157895e8, -2.4041193199521680582e7), - TestValue(10233, 0.0000256, 0.065, -80237.47905503410844, - 3.9956919271025565316e8, -157343.69709836101487), - TestValue(10233, 0.0000256, 4.42, -123371.16336416773985, - 3.9972424635504373549e8, -2307.2799792939510176), - TestValue(10233, 0.0000256, 800, -173733.65594636811604, - 3.9972654870875044132e8, -10.166635446653598855), - TestValue(10233, 0.0000256, 15324, -189611.39394380092393, - 3.997265608322239652e8, -0.1562719469099034673), - TestValue(10233, 0.314, 0.0004, -30.083534640956912654, - 41.460778593539812969, -30043.568270589792096), - TestValue(10233, 0.314, 0.065, -1936.7165917584869886, - 5589.0004705645093525, -26975.841613138526635), - TestValue(10233, 0.314, 4.42, -27734.555886932752049, 30426.6413450334886, - -2153.7342775414124626), - TestValue(10233, 0.314, 800, -77398.834534311059049, 32575.386135464123325, - -10.161617337135278412), - TestValue(10233, 0.314, 15324, -93272.766915544350705, - 32587.504232657958969, -0.15625826529496379204), - TestValue(10233, 1.5, 0.0004, -19.785223133324616937, 1.8184484137563316449, - -4317.6014472049352643), - TestValue(10233, 1.5, 0.065, -445.63039240802026812, 283.30031948881789137, - -6515.7878945898169301), - TestValue(10233, 1.5, 4.42, -14020.648493631530079, 5092.7060810810810811, - -1720.7211329093311099), - TestValue(10233, 1.5, 800, -61412.526640407231264, 6808.2345601996257018, - -10.142698900729563784), - TestValue(10233, 1.5, 15324, -77272.098984563728691, 6820.3323871978075756, - -0.15620659350885388317), - TestValue(10233, 3, 0.0004, -18.421373162288964031, 0.45460605252632982269, - -908.65830344005301507), - TestValue(10233, 3, 0.065, -230.93012488941404482, 72.316476345840130506, - -3316.4438994781907491), - TestValue(10233, 3, 4.42, -9239.7190298539962311, 2031.293800539083558, - -1371.3592560596120078), - TestValue(10233, 3, 800, -54340.180404088611315, 3397.2602739726027397, - -10.118854869649679896), - TestValue(10233, 3, 15324, -70181.625182690519906, 3409.3325504012526913, - -0.15614126136305778491), - TestValue(10233, 180, 0.0004, -17.081441774321808558, - 0.00012411083530925486832, 2440.9430011582593451), - TestValue(10233, 180, 0.065, -15.542242814932986052, - 0.020160775275594924055, -38.663485376183506373), - TestValue(10233, 180, 4.42, -235.49737914944659778, 1.3385587246502548531, - -50.377534581977016966), - TestValue(10233, 180, 800, -14640.502463070959489, 45.591836734693877551, - -7.8364899652763980015), - TestValue(10233, 180, 15324, -28577.644697168082129, 55.201586687306501548, - -0.14858705144088737228), - TestValue(10233, 1123, 0.0004, -17.063078998820718915, - 2.8894734020457445678e-6, 2486.8498802333634116), - TestValue(10233, 1123, 0.065, -12.558918107945625621, - 0.00046951241938052912769, 7.2241249583196655846), - TestValue(10233, 1123, 4.42, -35.455061578657784001, - 0.031803517445555683105, -5.7569606052102630188), - TestValue(10233, 1123, 800, -3343.1303902972739556, 3.3748099701370067269, - -2.9898053694742608731), - TestValue(10233, 1123, 15324, -11352.060718035326883, 7.5582990583477048515, - -0.11311918072723555384), - TestValue(10233, 10586, 0.0004, -17.060718192656536162, - -1.2600010324928188685e-9, 2492.7518943576552348), - TestValue(10233, 10586, 0.065, -12.175300607237463447, - -2.0474891832045490463e-7, 13.125723676609068062), - TestValue(10233, 10586, 4.42, -9.4307920456266217014, - -0.000013917201050134158853, 0.11674937200192659959), - TestValue(10233, 10586, 800, -7.2703661972122617808, - -0.0023429424616141566026, 0.00008904830662418682316), - TestValue(10233, 10586, 15324, -9.3278240351663417157, - -0.019721845219427536336, -0.00008059480750115928323), -}; -} // namespace neg_binomial_2_test_internal +//TODO[martinmodrak] add updated code here +std::vector testValues = { {0,0.0000256,0.0004,-0.0000248141563677810565248409,-0.93984962406015037593985,-0.0018850149796030172519518}, + {0,0.0000256,0.065,-0.0000255949600924861403888716,-0.999606308899879432100588,-7.75166869111834937935475e-8}, + {0,0.0000256,4.42,-0.0000255999258645396480948713,-0.999994208178341772500141,-1.67726638232395628338958e-11}, + {0,0.0000256,800,-0.0000255999995904000087381331,-0.999999968000001023999967,-5.1199997815466745309864e-16}, + {0,0.0000256,15324,-0.0000255999999786165492276784,-0.999999998329417909342659,-1.39542226236663832355842e-18}, + {0,0.314,0.0004,-0.00266678271697168261798476,-0.00127226463104325699745547,-5.66822905706024980195936}, + {0,0.314,0.065,-0.114604680787141300415594,-0.171503957783641160949868,-0.934652892970430398112858}, + {0,0.314,4.42,-0.303348202309659616314882,-0.933671313899450781580059,-0.00230212890163621513546237}, + {0,0.314,800,-0.313938393619808990999524,-0.999607653995806645891488,-7.69878314071302369967267e-8}, + {0,0.314,15324,-0.313996782998787812397665,-0.999979509686371605280341,-2.09929343978617830724328e-10}, + {0,1.5,0.0004,-0.00329191110003275493362122,-0.00026659557451346307651293,-7.23004434565640079712956}, + {0,1.5,0.065,-0.206781499150110071240643,-0.0415335463258785942492013,-2.22278737940449507487448}, + {0,1.5,4.42,-1.29150964740387939892012,-0.746621621621621621621622,-0.0388183744279291779383916}, + {0,1.5,800,-1.49859550534427827334156,-0.998128509045539613225203,-1.75342721996106687969703e-6}, + {0,1.5,15324,-1.49992659053829698010225,-0.999902123911128511304688,-4.79017695146261715054393e-9}, + {0,3,0.0004,-0.00356911664958785451901203,-0.00013331555792560991867751,-7.92292493952756190744874}, + {0,3,0.065,-0.250472012600853853120106,-0.0212071778140293637846656,-2.87462275628870402717091}, + {0,3,4.42,-2.28973397601639586742486,-0.595687331536388140161725,-0.113726692626070463108525}, + {0,3,800,-2.99438902306750149309853,-0.996264009962640099626401,-6.99624147447649277415792e-6}, + {0,3,15324,-2.99970638131217673536622,-0.999804266979839498923468,-1.91582075605741709616675e-8}, + {0,180,0.0004,-0.00520680203358650223341638,-2.22221728396159119646401e-6,-12.0170073061835395451321}, + {0,180,0.065,-0.515234583883688262086666,-0.000360980756948879571265932,-6.92704688665984521936613}, + {0,180,4.42,-16.4913562250745368347413,-0.0239670317752955210931569,-2.75504310079668394524277}, + {0,180,800,-162.3526751973522458866,-0.816326530612244897959184,-0.0192673746089352053174335}, + {0,180,15324,-178.951041022560568926078,-0.988390092879256965944272,-0.0000679211892648339243088643}, + {0,1123,0.0004,-0.00593912212871338076639709,-3.56188653183026470872139e-7,-13.8478056779721050990192}, + {0,1123,0.065,-0.634217014783734204352692,-0.000057877326779839101031552,-8.75724272015345990606553}, + {0,1123,4.42,-24.4936395934523258117904,-0.00392045555338738003583403,-4.54546787488649276731873}, + {0,1123,800,-701.624014336681947952778,-0.416016640665626625065003,-0.293046658586479060005975}, + {0,1123,15324,-1083.75715139725783359741,-0.931720070529579862588922,-0.00244293345030929573936621}, + {0,10586,0.0004,-0.00683653348042399161482707,-3.77857533426883301459161e-8,-16.091333738845732379756}, + {0,10586,0.065,-0.780043017108597589318463,-6.14014744855619155937546e-6,-11.0006679418181806995525}, + {0,10586,4.42,-34.3945190758502000304634,-0.000417358329509122395523501,-6.78198276010557247770399}, + {0,10586,800,-2124.42246547447991619038,-0.0702617249253469172668189,-1.72578980676844681250479}, + {0,10586,15324,-8048.29915678058041924358,-0.591431879583172520262447,-0.116640647318788574768032}, + {6,0.0000256,0.0004,-26.4803625972224902645113,220276.315789473684210526,-11595.4634978387095432955}, + {6,0.0000256,0.065,-51.4193881364481026728232,234281.729042100342019143,-74.6938075459730303944346}, + {6,0.0000256,4.42,-67.5203813751119077704357,234372.642547590674587948,-0.431255924758490025034736}, + {6,0.0000256,800,-69.998079065742703551293,234373.992500032239998968,-0.0000233303844710378174909984}, + {6,0.0000256,15324,-70.0158073212983954315096,234373.999608458993084276,-6.38614276575077488493398e-8}, + {6,0.314,0.0004,-9.62519749441237582251687,0.023038524497171844864751,2477.5305495558165940557}, + {6,0.314,0.065,-5.62316274126580027012417,3.10564173234962943044888,0.811756664687528071010215}, + {6,0.314,4.42,-11.7481186360489883350416,16.9071818179371883568924,-0.343526975436714222156802}, + {6,0.314,800,-13.8270107248858320162615,18.1011755433762948679586,-0.0000204650172704751119362432}, + {6,0.314,15324,-13.8425659569858167417764,18.1079092104353788140892,-5.6049178830042368725488e-8}, + {6,1.5,0.0004,-9.61978396161923322623754,0.00079978672354038922953879,2491.05377011516735187466}, + {6,1.5,0.065,-4.84100453988744409858109,0.124600638977635782747604,11.5208909282007772435409}, + {6,1.5,4.42,-4.69471130087565245107321,2.23986486486486486486486,-0.126129611536089773251445}, + {6,1.5,800,-5.6375883578559464150792,2.99438552713661883967561,-0.0000110478695320263035818071}, + {6,1.5,15324,-5.64599569956598171509704,2.99970637173338553391406,-3.03295927479829163411156e-8}, + {6,3,0.0004,-9.61926132713561025018161,0.00013331555792560991867751,2492.36008977011398813188}, + {6,3,0.065,-4.75878244235486512052296,0.0212071778140293637846656,12.745335721641112641817}, + {6,3,4.42,-2.88910819582874566285473,0.595687331536388140161725,0.00385024685205873541538553}, + {6,3,800,-2.98571724360242195248096,0.996264009962640099626401,-2.3069406647953774852549e-6}, + {6,3,15324,-2.98747963477610734281426,0.999804266979839498923468,-6.38245840446628643263247e-9}, + {6,180,0.0004,-9.62011239916672050497847,-2.14814337449620482324854e-6,2490.23240751308273540641}, + {6,180,0.065,-4.89709960487442547895843,-0.000348948065050583585557067,10.6171759350004776847048}, + {6,180,4.42,-11.8028833191445191284052,-0.023168130716119003723385,-1.86137525666548784300587}, + {6,180,800,-138.973123190861697819951,-0.789115646258503401360544,-0.0179131542129975601896404}, + {6,180,15324,-154.441639359481734262519,-0.955443756449948400412797,-0.0000634392772194434652186986}, + {6,1123,0.0004,-9.62083352307562855236427,-3.5428559715533443273747e-7,2488.4295995707558483234}, + {6,1123,0.065,-5.0142630342277769583843,-0.0000575680979635621334392196,8.81495887967631288756553}, + {6,1123,4.42,-19.6831821663032130583962,-0.00389950921917515894926679,-3.62458748384772905278683}, + {6,1123,800,-671.304184750646975825767,-0.41379393376981739999787,-0.288690114015941777831476}, + {6,1123,15324,-1048.61720731875393149901,-0.926742047000481483982035,-0.00241626280594218362665218}, + {6,10586,0.0004,-9.62172902400956379331308,-3.77643368945439762841293e-8,2486.19084755337982611478}, + {6,10586,0.065,-5.15977860354001470537965,-6.13666729697000818989159e-6,6.57630939764217205495288}, + {6,10586,4.42,-29.5629973572818969888733,-0.000417121776516768840415515,-5.85634703346878397904497}, + {6,10586,800,-2091.3124520859014907288,-0.0702219015407302460497774,-1.71884010032985743252181}, + {6,10586,15324,-8002.42495594488889877697,-0.59109666408369216553719,-0.116480739324794834878369}, + {14,0.0000256,0.0004,-49.8145624383586400724923,513979.323308270676691729,-30391.5592215308067657195}, + {14,0.0000256,0.065,-114.928171090288372551513,546658.700573312664550577,-196.832392093265929097095}, + {14,0.0000256,4.42,-161.649312877052269163198,546870.832603322478494242,-1.65012869090202521315342}, + {14,0.0000256,800,-173.098986627797206761932,546873.982500032559998958,-0.00014060727924520899116967}, + {14,0.0000256,15324,-173.206165042629407096483,546873.999086402089753857,-3.87293689171005773693536e-7}, + {14,0.314,0.0004,-10.48232124038756783909,0.0554529100014586473476929,2452.9820144458617504796}, + {14,0.314,0.065,-7.91753972042693519284807,7.47516931919399021898056,-19.4065385144529680284843}, + {14,0.314,4.42,-31.1096030160603970450565,40.6949859937193738748557,-1.44235830397139693802194}, + {14,0.314,800,-41.6146101076375483922037,43.568886473205763553092,-0.000133818772002702504530118}, + {14,0.314,15324,-41.7166402819016445593073,43.585094170597712706582,-3.68785202783475625980072e-7}, + {14,1.5,0.0004,-10.4688561593594870180174,0.00222162978761219230427442,2486.61861613580838671742}, + {14,1.5,0.065,-5.96960149272681243148081,0.346112886048988285410011,7.29895408232336627643618}, + {14,1.5,4.42,-13.3341039738636536056565,6.22184684684684684684685,-0.886409460834882606838869}, + {14,1.5,800,-20.9264151022685229463224,8.31773757537949677687669,-0.000109610174761583369512834}, + {14,1.5,15324,-21.0100699378693506067827,8.3325176992594042608724,-3.02665838448691571323444e-7}, + {14,3,0.0004,-10.4672670714982932744397,0.000488823712393903035150869,2490.59053612251208613134}, + {14,3,0.065,-5.71949591388313644017256,0.0777596519847743338771071,11.025105769529760808809}, + {14,3,4.42,-7.79006429060418247514041,2.18418688230008984725966,-0.483245366998347706389421}, + {14,3,800,-12.7443244787126682405839,3.6529680365296803652968,-0.0000822242550653573074282639}, + {14,3,15324,-12.8071593989944707311042,3.66594897892607816271938,-2.27631817501670696455485e-7}, + {14,180,0.0004,-10.4670693257255523386798,-2.04937816187568965896125e-6,2491.08472067831379995549}, + {14,180,0.065,-5.68921919805166473123324,-0.000332904475852855604611915,11.4626317745298008318075}, + {14,180,4.42,-9.65337657959679927166961,-0.0221029293038836472303558,-1.31368299764513841319336}, + {14,180,800,-117.570556789937986073345,-0.752834467120181405895692,-0.0161936967338941701029113}, + {14,180,15324,-131.5984192349764106228,-0.911515307877536979704162,-0.0000577016781835615346878727}, + {14,1123,0.0004,-10.4677755213861686112027,-3.51748189118411715224579e-7,2489.319233308602484167}, + {14,1123,0.065,-5.8039572920094235935389,-0.0000571557928751928433161097,9.69771975676490255408168}, + {14,1123,4.42,-17.3710293984633664722496,-0.00387158077355886416717715,-3.04061182895062280658097}, + {14,1123,800,-640.647914910330698665346,-0.41083032457540509990836,-0.282967557637372205015805}, + {14,1123,15324,-1011.59993064034851794618,-0.920104682295016979172854,-0.00238094023047733949128954}, + {14,10586,0.0004,-10.468668475096403358952,-3.77357816303515044684135e-8,2487.08684934922326872119}, + {14,10586,0.065,-5.94905895063816048990702,-6.13202709485509703057976e-6,7.46543792757153500263484}, + {14,10586,4.42,-27.2227588675497966851323,-0.000416806372526964100271534,-5.26603093110764468733629}, + {14,10586,800,-2056.93593717552727578896,-0.0701688036945746844270555,-1.70965999479388506262815}, + {14,10586,15324,-7951.09533692356666073317,-0.590649710084385025903513,-0.116267766949827820373742}, + {1525,0.0000256,0.0004,-4301.78472746701578211824,5.59871348684210526315789e7,-3.58066878763440801575999e6}, + {1525,0.0000256,0.065,-11965.4671281234821192651,5.95468591985310400826751e7,-23429.1126891147674041279}, + {1525,0.0000256,4.42,-18367.3428918005844132604,5.95699664793796669412955e7,-339.057082534394502685042}, + {1525,0.0000256,800,-24826.2281356385313850842,5.9570309593750092999997e7,-0.838976287617641050521018}, + {1525,0.0000256,15324,-25707.7170288016100578067,5.95703114004829044732209e7,-0.00464306291332368931093164}, + {1525,0.314,0.0004,-17.0947387955188070326685,6.17771997212362846631335,-2348.2711549792054388957}, + {1525,0.314,0.065,-296.585568286099067098382,832.7696922844226341529,-4001.49218112616940138645}, + {1525,0.314,4.42,-4115.10160678526160318827,4533.61649969457966358017,-316.176485619091863713022}, + {1525,0.314,800,-10469.9426767525578633112,4853.78278834474666145767,-0.838228516034976412381988}, + {1525,0.314,15324,-11350.8644775429644460839,4855.58840352125852665115,-0.00464102415296814454780544}, + {1525,1.5,0.0004,-15.5605375416167690037651,0.270772238514173998044966,1484.28030775203773370257}, + {1525,1.5,0.065,-74.4509275868752796839738,42.1842385516506922257721,-953.474508334327862701411}, + {1525,1.5,4.42,-2072.19103657901875771673,758.318693693693693693694,-251.676626135276647866636}, + {1525,1.5,800,-8088.5487996808837996978,1013.76585568725306716573,-0.835410572412918435298525}, + {1525,1.5,15324,-8967.33164084000397251235,1015.56725718573619131513,-0.00463332752548632640449661}, + {1525,3,0.0004,-15.3575220720668965445137,0.0676354263875927654090566,1991.71749039935673683979}, + {1525,3,0.065,-42.4918294753981553150494,10.759108210984230560087,-477.238467087057049216524}, + {1525,3,4.42,-1360.54978818586119643475,302.212039532794249775382,-199.675789571126133218244}, + {1525,3,800,-7035.84649923785032031894,505.437941054379410543794,-0.831861613850395752926704}, + {1525,3,15324,-7911.93122400832367818281,507.234031447771905787173,-0.00462360345575814251935502}, + {1525,180,0.0004,-15.1592288635917619923534,0.0000166049013718241119958005,2487.41676922898500772359}, + {1525,180,0.065,-10.6183839860155018806964,0.00269732843386801679640377,7.79296281407547767488829}, + {1525,180,4.42,-30.7569326420675973698907,0.179086987432069310390534,-5.06066771330890867332748}, + {1525,180,800,-1255.10606104316181434609,6.09977324263038548752834,-0.50811617220616562857323}, + {1525,180,15324,-1861.51726736161923065929,7.38547041623667010663915,-0.00355560001152251827139362}, + {1525,1123,0.0004,-15.1571154863562692876443,1.27504753855366555022796e-7,2492.70020501203972018602}, + {1525,1123,0.065,-10.2750368571307051844228,0.0000207183306905568286862724,13.0740397653170432513801}, + {1525,1123,4.42,-7.7548168672587285529831,0.0014034043922188128000047,0.0654298516080506295778705}, + {1525,1123,800,-30.3901820482837344036952,0.148921362019218079497891,-0.0188047284729684005572389}, + {1525,1123,15324,-64.3938471491118556432688,0.333527576449591366661395,-0.000290976140796059790385352}, + {1525,10586,0.0004,-15.1575273331900733823398,-3.23424061059983902750941e-8,2491.6705880068073820668}, + {1525,10586,0.065,-10.341961135413218918573,-5.25560892040125181555838e-6,12.0444483664247291801249}, + {1525,10586,4.42,-12.3018556139457378552047,-0.000357234443952593805577031,-0.96243723577972978183147}, + {1525,10586,800,-744.016916706287313438782,-0.0601399480019429829354474,-0.792452568525027960065769}, + {1525,10586,15324,-4300.64559341391477270059,-0.506231273465249027592861,-0.080624196979174112177973}, + {10233,0.0000256,0.0004,-28781.0708528951564436868,3.75682858552631578947368e8,-2.40411931995216805817928e7}, + {10233,0.0000256,0.065,-80237.4790550341084402889,3.99569192710255653158141e8,-157343.697098361014871643}, + {10233,0.0000256,4.42,-123371.163364167739853751,3.99724246355043735493297e8,-2307.2799792939510175957}, + {10233,0.0000256,800,-173733.655946368116040227,3.99726548708750441319986e8,-10.1666354466535988554224}, + {10233,0.0000256,15324,-189611.393943800923934812,3.9972656083222396519806e8,-0.156271946909903467303064}, + {10233,0.314,0.0004,-30.0835346409569126537712,41.4607785935398129689956,-30043.5682705897920957967}, + {10233,0.314,0.065,-1936.71659175848698855364,5589.00047056450935246962,-26975.8416131385266353558}, + {10233,0.314,4.42,-27734.5558869327520485077,30426.6413450334885998832,-2153.7342775414124625757}, + {10233,0.314,800,-77398.8345343110590488869,32575.3861354641233252254,-10.1616173371352784115726}, + {10233,0.314,15324,-93272.7669155443507051479,32587.5042326579589686295,-0.156258265294963792040417}, + {10233,1.5,0.0004,-19.7852231333246169373824,1.81844841375633164489469,-4317.60144720493526427937}, + {10233,1.5,0.065,-445.630392408020268115618,283.300319488817891373802,-6515.78789458981693006454}, + {10233,1.5,4.42,-14020.6484936315300789489,5092.70608108108108108108,-1720.72113290933110987002}, + {10233,1.5,800,-61412.5266404072312643186,6808.23456019962570180911,-10.1426989007295637839166}, + {10233,1.5,15324,-77272.0989845637286907938,6820.33238719780757560928,-0.156206593508853883167535}, + {10233,3,0.0004,-18.4213731622889640306878,0.454606052526329822690308,-908.658303440053015065049}, + {10233,3,0.065,-230.930124889414044823939,72.3164763458401305057096,-3316.44389947819074911539}, + {10233,3,4.42,-9239.71902985399623107597,2031.29380053908355795148,-1371.35925605961200776625}, + {10233,3,800,-54340.1804040886113152815,3397.26027397260273972603,-10.1188548696496798960218}, + {10233,3,15324,-70181.625182690519906018,3409.33255040125269132903,-0.156141261363057784911755}, + {10233,180,0.0004,-17.081441774321808557538,0.000124110835309254868322515,2440.94300115825934508112}, + {10233,180,0.065,-15.5422428149329860521265,0.0201607752755949240552023,-38.663485376183506373452}, + {10233,180,4.42,-235.497379149446597781456,1.33855872465025485305281,-50.3775345819770169658823}, + {10233,180,800,-14640.5024630709594885282,45.5918367346938775510204,-7.83648996527639800152069}, + {10233,180,15324,-28577.6446971680821285066,55.2015866873065015479876,-0.148587051440887372280679}, + {10233,1123,0.0004,-17.0630789988207189145522,2.88947340204574456780515e-6,2486.84988023336341161969}, + {10233,1123,0.065,-12.5589181079456256205069,0.000469512419380529127691397,7.22412495831966558459338}, + {10233,1123,4.42,-35.4550615786577840007616,0.0318035174455556831045841,-5.75696060521026301882133}, + {10233,1123,800,-3343.1303902972739556477,3.37480997013700672692981,-2.98980536947426087305154}, + {10233,1123,15324,-11352.0607180353268830661,7.55829905834770485145599,-0.113119180727235553840235}, + {10233,10586,0.0004,-17.0607181926565361616021,-1.26000103249281886845913e-9,2492.75189435765523482408}, + {10233,10586,0.065,-12.175300607237463446918,-2.04748918320454904634379e-7,13.1257236766090680623184}, + {10233,10586,4.42,-9.43079204562662170137108,-0.0000139172010501341588531831,0.116749372001926599593782}, + {10233,10586,800,-7.27036619721226178082317,-0.002342942461614156602606,0.0000890483066241868231597611}, + {10233,10586,15324,-9.3278240351663417156768,-0.0197218452194275363359762,-0.0000805948075011592832299515}, +};} // namespace neg_binomial_2_test_internal TEST(ProbDistributionsNegativeBinomial2, derivativesPrecomputed) { using neg_binomial_2_test_internal::TestValue; @@ -545,7 +334,8 @@ TEST(ProbDistributionsNegBinomial2, derivativesZeroOne) { for (double phi_dbl = phi_start; phi_dbl < phi_max; phi_dbl *= stan::math::pi()) { std::ostringstream msg; - msg << ", mu = " << mu_dbl << ", phi = " << phi_dbl; + msg << std::setprecision(20) << ", mu = " << mu_dbl + << ", phi = " << phi_dbl; var mu0(mu_dbl); var phi0(phi_dbl); From 70430fb3c9d23ae0aa6a9ff8f67c5996b6968fee Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Mon, 13 Jan 2020 20:10:34 +0100 Subject: [PATCH 60/82] Fixes after merge --- .../prim/fun/binomial_coefficient_log.hpp | 49 +++++++++++---- stan/math/prim/fun/lbeta.hpp | 56 +++++++++++++++-- .../fun/binomial_coefficient_log_test.cpp | 56 ++++++++++++++++- test/unit/math/prim/fun/lbeta_test.cpp | 61 +++++++++++++++++++ 4 files changed, 204 insertions(+), 18 deletions(-) diff --git a/stan/math/prim/fun/binomial_coefficient_log.hpp b/stan/math/prim/fun/binomial_coefficient_log.hpp index 89600a35c55..e81a97e8b55 100644 --- a/stan/math/prim/fun/binomial_coefficient_log.hpp +++ b/stan/math/prim/fun/binomial_coefficient_log.hpp @@ -1,13 +1,16 @@ -#ifndef STAN_MATH_PRIM_FUN_BINOMIAL_COEFFICIENT_LOG_HPP -#define STAN_MATH_PRIM_FUN_BINOMIAL_COEFFICIENT_LOG_HPP +#ifndef STAN_MATH_PRIM_SCAL_FUN_BINOMIAL_COEFFICIENT_LOG_HPP +#define STAN_MATH_PRIM_SCAL_FUN_BINOMIAL_COEFFICIENT_LOG_HPP #include -#include #include -#include +#include +#include +#include +#include namespace stan { namespace math { + /** * Return the log of the binomial coefficient for the specified * arguments. @@ -22,12 +25,15 @@ namespace math { * * \f$ \log {N \choose n} * = \log \ \Gamma(N+1) - \log \Gamma(n+1) - \log \Gamma(N-n+1)\f$. + * * + * TODO[martinmodrak] figure out the cases for x < 0 and for partials \f[ \mbox{binomial\_coefficient\_log}(x, y) = \begin{cases} - \textrm{error} & \mbox{if } y > x \textrm{ or } y < 0\\ - \ln\Gamma(x+1) & \mbox{if } 0\leq y \leq x \\ + \textrm{error} & \mbox{if } y > x + 1 \textrm{ or } y < -1 \textrm{ or } x < 0\\ + \textrm{-\infty} & \mbox{if } y = x + 1 \textrm{ or } y = -1\\ + \ln\Gamma(x+1) & \mbox{if } -1 < y < x + 1 \\ \quad -\ln\Gamma(y+1)& \\ \quad -\ln\Gamma(x-y+1)& \\[6pt] \textrm{NaN} & \mbox{if } x = \textrm{NaN or } y = \textrm{NaN} @@ -54,22 +60,39 @@ namespace math { \end{cases} \f] * + * This function is numerically more stable than naive evaluation via lgamma + * * @param N total number of objects. * @param n number of objects chosen. * @return log (N choose n). */ + template inline return_type_t binomial_coefficient_log(const T_N N, const T_n n) { - const double CUTOFF = 1000; - if (N - n < CUTOFF) { - const T_N N_plus_1 = N + 1; + if(is_nan(value_of_rec(N)) || is_nan(value_of_rec(n))) { + return std::numeric_limits::quiet_NaN(); + } + + // For some uses it is important this works even when N < 0 and therefore + // it is before checks + if (n == 0) { + return 0; + } + const T_N N_plus_1 = N + 1; + + static const char* function = "binomial_coefficient_log"; + check_nonnegative(function, "first argument", N); + check_greater_or_equal(function, "second argument", n, -1); + check_greater_or_equal(function, "(first argument - second argument + 1)", + N - n + 1, 0.0); + + if (N / 2 < n) { + return binomial_coefficient_log(N, N - n); + } else if (N_plus_1 < lgamma_stirling_diff_useful) { return lgamma(N_plus_1) - lgamma(n + 1) - lgamma(N_plus_1 - n); } else { - return_type_t N_minus_n = N - n; - const double one_twelfth = inv(12); - return multiply_log(n, N_minus_n) + multiply_log((N + 0.5), N / N_minus_n) - + one_twelfth / N - n - one_twelfth / N_minus_n - lgamma(n + 1); + return -lbeta(N - n + 1, n + 1) - log(N_plus_1); } } diff --git a/stan/math/prim/fun/lbeta.hpp b/stan/math/prim/fun/lbeta.hpp index 23a9ba9e5fb..ab4fbcb3050 100644 --- a/stan/math/prim/fun/lbeta.hpp +++ b/stan/math/prim/fun/lbeta.hpp @@ -1,8 +1,14 @@ -#ifndef STAN_MATH_PRIM_FUN_LBETA_HPP -#define STAN_MATH_PRIM_FUN_LBETA_HPP +#ifndef STAN_MATH_PRIM_SCAL_FUN_LBETA_HPP +#define STAN_MATH_PRIM_SCAL_FUN_LBETA_HPP #include #include +#include +#include +#include +#include +#include +#include namespace stan { namespace math { @@ -22,7 +28,7 @@ namespace math { * * See stan::math::lgamma() for the double-based and stan::math for the * variable-based log Gamma function. - * + * This function is numerically more stable than naive evaluation via lgamma * \f[ \mbox{lbeta}(\alpha, \beta) = @@ -55,7 +61,49 @@ namespace math { */ template inline return_type_t lbeta(const T1 a, const T2 b) { - return lgamma(a) + lgamma(b) - lgamma(a + b); + typedef return_type_t T_ret; + + if(is_nan(value_of_rec(a)) || is_nan(value_of_rec(b))) { + return std::numeric_limits::quiet_NaN(); + } + + static const char* function = "lbeta"; + check_nonnegative(function, "first argument", a); + check_nonnegative(function, "second argument", b); + T_ret x; // x is the smaller of the two + T_ret y; + if (a < b) { + x = a; + y = b; + } else { + x = b; + y = a; + } + + // For large x or y, separate the lgamma values into Stirling approximations + // and appropriate corrections. The Stirling approximations allow for + // analytic simplifaction and the corrections are added later. + // + // The overall approach is inspired by the code in R, where the algorithm is + // credited to W. Fullerton of Los Alamos Scientific Laboratory + if (y < lgamma_stirling_diff_useful) { + // both small + return lgamma(x) + lgamma(y) - lgamma(x + y); + } else if (x < lgamma_stirling_diff_useful) { + // y large, x small + T_ret stirling_diff + = lgamma_stirling_diff(y) - lgamma_stirling_diff(x + y); + T_ret log_x_y = log(x + y); + T_ret stirling = (y - 0.5) * log1p(-x / (x + y)) + x * (1 - log_x_y); + return stirling + lgamma(x) + stirling_diff; + } else { + // both large + T_ret stirling_diff = lgamma_stirling_diff(x) + lgamma_stirling_diff(y) + - lgamma_stirling_diff(x + y); + T_ret stirling = (x - 0.5) * log(x / (x + y)) + y * log1p(-x / (x + y)) + + 0.5 * (log(2 * stan::math::pi()) - log(y)); + return stirling + stirling_diff; + } } } // namespace math diff --git a/test/unit/math/prim/fun/binomial_coefficient_log_test.cpp b/test/unit/math/prim/fun/binomial_coefficient_log_test.cpp index 23cea698637..6b85505fd37 100644 --- a/test/unit/math/prim/fun/binomial_coefficient_log_test.cpp +++ b/test/unit/math/prim/fun/binomial_coefficient_log_test.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -7,7 +8,8 @@ template void test_binom_coefficient(const T_N& N, const T_n& n) { using stan::math::binomial_coefficient_log; EXPECT_FLOAT_EQ(lgamma(N + 1) - lgamma(n + 1) - lgamma(N - n + 1), - binomial_coefficient_log(N, n)); + binomial_coefficient_log(N, n)) + << "N = " << N << ", n = " << n; } TEST(MathFunctions, binomial_coefficient_log) { @@ -19,6 +21,13 @@ TEST(MathFunctions, binomial_coefficient_log) { EXPECT_FLOAT_EQ(29979.16, binomial_coefficient_log(100000, 91116)); + EXPECT_EQ(binomial_coefficient_log(-1, 0), 0); // Needed for neg_binomial_2 + EXPECT_EQ(binomial_coefficient_log(50, 0), 0); + EXPECT_EQ(binomial_coefficient_log(10000, 0), 0); + + EXPECT_EQ(binomial_coefficient_log(10, 11), -std::numeric_limits::infinity()); + EXPECT_EQ(binomial_coefficient_log(10, -1), -std::numeric_limits::infinity()); + for (int n = 0; n < 1010; ++n) { test_binom_coefficient(1010, n); test_binom_coefficient(1010.0, n); @@ -38,3 +47,48 @@ TEST(MathFunctions, binomial_coefficient_log_nan) { EXPECT_TRUE(std::isnan(stan::math::binomial_coefficient_log(nan, 2.0))); EXPECT_TRUE(std::isnan(stan::math::binomial_coefficient_log(nan, nan))); } + +TEST(MathFunctions, binomial_coefficient_log_errors) { + using stan::math::binomial_coefficient_log; + EXPECT_NO_THROW(binomial_coefficient_log(10, 11)); + EXPECT_THROW(binomial_coefficient_log(10, 11.01), std::domain_error); + EXPECT_THROW(binomial_coefficient_log(-1, 0.3), std::domain_error); + EXPECT_THROW(binomial_coefficient_log(10, -1.1), std::domain_error); + EXPECT_NO_THROW(binomial_coefficient_log(10, -0.9)); +} + +namespace binomial_coefficient_test_internal { +struct TestValue { + double n; + double k; + double val; +}; + +std::vector testValues = { {0.00003,-0.9,-2.21375637737528044964112}, {0.00003,3.e-15,1.48040820535563428588846e-19}, {0.00003,3.e-10,1.48039340142161568666212e-14}, {0.00003,3.e-7,1.46560412344434242311062e-11}, {0.00003,6.e-6,2.36865312869367134774661e-10}, {0.00003,0.000015,3.70102051348524044535716e-10}, {0.00003,0.0000291,4.30798787797857754693695e-11}, {0.00003,0.0000299999982,8.88244870007509649977929e-17}, {0.00003,0.00002999999991,4.44122460318735146597007e-18}, {0.00003,0.90003,-2.21375637737528044964112}, {0.002,-0.9,-2.21559326412971099686943}, {0.002,2.e-13,6.57013709556564677684856e-16}, {0.002,2.e-8,6.57007139476544583161173e-11}, {0.002,0.00002,6.50443564072189575550994e-8}, {0.002,0.0004,1.05122171458287350859763e-6}, {0.002,0.001,1.64253373496215313253469e-6}, {0.002,0.00194,1.91190982195918976356429e-7}, {0.002,0.00199999988,3.94208202120835082737684e-13}, {0.002,0.001999999994,1.97104112295366725515452e-14}, {0.002,0.902,-2.21559326412971099686943}, {1,-0.9,-2.85558226198351740582195}, {1,1.e-10,9.9999999988550659331851e-11}, {1,0.00001,9.99988550692664559909352e-6}, {1,0.01,0.00988583703486131052627978}, {1,0.2,0.156457962917688016707705}, {1,0.5,0.241564475270490444691037}, {1,0.97,0.028978328236256312960776}, {1,0.99999994,5.99999958782374313463811e-8}, {1,0.999999997,2.99999998969559340736596e-9}, {1,1.9,-2.85558226198351740582195}, {8,-0.9,-4.22528965320883461943031}, {8,8.e-10,2.17428571372173153982474e-9}, {8,0.00008,0.000217422931805073420417006}, {8,0.08,0.211982267378255838975509}, {8,1.6,2.90678606291134283426263}, {8,4,4.24849524204935898912334}, {8,7.76,0.606274586245453651115361}, {8,7.99999952,1.30457122553768403613331e-6}, {8,7.999999976,6.52285709209869625945566e-8}, {8,8.9,-4.22528965320883461943031}, {1325,-0.9,-8.72360867216657209762532}, {1325,1.325e-7,1.02909578020477960435539e-6}, {1325,0.01325,0.102766042691370430370992}, {1325,13.25,71.9898321274090629975055}, {1325,265,659.435649329029419323398}, {1325,662.5,914.599450340845275100724}, {1325,1285.25,175.786260651191862665015}, {1325,1324.9999205,0.000617452276410452190170437}, {1325,1324.999996025,0.0000308728608380968862741097}, {1325,1325.9,-8.72360867216657209762532}, {845000,-0.9,-14.5350963792733464918229}, {845000,0.0000845,0.00120194816738712136581358}, {845000,8.45,103.738303827736743600251}, {845000,8450,47315.8616457576200611209}, {845000,169000,422833.221695496506553128}, {845000,422500,585702.318235552114086514}, {845000,819650,113851.158132678562120685}, {845000,844999.9493,0.719108776819481762797449}, {845000,844999.997465,0.036053342347290003917417}, {845000,845000.9,-14.5350963792733464918229}, {3000000000000000.0,3,105.120406581508328854183}, {3000000000000000.0,100,3199.99949280231435502243}, {3000000000000000.0,12895,350387.5243605883687667}, {100000000000000000000.0,3,136.363346110414686040237}, {100000000000000000000.0,100,4241.4308104325278778424}, {100000000000000000000.0,12895,484680.092769031900296878},}; +} // namespace binomial_coefficient_test_internal + +TEST(MathFunctions, binomial_coefficient_log_precomputed) { + using binomial_coefficient_test_internal::TestValue; + using binomial_coefficient_test_internal::testValues; + using stan::test::expect_near_rel; + + for (TestValue t : testValues) { + + std::ostringstream msg; + msg << std::setprecision(22) << "n = " << t.n << ", k = " << t.k; + + double val = stan::math::binomial_coefficient_log(t.n, t.k); + expect_near_rel(msg.str(), val, t.val); + + if(t.k > t.n / 10) { + // Testing the mirrored binomial coefficient is not performed for + // small k, as we may loose so much precision computing k2 + // that the test becomes invalid + std::ostringstream msg2; + double k2 = t.n - t.k; + msg2 << std::setprecision(22) << "n = " << t.n << ", k = " << k2; + double val2 = stan::math::binomial_coefficient_log(t.n, k2); + expect_near_rel(msg2.str(), val2, t.val); + } + } +} diff --git a/test/unit/math/prim/fun/lbeta_test.cpp b/test/unit/math/prim/fun/lbeta_test.cpp index 6bb2f73621c..528359dd3f4 100644 --- a/test/unit/math/prim/fun/lbeta_test.cpp +++ b/test/unit/math/prim/fun/lbeta_test.cpp @@ -1,7 +1,10 @@ +#include #include #include #include #include +#include + TEST(MathFunctions, lbeta) { using stan::math::lbeta; @@ -21,3 +24,61 @@ TEST(MathFunctions, lbeta_nan) { EXPECT_TRUE(std::isnan(stan::math::lbeta(nan, nan))); } + +namespace lbeta_test_internal { + struct TestValue { + double x; + double y; + double val; + }; + +// Test values generated in Mathematice, reproducible notebook at +// https://www.wolframcloud.com/obj/martin.modrak/Published/lbeta.nb +// Mathematica Code reproduced below for convenience: +// +// lbeta[x_,y_]:= LogGamma[x] + LogGamma[y] - LogGamma[x + y] +// out = OpenWrite["lbeta_test.txt"] +// xs= {8*10^-8,4*10^-3,1,1+10^-8,5,23, 19845}; +// ys = {7*10^-11,2*10^-5,1+10^-12,1/2,2,1624}; +// WriteString[out, "std::vector testValues = {"]; +// For[i = 1, i <= Length[xs], i++, { +// For[j = 1, j <= Length[ys], j++, { +// cx = xs[[i]]; +// cy = ys[[j]]; + +// val = N[lbeta[cx,cy],24]; +// WriteString[out," {",CForm[cx],",",CForm[cy],",", +// CForm[val],"},"] +// }] +// }] +// extremeXs = {3*10^15,10^20}; +// lowYs = {3, 100, 12895}; +// For[i = 1, i <= Length[extremeXs], i++, { +// For[j = 1, j <= Length[lowYs], j++, { +// cx = extremeXs[[i]]; +// cy = lowYs[[j]]; +// val = N[lbeta[cx,cy],24]; +// WriteString[out," {",CForm[cx],".0,",CForm[cy],",", +// CForm[val],"},"] +// }] +// }] +// WriteString[out,"};"]; +// Close[out]; +// FilePrint[%] +std::vector testValues = { {8.e-8,7.e-11,23.3834004912898500586445}, {8.e-8,0.00002,16.3452312235394351410033}, {8.e-8,1.000000000001,16.3412392022725295437606}, {8.e-8,0.5,16.3412393131760679059067}, {8.e-8,2,16.3412391222725327438921}, {8.e-8,1624,16.3412385647081130254943}, {0.004,7.e-11,23.3825258913787298259023}, {0.004,0.00002,10.8247656947117878792194}, {0.004,1.000000000001,5.52146091786223987264715}, {0.004,0.5,5.52697992926150653113797}, {0.004,2,5.51746889659270898022044}, {0.004,1624,5.48959582574332555214719}, {1,7.e-11,23.3825258738791892190926}, {1,0.00002,10.8197782844102831106727}, {1,1.000000000001,-9.999999999995e-13}, {1,0.5,0.693147180559945309417232}, {1,2,-0.693147180559945309417232}, {1,1624,-7.39264752072162326054032}, {1.00000001,7.e-11,23.3825258738791892179411}, {1.00000001,0.00002,10.8197782844099541286699}, {1.00000001,1.000000000001,-1.00009999500064491739816e-8}, {1.00000001,0.5,0.693147174422888956122731}, {1.00000001,2,-0.693147195559945246917232}, {1.00000001,1624,-7.39264760042333353631934}, {5,7.e-11,23.3825258737333558857627}, {5,0.00002,10.8197366180283355258393}, {5,1.000000000001,-1.60943791243638370793409}, {5,0.5,-0.207395194346070587158746}, {5,2,-3.40119738166215537541324}, {5,1624,-33.7913357290267948074624}, {23,7.e-11,23.3825258736208322915813}, {23,0.00002,10.819704468465374949026}, {23,1.000000000001,-3.13549421593288398231784}, {23,0.5,-0.989947810259228199543883}, {23,2,-6.31354804627709531045369}, {23,1624,-121.714785277510463870251}, {19845,7.e-11,23.3825258731460863706715}, {19845,0.00002,10.8195688267825637640878}, {19845,1.000000000001,-9.89570736522763869861762}, {19845,0.5,-4.37548244086806082919414}, {19845,2,-19.7914651196913525680177}, {19845,1624,-5756.4146766727238501215}, {3000000000000000.0,3,-106.219018870176440545578}, {3000000000000000.0,100,-3204.60466298830574639047}, {3000000000000000.0,12895,-350396.988955562106921852}, {100000000000000000000.0,3,-137.461958399082795731692}, {100000000000000000000.0,100,-4246.03598061851596930944}, {100000000000000000000.0,12895,-484689.557363950217404711},}; +} + +TEST(MathFunctions, lbeta_precomputed) { + using lbeta_test_internal::TestValue; + using lbeta_test_internal::testValues; + using stan::test::expect_near_rel; + + for (TestValue t : testValues) { + + std::ostringstream msg; + msg << std::setprecision(22) << "x = " << t.x << ", y = " << t.y; + + double val = stan::math::lbeta(t.x, t.y); + expect_near_rel(msg.str(), val, t.val); + } +} From 36f24d70bb6334e8abdb5fa52477cda942c047e3 Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Mon, 13 Jan 2020 19:10:57 +0000 Subject: [PATCH 61/82] [Jenkins] auto-formatting by clang-format version 5.0.0-3~16.04.1 (tags/RELEASE_500/final) --- stan/math/prim/fun/lgamma_stirling_diff.hpp | 54 +- stan/math/prim/prob/neg_binomial_2_lpmf.hpp | 7 +- test/unit/math/expect_near_rel.hpp | 24 +- .../prim/fun/lgamma_stirling_diff_test.cpp | 37 +- .../math/rev/prob/neg_binomial_2_test.cpp | 537 ++++++++++++------ 5 files changed, 434 insertions(+), 225 deletions(-) diff --git a/stan/math/prim/fun/lgamma_stirling_diff.hpp b/stan/math/prim/fun/lgamma_stirling_diff.hpp index 45c9f26c1fe..bbe3f721383 100644 --- a/stan/math/prim/fun/lgamma_stirling_diff.hpp +++ b/stan/math/prim/fun/lgamma_stirling_diff.hpp @@ -10,26 +10,25 @@ #include #include - namespace stan { namespace math { constexpr double lgamma_stirling_diff_useful = 10; /** - * Return the difference between log of the gamma function and it's Stirling + * Return the difference between log of the gamma function and it's Stirling * approximation. * This is useful to stably compute log of ratios of gamma functions with large - * arguments where the Stirling approximation allows for analytic solution - * and the (small) differences can be added afterwards. + * arguments where the Stirling approximation allows for analytic solution + * and the (small) differences can be added afterwards. * This is for example used in the implementation of lbeta. - * + * * The function will return correct value for all arguments, but the can add * precision only when x >= lgamma_stirling_diff_useful. * \f[ \mbox{lgamma_stirling_diff}(x) = - \log(\Gamma(x)) - \frac{1}{2} \log(2\pi) + + \log(\Gamma(x)) - \frac{1}{2} \log(2\pi) + (x-\frac{1}{2})*\log(x) - x \f] @@ -40,29 +39,30 @@ constexpr double lgamma_stirling_diff_useful = 10; */ template -T lgamma_stirling_diff(const T x) { - static const char* function = "lgamma_stirling_diff"; - check_nonnegative(function, "argument", x); +T lgamma_stirling_diff(const T x) { + static const char* function = "lgamma_stirling_diff"; + check_nonnegative(function, "argument", x); - if (value_of(x) < lgamma_stirling_diff_useful) { - return lgamma(x) - lgamma_stirling(x); - } else { - // Using the Stirling series as expressed in formula 5.11.1. at - // https://dlmf.nist.gov/5.11 - constexpr double stirling_series[] = { - 0.0833333333333333333333333, -0.00277777777777777777777778, - 0.000793650793650793650793651,-0.000595238095238095238095238, - }; - constexpr int n_stirling_terms = 3; - T result(0.0); - T multiplier = inv(x); - T inv_x_squared = inv(square(x)); - for(int n = 0; n < n_stirling_terms; - n++, multiplier *= inv_x_squared) { - result += stirling_series[n] * multiplier; - } - return result; + if (value_of(x) < lgamma_stirling_diff_useful) { + return lgamma(x) - lgamma_stirling(x); + } else { + // Using the Stirling series as expressed in formula 5.11.1. at + // https://dlmf.nist.gov/5.11 + constexpr double stirling_series[] = { + 0.0833333333333333333333333, + -0.00277777777777777777777778, + 0.000793650793650793650793651, + -0.000595238095238095238095238, + }; + constexpr int n_stirling_terms = 3; + T result(0.0); + T multiplier = inv(x); + T inv_x_squared = inv(square(x)); + for (int n = 0; n < n_stirling_terms; n++, multiplier *= inv_x_squared) { + result += stirling_series[n] * multiplier; } + return result; + } } } // namespace math diff --git a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp index 73e1d0365cf..d3a0fa04e61 100644 --- a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp @@ -142,14 +142,13 @@ return_type_t neg_binomial_2_lpmf( } if (!is_constant_all::value) { T_partials_return log_term; - if(mu_val[i] < phi_val[i]) { - log_term = log1p(-mu_val[i]/(mu_val[i] + phi_val[i])); + if (mu_val[i] < phi_val[i]) { + log_term = log1p(-mu_val[i] / (mu_val[i] + phi_val[i])); } else { log_term = log_phi[i] - log_mu_plus_phi[i]; } ops_partials.edge2_.partials_[i] - += (mu_val[i] - n_vec[i]) / (mu_val[i] + phi_val[i]) - + log_term + += (mu_val[i] - n_vec[i]) / (mu_val[i] + phi_val[i]) + log_term - (digamma(phi_val[i]) - digamma(n_plus_phi[i])); } } diff --git a/test/unit/math/expect_near_rel.hpp b/test/unit/math/expect_near_rel.hpp index 4093aba00fe..0fd0a004b2a 100644 --- a/test/unit/math/expect_near_rel.hpp +++ b/test/unit/math/expect_near_rel.hpp @@ -33,8 +33,9 @@ namespace internal { */ template ...> void expect_near_rel_finite(const std::string& msg, const T1& x1, const T2& x2, - double tol_rel = 1e-8, - double tol_min = std::numeric_limits::quiet_NaN()) { + double tol_rel = 1e-8, + double tol_min + = std::numeric_limits::quiet_NaN()) { using stan::math::fabs; // if either arg near zero, must use absolute tolerance as rel tol -> 2 // if (fabs(x1) < tol || fabs(x2) < tol) { @@ -51,19 +52,17 @@ void expect_near_rel_finite(const std::string& msg, const T1& x1, const T2& x2, // << ", relative tolerance = " << tol << ")" // << "; relative diff = " << relative_diff << std::endl // << " in: " << msg << std::endl; - if(stan::math::is_nan(tol_min)) { + if (stan::math::is_nan(tol_min)) { tol_min = tol_rel * tol_rel; } auto avg = 0.5 * (fabs(x1) + fabs(x2)); auto tol = std::max(avg * tol_rel, tol_min); auto relative_diff = (x1 - x2) / avg; - EXPECT_NEAR(x1, x2, tol) - << "expect_near_rel_finite(" << x1 << ", " << x2 - << ", relative tolerance = " << tol_rel << ")" - << ", minimum tolerance = " << tol_min << ")" - << "; relative diff = " << relative_diff << std::endl - << " in: " << msg << std::endl; - + EXPECT_NEAR(x1, x2, tol) << "expect_near_rel_finite(" << x1 << ", " << x2 + << ", relative tolerance = " << tol_rel << ")" + << ", minimum tolerance = " << tol_min << ")" + << "; relative diff = " << relative_diff << std::endl + << " in: " << msg << std::endl; } template & x1, */ template ...> void expect_near_rel(const std::string& msg, const T1& x1, const T2& x2, - double tol_rel = 1e-8, - double tol_min = std::numeric_limits::quiet_NaN()) { + double tol_rel = 1e-8, + double tol_min + = std::numeric_limits::quiet_NaN()) { if (stan::math::is_nan(x1) || stan::math::is_nan(x2)) EXPECT_TRUE(stan::math::is_nan(x1) && stan::math::is_nan(x2)) << "expect_near_rel(" << x1 << ", " << x2 << ")" << std::endl diff --git a/test/unit/math/prim/fun/lgamma_stirling_diff_test.cpp b/test/unit/math/prim/fun/lgamma_stirling_diff_test.cpp index 8160d374172..56e97501374 100644 --- a/test/unit/math/prim/fun/lgamma_stirling_diff_test.cpp +++ b/test/unit/math/prim/fun/lgamma_stirling_diff_test.cpp @@ -10,8 +10,8 @@ TEST(MathFunctions, lgamma_stirling_diff_errors) { } TEST(MathFunctions, lgamma_stirling_diff_accuracy) { - using stan::math::lgamma_stirling_diff_useful; using stan::math::lgamma_stirling_diff; + using stan::math::lgamma_stirling_diff_useful; using stan::test::expect_near_rel; double start = std::nextafter(10, 11); @@ -43,7 +43,40 @@ struct TestValue { double val; }; -std::vector testValues = { {1.049787068367863943,0.077388806767834476832}, {1.1353352832366126919,0.071790358566585005482}, {1.3678794411714423216,0.059960812482712981438}, {2.,0.041340695955409294094}, {3.7182818284590452354,0.022358812123082674471}, {8.3890560989306502272,0.0099288907523535997267}, {21.085536923187667741,0.0039518599801395734578}, {55.598150033144239078,0.0014988346688724404687}, {149.41315910257660342,0.0005577367442531155476}, {404.42879349273512261,0.00020605188772717995062}, {1097.6331584284585993,0.000075920930766205666598}, {2981.9579870417282747,0.00002794584410078046085}, {8104.0839275753840077,0.000010282881326966996581}, {22027.465794806716517,3.7831557249429676373e-6}, {59875.141715197818455,1.3917851539949910276e-6}, {162755.79141900392081,5.1201455018391551878e-7}, {442414.39200892050333,1.8836035815859912686e-7}, {1.2026052841647767777e6,6.9294002305342748064e-8}, {3.2690183724721106393e6,2.5491852243801980915e-8}, {8.8861115205078726368e6,9.3779301712579119232e-9}, {2.4154953753575298215e7,3.4499479561619419703e-9}, {6.5659970137330511139e7,1.2691649593966957356e-9}, {1.7848230196318726084e8,4.6689970051216164913e-10}, {4.8516519640979027797e8,1.7176280151585029843e-10}, {1.3188157354832146972e9,6.3188003518019870566e-11}, {3.5849128471315915617e9,2.3245567434090096532e-11}, {9.7448034472489026e9,8.5515663588740238069e-12}, {2.6489122130843472294e10,3.1459454534471511195e-12}, {7.2004899338385872524e10,1.1573286553975954675e-12}, {1.9572960942983876427e11,4.2575741900310182743e-13}, {5.3204824060279861668e11,1.5662740137796255552e-13}, {1.4462570642924751737e12,5.7620000891128517638e-14},}; +std::vector testValues = { + {1.049787068367863943, 0.077388806767834476832}, + {1.1353352832366126919, 0.071790358566585005482}, + {1.3678794411714423216, 0.059960812482712981438}, + {2., 0.041340695955409294094}, + {3.7182818284590452354, 0.022358812123082674471}, + {8.3890560989306502272, 0.0099288907523535997267}, + {21.085536923187667741, 0.0039518599801395734578}, + {55.598150033144239078, 0.0014988346688724404687}, + {149.41315910257660342, 0.0005577367442531155476}, + {404.42879349273512261, 0.00020605188772717995062}, + {1097.6331584284585993, 0.000075920930766205666598}, + {2981.9579870417282747, 0.00002794584410078046085}, + {8104.0839275753840077, 0.000010282881326966996581}, + {22027.465794806716517, 3.7831557249429676373e-6}, + {59875.141715197818455, 1.3917851539949910276e-6}, + {162755.79141900392081, 5.1201455018391551878e-7}, + {442414.39200892050333, 1.8836035815859912686e-7}, + {1.2026052841647767777e6, 6.9294002305342748064e-8}, + {3.2690183724721106393e6, 2.5491852243801980915e-8}, + {8.8861115205078726368e6, 9.3779301712579119232e-9}, + {2.4154953753575298215e7, 3.4499479561619419703e-9}, + {6.5659970137330511139e7, 1.2691649593966957356e-9}, + {1.7848230196318726084e8, 4.6689970051216164913e-10}, + {4.8516519640979027797e8, 1.7176280151585029843e-10}, + {1.3188157354832146972e9, 6.3188003518019870566e-11}, + {3.5849128471315915617e9, 2.3245567434090096532e-11}, + {9.7448034472489026e9, 8.5515663588740238069e-12}, + {2.6489122130843472294e10, 3.1459454534471511195e-12}, + {7.2004899338385872524e10, 1.1573286553975954675e-12}, + {1.9572960942983876427e11, 4.2575741900310182743e-13}, + {5.3204824060279861668e11, 1.5662740137796255552e-13}, + {1.4462570642924751737e12, 5.7620000891128517638e-14}, +}; } // namespace lgamma_stirling_diff_test_internal diff --git a/test/unit/math/rev/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/prob/neg_binomial_2_test.cpp index 4ca9374cd6d..c8844be55b6 100644 --- a/test/unit/math/rev/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/prob/neg_binomial_2_test.cpp @@ -13,190 +13,367 @@ struct TestValue { double phi; double value; double grad_mu; - double grad_phi; + double grad_phi; }; // Test data generated in Mathematica (Wolfram Cloud). The code can be re-ran // at https://www.wolframcloud.com/env/martin.modrak/NegBinomial2_Tests.nb // but is also presented below for convenience: // -//TODO[martinmodrak] add updated code here -std::vector testValues = { {0,0.0000256,0.0004,-0.0000248141563677810565248409,-0.93984962406015037593985,-0.0018850149796030172519518}, - {0,0.0000256,0.065,-0.0000255949600924861403888716,-0.999606308899879432100588,-7.75166869111834937935475e-8}, - {0,0.0000256,4.42,-0.0000255999258645396480948713,-0.999994208178341772500141,-1.67726638232395628338958e-11}, - {0,0.0000256,800,-0.0000255999995904000087381331,-0.999999968000001023999967,-5.1199997815466745309864e-16}, - {0,0.0000256,15324,-0.0000255999999786165492276784,-0.999999998329417909342659,-1.39542226236663832355842e-18}, - {0,0.314,0.0004,-0.00266678271697168261798476,-0.00127226463104325699745547,-5.66822905706024980195936}, - {0,0.314,0.065,-0.114604680787141300415594,-0.171503957783641160949868,-0.934652892970430398112858}, - {0,0.314,4.42,-0.303348202309659616314882,-0.933671313899450781580059,-0.00230212890163621513546237}, - {0,0.314,800,-0.313938393619808990999524,-0.999607653995806645891488,-7.69878314071302369967267e-8}, - {0,0.314,15324,-0.313996782998787812397665,-0.999979509686371605280341,-2.09929343978617830724328e-10}, - {0,1.5,0.0004,-0.00329191110003275493362122,-0.00026659557451346307651293,-7.23004434565640079712956}, - {0,1.5,0.065,-0.206781499150110071240643,-0.0415335463258785942492013,-2.22278737940449507487448}, - {0,1.5,4.42,-1.29150964740387939892012,-0.746621621621621621621622,-0.0388183744279291779383916}, - {0,1.5,800,-1.49859550534427827334156,-0.998128509045539613225203,-1.75342721996106687969703e-6}, - {0,1.5,15324,-1.49992659053829698010225,-0.999902123911128511304688,-4.79017695146261715054393e-9}, - {0,3,0.0004,-0.00356911664958785451901203,-0.00013331555792560991867751,-7.92292493952756190744874}, - {0,3,0.065,-0.250472012600853853120106,-0.0212071778140293637846656,-2.87462275628870402717091}, - {0,3,4.42,-2.28973397601639586742486,-0.595687331536388140161725,-0.113726692626070463108525}, - {0,3,800,-2.99438902306750149309853,-0.996264009962640099626401,-6.99624147447649277415792e-6}, - {0,3,15324,-2.99970638131217673536622,-0.999804266979839498923468,-1.91582075605741709616675e-8}, - {0,180,0.0004,-0.00520680203358650223341638,-2.22221728396159119646401e-6,-12.0170073061835395451321}, - {0,180,0.065,-0.515234583883688262086666,-0.000360980756948879571265932,-6.92704688665984521936613}, - {0,180,4.42,-16.4913562250745368347413,-0.0239670317752955210931569,-2.75504310079668394524277}, - {0,180,800,-162.3526751973522458866,-0.816326530612244897959184,-0.0192673746089352053174335}, - {0,180,15324,-178.951041022560568926078,-0.988390092879256965944272,-0.0000679211892648339243088643}, - {0,1123,0.0004,-0.00593912212871338076639709,-3.56188653183026470872139e-7,-13.8478056779721050990192}, - {0,1123,0.065,-0.634217014783734204352692,-0.000057877326779839101031552,-8.75724272015345990606553}, - {0,1123,4.42,-24.4936395934523258117904,-0.00392045555338738003583403,-4.54546787488649276731873}, - {0,1123,800,-701.624014336681947952778,-0.416016640665626625065003,-0.293046658586479060005975}, - {0,1123,15324,-1083.75715139725783359741,-0.931720070529579862588922,-0.00244293345030929573936621}, - {0,10586,0.0004,-0.00683653348042399161482707,-3.77857533426883301459161e-8,-16.091333738845732379756}, - {0,10586,0.065,-0.780043017108597589318463,-6.14014744855619155937546e-6,-11.0006679418181806995525}, - {0,10586,4.42,-34.3945190758502000304634,-0.000417358329509122395523501,-6.78198276010557247770399}, - {0,10586,800,-2124.42246547447991619038,-0.0702617249253469172668189,-1.72578980676844681250479}, - {0,10586,15324,-8048.29915678058041924358,-0.591431879583172520262447,-0.116640647318788574768032}, - {6,0.0000256,0.0004,-26.4803625972224902645113,220276.315789473684210526,-11595.4634978387095432955}, - {6,0.0000256,0.065,-51.4193881364481026728232,234281.729042100342019143,-74.6938075459730303944346}, - {6,0.0000256,4.42,-67.5203813751119077704357,234372.642547590674587948,-0.431255924758490025034736}, - {6,0.0000256,800,-69.998079065742703551293,234373.992500032239998968,-0.0000233303844710378174909984}, - {6,0.0000256,15324,-70.0158073212983954315096,234373.999608458993084276,-6.38614276575077488493398e-8}, - {6,0.314,0.0004,-9.62519749441237582251687,0.023038524497171844864751,2477.5305495558165940557}, - {6,0.314,0.065,-5.62316274126580027012417,3.10564173234962943044888,0.811756664687528071010215}, - {6,0.314,4.42,-11.7481186360489883350416,16.9071818179371883568924,-0.343526975436714222156802}, - {6,0.314,800,-13.8270107248858320162615,18.1011755433762948679586,-0.0000204650172704751119362432}, - {6,0.314,15324,-13.8425659569858167417764,18.1079092104353788140892,-5.6049178830042368725488e-8}, - {6,1.5,0.0004,-9.61978396161923322623754,0.00079978672354038922953879,2491.05377011516735187466}, - {6,1.5,0.065,-4.84100453988744409858109,0.124600638977635782747604,11.5208909282007772435409}, - {6,1.5,4.42,-4.69471130087565245107321,2.23986486486486486486486,-0.126129611536089773251445}, - {6,1.5,800,-5.6375883578559464150792,2.99438552713661883967561,-0.0000110478695320263035818071}, - {6,1.5,15324,-5.64599569956598171509704,2.99970637173338553391406,-3.03295927479829163411156e-8}, - {6,3,0.0004,-9.61926132713561025018161,0.00013331555792560991867751,2492.36008977011398813188}, - {6,3,0.065,-4.75878244235486512052296,0.0212071778140293637846656,12.745335721641112641817}, - {6,3,4.42,-2.88910819582874566285473,0.595687331536388140161725,0.00385024685205873541538553}, - {6,3,800,-2.98571724360242195248096,0.996264009962640099626401,-2.3069406647953774852549e-6}, - {6,3,15324,-2.98747963477610734281426,0.999804266979839498923468,-6.38245840446628643263247e-9}, - {6,180,0.0004,-9.62011239916672050497847,-2.14814337449620482324854e-6,2490.23240751308273540641}, - {6,180,0.065,-4.89709960487442547895843,-0.000348948065050583585557067,10.6171759350004776847048}, - {6,180,4.42,-11.8028833191445191284052,-0.023168130716119003723385,-1.86137525666548784300587}, - {6,180,800,-138.973123190861697819951,-0.789115646258503401360544,-0.0179131542129975601896404}, - {6,180,15324,-154.441639359481734262519,-0.955443756449948400412797,-0.0000634392772194434652186986}, - {6,1123,0.0004,-9.62083352307562855236427,-3.5428559715533443273747e-7,2488.4295995707558483234}, - {6,1123,0.065,-5.0142630342277769583843,-0.0000575680979635621334392196,8.81495887967631288756553}, - {6,1123,4.42,-19.6831821663032130583962,-0.00389950921917515894926679,-3.62458748384772905278683}, - {6,1123,800,-671.304184750646975825767,-0.41379393376981739999787,-0.288690114015941777831476}, - {6,1123,15324,-1048.61720731875393149901,-0.926742047000481483982035,-0.00241626280594218362665218}, - {6,10586,0.0004,-9.62172902400956379331308,-3.77643368945439762841293e-8,2486.19084755337982611478}, - {6,10586,0.065,-5.15977860354001470537965,-6.13666729697000818989159e-6,6.57630939764217205495288}, - {6,10586,4.42,-29.5629973572818969888733,-0.000417121776516768840415515,-5.85634703346878397904497}, - {6,10586,800,-2091.3124520859014907288,-0.0702219015407302460497774,-1.71884010032985743252181}, - {6,10586,15324,-8002.42495594488889877697,-0.59109666408369216553719,-0.116480739324794834878369}, - {14,0.0000256,0.0004,-49.8145624383586400724923,513979.323308270676691729,-30391.5592215308067657195}, - {14,0.0000256,0.065,-114.928171090288372551513,546658.700573312664550577,-196.832392093265929097095}, - {14,0.0000256,4.42,-161.649312877052269163198,546870.832603322478494242,-1.65012869090202521315342}, - {14,0.0000256,800,-173.098986627797206761932,546873.982500032559998958,-0.00014060727924520899116967}, - {14,0.0000256,15324,-173.206165042629407096483,546873.999086402089753857,-3.87293689171005773693536e-7}, - {14,0.314,0.0004,-10.48232124038756783909,0.0554529100014586473476929,2452.9820144458617504796}, - {14,0.314,0.065,-7.91753972042693519284807,7.47516931919399021898056,-19.4065385144529680284843}, - {14,0.314,4.42,-31.1096030160603970450565,40.6949859937193738748557,-1.44235830397139693802194}, - {14,0.314,800,-41.6146101076375483922037,43.568886473205763553092,-0.000133818772002702504530118}, - {14,0.314,15324,-41.7166402819016445593073,43.585094170597712706582,-3.68785202783475625980072e-7}, - {14,1.5,0.0004,-10.4688561593594870180174,0.00222162978761219230427442,2486.61861613580838671742}, - {14,1.5,0.065,-5.96960149272681243148081,0.346112886048988285410011,7.29895408232336627643618}, - {14,1.5,4.42,-13.3341039738636536056565,6.22184684684684684684685,-0.886409460834882606838869}, - {14,1.5,800,-20.9264151022685229463224,8.31773757537949677687669,-0.000109610174761583369512834}, - {14,1.5,15324,-21.0100699378693506067827,8.3325176992594042608724,-3.02665838448691571323444e-7}, - {14,3,0.0004,-10.4672670714982932744397,0.000488823712393903035150869,2490.59053612251208613134}, - {14,3,0.065,-5.71949591388313644017256,0.0777596519847743338771071,11.025105769529760808809}, - {14,3,4.42,-7.79006429060418247514041,2.18418688230008984725966,-0.483245366998347706389421}, - {14,3,800,-12.7443244787126682405839,3.6529680365296803652968,-0.0000822242550653573074282639}, - {14,3,15324,-12.8071593989944707311042,3.66594897892607816271938,-2.27631817501670696455485e-7}, - {14,180,0.0004,-10.4670693257255523386798,-2.04937816187568965896125e-6,2491.08472067831379995549}, - {14,180,0.065,-5.68921919805166473123324,-0.000332904475852855604611915,11.4626317745298008318075}, - {14,180,4.42,-9.65337657959679927166961,-0.0221029293038836472303558,-1.31368299764513841319336}, - {14,180,800,-117.570556789937986073345,-0.752834467120181405895692,-0.0161936967338941701029113}, - {14,180,15324,-131.5984192349764106228,-0.911515307877536979704162,-0.0000577016781835615346878727}, - {14,1123,0.0004,-10.4677755213861686112027,-3.51748189118411715224579e-7,2489.319233308602484167}, - {14,1123,0.065,-5.8039572920094235935389,-0.0000571557928751928433161097,9.69771975676490255408168}, - {14,1123,4.42,-17.3710293984633664722496,-0.00387158077355886416717715,-3.04061182895062280658097}, - {14,1123,800,-640.647914910330698665346,-0.41083032457540509990836,-0.282967557637372205015805}, - {14,1123,15324,-1011.59993064034851794618,-0.920104682295016979172854,-0.00238094023047733949128954}, - {14,10586,0.0004,-10.468668475096403358952,-3.77357816303515044684135e-8,2487.08684934922326872119}, - {14,10586,0.065,-5.94905895063816048990702,-6.13202709485509703057976e-6,7.46543792757153500263484}, - {14,10586,4.42,-27.2227588675497966851323,-0.000416806372526964100271534,-5.26603093110764468733629}, - {14,10586,800,-2056.93593717552727578896,-0.0701688036945746844270555,-1.70965999479388506262815}, - {14,10586,15324,-7951.09533692356666073317,-0.590649710084385025903513,-0.116267766949827820373742}, - {1525,0.0000256,0.0004,-4301.78472746701578211824,5.59871348684210526315789e7,-3.58066878763440801575999e6}, - {1525,0.0000256,0.065,-11965.4671281234821192651,5.95468591985310400826751e7,-23429.1126891147674041279}, - {1525,0.0000256,4.42,-18367.3428918005844132604,5.95699664793796669412955e7,-339.057082534394502685042}, - {1525,0.0000256,800,-24826.2281356385313850842,5.9570309593750092999997e7,-0.838976287617641050521018}, - {1525,0.0000256,15324,-25707.7170288016100578067,5.95703114004829044732209e7,-0.00464306291332368931093164}, - {1525,0.314,0.0004,-17.0947387955188070326685,6.17771997212362846631335,-2348.2711549792054388957}, - {1525,0.314,0.065,-296.585568286099067098382,832.7696922844226341529,-4001.49218112616940138645}, - {1525,0.314,4.42,-4115.10160678526160318827,4533.61649969457966358017,-316.176485619091863713022}, - {1525,0.314,800,-10469.9426767525578633112,4853.78278834474666145767,-0.838228516034976412381988}, - {1525,0.314,15324,-11350.8644775429644460839,4855.58840352125852665115,-0.00464102415296814454780544}, - {1525,1.5,0.0004,-15.5605375416167690037651,0.270772238514173998044966,1484.28030775203773370257}, - {1525,1.5,0.065,-74.4509275868752796839738,42.1842385516506922257721,-953.474508334327862701411}, - {1525,1.5,4.42,-2072.19103657901875771673,758.318693693693693693694,-251.676626135276647866636}, - {1525,1.5,800,-8088.5487996808837996978,1013.76585568725306716573,-0.835410572412918435298525}, - {1525,1.5,15324,-8967.33164084000397251235,1015.56725718573619131513,-0.00463332752548632640449661}, - {1525,3,0.0004,-15.3575220720668965445137,0.0676354263875927654090566,1991.71749039935673683979}, - {1525,3,0.065,-42.4918294753981553150494,10.759108210984230560087,-477.238467087057049216524}, - {1525,3,4.42,-1360.54978818586119643475,302.212039532794249775382,-199.675789571126133218244}, - {1525,3,800,-7035.84649923785032031894,505.437941054379410543794,-0.831861613850395752926704}, - {1525,3,15324,-7911.93122400832367818281,507.234031447771905787173,-0.00462360345575814251935502}, - {1525,180,0.0004,-15.1592288635917619923534,0.0000166049013718241119958005,2487.41676922898500772359}, - {1525,180,0.065,-10.6183839860155018806964,0.00269732843386801679640377,7.79296281407547767488829}, - {1525,180,4.42,-30.7569326420675973698907,0.179086987432069310390534,-5.06066771330890867332748}, - {1525,180,800,-1255.10606104316181434609,6.09977324263038548752834,-0.50811617220616562857323}, - {1525,180,15324,-1861.51726736161923065929,7.38547041623667010663915,-0.00355560001152251827139362}, - {1525,1123,0.0004,-15.1571154863562692876443,1.27504753855366555022796e-7,2492.70020501203972018602}, - {1525,1123,0.065,-10.2750368571307051844228,0.0000207183306905568286862724,13.0740397653170432513801}, - {1525,1123,4.42,-7.7548168672587285529831,0.0014034043922188128000047,0.0654298516080506295778705}, - {1525,1123,800,-30.3901820482837344036952,0.148921362019218079497891,-0.0188047284729684005572389}, - {1525,1123,15324,-64.3938471491118556432688,0.333527576449591366661395,-0.000290976140796059790385352}, - {1525,10586,0.0004,-15.1575273331900733823398,-3.23424061059983902750941e-8,2491.6705880068073820668}, - {1525,10586,0.065,-10.341961135413218918573,-5.25560892040125181555838e-6,12.0444483664247291801249}, - {1525,10586,4.42,-12.3018556139457378552047,-0.000357234443952593805577031,-0.96243723577972978183147}, - {1525,10586,800,-744.016916706287313438782,-0.0601399480019429829354474,-0.792452568525027960065769}, - {1525,10586,15324,-4300.64559341391477270059,-0.506231273465249027592861,-0.080624196979174112177973}, - {10233,0.0000256,0.0004,-28781.0708528951564436868,3.75682858552631578947368e8,-2.40411931995216805817928e7}, - {10233,0.0000256,0.065,-80237.4790550341084402889,3.99569192710255653158141e8,-157343.697098361014871643}, - {10233,0.0000256,4.42,-123371.163364167739853751,3.99724246355043735493297e8,-2307.2799792939510175957}, - {10233,0.0000256,800,-173733.655946368116040227,3.99726548708750441319986e8,-10.1666354466535988554224}, - {10233,0.0000256,15324,-189611.393943800923934812,3.9972656083222396519806e8,-0.156271946909903467303064}, - {10233,0.314,0.0004,-30.0835346409569126537712,41.4607785935398129689956,-30043.5682705897920957967}, - {10233,0.314,0.065,-1936.71659175848698855364,5589.00047056450935246962,-26975.8416131385266353558}, - {10233,0.314,4.42,-27734.5558869327520485077,30426.6413450334885998832,-2153.7342775414124625757}, - {10233,0.314,800,-77398.8345343110590488869,32575.3861354641233252254,-10.1616173371352784115726}, - {10233,0.314,15324,-93272.7669155443507051479,32587.5042326579589686295,-0.156258265294963792040417}, - {10233,1.5,0.0004,-19.7852231333246169373824,1.81844841375633164489469,-4317.60144720493526427937}, - {10233,1.5,0.065,-445.630392408020268115618,283.300319488817891373802,-6515.78789458981693006454}, - {10233,1.5,4.42,-14020.6484936315300789489,5092.70608108108108108108,-1720.72113290933110987002}, - {10233,1.5,800,-61412.5266404072312643186,6808.23456019962570180911,-10.1426989007295637839166}, - {10233,1.5,15324,-77272.0989845637286907938,6820.33238719780757560928,-0.156206593508853883167535}, - {10233,3,0.0004,-18.4213731622889640306878,0.454606052526329822690308,-908.658303440053015065049}, - {10233,3,0.065,-230.930124889414044823939,72.3164763458401305057096,-3316.44389947819074911539}, - {10233,3,4.42,-9239.71902985399623107597,2031.29380053908355795148,-1371.35925605961200776625}, - {10233,3,800,-54340.1804040886113152815,3397.26027397260273972603,-10.1188548696496798960218}, - {10233,3,15324,-70181.625182690519906018,3409.33255040125269132903,-0.156141261363057784911755}, - {10233,180,0.0004,-17.081441774321808557538,0.000124110835309254868322515,2440.94300115825934508112}, - {10233,180,0.065,-15.5422428149329860521265,0.0201607752755949240552023,-38.663485376183506373452}, - {10233,180,4.42,-235.497379149446597781456,1.33855872465025485305281,-50.3775345819770169658823}, - {10233,180,800,-14640.5024630709594885282,45.5918367346938775510204,-7.83648996527639800152069}, - {10233,180,15324,-28577.6446971680821285066,55.2015866873065015479876,-0.148587051440887372280679}, - {10233,1123,0.0004,-17.0630789988207189145522,2.88947340204574456780515e-6,2486.84988023336341161969}, - {10233,1123,0.065,-12.5589181079456256205069,0.000469512419380529127691397,7.22412495831966558459338}, - {10233,1123,4.42,-35.4550615786577840007616,0.0318035174455556831045841,-5.75696060521026301882133}, - {10233,1123,800,-3343.1303902972739556477,3.37480997013700672692981,-2.98980536947426087305154}, - {10233,1123,15324,-11352.0607180353268830661,7.55829905834770485145599,-0.113119180727235553840235}, - {10233,10586,0.0004,-17.0607181926565361616021,-1.26000103249281886845913e-9,2492.75189435765523482408}, - {10233,10586,0.065,-12.175300607237463446918,-2.04748918320454904634379e-7,13.1257236766090680623184}, - {10233,10586,4.42,-9.43079204562662170137108,-0.0000139172010501341588531831,0.116749372001926599593782}, - {10233,10586,800,-7.27036619721226178082317,-0.002342942461614156602606,0.0000890483066241868231597611}, - {10233,10586,15324,-9.3278240351663417156768,-0.0197218452194275363359762,-0.0000805948075011592832299515}, -};} // namespace neg_binomial_2_test_internal +// TODO[martinmodrak] add updated code here +std::vector testValues = { + {0, 0.0000256, 0.0004, -0.0000248141563677810565248409, + -0.93984962406015037593985, -0.0018850149796030172519518}, + {0, 0.0000256, 0.065, -0.0000255949600924861403888716, + -0.999606308899879432100588, -7.75166869111834937935475e-8}, + {0, 0.0000256, 4.42, -0.0000255999258645396480948713, + -0.999994208178341772500141, -1.67726638232395628338958e-11}, + {0, 0.0000256, 800, -0.0000255999995904000087381331, + -0.999999968000001023999967, -5.1199997815466745309864e-16}, + {0, 0.0000256, 15324, -0.0000255999999786165492276784, + -0.999999998329417909342659, -1.39542226236663832355842e-18}, + {0, 0.314, 0.0004, -0.00266678271697168261798476, + -0.00127226463104325699745547, -5.66822905706024980195936}, + {0, 0.314, 0.065, -0.114604680787141300415594, -0.171503957783641160949868, + -0.934652892970430398112858}, + {0, 0.314, 4.42, -0.303348202309659616314882, -0.933671313899450781580059, + -0.00230212890163621513546237}, + {0, 0.314, 800, -0.313938393619808990999524, -0.999607653995806645891488, + -7.69878314071302369967267e-8}, + {0, 0.314, 15324, -0.313996782998787812397665, -0.999979509686371605280341, + -2.09929343978617830724328e-10}, + {0, 1.5, 0.0004, -0.00329191110003275493362122, + -0.00026659557451346307651293, -7.23004434565640079712956}, + {0, 1.5, 0.065, -0.206781499150110071240643, -0.0415335463258785942492013, + -2.22278737940449507487448}, + {0, 1.5, 4.42, -1.29150964740387939892012, -0.746621621621621621621622, + -0.0388183744279291779383916}, + {0, 1.5, 800, -1.49859550534427827334156, -0.998128509045539613225203, + -1.75342721996106687969703e-6}, + {0, 1.5, 15324, -1.49992659053829698010225, -0.999902123911128511304688, + -4.79017695146261715054393e-9}, + {0, 3, 0.0004, -0.00356911664958785451901203, -0.00013331555792560991867751, + -7.92292493952756190744874}, + {0, 3, 0.065, -0.250472012600853853120106, -0.0212071778140293637846656, + -2.87462275628870402717091}, + {0, 3, 4.42, -2.28973397601639586742486, -0.595687331536388140161725, + -0.113726692626070463108525}, + {0, 3, 800, -2.99438902306750149309853, -0.996264009962640099626401, + -6.99624147447649277415792e-6}, + {0, 3, 15324, -2.99970638131217673536622, -0.999804266979839498923468, + -1.91582075605741709616675e-8}, + {0, 180, 0.0004, -0.00520680203358650223341638, + -2.22221728396159119646401e-6, -12.0170073061835395451321}, + {0, 180, 0.065, -0.515234583883688262086666, -0.000360980756948879571265932, + -6.92704688665984521936613}, + {0, 180, 4.42, -16.4913562250745368347413, -0.0239670317752955210931569, + -2.75504310079668394524277}, + {0, 180, 800, -162.3526751973522458866, -0.816326530612244897959184, + -0.0192673746089352053174335}, + {0, 180, 15324, -178.951041022560568926078, -0.988390092879256965944272, + -0.0000679211892648339243088643}, + {0, 1123, 0.0004, -0.00593912212871338076639709, + -3.56188653183026470872139e-7, -13.8478056779721050990192}, + {0, 1123, 0.065, -0.634217014783734204352692, + -0.000057877326779839101031552, -8.75724272015345990606553}, + {0, 1123, 4.42, -24.4936395934523258117904, -0.00392045555338738003583403, + -4.54546787488649276731873}, + {0, 1123, 800, -701.624014336681947952778, -0.416016640665626625065003, + -0.293046658586479060005975}, + {0, 1123, 15324, -1083.75715139725783359741, -0.931720070529579862588922, + -0.00244293345030929573936621}, + {0, 10586, 0.0004, -0.00683653348042399161482707, + -3.77857533426883301459161e-8, -16.091333738845732379756}, + {0, 10586, 0.065, -0.780043017108597589318463, + -6.14014744855619155937546e-6, -11.0006679418181806995525}, + {0, 10586, 4.42, -34.3945190758502000304634, -0.000417358329509122395523501, + -6.78198276010557247770399}, + {0, 10586, 800, -2124.42246547447991619038, -0.0702617249253469172668189, + -1.72578980676844681250479}, + {0, 10586, 15324, -8048.29915678058041924358, -0.591431879583172520262447, + -0.116640647318788574768032}, + {6, 0.0000256, 0.0004, -26.4803625972224902645113, + 220276.315789473684210526, -11595.4634978387095432955}, + {6, 0.0000256, 0.065, -51.4193881364481026728232, 234281.729042100342019143, + -74.6938075459730303944346}, + {6, 0.0000256, 4.42, -67.5203813751119077704357, 234372.642547590674587948, + -0.431255924758490025034736}, + {6, 0.0000256, 800, -69.998079065742703551293, 234373.992500032239998968, + -0.0000233303844710378174909984}, + {6, 0.0000256, 15324, -70.0158073212983954315096, 234373.999608458993084276, + -6.38614276575077488493398e-8}, + {6, 0.314, 0.0004, -9.62519749441237582251687, 0.023038524497171844864751, + 2477.5305495558165940557}, + {6, 0.314, 0.065, -5.62316274126580027012417, 3.10564173234962943044888, + 0.811756664687528071010215}, + {6, 0.314, 4.42, -11.7481186360489883350416, 16.9071818179371883568924, + -0.343526975436714222156802}, + {6, 0.314, 800, -13.8270107248858320162615, 18.1011755433762948679586, + -0.0000204650172704751119362432}, + {6, 0.314, 15324, -13.8425659569858167417764, 18.1079092104353788140892, + -5.6049178830042368725488e-8}, + {6, 1.5, 0.0004, -9.61978396161923322623754, 0.00079978672354038922953879, + 2491.05377011516735187466}, + {6, 1.5, 0.065, -4.84100453988744409858109, 0.124600638977635782747604, + 11.5208909282007772435409}, + {6, 1.5, 4.42, -4.69471130087565245107321, 2.23986486486486486486486, + -0.126129611536089773251445}, + {6, 1.5, 800, -5.6375883578559464150792, 2.99438552713661883967561, + -0.0000110478695320263035818071}, + {6, 1.5, 15324, -5.64599569956598171509704, 2.99970637173338553391406, + -3.03295927479829163411156e-8}, + {6, 3, 0.0004, -9.61926132713561025018161, 0.00013331555792560991867751, + 2492.36008977011398813188}, + {6, 3, 0.065, -4.75878244235486512052296, 0.0212071778140293637846656, + 12.745335721641112641817}, + {6, 3, 4.42, -2.88910819582874566285473, 0.595687331536388140161725, + 0.00385024685205873541538553}, + {6, 3, 800, -2.98571724360242195248096, 0.996264009962640099626401, + -2.3069406647953774852549e-6}, + {6, 3, 15324, -2.98747963477610734281426, 0.999804266979839498923468, + -6.38245840446628643263247e-9}, + {6, 180, 0.0004, -9.62011239916672050497847, -2.14814337449620482324854e-6, + 2490.23240751308273540641}, + {6, 180, 0.065, -4.89709960487442547895843, -0.000348948065050583585557067, + 10.6171759350004776847048}, + {6, 180, 4.42, -11.8028833191445191284052, -0.023168130716119003723385, + -1.86137525666548784300587}, + {6, 180, 800, -138.973123190861697819951, -0.789115646258503401360544, + -0.0179131542129975601896404}, + {6, 180, 15324, -154.441639359481734262519, -0.955443756449948400412797, + -0.0000634392772194434652186986}, + {6, 1123, 0.0004, -9.62083352307562855236427, -3.5428559715533443273747e-7, + 2488.4295995707558483234}, + {6, 1123, 0.065, -5.0142630342277769583843, -0.0000575680979635621334392196, + 8.81495887967631288756553}, + {6, 1123, 4.42, -19.6831821663032130583962, -0.00389950921917515894926679, + -3.62458748384772905278683}, + {6, 1123, 800, -671.304184750646975825767, -0.41379393376981739999787, + -0.288690114015941777831476}, + {6, 1123, 15324, -1048.61720731875393149901, -0.926742047000481483982035, + -0.00241626280594218362665218}, + {6, 10586, 0.0004, -9.62172902400956379331308, + -3.77643368945439762841293e-8, 2486.19084755337982611478}, + {6, 10586, 0.065, -5.15977860354001470537965, -6.13666729697000818989159e-6, + 6.57630939764217205495288}, + {6, 10586, 4.42, -29.5629973572818969888733, -0.000417121776516768840415515, + -5.85634703346878397904497}, + {6, 10586, 800, -2091.3124520859014907288, -0.0702219015407302460497774, + -1.71884010032985743252181}, + {6, 10586, 15324, -8002.42495594488889877697, -0.59109666408369216553719, + -0.116480739324794834878369}, + {14, 0.0000256, 0.0004, -49.8145624383586400724923, + 513979.323308270676691729, -30391.5592215308067657195}, + {14, 0.0000256, 0.065, -114.928171090288372551513, + 546658.700573312664550577, -196.832392093265929097095}, + {14, 0.0000256, 4.42, -161.649312877052269163198, 546870.832603322478494242, + -1.65012869090202521315342}, + {14, 0.0000256, 800, -173.098986627797206761932, 546873.982500032559998958, + -0.00014060727924520899116967}, + {14, 0.0000256, 15324, -173.206165042629407096483, + 546873.999086402089753857, -3.87293689171005773693536e-7}, + {14, 0.314, 0.0004, -10.48232124038756783909, 0.0554529100014586473476929, + 2452.9820144458617504796}, + {14, 0.314, 0.065, -7.91753972042693519284807, 7.47516931919399021898056, + -19.4065385144529680284843}, + {14, 0.314, 4.42, -31.1096030160603970450565, 40.6949859937193738748557, + -1.44235830397139693802194}, + {14, 0.314, 800, -41.6146101076375483922037, 43.568886473205763553092, + -0.000133818772002702504530118}, + {14, 0.314, 15324, -41.7166402819016445593073, 43.585094170597712706582, + -3.68785202783475625980072e-7}, + {14, 1.5, 0.0004, -10.4688561593594870180174, 0.00222162978761219230427442, + 2486.61861613580838671742}, + {14, 1.5, 0.065, -5.96960149272681243148081, 0.346112886048988285410011, + 7.29895408232336627643618}, + {14, 1.5, 4.42, -13.3341039738636536056565, 6.22184684684684684684685, + -0.886409460834882606838869}, + {14, 1.5, 800, -20.9264151022685229463224, 8.31773757537949677687669, + -0.000109610174761583369512834}, + {14, 1.5, 15324, -21.0100699378693506067827, 8.3325176992594042608724, + -3.02665838448691571323444e-7}, + {14, 3, 0.0004, -10.4672670714982932744397, 0.000488823712393903035150869, + 2490.59053612251208613134}, + {14, 3, 0.065, -5.71949591388313644017256, 0.0777596519847743338771071, + 11.025105769529760808809}, + {14, 3, 4.42, -7.79006429060418247514041, 2.18418688230008984725966, + -0.483245366998347706389421}, + {14, 3, 800, -12.7443244787126682405839, 3.6529680365296803652968, + -0.0000822242550653573074282639}, + {14, 3, 15324, -12.8071593989944707311042, 3.66594897892607816271938, + -2.27631817501670696455485e-7}, + {14, 180, 0.0004, -10.4670693257255523386798, -2.04937816187568965896125e-6, + 2491.08472067831379995549}, + {14, 180, 0.065, -5.68921919805166473123324, -0.000332904475852855604611915, + 11.4626317745298008318075}, + {14, 180, 4.42, -9.65337657959679927166961, -0.0221029293038836472303558, + -1.31368299764513841319336}, + {14, 180, 800, -117.570556789937986073345, -0.752834467120181405895692, + -0.0161936967338941701029113}, + {14, 180, 15324, -131.5984192349764106228, -0.911515307877536979704162, + -0.0000577016781835615346878727}, + {14, 1123, 0.0004, -10.4677755213861686112027, + -3.51748189118411715224579e-7, 2489.319233308602484167}, + {14, 1123, 0.065, -5.8039572920094235935389, + -0.0000571557928751928433161097, 9.69771975676490255408168}, + {14, 1123, 4.42, -17.3710293984633664722496, -0.00387158077355886416717715, + -3.04061182895062280658097}, + {14, 1123, 800, -640.647914910330698665346, -0.41083032457540509990836, + -0.282967557637372205015805}, + {14, 1123, 15324, -1011.59993064034851794618, -0.920104682295016979172854, + -0.00238094023047733949128954}, + {14, 10586, 0.0004, -10.468668475096403358952, + -3.77357816303515044684135e-8, 2487.08684934922326872119}, + {14, 10586, 0.065, -5.94905895063816048990702, + -6.13202709485509703057976e-6, 7.46543792757153500263484}, + {14, 10586, 4.42, -27.2227588675497966851323, + -0.000416806372526964100271534, -5.26603093110764468733629}, + {14, 10586, 800, -2056.93593717552727578896, -0.0701688036945746844270555, + -1.70965999479388506262815}, + {14, 10586, 15324, -7951.09533692356666073317, -0.590649710084385025903513, + -0.116267766949827820373742}, + {1525, 0.0000256, 0.0004, -4301.78472746701578211824, + 5.59871348684210526315789e7, -3.58066878763440801575999e6}, + {1525, 0.0000256, 0.065, -11965.4671281234821192651, + 5.95468591985310400826751e7, -23429.1126891147674041279}, + {1525, 0.0000256, 4.42, -18367.3428918005844132604, + 5.95699664793796669412955e7, -339.057082534394502685042}, + {1525, 0.0000256, 800, -24826.2281356385313850842, + 5.9570309593750092999997e7, -0.838976287617641050521018}, + {1525, 0.0000256, 15324, -25707.7170288016100578067, + 5.95703114004829044732209e7, -0.00464306291332368931093164}, + {1525, 0.314, 0.0004, -17.0947387955188070326685, 6.17771997212362846631335, + -2348.2711549792054388957}, + {1525, 0.314, 0.065, -296.585568286099067098382, 832.7696922844226341529, + -4001.49218112616940138645}, + {1525, 0.314, 4.42, -4115.10160678526160318827, 4533.61649969457966358017, + -316.176485619091863713022}, + {1525, 0.314, 800, -10469.9426767525578633112, 4853.78278834474666145767, + -0.838228516034976412381988}, + {1525, 0.314, 15324, -11350.8644775429644460839, 4855.58840352125852665115, + -0.00464102415296814454780544}, + {1525, 1.5, 0.0004, -15.5605375416167690037651, 0.270772238514173998044966, + 1484.28030775203773370257}, + {1525, 1.5, 0.065, -74.4509275868752796839738, 42.1842385516506922257721, + -953.474508334327862701411}, + {1525, 1.5, 4.42, -2072.19103657901875771673, 758.318693693693693693694, + -251.676626135276647866636}, + {1525, 1.5, 800, -8088.5487996808837996978, 1013.76585568725306716573, + -0.835410572412918435298525}, + {1525, 1.5, 15324, -8967.33164084000397251235, 1015.56725718573619131513, + -0.00463332752548632640449661}, + {1525, 3, 0.0004, -15.3575220720668965445137, 0.0676354263875927654090566, + 1991.71749039935673683979}, + {1525, 3, 0.065, -42.4918294753981553150494, 10.759108210984230560087, + -477.238467087057049216524}, + {1525, 3, 4.42, -1360.54978818586119643475, 302.212039532794249775382, + -199.675789571126133218244}, + {1525, 3, 800, -7035.84649923785032031894, 505.437941054379410543794, + -0.831861613850395752926704}, + {1525, 3, 15324, -7911.93122400832367818281, 507.234031447771905787173, + -0.00462360345575814251935502}, + {1525, 180, 0.0004, -15.1592288635917619923534, + 0.0000166049013718241119958005, 2487.41676922898500772359}, + {1525, 180, 0.065, -10.6183839860155018806964, 0.00269732843386801679640377, + 7.79296281407547767488829}, + {1525, 180, 4.42, -30.7569326420675973698907, 0.179086987432069310390534, + -5.06066771330890867332748}, + {1525, 180, 800, -1255.10606104316181434609, 6.09977324263038548752834, + -0.50811617220616562857323}, + {1525, 180, 15324, -1861.51726736161923065929, 7.38547041623667010663915, + -0.00355560001152251827139362}, + {1525, 1123, 0.0004, -15.1571154863562692876443, + 1.27504753855366555022796e-7, 2492.70020501203972018602}, + {1525, 1123, 0.065, -10.2750368571307051844228, + 0.0000207183306905568286862724, 13.0740397653170432513801}, + {1525, 1123, 4.42, -7.7548168672587285529831, 0.0014034043922188128000047, + 0.0654298516080506295778705}, + {1525, 1123, 800, -30.3901820482837344036952, 0.148921362019218079497891, + -0.0188047284729684005572389}, + {1525, 1123, 15324, -64.3938471491118556432688, 0.333527576449591366661395, + -0.000290976140796059790385352}, + {1525, 10586, 0.0004, -15.1575273331900733823398, + -3.23424061059983902750941e-8, 2491.6705880068073820668}, + {1525, 10586, 0.065, -10.341961135413218918573, + -5.25560892040125181555838e-6, 12.0444483664247291801249}, + {1525, 10586, 4.42, -12.3018556139457378552047, + -0.000357234443952593805577031, -0.96243723577972978183147}, + {1525, 10586, 800, -744.016916706287313438782, -0.0601399480019429829354474, + -0.792452568525027960065769}, + {1525, 10586, 15324, -4300.64559341391477270059, + -0.506231273465249027592861, -0.080624196979174112177973}, + {10233, 0.0000256, 0.0004, -28781.0708528951564436868, + 3.75682858552631578947368e8, -2.40411931995216805817928e7}, + {10233, 0.0000256, 0.065, -80237.4790550341084402889, + 3.99569192710255653158141e8, -157343.697098361014871643}, + {10233, 0.0000256, 4.42, -123371.163364167739853751, + 3.99724246355043735493297e8, -2307.2799792939510175957}, + {10233, 0.0000256, 800, -173733.655946368116040227, + 3.99726548708750441319986e8, -10.1666354466535988554224}, + {10233, 0.0000256, 15324, -189611.393943800923934812, + 3.9972656083222396519806e8, -0.156271946909903467303064}, + {10233, 0.314, 0.0004, -30.0835346409569126537712, + 41.4607785935398129689956, -30043.5682705897920957967}, + {10233, 0.314, 0.065, -1936.71659175848698855364, 5589.00047056450935246962, + -26975.8416131385266353558}, + {10233, 0.314, 4.42, -27734.5558869327520485077, 30426.6413450334885998832, + -2153.7342775414124625757}, + {10233, 0.314, 800, -77398.8345343110590488869, 32575.3861354641233252254, + -10.1616173371352784115726}, + {10233, 0.314, 15324, -93272.7669155443507051479, 32587.5042326579589686295, + -0.156258265294963792040417}, + {10233, 1.5, 0.0004, -19.7852231333246169373824, 1.81844841375633164489469, + -4317.60144720493526427937}, + {10233, 1.5, 0.065, -445.630392408020268115618, 283.300319488817891373802, + -6515.78789458981693006454}, + {10233, 1.5, 4.42, -14020.6484936315300789489, 5092.70608108108108108108, + -1720.72113290933110987002}, + {10233, 1.5, 800, -61412.5266404072312643186, 6808.23456019962570180911, + -10.1426989007295637839166}, + {10233, 1.5, 15324, -77272.0989845637286907938, 6820.33238719780757560928, + -0.156206593508853883167535}, + {10233, 3, 0.0004, -18.4213731622889640306878, 0.454606052526329822690308, + -908.658303440053015065049}, + {10233, 3, 0.065, -230.930124889414044823939, 72.3164763458401305057096, + -3316.44389947819074911539}, + {10233, 3, 4.42, -9239.71902985399623107597, 2031.29380053908355795148, + -1371.35925605961200776625}, + {10233, 3, 800, -54340.1804040886113152815, 3397.26027397260273972603, + -10.1188548696496798960218}, + {10233, 3, 15324, -70181.625182690519906018, 3409.33255040125269132903, + -0.156141261363057784911755}, + {10233, 180, 0.0004, -17.081441774321808557538, + 0.000124110835309254868322515, 2440.94300115825934508112}, + {10233, 180, 0.065, -15.5422428149329860521265, 0.0201607752755949240552023, + -38.663485376183506373452}, + {10233, 180, 4.42, -235.497379149446597781456, 1.33855872465025485305281, + -50.3775345819770169658823}, + {10233, 180, 800, -14640.5024630709594885282, 45.5918367346938775510204, + -7.83648996527639800152069}, + {10233, 180, 15324, -28577.6446971680821285066, 55.2015866873065015479876, + -0.148587051440887372280679}, + {10233, 1123, 0.0004, -17.0630789988207189145522, + 2.88947340204574456780515e-6, 2486.84988023336341161969}, + {10233, 1123, 0.065, -12.5589181079456256205069, + 0.000469512419380529127691397, 7.22412495831966558459338}, + {10233, 1123, 4.42, -35.4550615786577840007616, 0.0318035174455556831045841, + -5.75696060521026301882133}, + {10233, 1123, 800, -3343.1303902972739556477, 3.37480997013700672692981, + -2.98980536947426087305154}, + {10233, 1123, 15324, -11352.0607180353268830661, 7.55829905834770485145599, + -0.113119180727235553840235}, + {10233, 10586, 0.0004, -17.0607181926565361616021, + -1.26000103249281886845913e-9, 2492.75189435765523482408}, + {10233, 10586, 0.065, -12.175300607237463446918, + -2.04748918320454904634379e-7, 13.1257236766090680623184}, + {10233, 10586, 4.42, -9.43079204562662170137108, + -0.0000139172010501341588531831, 0.116749372001926599593782}, + {10233, 10586, 800, -7.27036619721226178082317, -0.002342942461614156602606, + 0.0000890483066241868231597611}, + {10233, 10586, 15324, -9.3278240351663417156768, + -0.0197218452194275363359762, -0.0000805948075011592832299515}, +}; +} // namespace neg_binomial_2_test_internal TEST(ProbDistributionsNegativeBinomial2, derivativesPrecomputed) { using neg_binomial_2_test_internal::TestValue; @@ -334,8 +511,8 @@ TEST(ProbDistributionsNegBinomial2, derivativesZeroOne) { for (double phi_dbl = phi_start; phi_dbl < phi_max; phi_dbl *= stan::math::pi()) { std::ostringstream msg; - msg << std::setprecision(20) << ", mu = " << mu_dbl - << ", phi = " << phi_dbl; + msg << std::setprecision(20) << ", mu = " << mu_dbl + << ", phi = " << phi_dbl; var mu0(mu_dbl); var phi0(phi_dbl); From 4c48fc67a66ca83f81f76cc68356d41f70ab9da4 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Mon, 13 Jan 2020 20:11:43 +0100 Subject: [PATCH 62/82] More fixes after merge --- stan/math/prim/fun/lgamma_stirling.hpp | 4 ++-- stan/math/prim/fun/lgamma_stirling_diff.hpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/stan/math/prim/fun/lgamma_stirling.hpp b/stan/math/prim/fun/lgamma_stirling.hpp index 9aaa627447d..cf63a1f0656 100644 --- a/stan/math/prim/fun/lgamma_stirling.hpp +++ b/stan/math/prim/fun/lgamma_stirling.hpp @@ -1,5 +1,5 @@ -#ifndef STAN_MATH_PRIM_SCAL_FUN_LGAMMA_STIRLING_HPP -#define STAN_MATH_PRIM_SCAL_FUN_LGAMMA_STIRLING_HPP +#ifndef STAN_MATH_PRIM_FUN_LGAMMA_STIRLING_HPP +#define STAN_MATH_PRIM_FUN_LGAMMA_STIRLING_HPP #include #include diff --git a/stan/math/prim/fun/lgamma_stirling_diff.hpp b/stan/math/prim/fun/lgamma_stirling_diff.hpp index 45c9f26c1fe..5432ad6e044 100644 --- a/stan/math/prim/fun/lgamma_stirling_diff.hpp +++ b/stan/math/prim/fun/lgamma_stirling_diff.hpp @@ -1,5 +1,5 @@ -#ifndef STAN_MATH_PRIM_SCAL_FUN_LGAMMA_STIRLING_DIFF_HPP -#define STAN_MATH_PRIM_SCAL_FUN_LGAMMA_STIRLING_DIFF_HPP +#ifndef STAN_MATH_PRIM_FUN_LGAMMA_STIRLING_DIFF_HPP +#define STAN_MATH_PRIM_FUN_LGAMMA_STIRLING_DIFF_HPP #include #include From 584d5056d8c46fb94627c165795459a47c96871b Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Mon, 13 Jan 2020 19:16:18 +0000 Subject: [PATCH 63/82] [Jenkins] auto-formatting by clang-format version 5.0.0-3~16.04.1 (tags/RELEASE_500/final) --- .../prim/fun/binomial_coefficient_log.hpp | 17 ++-- stan/math/prim/fun/lbeta.hpp | 13 ++- .../fun/binomial_coefficient_log_test.cpp | 80 +++++++++++++++++-- test/unit/math/prim/fun/lbeta_test.cpp | 67 +++++++++++++--- 4 files changed, 146 insertions(+), 31 deletions(-) diff --git a/stan/math/prim/fun/binomial_coefficient_log.hpp b/stan/math/prim/fun/binomial_coefficient_log.hpp index e81a97e8b55..5355a625a8d 100644 --- a/stan/math/prim/fun/binomial_coefficient_log.hpp +++ b/stan/math/prim/fun/binomial_coefficient_log.hpp @@ -25,13 +25,14 @@ namespace math { * * \f$ \log {N \choose n} * = \log \ \Gamma(N+1) - \log \Gamma(n+1) - \log \Gamma(N-n+1)\f$. - * + * * * TODO[martinmodrak] figure out the cases for x < 0 and for partials \f[ \mbox{binomial\_coefficient\_log}(x, y) = \begin{cases} - \textrm{error} & \mbox{if } y > x + 1 \textrm{ or } y < -1 \textrm{ or } x < 0\\ + \textrm{error} & \mbox{if } y > x + 1 \textrm{ or } y < -1 \textrm{ or } x + < 0\\ \textrm{-\infty} & \mbox{if } y = x + 1 \textrm{ or } y = -1\\ \ln\Gamma(x+1) & \mbox{if } -1 < y < x + 1 \\ \quad -\ln\Gamma(y+1)& \\ @@ -70,22 +71,22 @@ namespace math { template inline return_type_t binomial_coefficient_log(const T_N N, const T_n n) { - if(is_nan(value_of_rec(N)) || is_nan(value_of_rec(n))) { + if (is_nan(value_of_rec(N)) || is_nan(value_of_rec(n))) { return std::numeric_limits::quiet_NaN(); - } - + } + // For some uses it is important this works even when N < 0 and therefore // it is before checks if (n == 0) { return 0; - } + } const T_N N_plus_1 = N + 1; static const char* function = "binomial_coefficient_log"; check_nonnegative(function, "first argument", N); check_greater_or_equal(function, "second argument", n, -1); - check_greater_or_equal(function, "(first argument - second argument + 1)", - N - n + 1, 0.0); + check_greater_or_equal(function, "(first argument - second argument + 1)", + N - n + 1, 0.0); if (N / 2 < n) { return binomial_coefficient_log(N, N - n); diff --git a/stan/math/prim/fun/lbeta.hpp b/stan/math/prim/fun/lbeta.hpp index ab4fbcb3050..644fc82bf28 100644 --- a/stan/math/prim/fun/lbeta.hpp +++ b/stan/math/prim/fun/lbeta.hpp @@ -63,9 +63,9 @@ template inline return_type_t lbeta(const T1 a, const T2 b) { typedef return_type_t T_ret; - if(is_nan(value_of_rec(a)) || is_nan(value_of_rec(b))) { + if (is_nan(value_of_rec(a)) || is_nan(value_of_rec(b))) { return std::numeric_limits::quiet_NaN(); - } + } static const char* function = "lbeta"; check_nonnegative(function, "first argument", a); @@ -91,17 +91,16 @@ inline return_type_t lbeta(const T1 a, const T2 b) { return lgamma(x) + lgamma(y) - lgamma(x + y); } else if (x < lgamma_stirling_diff_useful) { // y large, x small - T_ret stirling_diff - = lgamma_stirling_diff(y) - lgamma_stirling_diff(x + y); - T_ret log_x_y = log(x + y); + T_ret stirling_diff = lgamma_stirling_diff(y) - lgamma_stirling_diff(x + y); + T_ret log_x_y = log(x + y); T_ret stirling = (y - 0.5) * log1p(-x / (x + y)) + x * (1 - log_x_y); return stirling + lgamma(x) + stirling_diff; } else { // both large T_ret stirling_diff = lgamma_stirling_diff(x) + lgamma_stirling_diff(y) - - lgamma_stirling_diff(x + y); + - lgamma_stirling_diff(x + y); T_ret stirling = (x - 0.5) * log(x / (x + y)) + y * log1p(-x / (x + y)) - + 0.5 * (log(2 * stan::math::pi()) - log(y)); + + 0.5 * (log(2 * stan::math::pi()) - log(y)); return stirling + stirling_diff; } } diff --git a/test/unit/math/prim/fun/binomial_coefficient_log_test.cpp b/test/unit/math/prim/fun/binomial_coefficient_log_test.cpp index 6b85505fd37..91b5c3afaa8 100644 --- a/test/unit/math/prim/fun/binomial_coefficient_log_test.cpp +++ b/test/unit/math/prim/fun/binomial_coefficient_log_test.cpp @@ -21,12 +21,14 @@ TEST(MathFunctions, binomial_coefficient_log) { EXPECT_FLOAT_EQ(29979.16, binomial_coefficient_log(100000, 91116)); - EXPECT_EQ(binomial_coefficient_log(-1, 0), 0); // Needed for neg_binomial_2 + EXPECT_EQ(binomial_coefficient_log(-1, 0), 0); // Needed for neg_binomial_2 EXPECT_EQ(binomial_coefficient_log(50, 0), 0); EXPECT_EQ(binomial_coefficient_log(10000, 0), 0); - EXPECT_EQ(binomial_coefficient_log(10, 11), -std::numeric_limits::infinity()); - EXPECT_EQ(binomial_coefficient_log(10, -1), -std::numeric_limits::infinity()); + EXPECT_EQ(binomial_coefficient_log(10, 11), + -std::numeric_limits::infinity()); + EXPECT_EQ(binomial_coefficient_log(10, -1), + -std::numeric_limits::infinity()); for (int n = 0; n < 1010; ++n) { test_binom_coefficient(1010, n); @@ -64,7 +66,74 @@ struct TestValue { double val; }; -std::vector testValues = { {0.00003,-0.9,-2.21375637737528044964112}, {0.00003,3.e-15,1.48040820535563428588846e-19}, {0.00003,3.e-10,1.48039340142161568666212e-14}, {0.00003,3.e-7,1.46560412344434242311062e-11}, {0.00003,6.e-6,2.36865312869367134774661e-10}, {0.00003,0.000015,3.70102051348524044535716e-10}, {0.00003,0.0000291,4.30798787797857754693695e-11}, {0.00003,0.0000299999982,8.88244870007509649977929e-17}, {0.00003,0.00002999999991,4.44122460318735146597007e-18}, {0.00003,0.90003,-2.21375637737528044964112}, {0.002,-0.9,-2.21559326412971099686943}, {0.002,2.e-13,6.57013709556564677684856e-16}, {0.002,2.e-8,6.57007139476544583161173e-11}, {0.002,0.00002,6.50443564072189575550994e-8}, {0.002,0.0004,1.05122171458287350859763e-6}, {0.002,0.001,1.64253373496215313253469e-6}, {0.002,0.00194,1.91190982195918976356429e-7}, {0.002,0.00199999988,3.94208202120835082737684e-13}, {0.002,0.001999999994,1.97104112295366725515452e-14}, {0.002,0.902,-2.21559326412971099686943}, {1,-0.9,-2.85558226198351740582195}, {1,1.e-10,9.9999999988550659331851e-11}, {1,0.00001,9.99988550692664559909352e-6}, {1,0.01,0.00988583703486131052627978}, {1,0.2,0.156457962917688016707705}, {1,0.5,0.241564475270490444691037}, {1,0.97,0.028978328236256312960776}, {1,0.99999994,5.99999958782374313463811e-8}, {1,0.999999997,2.99999998969559340736596e-9}, {1,1.9,-2.85558226198351740582195}, {8,-0.9,-4.22528965320883461943031}, {8,8.e-10,2.17428571372173153982474e-9}, {8,0.00008,0.000217422931805073420417006}, {8,0.08,0.211982267378255838975509}, {8,1.6,2.90678606291134283426263}, {8,4,4.24849524204935898912334}, {8,7.76,0.606274586245453651115361}, {8,7.99999952,1.30457122553768403613331e-6}, {8,7.999999976,6.52285709209869625945566e-8}, {8,8.9,-4.22528965320883461943031}, {1325,-0.9,-8.72360867216657209762532}, {1325,1.325e-7,1.02909578020477960435539e-6}, {1325,0.01325,0.102766042691370430370992}, {1325,13.25,71.9898321274090629975055}, {1325,265,659.435649329029419323398}, {1325,662.5,914.599450340845275100724}, {1325,1285.25,175.786260651191862665015}, {1325,1324.9999205,0.000617452276410452190170437}, {1325,1324.999996025,0.0000308728608380968862741097}, {1325,1325.9,-8.72360867216657209762532}, {845000,-0.9,-14.5350963792733464918229}, {845000,0.0000845,0.00120194816738712136581358}, {845000,8.45,103.738303827736743600251}, {845000,8450,47315.8616457576200611209}, {845000,169000,422833.221695496506553128}, {845000,422500,585702.318235552114086514}, {845000,819650,113851.158132678562120685}, {845000,844999.9493,0.719108776819481762797449}, {845000,844999.997465,0.036053342347290003917417}, {845000,845000.9,-14.5350963792733464918229}, {3000000000000000.0,3,105.120406581508328854183}, {3000000000000000.0,100,3199.99949280231435502243}, {3000000000000000.0,12895,350387.5243605883687667}, {100000000000000000000.0,3,136.363346110414686040237}, {100000000000000000000.0,100,4241.4308104325278778424}, {100000000000000000000.0,12895,484680.092769031900296878},}; +std::vector testValues = { + {0.00003, -0.9, -2.21375637737528044964112}, + {0.00003, 3.e-15, 1.48040820535563428588846e-19}, + {0.00003, 3.e-10, 1.48039340142161568666212e-14}, + {0.00003, 3.e-7, 1.46560412344434242311062e-11}, + {0.00003, 6.e-6, 2.36865312869367134774661e-10}, + {0.00003, 0.000015, 3.70102051348524044535716e-10}, + {0.00003, 0.0000291, 4.30798787797857754693695e-11}, + {0.00003, 0.0000299999982, 8.88244870007509649977929e-17}, + {0.00003, 0.00002999999991, 4.44122460318735146597007e-18}, + {0.00003, 0.90003, -2.21375637737528044964112}, + {0.002, -0.9, -2.21559326412971099686943}, + {0.002, 2.e-13, 6.57013709556564677684856e-16}, + {0.002, 2.e-8, 6.57007139476544583161173e-11}, + {0.002, 0.00002, 6.50443564072189575550994e-8}, + {0.002, 0.0004, 1.05122171458287350859763e-6}, + {0.002, 0.001, 1.64253373496215313253469e-6}, + {0.002, 0.00194, 1.91190982195918976356429e-7}, + {0.002, 0.00199999988, 3.94208202120835082737684e-13}, + {0.002, 0.001999999994, 1.97104112295366725515452e-14}, + {0.002, 0.902, -2.21559326412971099686943}, + {1, -0.9, -2.85558226198351740582195}, + {1, 1.e-10, 9.9999999988550659331851e-11}, + {1, 0.00001, 9.99988550692664559909352e-6}, + {1, 0.01, 0.00988583703486131052627978}, + {1, 0.2, 0.156457962917688016707705}, + {1, 0.5, 0.241564475270490444691037}, + {1, 0.97, 0.028978328236256312960776}, + {1, 0.99999994, 5.99999958782374313463811e-8}, + {1, 0.999999997, 2.99999998969559340736596e-9}, + {1, 1.9, -2.85558226198351740582195}, + {8, -0.9, -4.22528965320883461943031}, + {8, 8.e-10, 2.17428571372173153982474e-9}, + {8, 0.00008, 0.000217422931805073420417006}, + {8, 0.08, 0.211982267378255838975509}, + {8, 1.6, 2.90678606291134283426263}, + {8, 4, 4.24849524204935898912334}, + {8, 7.76, 0.606274586245453651115361}, + {8, 7.99999952, 1.30457122553768403613331e-6}, + {8, 7.999999976, 6.52285709209869625945566e-8}, + {8, 8.9, -4.22528965320883461943031}, + {1325, -0.9, -8.72360867216657209762532}, + {1325, 1.325e-7, 1.02909578020477960435539e-6}, + {1325, 0.01325, 0.102766042691370430370992}, + {1325, 13.25, 71.9898321274090629975055}, + {1325, 265, 659.435649329029419323398}, + {1325, 662.5, 914.599450340845275100724}, + {1325, 1285.25, 175.786260651191862665015}, + {1325, 1324.9999205, 0.000617452276410452190170437}, + {1325, 1324.999996025, 0.0000308728608380968862741097}, + {1325, 1325.9, -8.72360867216657209762532}, + {845000, -0.9, -14.5350963792733464918229}, + {845000, 0.0000845, 0.00120194816738712136581358}, + {845000, 8.45, 103.738303827736743600251}, + {845000, 8450, 47315.8616457576200611209}, + {845000, 169000, 422833.221695496506553128}, + {845000, 422500, 585702.318235552114086514}, + {845000, 819650, 113851.158132678562120685}, + {845000, 844999.9493, 0.719108776819481762797449}, + {845000, 844999.997465, 0.036053342347290003917417}, + {845000, 845000.9, -14.5350963792733464918229}, + {3000000000000000.0, 3, 105.120406581508328854183}, + {3000000000000000.0, 100, 3199.99949280231435502243}, + {3000000000000000.0, 12895, 350387.5243605883687667}, + {100000000000000000000.0, 3, 136.363346110414686040237}, + {100000000000000000000.0, 100, 4241.4308104325278778424}, + {100000000000000000000.0, 12895, 484680.092769031900296878}, +}; } // namespace binomial_coefficient_test_internal TEST(MathFunctions, binomial_coefficient_log_precomputed) { @@ -73,14 +142,13 @@ TEST(MathFunctions, binomial_coefficient_log_precomputed) { using stan::test::expect_near_rel; for (TestValue t : testValues) { - std::ostringstream msg; msg << std::setprecision(22) << "n = " << t.n << ", k = " << t.k; double val = stan::math::binomial_coefficient_log(t.n, t.k); expect_near_rel(msg.str(), val, t.val); - if(t.k > t.n / 10) { + if (t.k > t.n / 10) { // Testing the mirrored binomial coefficient is not performed for // small k, as we may loose so much precision computing k2 // that the test becomes invalid diff --git a/test/unit/math/prim/fun/lbeta_test.cpp b/test/unit/math/prim/fun/lbeta_test.cpp index 528359dd3f4..b0a368a20f8 100644 --- a/test/unit/math/prim/fun/lbeta_test.cpp +++ b/test/unit/math/prim/fun/lbeta_test.cpp @@ -5,7 +5,6 @@ #include #include - TEST(MathFunctions, lbeta) { using stan::math::lbeta; @@ -26,11 +25,11 @@ TEST(MathFunctions, lbeta_nan) { } namespace lbeta_test_internal { - struct TestValue { - double x; - double y; - double val; - }; +struct TestValue { + double x; + double y; + double val; +}; // Test values generated in Mathematice, reproducible notebook at // https://www.wolframcloud.com/obj/martin.modrak/Published/lbeta.nb @@ -45,7 +44,7 @@ namespace lbeta_test_internal { // For[j = 1, j <= Length[ys], j++, { // cx = xs[[i]]; // cy = ys[[j]]; - + // val = N[lbeta[cx,cy],24]; // WriteString[out," {",CForm[cx],",",CForm[cy],",", // CForm[val],"},"] @@ -65,8 +64,57 @@ namespace lbeta_test_internal { // WriteString[out,"};"]; // Close[out]; // FilePrint[%] -std::vector testValues = { {8.e-8,7.e-11,23.3834004912898500586445}, {8.e-8,0.00002,16.3452312235394351410033}, {8.e-8,1.000000000001,16.3412392022725295437606}, {8.e-8,0.5,16.3412393131760679059067}, {8.e-8,2,16.3412391222725327438921}, {8.e-8,1624,16.3412385647081130254943}, {0.004,7.e-11,23.3825258913787298259023}, {0.004,0.00002,10.8247656947117878792194}, {0.004,1.000000000001,5.52146091786223987264715}, {0.004,0.5,5.52697992926150653113797}, {0.004,2,5.51746889659270898022044}, {0.004,1624,5.48959582574332555214719}, {1,7.e-11,23.3825258738791892190926}, {1,0.00002,10.8197782844102831106727}, {1,1.000000000001,-9.999999999995e-13}, {1,0.5,0.693147180559945309417232}, {1,2,-0.693147180559945309417232}, {1,1624,-7.39264752072162326054032}, {1.00000001,7.e-11,23.3825258738791892179411}, {1.00000001,0.00002,10.8197782844099541286699}, {1.00000001,1.000000000001,-1.00009999500064491739816e-8}, {1.00000001,0.5,0.693147174422888956122731}, {1.00000001,2,-0.693147195559945246917232}, {1.00000001,1624,-7.39264760042333353631934}, {5,7.e-11,23.3825258737333558857627}, {5,0.00002,10.8197366180283355258393}, {5,1.000000000001,-1.60943791243638370793409}, {5,0.5,-0.207395194346070587158746}, {5,2,-3.40119738166215537541324}, {5,1624,-33.7913357290267948074624}, {23,7.e-11,23.3825258736208322915813}, {23,0.00002,10.819704468465374949026}, {23,1.000000000001,-3.13549421593288398231784}, {23,0.5,-0.989947810259228199543883}, {23,2,-6.31354804627709531045369}, {23,1624,-121.714785277510463870251}, {19845,7.e-11,23.3825258731460863706715}, {19845,0.00002,10.8195688267825637640878}, {19845,1.000000000001,-9.89570736522763869861762}, {19845,0.5,-4.37548244086806082919414}, {19845,2,-19.7914651196913525680177}, {19845,1624,-5756.4146766727238501215}, {3000000000000000.0,3,-106.219018870176440545578}, {3000000000000000.0,100,-3204.60466298830574639047}, {3000000000000000.0,12895,-350396.988955562106921852}, {100000000000000000000.0,3,-137.461958399082795731692}, {100000000000000000000.0,100,-4246.03598061851596930944}, {100000000000000000000.0,12895,-484689.557363950217404711},}; -} +std::vector testValues = { + {8.e-8, 7.e-11, 23.3834004912898500586445}, + {8.e-8, 0.00002, 16.3452312235394351410033}, + {8.e-8, 1.000000000001, 16.3412392022725295437606}, + {8.e-8, 0.5, 16.3412393131760679059067}, + {8.e-8, 2, 16.3412391222725327438921}, + {8.e-8, 1624, 16.3412385647081130254943}, + {0.004, 7.e-11, 23.3825258913787298259023}, + {0.004, 0.00002, 10.8247656947117878792194}, + {0.004, 1.000000000001, 5.52146091786223987264715}, + {0.004, 0.5, 5.52697992926150653113797}, + {0.004, 2, 5.51746889659270898022044}, + {0.004, 1624, 5.48959582574332555214719}, + {1, 7.e-11, 23.3825258738791892190926}, + {1, 0.00002, 10.8197782844102831106727}, + {1, 1.000000000001, -9.999999999995e-13}, + {1, 0.5, 0.693147180559945309417232}, + {1, 2, -0.693147180559945309417232}, + {1, 1624, -7.39264752072162326054032}, + {1.00000001, 7.e-11, 23.3825258738791892179411}, + {1.00000001, 0.00002, 10.8197782844099541286699}, + {1.00000001, 1.000000000001, -1.00009999500064491739816e-8}, + {1.00000001, 0.5, 0.693147174422888956122731}, + {1.00000001, 2, -0.693147195559945246917232}, + {1.00000001, 1624, -7.39264760042333353631934}, + {5, 7.e-11, 23.3825258737333558857627}, + {5, 0.00002, 10.8197366180283355258393}, + {5, 1.000000000001, -1.60943791243638370793409}, + {5, 0.5, -0.207395194346070587158746}, + {5, 2, -3.40119738166215537541324}, + {5, 1624, -33.7913357290267948074624}, + {23, 7.e-11, 23.3825258736208322915813}, + {23, 0.00002, 10.819704468465374949026}, + {23, 1.000000000001, -3.13549421593288398231784}, + {23, 0.5, -0.989947810259228199543883}, + {23, 2, -6.31354804627709531045369}, + {23, 1624, -121.714785277510463870251}, + {19845, 7.e-11, 23.3825258731460863706715}, + {19845, 0.00002, 10.8195688267825637640878}, + {19845, 1.000000000001, -9.89570736522763869861762}, + {19845, 0.5, -4.37548244086806082919414}, + {19845, 2, -19.7914651196913525680177}, + {19845, 1624, -5756.4146766727238501215}, + {3000000000000000.0, 3, -106.219018870176440545578}, + {3000000000000000.0, 100, -3204.60466298830574639047}, + {3000000000000000.0, 12895, -350396.988955562106921852}, + {100000000000000000000.0, 3, -137.461958399082795731692}, + {100000000000000000000.0, 100, -4246.03598061851596930944}, + {100000000000000000000.0, 12895, -484689.557363950217404711}, +}; +} // namespace lbeta_test_internal TEST(MathFunctions, lbeta_precomputed) { using lbeta_test_internal::TestValue; @@ -74,7 +122,6 @@ TEST(MathFunctions, lbeta_precomputed) { using stan::test::expect_near_rel; for (TestValue t : testValues) { - std::ostringstream msg; msg << std::setprecision(22) << "x = " << t.x << ", y = " << t.y; From a85d4497b432ca81e8c4d26bd572594b7ded1a27 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Mon, 13 Jan 2020 20:20:41 +0100 Subject: [PATCH 64/82] LOG_TWO_PI --- stan/math/prim/fun/lbeta.hpp | 2 +- stan/math/prim/fun/lgamma_stirling.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/stan/math/prim/fun/lbeta.hpp b/stan/math/prim/fun/lbeta.hpp index 644fc82bf28..cb53799ea04 100644 --- a/stan/math/prim/fun/lbeta.hpp +++ b/stan/math/prim/fun/lbeta.hpp @@ -100,7 +100,7 @@ inline return_type_t lbeta(const T1 a, const T2 b) { T_ret stirling_diff = lgamma_stirling_diff(x) + lgamma_stirling_diff(y) - lgamma_stirling_diff(x + y); T_ret stirling = (x - 0.5) * log(x / (x + y)) + y * log1p(-x / (x + y)) - + 0.5 * (log(2 * stan::math::pi()) - log(y)); + + 0.5 * (LOG_TWO_PI - log(y)); return stirling + stirling_diff; } } diff --git a/stan/math/prim/fun/lgamma_stirling.hpp b/stan/math/prim/fun/lgamma_stirling.hpp index cf63a1f0656..be99bd5585e 100644 --- a/stan/math/prim/fun/lgamma_stirling.hpp +++ b/stan/math/prim/fun/lgamma_stirling.hpp @@ -25,7 +25,7 @@ namespace math { template T lgamma_stirling(const T x) { using std::log; - return 0.5 * log(2 * stan::math::pi()) + (x - 0.5) * log(x) - x; + return 0.5 * LOG_TWO_PI + (x - 0.5) * log(x) - x; } } // namespace math From 6e5026955c58a057588ea765f1fa620bc8e00aaa Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Mon, 13 Jan 2020 19:21:17 +0000 Subject: [PATCH 65/82] [Jenkins] auto-formatting by clang-format version 5.0.0-3~16.04.1 (tags/RELEASE_500/final) --- stan/math/prim/fun/lbeta.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stan/math/prim/fun/lbeta.hpp b/stan/math/prim/fun/lbeta.hpp index cb53799ea04..f5d1aabe540 100644 --- a/stan/math/prim/fun/lbeta.hpp +++ b/stan/math/prim/fun/lbeta.hpp @@ -100,7 +100,7 @@ inline return_type_t lbeta(const T1 a, const T2 b) { T_ret stirling_diff = lgamma_stirling_diff(x) + lgamma_stirling_diff(y) - lgamma_stirling_diff(x + y); T_ret stirling = (x - 0.5) * log(x / (x + y)) + y * log1p(-x / (x + y)) - + 0.5 * (LOG_TWO_PI - log(y)); + + 0.5 * (LOG_TWO_PI - log(y)); return stirling + stirling_diff; } } From 446f04269fc07397f0eba91f60bdaf2a62b74aee Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Mon, 13 Jan 2020 20:28:50 +0100 Subject: [PATCH 66/82] Minor optimization in lgamma_stirling_dff --- stan/math/prim/fun/lgamma_stirling_diff.hpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/stan/math/prim/fun/lgamma_stirling_diff.hpp b/stan/math/prim/fun/lgamma_stirling_diff.hpp index 1a5510825a8..cd260320caf 100644 --- a/stan/math/prim/fun/lgamma_stirling_diff.hpp +++ b/stan/math/prim/fun/lgamma_stirling_diff.hpp @@ -55,13 +55,13 @@ T lgamma_stirling_diff(const T x) { -0.000595238095238095238095238, }; constexpr int n_stirling_terms = 3; - T result(0.0); - T multiplier = inv(x); - T inv_x_squared = inv(square(x)); - for (int n = 0; n < n_stirling_terms; n++, multiplier *= inv_x_squared) { - result += stirling_series[n] * multiplier; - } - return result; + T inv_x = inv(x); + T inv_x_squared = square(inv_x); + T inv_x_cubed = inv_x * inv_x_squared; + T inv_x_fifth = inv_x_cubed * inv_x_squared; + return stirling_series[0] * inv_x + + stirling_series[1] * inv_x_cubed + + stirling_series[2] * inv_x_fifth; } } From 52dce3c78c5803242c761c532403e3ea9e77d77f Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Mon, 13 Jan 2020 19:29:32 +0000 Subject: [PATCH 67/82] [Jenkins] auto-formatting by clang-format version 5.0.0-3~16.04.1 (tags/RELEASE_500/final) --- stan/math/prim/fun/lgamma_stirling_diff.hpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/stan/math/prim/fun/lgamma_stirling_diff.hpp b/stan/math/prim/fun/lgamma_stirling_diff.hpp index cd260320caf..dca3c687bb7 100644 --- a/stan/math/prim/fun/lgamma_stirling_diff.hpp +++ b/stan/math/prim/fun/lgamma_stirling_diff.hpp @@ -59,9 +59,8 @@ T lgamma_stirling_diff(const T x) { T inv_x_squared = square(inv_x); T inv_x_cubed = inv_x * inv_x_squared; T inv_x_fifth = inv_x_cubed * inv_x_squared; - return stirling_series[0] * inv_x - + stirling_series[1] * inv_x_cubed - + stirling_series[2] * inv_x_fifth; + return stirling_series[0] * inv_x + stirling_series[1] * inv_x_cubed + + stirling_series[2] * inv_x_fifth; } } From e505f53993e46db39d0b8782e4011d04189c7bb6 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Tue, 14 Jan 2020 08:23:08 +0100 Subject: [PATCH 68/82] Fixing lint, cleanup --- .../prim/fun/binomial_coefficient_log.hpp | 1 + stan/math/prim/fun/lbeta.hpp | 1 + stan/math/prim/fun/lgamma_stirling.hpp | 4 +- stan/math/prim/fun/lgamma_stirling_diff.hpp | 20 ++- stan/math/prim/prob/neg_binomial_2_lpmf.hpp | 95 ++++---------- test/unit/math/expect_near_rel.hpp | 1 + test/unit/math/expect_near_rel_test.cpp | 22 ++-- .../prim/fun/lgamma_stirling_diff_test.cpp | 25 +++- .../math/prim/prob/neg_binomial_2_test.cpp | 53 +------- .../prim/prob/neg_binomial_2_test_tools.hpp | 19 --- .../math/rev/prob/neg_binomial_2_test.cpp | 124 ++++++------------ 11 files changed, 111 insertions(+), 254 deletions(-) delete mode 100644 test/unit/math/prim/prob/neg_binomial_2_test_tools.hpp diff --git a/stan/math/prim/fun/binomial_coefficient_log.hpp b/stan/math/prim/fun/binomial_coefficient_log.hpp index 5355a625a8d..c9c0e35e0fd 100644 --- a/stan/math/prim/fun/binomial_coefficient_log.hpp +++ b/stan/math/prim/fun/binomial_coefficient_log.hpp @@ -1,6 +1,7 @@ #ifndef STAN_MATH_PRIM_SCAL_FUN_BINOMIAL_COEFFICIENT_LOG_HPP #define STAN_MATH_PRIM_SCAL_FUN_BINOMIAL_COEFFICIENT_LOG_HPP +#include #include #include #include diff --git a/stan/math/prim/fun/lbeta.hpp b/stan/math/prim/fun/lbeta.hpp index f5d1aabe540..a4e52bd44eb 100644 --- a/stan/math/prim/fun/lbeta.hpp +++ b/stan/math/prim/fun/lbeta.hpp @@ -1,6 +1,7 @@ #ifndef STAN_MATH_PRIM_SCAL_FUN_LBETA_HPP #define STAN_MATH_PRIM_SCAL_FUN_LBETA_HPP +#include #include #include #include diff --git a/stan/math/prim/fun/lgamma_stirling.hpp b/stan/math/prim/fun/lgamma_stirling.hpp index be99bd5585e..76a93d2260e 100644 --- a/stan/math/prim/fun/lgamma_stirling.hpp +++ b/stan/math/prim/fun/lgamma_stirling.hpp @@ -4,6 +4,7 @@ #include #include #include +#include namespace stan { namespace math { @@ -23,8 +24,7 @@ namespace math { * @tparam T Type of value. */ template -T lgamma_stirling(const T x) { - using std::log; +return_type_t lgamma_stirling(const T x) { return 0.5 * LOG_TWO_PI + (x - 0.5) * log(x) - x; } diff --git a/stan/math/prim/fun/lgamma_stirling_diff.hpp b/stan/math/prim/fun/lgamma_stirling_diff.hpp index dca3c687bb7..190acc22fdf 100644 --- a/stan/math/prim/fun/lgamma_stirling_diff.hpp +++ b/stan/math/prim/fun/lgamma_stirling_diff.hpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace stan { namespace math { @@ -39,11 +40,18 @@ constexpr double lgamma_stirling_diff_useful = 10; */ template -T lgamma_stirling_diff(const T x) { +return_type_t lgamma_stirling_diff(const T x) { + if (is_nan(value_of_rec(x))) { + return std::numeric_limits::quiet_NaN(); + } + typedef return_type_t T_Ret; + static const char* function = "lgamma_stirling_diff"; check_nonnegative(function, "argument", x); - if (value_of(x) < lgamma_stirling_diff_useful) { + if(x == 0) { + return std::numeric_limits::infinity(); + } else if (value_of(x) < lgamma_stirling_diff_useful) { return lgamma(x) - lgamma_stirling(x); } else { // Using the Stirling series as expressed in formula 5.11.1. at @@ -55,10 +63,10 @@ T lgamma_stirling_diff(const T x) { -0.000595238095238095238095238, }; constexpr int n_stirling_terms = 3; - T inv_x = inv(x); - T inv_x_squared = square(inv_x); - T inv_x_cubed = inv_x * inv_x_squared; - T inv_x_fifth = inv_x_cubed * inv_x_squared; + T_Ret inv_x = inv(x); + T_Ret inv_x_squared = square(inv_x); + T_Ret inv_x_cubed = inv_x * inv_x_squared; + T_Ret inv_x_fifth = inv_x_cubed * inv_x_squared; return stirling_series[0] * inv_x + stirling_series[1] * inv_x_cubed + stirling_series[2] * inv_x_fifth; } diff --git a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp index d3a0fa04e61..f4609a89da6 100644 --- a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp @@ -16,13 +16,6 @@ namespace stan { namespace math { -namespace internal { -// When to switch to approximations for neg. binom for large phi -// The current tests fail when the cutoff is 1e8 and pass with 1e9, -// setting 1e10 to be safe -constexpr double neg_binomial_2_phi_cutoff = 1e15; -} // namespace internal - // NegBinomial(n|mu, phi) [mu >= 0; phi > 0; n >= 0] template return_type_t neg_binomial_2_lpmf( @@ -84,73 +77,31 @@ return_type_t neg_binomial_2_lpmf( } for (size_t i = 0; i < max_size_seq_view; i++) { - if (false) { - // if (phi_val[i] > internal::neg_binomial_2_phi_cutoff) { - // Phi is large, delegate to Poisson. - // Copying the code here as just calling - // poisson_lpmf does not preserve propto logic correctly. - // Note that Poisson can be seen as first term of Taylor series for - // phi -> Inf. Similarly, the derivative w.r.t. mu and phi can be obtained - // via the Same Taylor expansions: - // - // For mu, the expansions can be obtained in Mathematica via - // Series[n/mu - (n + phi)/(mu+phi),{phi,Infinity, 1}] - // Currently ignoring the 2nd order term (mu_val[i] - n_vec[i]) / - // phi_val[i] - // - // The derivative w.r.t. phi = 0 + O(1/phi^2), - // But the quadratic term is big enough to warrant inclusion here - // (can be around 1e-6 at cutoff). - // Expansion obtained in Mathematica via - // Series[1 - (n + phi) / (mu + phi) + Log[phi] - Log[mu + phi] - - // PolyGamma[phi] + PolyGamma[n + phi],{phi,Infinity, 2}] - if (n_vec[i] == 0) { - logp += phi_val[i] * (-log1p(mu_val[i] / phi_val[i])); + if (include_summand::value) { + logp += binomial_coefficient_log(n_plus_phi[i] - 1, n_vec[i]); + } + if (include_summand::value) { + logp += multiply_log(n_vec[i], mu_val[i]); + } + // logp += phi_val[i] * (log_phi[i] - log_mu_plus_phi[i]) + logp += -phi_val[i] * (log1p(mu_val[i] / phi_val[i])) + - n_vec[i] * log_mu_plus_phi[i]; + + if (!is_constant_all::value) { + ops_partials.edge1_.partials_[i] + += n_vec[i] / mu_val[i] + - (n_vec[i] + phi_val[i]) / (mu_val[i] + phi_val[i]); + } + if (!is_constant_all::value) { + T_partials_return log_term; + if (mu_val[i] < phi_val[i]) { + log_term = log1p(-mu_val[i] / (mu_val[i] + phi_val[i])); } else { - if (include_summand::value) { - logp -= lgamma(n_vec[i] + 1.0); - } - if (include_summand::value) { - logp += multiply_log(n_vec[i], mu_val[i]) - mu_val[i]; - } - - if (!is_constant_all::value) { - ops_partials.edge1_.partials_[i] += n_vec[i] / mu_val[i] - 1; - } - if (!is_constant_all::value) { - ops_partials.edge2_.partials_[i] - += (mu_val[i] * (-mu_val[i] + 2 * n_vec[i]) - + n_vec[i] * (1 - n_vec[i])) - / (2 * square(phi_val[i])); - } - } - } else { - if (include_summand::value) { - logp += binomial_coefficient_log(n_plus_phi[i] - 1, n_vec[i]); - } - if (include_summand::value) { - logp += multiply_log(n_vec[i], mu_val[i]); - } - // logp += phi_val[i] * (log_phi[i] - log_mu_plus_phi[i]) - logp += -phi_val[i] * (log1p(mu_val[i] / phi_val[i])) - - n_vec[i] * log_mu_plus_phi[i]; - - if (!is_constant_all::value) { - ops_partials.edge1_.partials_[i] - += n_vec[i] / mu_val[i] - - (n_vec[i] + phi_val[i]) / (mu_val[i] + phi_val[i]); - } - if (!is_constant_all::value) { - T_partials_return log_term; - if (mu_val[i] < phi_val[i]) { - log_term = log1p(-mu_val[i] / (mu_val[i] + phi_val[i])); - } else { - log_term = log_phi[i] - log_mu_plus_phi[i]; - } - ops_partials.edge2_.partials_[i] - += (mu_val[i] - n_vec[i]) / (mu_val[i] + phi_val[i]) + log_term - - (digamma(phi_val[i]) - digamma(n_plus_phi[i])); + log_term = log_phi[i] - log_mu_plus_phi[i]; } + ops_partials.edge2_.partials_[i] + += (mu_val[i] - n_vec[i]) / (mu_val[i] + phi_val[i]) + log_term + - (digamma(phi_val[i]) - digamma(n_plus_phi[i])); } } return ops_partials.build(logp); diff --git a/test/unit/math/expect_near_rel.hpp b/test/unit/math/expect_near_rel.hpp index 0fd0a004b2a..8c62c008e36 100644 --- a/test/unit/math/expect_near_rel.hpp +++ b/test/unit/math/expect_near_rel.hpp @@ -6,6 +6,7 @@ #include #include #include +#include namespace stan { namespace test { diff --git a/test/unit/math/expect_near_rel_test.cpp b/test/unit/math/expect_near_rel_test.cpp index a07f5195f68..62b189ff139 100644 --- a/test/unit/math/expect_near_rel_test.cpp +++ b/test/unit/math/expect_near_rel_test.cpp @@ -9,10 +9,10 @@ TEST(testUnitMath, ExpectNearRelScalar) { expect_near_rel("test A1", 0, 0, 1e-16); expect_near_rel("test A2", 0, 0.0, 1e-16); expect_near_rel("test A3", 0.0, 0, 1e-16); - expect_near_rel("test B1", 0, 1e-8, 1e-5); - expect_near_rel("test B2", 0.0, 1e-8, 1e-5); - expect_near_rel("test C1", 1e-8, 0, 1e-5); - expect_near_rel("test C2", 1e-8, 0.0, 1e-5); + expect_near_rel("test B1", 0, 1e-10, 1e-5); + expect_near_rel("test B2", 0.0, 1e-10, 1e-5); + expect_near_rel("test C1", 1e-10, 0, 1e-5); + expect_near_rel("test C2", 1e-10, 0.0, 1e-5); // non-zero examples expect_near_rel("test D1", 1, 1, 1e-16); @@ -55,8 +55,8 @@ TEST(testUnitMath, ExpectNearRelMatrix) { m_t d1(2, 3); m_t d2(2, 3); - d1 << 1, 2, 3, 0, 0, 0 - 1e-8; - d2 << 1 + 1e-8, 2 - 1e-8, 3, 0, 0 + 1e-8, 0; + d1 << 1, 2, 3, 0, 0, 0 - 1e-12; + d2 << 1 + 1e-8, 2 - 1e-8, 3, 0, 0 + 1e-12, 0; expect_near_rel("test D", d1, d2, 1e-6); // these will fail @@ -82,7 +82,7 @@ TEST(testUnitMath, ExpectNearRelVector) { expect_near_rel("test C", v_t{1, 1, 1}, v_t{1 + 1e-8, 1 - 1e-9, 1}, 1e-6); - expect_near_rel("test D", v_t{0, 0, 0}, v_t{0, 0 + 1e-6, 0 - 1e-6}, 1e-4); + expect_near_rel("test D", v_t{0, 0, 0}, v_t{0, 0 + 1e-8, 0 - 1e-8}, 1e-4); // ones after here fail // expect_near_rel("test E", v_t{1}, v_t{1, 2}, 1e-6); @@ -102,19 +102,19 @@ TEST(testUnitMath, ExpectNearRelVectorNesting) { expect_near_rel("test A", vv_t{}, vv_t{}, 1e-10); expect_near_rel("test B", vv_t{v_t{1, 2, 3}, v_t{0, 0, 0}}, - vv_t{v_t{1, 2, 3}, v_t{0, 0 + 1e-6, 0 - 1e-6}}, 1e-5); + vv_t{v_t{1, 2, 3}, v_t{0, 0 + 1e-10, 0 - 1e-10}}, 1e-5); expect_near_rel( "test C", vvv_t{vv_t{v_t{1, 2, 3}, v_t{0, 0, 0}}, vv_t{v_t{1, 2, 3}, v_t{0, 0, 0}}}, - vvv_t{vv_t{v_t{1, 2, 3}, v_t{0, 0 + 1e-6, 0 - 1e-6}}, - vv_t{v_t{1, 2, 3}, v_t{0, 0 + 1e-6, 0 - 1e-6}}}, + vvv_t{vv_t{v_t{1, 2, 3}, v_t{0, 0 + 1e-10, 0 - 1e-10}}, + vv_t{v_t{1, 2, 3}, v_t{0, 0 + 1e-10, 0 - 1e-10}}}, 1e-5); ev_t d1(3); ev_t d2(3); d1 << 1, 0, 0; - d2 << 1 + 1e-8, 0 + 1e-8, 0; + d2 << 1 + 1e-12, 0 + 1e-12, 0; vev_t e1{d1, d2}; vev_t e2{d2, d1}; expect_near_rel("test E", e1, e2, 1e-6); diff --git a/test/unit/math/prim/fun/lgamma_stirling_diff_test.cpp b/test/unit/math/prim/fun/lgamma_stirling_diff_test.cpp index 56e97501374..1c53d797f1c 100644 --- a/test/unit/math/prim/fun/lgamma_stirling_diff_test.cpp +++ b/test/unit/math/prim/fun/lgamma_stirling_diff_test.cpp @@ -1,12 +1,22 @@ -#include -#include -#include #include #include +#include +#include #include +#include +#include + +TEST(MathFunctions, lgamma_stirling_diff_errors_special_cases) { + using stan::math::lgamma_stirling_diff; + + double nan = std::numeric_limits::quiet_NaN(); + double inf = std::numeric_limits::infinity(); -TEST(MathFunctions, lgamma_stirling_diff_errors) { - // TODO[martinmodrak] nan, negative values, ... + EXPECT_TRUE(std::isnan(lgamma_stirling_diff(nan))); + EXPECT_FLOAT_EQ(lgamma_stirling_diff(inf), 0); + EXPECT_THROW(std::isnan(lgamma_stirling_diff(-1.0)), std::domain_error); + EXPECT_TRUE(std::isinf(lgamma_stirling_diff(0.0))); + EXPECT_TRUE(lgamma_stirling_diff(0) > 0); } TEST(MathFunctions, lgamma_stirling_diff_accuracy) { @@ -83,11 +93,12 @@ std::vector testValues = { TEST(MathFunctions, lgamma_stirling_diff_precomputed) { using stan::math::lgamma_stirling_diff; using stan::test::expect_near_rel; - using namespace lgamma_stirling_diff_test_internal; + using lgamma_stirling_diff_test_internal::TestValue; + using lgamma_stirling_diff_test_internal::testValues; for (TestValue t : testValues) { std::ostringstream msg; msg << "x = " << t.x; expect_near_rel(msg.str(), lgamma_stirling_diff(t.x), t.val, 1e-10); } -} \ No newline at end of file +} diff --git a/test/unit/math/prim/prob/neg_binomial_2_test.cpp b/test/unit/math/prim/prob/neg_binomial_2_test.cpp index d0b77093947..648c068ba59 100644 --- a/test/unit/math/prim/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/prim/prob/neg_binomial_2_test.cpp @@ -2,7 +2,6 @@ #include #include #include -#include #include #include #include @@ -242,15 +241,8 @@ TEST(ProbDistributionsNegBinomial2, chiSquareGoodnessFitTest4) { TEST(ProbDistributionsNegBinomial2, extreme_values) { std::vector n_to_test = {0, 1, 5, 100, 12985, 1968422}; std::vector mu_to_test = {1e-5, 0.1, 8, 713, 28311, 19850054}; - double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; for (double mu : mu_to_test) { for (int n : n_to_test) { - // Test just before cutoff - double logp - = stan::math::neg_binomial_2_log(n, mu, phi_cutoff - 1e-8); - EXPECT_LT(logp, 0) << "n = " << n << ", mu = " << mu - << ", phi = " << (phi_cutoff - 1e-8); - // Test across a range of phi for (double phi = 1e12; phi < 1e22; phi *= 10) { double logp = stan::math::neg_binomial_2_log(n, mu, phi); @@ -261,41 +253,13 @@ TEST(ProbDistributionsNegBinomial2, extreme_values) { } } -TEST(ProbDistributionsNegBinomial2, poissonCutoff) { - using stan::test::expect_near_rel; - using namespace stan::test::neg_binomial_2_test_internal; - - // std::vector mu_to_test - // = {2.345e-5, 0.2, 13, 150, 1621, 18432, 73582345, - // static_cast(std::numeric_limits::max()) }; - // std::vector n_to_test = {0, 1, 3, 16, 24, 181, 2132, 121358, - // 865422242}; - std::vector mu_to_test = {10}; - std::vector n_to_test = {16}; - for (double mu : mu_to_test) { - for (int n : n_to_test) { - double before_cutoff - = stan::math::neg_binomial_2_lpmf(n, mu, just_below_phi_cutoff); - double after_cutoff - = stan::math::neg_binomial_2_lpmf(n, mu, just_above_phi_cutoff); - std::ostringstream msg; - msg << "neg_binomial_2_lpmf changes too much around phi cutoff for n = " - << std::setprecision(17) << n << ", mu = " << mu - << ", below cutoff = " << just_below_phi_cutoff - << ", above cutoff = " << just_above_phi_cutoff; - expect_near_rel(msg.str(), before_cutoff, after_cutoff); - } - } -} - TEST(ProbDistributionsNegBinomial2, zeroOne) { using stan::test::expect_near_rel; - using namespace stan::test::neg_binomial_2_test_internal; std::vector mu_to_test - = {2.345e-5, 0.2, 13, 150, 1621, 18432, phi_cutoff}; + = {2.345e-5, 0.2, 13, 150, 1621, 18432, 1e10}; double phi_start = 1e-8; - double phi_max = just_above_phi_cutoff * 1e10; + double phi_max = 1e22; for (double mu : mu_to_test) { for (double phi = phi_start; phi < phi_max; phi *= stan::math::pi()) { std::ostringstream msg; @@ -312,19 +276,6 @@ TEST(ProbDistributionsNegBinomial2, zeroOne) { } } -TEST(ProbDistributionsNegBinomial2, vectorAroundCutoff) { - int y = 10; - double mu = 9.36; - std::vector phi; - phi.push_back(1); - phi.push_back(stan::math::internal::neg_binomial_2_phi_cutoff + 1); - double vector_value = stan::math::neg_binomial_2_lpmf(y, mu, phi); - double scalar_value = stan::math::neg_binomial_2_lpmf(y, mu, phi[0]) - + stan::math::neg_binomial_2_lpmf(y, mu, phi[1]); - - EXPECT_FLOAT_EQ(vector_value, scalar_value); -} - TEST(ProbDistributionsNegativeBinomial2Log, distributionCheck) { check_counts_real_real(NegativeBinomial2LogTestRig()); } diff --git a/test/unit/math/prim/prob/neg_binomial_2_test_tools.hpp b/test/unit/math/prim/prob/neg_binomial_2_test_tools.hpp deleted file mode 100644 index 36d82734bae..00000000000 --- a/test/unit/math/prim/prob/neg_binomial_2_test_tools.hpp +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef STAN_TEST_UNIT_PRIM_PROB_NEG_BINOMIAL_2_TEST_TOOLS_HPP -#define STAN_TEST_UNIT_PRIM_PROB_NEG_BINOMIAL_2_TEST_TOOLS_HPP - -#include -#include -#include - -namespace stan { -namespace test { -namespace neg_binomial_2_test_internal { -double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; -double just_below_phi_cutoff = std::nextafter(phi_cutoff, 0); -double just_above_phi_cutoff - = std::nextafter(phi_cutoff, std::numeric_limits::infinity()); -} // namespace neg_binomial_2_test_internal -} // namespace test -} // namespace stan - -#endif \ No newline at end of file diff --git a/test/unit/math/rev/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/prob/neg_binomial_2_test.cpp index c8844be55b6..d8e92e404b7 100644 --- a/test/unit/math/rev/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/prob/neg_binomial_2_test.cpp @@ -16,11 +16,37 @@ struct TestValue { double grad_phi; }; -// Test data generated in Mathematica (Wolfram Cloud). The code can be re-ran -// at https://www.wolframcloud.com/env/martin.modrak/NegBinomial2_Tests.nb +// Test data generated in Mathematica (Wolfram Cloud). The code can be re-ran at +// https://www.wolframcloud.com/obj/martin.modrak/Published/neg_binomial_2_lpmf.nb // but is also presented below for convenience: -// -// TODO[martinmodrak] add updated code here +// +// nb2[n_,mu_,phi_]:= LogGamma[n + phi] - LogGamma[n + 1] - LogGamma[phi] + +// n * (Log[mu] - Log[mu + phi]) + phi * (Log[phi] - Log[mu + phi]) +// nb2dmu[n_,mu_,phi_]= D[nb2[n, mu, phi],mu]; +// nb2dphi[n_,mu_,phi_]= D[nb2[n, mu, phi],phi]; +// out = OpenWrite["nb_test.txt"] +// mus= {256*10^-7,314*10^-3,15*10^-1,3,180, 1123,10586}; +// phis= {4*10^-4,65*10^-3,442*10^-2,800, 15324}; +// ns = {0,6,14,1525,10233}; +// WriteString[out, "std::vector testValues = {"]; +// For[k = 1, k <= Length[ns], k++, { +// For[i = 1, i <= Length[mus], i++, { +// For[j = 1, j <= Length[phis], j++, { +// cmu = mus[[i]]; +// cphi = phis[[j]]; +// cn=ns[[k]]; +// val = N[nb2[cn,cmu,cphi], 24]; +// ddmu= N[nb2dmu[cn,cmu,cphi], 24]; +// ddphi= N[nb2dphi[cn,cmu,cphi], 24]; +// WriteString[out," {",CForm[cn],",",CForm[cmu],",", +// CForm[cphi],",", CForm[val],",",CForm[ddmu],",",CForm[ddphi],"},"] +// }] +// }] +// }] +// WriteString[out,"};"]; +// Close[out]; +// FilePrint[%] +// std::vector testValues = { {0, 0.0000256, 0.0004, -0.0000248141563677810565248409, -0.93984962406015037593985, -0.0018850149796030172519518}, @@ -438,7 +464,6 @@ TEST(ProbDistributionsNegBinomial2, derivativesComplexStep) { + n_ * log(mu); }; - double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; for (double mu_dbl : mu_to_test) { for (int n : n_to_test) { for (double phi_dbl = 1.5; phi_dbl < 1e22; phi_dbl *= 10) { @@ -478,17 +503,17 @@ TEST(ProbDistributionsNegBinomial2, derivativesComplexStep) { double tolerance_phi; double tolerance_mu; - if (phi < phi_cutoff || n < 100000) { - tolerance_phi = std::max(1e-10, fabs(gradients[1]) * 1e-8); - } else { + // if (phi < phi_cutoff || n < 100000) { + // tolerance_phi = std::max(1e-10, fabs(gradients[1]) * 1e-8); + // } else { tolerance_phi = std::max(1e-8, fabs(gradients[1]) * 1e-5); - } + // } - if (phi < phi_cutoff) { + // if (phi < phi_cutoff) { tolerance_mu = std::max(1e-10, fabs(gradients[0]) * 1e-8); - } else { - tolerance_mu = std::max(1e-8, fabs(gradients[0]) * 1e-5); - } + // } else { + // tolerance_mu = std::max(1e-8, fabs(gradients[0]) * 1e-5); + // } EXPECT_NEAR(gradients[0], complex_step_dmu, tolerance_mu) << "grad_mu" << message.str(); @@ -549,76 +574,3 @@ TEST(ProbDistributionsNegBinomial2, derivativesZeroOne) { } } } - -TEST(ProbDistributionsNegBinomial2, proptoAtPoissonCutoff) { - using stan::math::internal::neg_binomial_2_phi_cutoff; - using stan::math::neg_binomial_2_lpmf; - using stan::math::var; - - var mu_var(10); - int y = 11; - var value_before_cutoff = neg_binomial_2_lpmf( - y, mu_var, neg_binomial_2_phi_cutoff - 1e-8); - var value_after_cutoff = neg_binomial_2_lpmf( - y, mu_var, neg_binomial_2_phi_cutoff + 1e-8); - - EXPECT_NEAR(value_of(value_before_cutoff), value_of(value_after_cutoff), 1); -} - -TEST(ProbDistributionsNegBinomial2, derivativesAtCutoff) { - double phi_cutoff = stan::math::internal::neg_binomial_2_phi_cutoff; - using stan::math::is_nan; - using stan::math::var; - - std::vector mu_to_test - = {9.3e-6, 0.0028252, 4, 11, 8522, 984256, 5036842}; - std::vector n_to_test = {0, 1, 5, 48, 1158, 224582, 48235842, 20314458}; - for (double mu : mu_to_test) { - for (int n : n_to_test) { - var mu_before(mu); - var phi_before(phi_cutoff - 1e-8); - var value_before = neg_binomial_2_lpmf(n, mu_before, phi_before); - std::vector x_before; - x_before.push_back(mu_before); - x_before.push_back(phi_before); - - std::vector gradients_before; - value_before.grad(x_before, gradients_before); - - var mu_after(mu); - var phi_after(phi_cutoff + 1e-8); - var value_after = neg_binomial_2_lpmf(n, mu_after, phi_after); - std::vector x_after; - x_after.push_back(mu_after); - x_after.push_back(phi_after); - - std::vector gradients_after; - value_after.grad(x_after, gradients_after); - - for (int i = 0; i < 2; ++i) { - EXPECT_FALSE(is_nan(gradients_before[i])); - EXPECT_FALSE(is_nan(gradients_after[i])); - } - - EXPECT_NEAR(value_of(value_before), value_of(value_after), - 1e-8 * fabs(value_of(value_after))) - << "value changes too much around phi cutoff for n = " << n - << ", mu = " << mu << ", cutoff = " << phi_cutoff - << " value at cutoff - 1e-8: " << value_of(value_before) - << ", value at cutoff + 1e-8: " << value_of(value_after); - EXPECT_NEAR(gradients_before[0], gradients_after[0], - 1e-8 * fabs(gradients_before[0])) - << "grad_mu changes too much around phi cutoff for n = " << n - << ", mu = " << mu << ", cutoff = " << phi_cutoff - << " grad_mu at cutoff - 1e-8: " << gradients_before[0] - << ", grad_mu at cutoff + 1e-8: " << gradients_after[0]; - - EXPECT_NEAR(gradients_before[1], gradients_after[1], - 1e-8 * fabs(gradients_before[1])) - << "grad_phi changes too much around phi cutoff for n = " << n - << ", mu = " << mu << ", cutoff = " << phi_cutoff - << " grad_phi at cutoff - 1e-8: " << gradients_before[1] - << ", grad_phi at cutoff + 1e-8: " << gradients_after[1]; - } - } -} From ec5e5ed6bf17c00a565af769d2dafd38f1dc22c9 Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Tue, 14 Jan 2020 07:25:01 +0000 Subject: [PATCH 69/82] [Jenkins] auto-formatting by clang-format version 5.0.0-3~16.04.1 (tags/RELEASE_500/final) --- stan/math/prim/fun/lgamma_stirling_diff.hpp | 2 +- stan/math/prim/prob/neg_binomial_2_lpmf.hpp | 4 ++-- .../unit/math/prim/fun/lgamma_stirling_diff_test.cpp | 6 +++--- test/unit/math/prim/prob/neg_binomial_2_test.cpp | 3 +-- test/unit/math/rev/prob/neg_binomial_2_test.cpp | 12 ++++++------ 5 files changed, 13 insertions(+), 14 deletions(-) diff --git a/stan/math/prim/fun/lgamma_stirling_diff.hpp b/stan/math/prim/fun/lgamma_stirling_diff.hpp index 190acc22fdf..9ff77a296de 100644 --- a/stan/math/prim/fun/lgamma_stirling_diff.hpp +++ b/stan/math/prim/fun/lgamma_stirling_diff.hpp @@ -49,7 +49,7 @@ return_type_t lgamma_stirling_diff(const T x) { static const char* function = "lgamma_stirling_diff"; check_nonnegative(function, "argument", x); - if(x == 0) { + if (x == 0) { return std::numeric_limits::infinity(); } else if (value_of(x) < lgamma_stirling_diff_useful) { return lgamma(x) - lgamma_stirling(x); diff --git a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp index f4609a89da6..25c2f9c6a13 100644 --- a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp @@ -90,7 +90,7 @@ return_type_t neg_binomial_2_lpmf( if (!is_constant_all::value) { ops_partials.edge1_.partials_[i] += n_vec[i] / mu_val[i] - - (n_vec[i] + phi_val[i]) / (mu_val[i] + phi_val[i]); + - (n_vec[i] + phi_val[i]) / (mu_val[i] + phi_val[i]); } if (!is_constant_all::value) { T_partials_return log_term; @@ -101,7 +101,7 @@ return_type_t neg_binomial_2_lpmf( } ops_partials.edge2_.partials_[i] += (mu_val[i] - n_vec[i]) / (mu_val[i] + phi_val[i]) + log_term - - (digamma(phi_val[i]) - digamma(n_plus_phi[i])); + - (digamma(phi_val[i]) - digamma(n_plus_phi[i])); } } return ops_partials.build(logp); diff --git a/test/unit/math/prim/fun/lgamma_stirling_diff_test.cpp b/test/unit/math/prim/fun/lgamma_stirling_diff_test.cpp index 1c53d797f1c..a1d0533bfbd 100644 --- a/test/unit/math/prim/fun/lgamma_stirling_diff_test.cpp +++ b/test/unit/math/prim/fun/lgamma_stirling_diff_test.cpp @@ -8,7 +8,7 @@ TEST(MathFunctions, lgamma_stirling_diff_errors_special_cases) { using stan::math::lgamma_stirling_diff; - + double nan = std::numeric_limits::quiet_NaN(); double inf = std::numeric_limits::infinity(); @@ -91,10 +91,10 @@ std::vector testValues = { } // namespace lgamma_stirling_diff_test_internal TEST(MathFunctions, lgamma_stirling_diff_precomputed) { - using stan::math::lgamma_stirling_diff; - using stan::test::expect_near_rel; using lgamma_stirling_diff_test_internal::TestValue; using lgamma_stirling_diff_test_internal::testValues; + using stan::math::lgamma_stirling_diff; + using stan::test::expect_near_rel; for (TestValue t : testValues) { std::ostringstream msg; diff --git a/test/unit/math/prim/prob/neg_binomial_2_test.cpp b/test/unit/math/prim/prob/neg_binomial_2_test.cpp index 648c068ba59..0affe135bbd 100644 --- a/test/unit/math/prim/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/prim/prob/neg_binomial_2_test.cpp @@ -256,8 +256,7 @@ TEST(ProbDistributionsNegBinomial2, extreme_values) { TEST(ProbDistributionsNegBinomial2, zeroOne) { using stan::test::expect_near_rel; - std::vector mu_to_test - = {2.345e-5, 0.2, 13, 150, 1621, 18432, 1e10}; + std::vector mu_to_test = {2.345e-5, 0.2, 13, 150, 1621, 18432, 1e10}; double phi_start = 1e-8; double phi_max = 1e22; for (double mu : mu_to_test) { diff --git a/test/unit/math/rev/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/prob/neg_binomial_2_test.cpp index d8e92e404b7..285255db70a 100644 --- a/test/unit/math/rev/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/prob/neg_binomial_2_test.cpp @@ -19,12 +19,12 @@ struct TestValue { // Test data generated in Mathematica (Wolfram Cloud). The code can be re-ran at // https://www.wolframcloud.com/obj/martin.modrak/Published/neg_binomial_2_lpmf.nb // but is also presented below for convenience: -// -// nb2[n_,mu_,phi_]:= LogGamma[n + phi] - LogGamma[n + 1] - LogGamma[phi] + +// +// nb2[n_,mu_,phi_]:= LogGamma[n + phi] - LogGamma[n + 1] - LogGamma[phi] + // n * (Log[mu] - Log[mu + phi]) + phi * (Log[phi] - Log[mu + phi]) // nb2dmu[n_,mu_,phi_]= D[nb2[n, mu, phi],mu]; // nb2dphi[n_,mu_,phi_]= D[nb2[n, mu, phi],phi]; -// out = OpenWrite["nb_test.txt"] +// out = OpenWrite["nb_test.txt"] // mus= {256*10^-7,314*10^-3,15*10^-1,3,180, 1123,10586}; // phis= {4*10^-4,65*10^-3,442*10^-2,800, 15324}; // ns = {0,6,14,1525,10233}; @@ -46,7 +46,7 @@ struct TestValue { // WriteString[out,"};"]; // Close[out]; // FilePrint[%] -// +// std::vector testValues = { {0, 0.0000256, 0.0004, -0.0000248141563677810565248409, -0.93984962406015037593985, -0.0018850149796030172519518}, @@ -506,11 +506,11 @@ TEST(ProbDistributionsNegBinomial2, derivativesComplexStep) { // if (phi < phi_cutoff || n < 100000) { // tolerance_phi = std::max(1e-10, fabs(gradients[1]) * 1e-8); // } else { - tolerance_phi = std::max(1e-8, fabs(gradients[1]) * 1e-5); + tolerance_phi = std::max(1e-8, fabs(gradients[1]) * 1e-5); // } // if (phi < phi_cutoff) { - tolerance_mu = std::max(1e-10, fabs(gradients[0]) * 1e-8); + tolerance_mu = std::max(1e-10, fabs(gradients[0]) * 1e-8); // } else { // tolerance_mu = std::max(1e-8, fabs(gradients[0]) * 1e-5); // } From 10fdef947c35375b248d6145b49ba310a691d087 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Tue, 14 Jan 2020 14:46:30 +0100 Subject: [PATCH 70/82] Fixing incomplete merge --- stan/math/prim/fun/binomial_coefficient_log.hpp | 1 - stan/math/prim/fun/lbeta.hpp | 5 ++--- test/unit/math/prim/fun/lbeta_test.cpp | 1 - 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/stan/math/prim/fun/binomial_coefficient_log.hpp b/stan/math/prim/fun/binomial_coefficient_log.hpp index 6af05d08703..260d2ce25bb 100644 --- a/stan/math/prim/fun/binomial_coefficient_log.hpp +++ b/stan/math/prim/fun/binomial_coefficient_log.hpp @@ -1,7 +1,6 @@ #ifndef STAN_MATH_PRIM_SCAL_FUN_BINOMIAL_COEFFICIENT_LOG_HPP #define STAN_MATH_PRIM_SCAL_FUN_BINOMIAL_COEFFICIENT_LOG_HPP -#include #include #include #include diff --git a/stan/math/prim/fun/lbeta.hpp b/stan/math/prim/fun/lbeta.hpp index 6eba8c98728..fd88cbcd3a6 100644 --- a/stan/math/prim/fun/lbeta.hpp +++ b/stan/math/prim/fun/lbeta.hpp @@ -1,7 +1,6 @@ -#ifndef STAN_MATH_PRIM_SCAL_FUN_LBETA_HPP -#define STAN_MATH_PRIM_SCAL_FUN_LBETA_HPP +#ifndef STAN_MATH_PRIM_FUN_LBETA_HPP +#define STAN_MATH_PRIM_FUN_LBETA_HPP -#include #include #include #include diff --git a/test/unit/math/prim/fun/lbeta_test.cpp b/test/unit/math/prim/fun/lbeta_test.cpp index 3cc919d4190..66661f41e23 100644 --- a/test/unit/math/prim/fun/lbeta_test.cpp +++ b/test/unit/math/prim/fun/lbeta_test.cpp @@ -1,4 +1,3 @@ -#include #include #include #include From e420333a9528263ec2f0ad0e23543642ab304ef6 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Tue, 14 Jan 2020 16:21:59 +0100 Subject: [PATCH 71/82] Improved code style --- stan/math/prim/prob/neg_binomial_2_lpmf.hpp | 19 ++++++++------- .../math/prim/prob/neg_binomial_2_test.cpp | 2 +- .../math/rev/prob/neg_binomial_2_test.cpp | 24 +++++-------------- 3 files changed, 18 insertions(+), 27 deletions(-) diff --git a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp index 25c2f9c6a13..6b0c363e735 100644 --- a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp @@ -3,12 +3,12 @@ #include #include -#include -#include +#include #include -#include #include -#include +#include +#include +#include #include #include #include @@ -65,10 +65,13 @@ return_type_t neg_binomial_2_lpmf( log_phi[i] = log(phi_val[i]); } + VectorBuilder + mu_plus_phi(len_ep); VectorBuilder log_mu_plus_phi(len_ep); for (size_t i = 0; i < len_ep; ++i) { - log_mu_plus_phi[i] = log(mu_val[i] + phi_val[i]); + mu_plus_phi[i] = mu_val[i] + phi_val[i]; + log_mu_plus_phi[i] = log(mu_plus_phi[i]); } VectorBuilder n_plus_phi(len_np); @@ -90,17 +93,17 @@ return_type_t neg_binomial_2_lpmf( if (!is_constant_all::value) { ops_partials.edge1_.partials_[i] += n_vec[i] / mu_val[i] - - (n_vec[i] + phi_val[i]) / (mu_val[i] + phi_val[i]); + - (n_vec[i] + phi_val[i]) / (mu_plus_phi[i]); } if (!is_constant_all::value) { T_partials_return log_term; if (mu_val[i] < phi_val[i]) { - log_term = log1p(-mu_val[i] / (mu_val[i] + phi_val[i])); + log_term = log1p(-mu_val[i] / (mu_plus_phi[i])); } else { log_term = log_phi[i] - log_mu_plus_phi[i]; } ops_partials.edge2_.partials_[i] - += (mu_val[i] - n_vec[i]) / (mu_val[i] + phi_val[i]) + log_term + += (mu_val[i] - n_vec[i]) / (mu_plus_phi[i]) + log_term - (digamma(phi_val[i]) - digamma(n_plus_phi[i])); } } diff --git a/test/unit/math/prim/prob/neg_binomial_2_test.cpp b/test/unit/math/prim/prob/neg_binomial_2_test.cpp index 0affe135bbd..47853d4e0b8 100644 --- a/test/unit/math/prim/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/prim/prob/neg_binomial_2_test.cpp @@ -261,7 +261,7 @@ TEST(ProbDistributionsNegBinomial2, zeroOne) { double phi_max = 1e22; for (double mu : mu_to_test) { for (double phi = phi_start; phi < phi_max; phi *= stan::math::pi()) { - std::ostringstream msg; + std::stringstream msg; msg << ", mu = " << mu << ", phi = " << phi; double expected_value_0 = phi * (-log1p(mu / phi)); diff --git a/test/unit/math/rev/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/prob/neg_binomial_2_test.cpp index 285255db70a..2fc5178f374 100644 --- a/test/unit/math/rev/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/prob/neg_binomial_2_test.cpp @@ -1,8 +1,8 @@ #include -#include -#include #include #include +#include +#include #include #include @@ -408,7 +408,6 @@ TEST(ProbDistributionsNegativeBinomial2, derivativesPrecomputed) { using stan::math::neg_binomial_2_log; using stan::math::value_of; using stan::math::var; - using stan::test::internal::expect_near_rel_finite; for (TestValue t : testValues) { int n = t.n; @@ -497,23 +496,12 @@ TEST(ProbDistributionsNegBinomial2, derivativesComplexStep) { double complex_step_dphi = complex_step_derivative(nb2_log_phi, phi_dbl); - std::ostringstream message; + std::stringstream message; message << ", n = " << n << ", mu = " << mu_dbl << ", phi = " << phi_dbl; - double tolerance_phi; - double tolerance_mu; - // if (phi < phi_cutoff || n < 100000) { - // tolerance_phi = std::max(1e-10, fabs(gradients[1]) * 1e-8); - // } else { - tolerance_phi = std::max(1e-8, fabs(gradients[1]) * 1e-5); - // } - - // if (phi < phi_cutoff) { - tolerance_mu = std::max(1e-10, fabs(gradients[0]) * 1e-8); - // } else { - // tolerance_mu = std::max(1e-8, fabs(gradients[0]) * 1e-5); - // } + double tolerance_phi = std::max(1e-8, fabs(gradients[1]) * 1e-5); + double tolerance_mu = std::max(1e-10, fabs(gradients[0]) * 1e-8); EXPECT_NEAR(gradients[0], complex_step_dmu, tolerance_mu) << "grad_mu" << message.str(); @@ -535,7 +523,7 @@ TEST(ProbDistributionsNegBinomial2, derivativesZeroOne) { for (double mu_dbl : mu_to_test) { for (double phi_dbl = phi_start; phi_dbl < phi_max; phi_dbl *= stan::math::pi()) { - std::ostringstream msg; + std::stringstream msg; msg << std::setprecision(20) << ", mu = " << mu_dbl << ", phi = " << phi_dbl; From fbe958d633c0701b91edc51405626bc253371866 Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Tue, 14 Jan 2020 15:24:53 +0000 Subject: [PATCH 72/82] [Jenkins] auto-formatting by clang-format version 5.0.0-3~16.04.1 (tags/RELEASE_500/final) --- stan/math/prim/fun/binomial_coefficient_log.hpp | 4 ++-- stan/math/prim/prob/neg_binomial_2_lpmf.hpp | 7 +++---- test/unit/math/prim/fun/binomial_coefficient_log_test.cpp | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/stan/math/prim/fun/binomial_coefficient_log.hpp b/stan/math/prim/fun/binomial_coefficient_log.hpp index cd39e80b0fe..7365f9aab55 100644 --- a/stan/math/prim/fun/binomial_coefficient_log.hpp +++ b/stan/math/prim/fun/binomial_coefficient_log.hpp @@ -90,10 +90,10 @@ inline return_type_t binomial_coefficient_log(const T_N N, } if (N / 2 < n) { return binomial_coefficient_log(N, N - n); - } + } if (N_plus_1 < lgamma_stirling_diff_useful) { return lgamma(N_plus_1) - lgamma(n + 1) - lgamma(N_plus_1 - n); - } + } return -lbeta(N - n + 1, n + 1) - log(N_plus_1); } diff --git a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp index 6b0c363e735..0312ce10824 100644 --- a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp @@ -65,8 +65,8 @@ return_type_t neg_binomial_2_lpmf( log_phi[i] = log(phi_val[i]); } - VectorBuilder - mu_plus_phi(len_ep); + VectorBuilder mu_plus_phi( + len_ep); VectorBuilder log_mu_plus_phi(len_ep); for (size_t i = 0; i < len_ep; ++i) { @@ -92,8 +92,7 @@ return_type_t neg_binomial_2_lpmf( if (!is_constant_all::value) { ops_partials.edge1_.partials_[i] - += n_vec[i] / mu_val[i] - - (n_vec[i] + phi_val[i]) / (mu_plus_phi[i]); + += n_vec[i] / mu_val[i] - (n_vec[i] + phi_val[i]) / (mu_plus_phi[i]); } if (!is_constant_all::value) { T_partials_return log_term; diff --git a/test/unit/math/prim/fun/binomial_coefficient_log_test.cpp b/test/unit/math/prim/fun/binomial_coefficient_log_test.cpp index e372b6815d9..ef379939828 100644 --- a/test/unit/math/prim/fun/binomial_coefficient_log_test.cpp +++ b/test/unit/math/prim/fun/binomial_coefficient_log_test.cpp @@ -50,8 +50,8 @@ TEST(MathFunctions, binomial_coefficient_log_nan) { } TEST(MathFunctions, binomial_coefficient_log_errors_edge_cases) { - using stan::math::binomial_coefficient_log; using stan::math::INFTY; + using stan::math::binomial_coefficient_log; EXPECT_NO_THROW(binomial_coefficient_log(10, 11)); EXPECT_THROW(binomial_coefficient_log(10, 11.01), std::domain_error); From e560179cd3ebbe9b6ae47668e27a6329ce498f43 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Fri, 13 Mar 2020 15:52:04 +0100 Subject: [PATCH 73/82] Fixed merge --- test/unit/math/expect_near_rel.hpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/unit/math/expect_near_rel.hpp b/test/unit/math/expect_near_rel.hpp index 3bbab6d2ff1..9f7f7ae0696 100644 --- a/test/unit/math/expect_near_rel.hpp +++ b/test/unit/math/expect_near_rel.hpp @@ -6,8 +6,6 @@ #include #include #include -#include -#include namespace stan { namespace test { @@ -84,7 +82,7 @@ void expect_near_rel(const std::string& msg, const T1& x1, const T2& x2, << std::endl << msg << std::endl; else - internal::expect_near_rel_finite(msg, x1, x2, tol_rel, tol_min); + internal::expect_near_rel_finite(msg, x1, x2, tol); } /** From 815f0a9b6bb77b43e9f7b83e2e9303978e8ffbc6 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Fri, 13 Mar 2020 16:58:09 +0100 Subject: [PATCH 74/82] Fixes #1496 --- stan/math/prim/prob/neg_binomial_2_lpmf.hpp | 4 +- .../math/rev/prob/neg_binomial_2_test.cpp | 565 ++++++------------ 2 files changed, 196 insertions(+), 373 deletions(-) diff --git a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp index 77e1d72b8f9..b69387ae5e5 100644 --- a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp @@ -48,11 +48,9 @@ return_type_t neg_binomial_2_lpmf( size_t size_n_phi = max_size(n, phi); size_t max_size_seq_view = max_size(n, mu, phi); - operands_and_partials ops_partials(mu, phi); - size_t len_ep = max_size(mu, phi); size_t len_np = max_size(n, phi); - + size_t len_mu = size(mu); VectorBuilder mu_val(len_mu); for (size_t i = 0; i < len_mu; ++i) { diff --git a/test/unit/math/rev/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/prob/neg_binomial_2_test.cpp index 6322ad564d3..cc28fc42fb8 100644 --- a/test/unit/math/rev/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/prob/neg_binomial_2_test.cpp @@ -20,384 +20,209 @@ struct TestValue { // https://www.wolframcloud.com/obj/martin.modrak/Published/neg_binomial_2_lpmf.nb // but is also presented below for convenience: // -// nb2[n_,mu_,phi_]:= LogGamma[n + phi] - LogGamma[n + 1] - LogGamma[phi] + +// toCString[x_] := ToString[CForm[N[x, 24]]]; +// nb2[n_,mu_,phi_]:= LogGamma[n + phi] - LogGamma[n + 1] - LogGamma[phi] + // n * (Log[mu] - Log[mu + phi]) + phi * (Log[phi] - Log[mu + phi]) // nb2dmu[n_,mu_,phi_]= D[nb2[n, mu, phi],mu]; // nb2dphi[n_,mu_,phi_]= D[nb2[n, mu, phi],phi]; -// out = OpenWrite["nb_test.txt"] -// mus= {256*10^-7,314*10^-3,15*10^-1,3,180, 1123,10586}; -// phis= {4*10^-4,65*10^-3,442*10^-2,800, 15324}; +// mus= SetPrecision[{0.0000256,0.314,1.5,3.0,180.0,1123.0,10586.0}, Infinity]; +// phis= SetPrecision[{0.0004,0.065,4.42,800.0, 15324.0}, Infinity]; // ns = {0,6,14,1525,10233}; -// WriteString[out, "std::vector testValues = {"]; -// For[k = 1, k <= Length[ns], k++, { -// For[i = 1, i <= Length[mus], i++, { -// For[j = 1, j <= Length[phis], j++, { -// cmu = mus[[i]]; -// cphi = phis[[j]]; -// cn=ns[[k]]; -// val = N[nb2[cn,cmu,cphi], 24]; -// ddmu= N[nb2dmu[cn,cmu,cphi], 24]; -// ddphi= N[nb2dphi[cn,cmu,cphi], 24]; -// WriteString[out," {",CForm[cn],",",CForm[cmu],",", -// CForm[cphi],",", CForm[val],",",CForm[ddmu],",",CForm[ddphi],"},"] -// }] +// out = "std::vector testValues = {\n"; +// For[k = 1, k <= Length[ns], k++, { +// For[i = 1, i <= Length[mus], i++, { +// For[j = 1, j <= Length[phis], j++, { +// cmu = mus[[i]]; +// cphi = phis[[j]]; +// cn=ns[[k]]; +// val = nb2[cn,cmu,cphi]; +// ddmu= nb2dmu[cn,cmu,cphi]; +// ddphi= nb2dphi[cn,cmu,cphi]; +// out = StringJoin[out," {",ToString[cn],",",toCString[cmu],",", +// toCString[cphi],",", toCString[val],",",toCString[ddmu],",", +// toCString[ddphi],"},\n"]; // }] // }] -// WriteString[out,"};"]; -// Close[out]; -// FilePrint[%] +// }] +// out = StringJoin[out,"};\n"]; +// out // std::vector testValues = { - {0, 0.0000256, 0.0004, -0.0000248141563677810565248409, - -0.93984962406015037593985, -0.0018850149796030172519518}, - {0, 0.0000256, 0.065, -0.0000255949600924861403888716, - -0.999606308899879432100588, -7.75166869111834937935475e-8}, - {0, 0.0000256, 4.42, -0.0000255999258645396480948713, - -0.999994208178341772500141, -1.67726638232395628338958e-11}, - {0, 0.0000256, 800, -0.0000255999995904000087381331, - -0.999999968000001023999967, -5.1199997815466745309864e-16}, - {0, 0.0000256, 15324, -0.0000255999999786165492276784, - -0.999999998329417909342659, -1.39542226236663832355842e-18}, - {0, 0.314, 0.0004, -0.00266678271697168261798476, - -0.00127226463104325699745547, -5.66822905706024980195936}, - {0, 0.314, 0.065, -0.114604680787141300415594, -0.171503957783641160949868, - -0.934652892970430398112858}, - {0, 0.314, 4.42, -0.303348202309659616314882, -0.933671313899450781580059, - -0.00230212890163621513546237}, - {0, 0.314, 800, -0.313938393619808990999524, -0.999607653995806645891488, - -7.69878314071302369967267e-8}, - {0, 0.314, 15324, -0.313996782998787812397665, -0.999979509686371605280341, - -2.09929343978617830724328e-10}, - {0, 1.5, 0.0004, -0.00329191110003275493362122, - -0.00026659557451346307651293, -7.23004434565640079712956}, - {0, 1.5, 0.065, -0.206781499150110071240643, -0.0415335463258785942492013, - -2.22278737940449507487448}, - {0, 1.5, 4.42, -1.29150964740387939892012, -0.746621621621621621621622, - -0.0388183744279291779383916}, - {0, 1.5, 800, -1.49859550534427827334156, -0.998128509045539613225203, - -1.75342721996106687969703e-6}, - {0, 1.5, 15324, -1.49992659053829698010225, -0.999902123911128511304688, - -4.79017695146261715054393e-9}, - {0, 3, 0.0004, -0.00356911664958785451901203, -0.00013331555792560991867751, - -7.92292493952756190744874}, - {0, 3, 0.065, -0.250472012600853853120106, -0.0212071778140293637846656, - -2.87462275628870402717091}, - {0, 3, 4.42, -2.28973397601639586742486, -0.595687331536388140161725, - -0.113726692626070463108525}, - {0, 3, 800, -2.99438902306750149309853, -0.996264009962640099626401, - -6.99624147447649277415792e-6}, - {0, 3, 15324, -2.99970638131217673536622, -0.999804266979839498923468, - -1.91582075605741709616675e-8}, - {0, 180, 0.0004, -0.00520680203358650223341638, - -2.22221728396159119646401e-6, -12.0170073061835395451321}, - {0, 180, 0.065, -0.515234583883688262086666, -0.000360980756948879571265932, - -6.92704688665984521936613}, - {0, 180, 4.42, -16.4913562250745368347413, -0.0239670317752955210931569, - -2.75504310079668394524277}, - {0, 180, 800, -162.3526751973522458866, -0.816326530612244897959184, - -0.0192673746089352053174335}, - {0, 180, 15324, -178.951041022560568926078, -0.988390092879256965944272, - -0.0000679211892648339243088643}, - {0, 1123, 0.0004, -0.00593912212871338076639709, - -3.56188653183026470872139e-7, -13.8478056779721050990192}, - {0, 1123, 0.065, -0.634217014783734204352692, - -0.000057877326779839101031552, -8.75724272015345990606553}, - {0, 1123, 4.42, -24.4936395934523258117904, -0.00392045555338738003583403, - -4.54546787488649276731873}, - {0, 1123, 800, -701.624014336681947952778, -0.416016640665626625065003, - -0.293046658586479060005975}, - {0, 1123, 15324, -1083.75715139725783359741, -0.931720070529579862588922, - -0.00244293345030929573936621}, - {0, 10586, 0.0004, -0.00683653348042399161482707, - -3.77857533426883301459161e-8, -16.091333738845732379756}, - {0, 10586, 0.065, -0.780043017108597589318463, - -6.14014744855619155937546e-6, -11.0006679418181806995525}, - {0, 10586, 4.42, -34.3945190758502000304634, -0.000417358329509122395523501, - -6.78198276010557247770399}, - {0, 10586, 800, -2124.42246547447991619038, -0.0702617249253469172668189, - -1.72578980676844681250479}, - {0, 10586, 15324, -8048.29915678058041924358, -0.591431879583172520262447, - -0.116640647318788574768032}, - {6, 0.0000256, 0.0004, -26.4803625972224902645113, - 220276.315789473684210526, -11595.4634978387095432955}, - {6, 0.0000256, 0.065, -51.4193881364481026728232, 234281.729042100342019143, - -74.6938075459730303944346}, - {6, 0.0000256, 4.42, -67.5203813751119077704357, 234372.642547590674587948, - -0.431255924758490025034736}, - {6, 0.0000256, 800, -69.998079065742703551293, 234373.992500032239998968, - -0.0000233303844710378174909984}, - {6, 0.0000256, 15324, -70.0158073212983954315096, 234373.999608458993084276, - -6.38614276575077488493398e-8}, - {6, 0.314, 0.0004, -9.62519749441237582251687, 0.023038524497171844864751, - 2477.5305495558165940557}, - {6, 0.314, 0.065, -5.62316274126580027012417, 3.10564173234962943044888, - 0.811756664687528071010215}, - {6, 0.314, 4.42, -11.7481186360489883350416, 16.9071818179371883568924, - -0.343526975436714222156802}, - {6, 0.314, 800, -13.8270107248858320162615, 18.1011755433762948679586, - -0.0000204650172704751119362432}, - {6, 0.314, 15324, -13.8425659569858167417764, 18.1079092104353788140892, - -5.6049178830042368725488e-8}, - {6, 1.5, 0.0004, -9.61978396161923322623754, 0.00079978672354038922953879, - 2491.05377011516735187466}, - {6, 1.5, 0.065, -4.84100453988744409858109, 0.124600638977635782747604, - 11.5208909282007772435409}, - {6, 1.5, 4.42, -4.69471130087565245107321, 2.23986486486486486486486, - -0.126129611536089773251445}, - {6, 1.5, 800, -5.6375883578559464150792, 2.99438552713661883967561, - -0.0000110478695320263035818071}, - {6, 1.5, 15324, -5.64599569956598171509704, 2.99970637173338553391406, - -3.03295927479829163411156e-8}, - {6, 3, 0.0004, -9.61926132713561025018161, 0.00013331555792560991867751, - 2492.36008977011398813188}, - {6, 3, 0.065, -4.75878244235486512052296, 0.0212071778140293637846656, - 12.745335721641112641817}, - {6, 3, 4.42, -2.88910819582874566285473, 0.595687331536388140161725, - 0.00385024685205873541538553}, - {6, 3, 800, -2.98571724360242195248096, 0.996264009962640099626401, - -2.3069406647953774852549e-6}, - {6, 3, 15324, -2.98747963477610734281426, 0.999804266979839498923468, - -6.38245840446628643263247e-9}, - {6, 180, 0.0004, -9.62011239916672050497847, -2.14814337449620482324854e-6, - 2490.23240751308273540641}, - {6, 180, 0.065, -4.89709960487442547895843, -0.000348948065050583585557067, - 10.6171759350004776847048}, - {6, 180, 4.42, -11.8028833191445191284052, -0.023168130716119003723385, - -1.86137525666548784300587}, - {6, 180, 800, -138.973123190861697819951, -0.789115646258503401360544, - -0.0179131542129975601896404}, - {6, 180, 15324, -154.441639359481734262519, -0.955443756449948400412797, - -0.0000634392772194434652186986}, - {6, 1123, 0.0004, -9.62083352307562855236427, -3.5428559715533443273747e-7, - 2488.4295995707558483234}, - {6, 1123, 0.065, -5.0142630342277769583843, -0.0000575680979635621334392196, - 8.81495887967631288756553}, - {6, 1123, 4.42, -19.6831821663032130583962, -0.00389950921917515894926679, - -3.62458748384772905278683}, - {6, 1123, 800, -671.304184750646975825767, -0.41379393376981739999787, - -0.288690114015941777831476}, - {6, 1123, 15324, -1048.61720731875393149901, -0.926742047000481483982035, - -0.00241626280594218362665218}, - {6, 10586, 0.0004, -9.62172902400956379331308, - -3.77643368945439762841293e-8, 2486.19084755337982611478}, - {6, 10586, 0.065, -5.15977860354001470537965, -6.13666729697000818989159e-6, - 6.57630939764217205495288}, - {6, 10586, 4.42, -29.5629973572818969888733, -0.000417121776516768840415515, - -5.85634703346878397904497}, - {6, 10586, 800, -2091.3124520859014907288, -0.0702219015407302460497774, - -1.71884010032985743252181}, - {6, 10586, 15324, -8002.42495594488889877697, -0.59109666408369216553719, - -0.116480739324794834878369}, - {14, 0.0000256, 0.0004, -49.8145624383586400724923, - 513979.323308270676691729, -30391.5592215308067657195}, - {14, 0.0000256, 0.065, -114.928171090288372551513, - 546658.700573312664550577, -196.832392093265929097095}, - {14, 0.0000256, 4.42, -161.649312877052269163198, 546870.832603322478494242, - -1.65012869090202521315342}, - {14, 0.0000256, 800, -173.098986627797206761932, 546873.982500032559998958, - -0.00014060727924520899116967}, - {14, 0.0000256, 15324, -173.206165042629407096483, - 546873.999086402089753857, -3.87293689171005773693536e-7}, - {14, 0.314, 0.0004, -10.48232124038756783909, 0.0554529100014586473476929, - 2452.9820144458617504796}, - {14, 0.314, 0.065, -7.91753972042693519284807, 7.47516931919399021898056, - -19.4065385144529680284843}, - {14, 0.314, 4.42, -31.1096030160603970450565, 40.6949859937193738748557, - -1.44235830397139693802194}, - {14, 0.314, 800, -41.6146101076375483922037, 43.568886473205763553092, - -0.000133818772002702504530118}, - {14, 0.314, 15324, -41.7166402819016445593073, 43.585094170597712706582, - -3.68785202783475625980072e-7}, - {14, 1.5, 0.0004, -10.4688561593594870180174, 0.00222162978761219230427442, - 2486.61861613580838671742}, - {14, 1.5, 0.065, -5.96960149272681243148081, 0.346112886048988285410011, - 7.29895408232336627643618}, - {14, 1.5, 4.42, -13.3341039738636536056565, 6.22184684684684684684685, - -0.886409460834882606838869}, - {14, 1.5, 800, -20.9264151022685229463224, 8.31773757537949677687669, - -0.000109610174761583369512834}, - {14, 1.5, 15324, -21.0100699378693506067827, 8.3325176992594042608724, - -3.02665838448691571323444e-7}, - {14, 3, 0.0004, -10.4672670714982932744397, 0.000488823712393903035150869, - 2490.59053612251208613134}, - {14, 3, 0.065, -5.71949591388313644017256, 0.0777596519847743338771071, - 11.025105769529760808809}, - {14, 3, 4.42, -7.79006429060418247514041, 2.18418688230008984725966, - -0.483245366998347706389421}, - {14, 3, 800, -12.7443244787126682405839, 3.6529680365296803652968, - -0.0000822242550653573074282639}, - {14, 3, 15324, -12.8071593989944707311042, 3.66594897892607816271938, - -2.27631817501670696455485e-7}, - {14, 180, 0.0004, -10.4670693257255523386798, -2.04937816187568965896125e-6, - 2491.08472067831379995549}, - {14, 180, 0.065, -5.68921919805166473123324, -0.000332904475852855604611915, - 11.4626317745298008318075}, - {14, 180, 4.42, -9.65337657959679927166961, -0.0221029293038836472303558, - -1.31368299764513841319336}, - {14, 180, 800, -117.570556789937986073345, -0.752834467120181405895692, - -0.0161936967338941701029113}, - {14, 180, 15324, -131.5984192349764106228, -0.911515307877536979704162, - -0.0000577016781835615346878727}, - {14, 1123, 0.0004, -10.4677755213861686112027, - -3.51748189118411715224579e-7, 2489.319233308602484167}, - {14, 1123, 0.065, -5.8039572920094235935389, - -0.0000571557928751928433161097, 9.69771975676490255408168}, - {14, 1123, 4.42, -17.3710293984633664722496, -0.00387158077355886416717715, - -3.04061182895062280658097}, - {14, 1123, 800, -640.647914910330698665346, -0.41083032457540509990836, - -0.282967557637372205015805}, - {14, 1123, 15324, -1011.59993064034851794618, -0.920104682295016979172854, - -0.00238094023047733949128954}, - {14, 10586, 0.0004, -10.468668475096403358952, - -3.77357816303515044684135e-8, 2487.08684934922326872119}, - {14, 10586, 0.065, -5.94905895063816048990702, - -6.13202709485509703057976e-6, 7.46543792757153500263484}, - {14, 10586, 4.42, -27.2227588675497966851323, - -0.000416806372526964100271534, -5.26603093110764468733629}, - {14, 10586, 800, -2056.93593717552727578896, -0.0701688036945746844270555, - -1.70965999479388506262815}, - {14, 10586, 15324, -7951.09533692356666073317, -0.590649710084385025903513, - -0.116267766949827820373742}, - {1525, 0.0000256, 0.0004, -4301.78472746701578211824, - 5.59871348684210526315789e7, -3.58066878763440801575999e6}, - {1525, 0.0000256, 0.065, -11965.4671281234821192651, - 5.95468591985310400826751e7, -23429.1126891147674041279}, - {1525, 0.0000256, 4.42, -18367.3428918005844132604, - 5.95699664793796669412955e7, -339.057082534394502685042}, - {1525, 0.0000256, 800, -24826.2281356385313850842, - 5.9570309593750092999997e7, -0.838976287617641050521018}, - {1525, 0.0000256, 15324, -25707.7170288016100578067, - 5.95703114004829044732209e7, -0.00464306291332368931093164}, - {1525, 0.314, 0.0004, -17.0947387955188070326685, 6.17771997212362846631335, - -2348.2711549792054388957}, - {1525, 0.314, 0.065, -296.585568286099067098382, 832.7696922844226341529, - -4001.49218112616940138645}, - {1525, 0.314, 4.42, -4115.10160678526160318827, 4533.61649969457966358017, - -316.176485619091863713022}, - {1525, 0.314, 800, -10469.9426767525578633112, 4853.78278834474666145767, - -0.838228516034976412381988}, - {1525, 0.314, 15324, -11350.8644775429644460839, 4855.58840352125852665115, - -0.00464102415296814454780544}, - {1525, 1.5, 0.0004, -15.5605375416167690037651, 0.270772238514173998044966, - 1484.28030775203773370257}, - {1525, 1.5, 0.065, -74.4509275868752796839738, 42.1842385516506922257721, - -953.474508334327862701411}, - {1525, 1.5, 4.42, -2072.19103657901875771673, 758.318693693693693693694, - -251.676626135276647866636}, - {1525, 1.5, 800, -8088.5487996808837996978, 1013.76585568725306716573, - -0.835410572412918435298525}, - {1525, 1.5, 15324, -8967.33164084000397251235, 1015.56725718573619131513, - -0.00463332752548632640449661}, - {1525, 3, 0.0004, -15.3575220720668965445137, 0.0676354263875927654090566, - 1991.71749039935673683979}, - {1525, 3, 0.065, -42.4918294753981553150494, 10.759108210984230560087, - -477.238467087057049216524}, - {1525, 3, 4.42, -1360.54978818586119643475, 302.212039532794249775382, - -199.675789571126133218244}, - {1525, 3, 800, -7035.84649923785032031894, 505.437941054379410543794, - -0.831861613850395752926704}, - {1525, 3, 15324, -7911.93122400832367818281, 507.234031447771905787173, - -0.00462360345575814251935502}, - {1525, 180, 0.0004, -15.1592288635917619923534, - 0.0000166049013718241119958005, 2487.41676922898500772359}, - {1525, 180, 0.065, -10.6183839860155018806964, 0.00269732843386801679640377, - 7.79296281407547767488829}, - {1525, 180, 4.42, -30.7569326420675973698907, 0.179086987432069310390534, - -5.06066771330890867332748}, - {1525, 180, 800, -1255.10606104316181434609, 6.09977324263038548752834, - -0.50811617220616562857323}, - {1525, 180, 15324, -1861.51726736161923065929, 7.38547041623667010663915, - -0.00355560001152251827139362}, - {1525, 1123, 0.0004, -15.1571154863562692876443, - 1.27504753855366555022796e-7, 2492.70020501203972018602}, - {1525, 1123, 0.065, -10.2750368571307051844228, - 0.0000207183306905568286862724, 13.0740397653170432513801}, - {1525, 1123, 4.42, -7.7548168672587285529831, 0.0014034043922188128000047, - 0.0654298516080506295778705}, - {1525, 1123, 800, -30.3901820482837344036952, 0.148921362019218079497891, - -0.0188047284729684005572389}, - {1525, 1123, 15324, -64.3938471491118556432688, 0.333527576449591366661395, - -0.000290976140796059790385352}, - {1525, 10586, 0.0004, -15.1575273331900733823398, - -3.23424061059983902750941e-8, 2491.6705880068073820668}, - {1525, 10586, 0.065, -10.341961135413218918573, - -5.25560892040125181555838e-6, 12.0444483664247291801249}, - {1525, 10586, 4.42, -12.3018556139457378552047, - -0.000357234443952593805577031, -0.96243723577972978183147}, - {1525, 10586, 800, -744.016916706287313438782, -0.0601399480019429829354474, - -0.792452568525027960065769}, - {1525, 10586, 15324, -4300.64559341391477270059, - -0.506231273465249027592861, -0.080624196979174112177973}, - {10233, 0.0000256, 0.0004, -28781.0708528951564436868, - 3.75682858552631578947368e8, -2.40411931995216805817928e7}, - {10233, 0.0000256, 0.065, -80237.4790550341084402889, - 3.99569192710255653158141e8, -157343.697098361014871643}, - {10233, 0.0000256, 4.42, -123371.163364167739853751, - 3.99724246355043735493297e8, -2307.2799792939510175957}, - {10233, 0.0000256, 800, -173733.655946368116040227, - 3.99726548708750441319986e8, -10.1666354466535988554224}, - {10233, 0.0000256, 15324, -189611.393943800923934812, - 3.9972656083222396519806e8, -0.156271946909903467303064}, - {10233, 0.314, 0.0004, -30.0835346409569126537712, - 41.4607785935398129689956, -30043.5682705897920957967}, - {10233, 0.314, 0.065, -1936.71659175848698855364, 5589.00047056450935246962, - -26975.8416131385266353558}, - {10233, 0.314, 4.42, -27734.5558869327520485077, 30426.6413450334885998832, - -2153.7342775414124625757}, - {10233, 0.314, 800, -77398.8345343110590488869, 32575.3861354641233252254, - -10.1616173371352784115726}, - {10233, 0.314, 15324, -93272.7669155443507051479, 32587.5042326579589686295, - -0.156258265294963792040417}, - {10233, 1.5, 0.0004, -19.7852231333246169373824, 1.81844841375633164489469, - -4317.60144720493526427937}, - {10233, 1.5, 0.065, -445.630392408020268115618, 283.300319488817891373802, - -6515.78789458981693006454}, - {10233, 1.5, 4.42, -14020.6484936315300789489, 5092.70608108108108108108, - -1720.72113290933110987002}, - {10233, 1.5, 800, -61412.5266404072312643186, 6808.23456019962570180911, - -10.1426989007295637839166}, - {10233, 1.5, 15324, -77272.0989845637286907938, 6820.33238719780757560928, - -0.156206593508853883167535}, - {10233, 3, 0.0004, -18.4213731622889640306878, 0.454606052526329822690308, - -908.658303440053015065049}, - {10233, 3, 0.065, -230.930124889414044823939, 72.3164763458401305057096, - -3316.44389947819074911539}, - {10233, 3, 4.42, -9239.71902985399623107597, 2031.29380053908355795148, - -1371.35925605961200776625}, - {10233, 3, 800, -54340.1804040886113152815, 3397.26027397260273972603, - -10.1188548696496798960218}, - {10233, 3, 15324, -70181.625182690519906018, 3409.33255040125269132903, - -0.156141261363057784911755}, - {10233, 180, 0.0004, -17.081441774321808557538, - 0.000124110835309254868322515, 2440.94300115825934508112}, - {10233, 180, 0.065, -15.5422428149329860521265, 0.0201607752755949240552023, - -38.663485376183506373452}, - {10233, 180, 4.42, -235.497379149446597781456, 1.33855872465025485305281, - -50.3775345819770169658823}, - {10233, 180, 800, -14640.5024630709594885282, 45.5918367346938775510204, - -7.83648996527639800152069}, - {10233, 180, 15324, -28577.6446971680821285066, 55.2015866873065015479876, - -0.148587051440887372280679}, - {10233, 1123, 0.0004, -17.0630789988207189145522, - 2.88947340204574456780515e-6, 2486.84988023336341161969}, - {10233, 1123, 0.065, -12.5589181079456256205069, - 0.000469512419380529127691397, 7.22412495831966558459338}, - {10233, 1123, 4.42, -35.4550615786577840007616, 0.0318035174455556831045841, - -5.75696060521026301882133}, - {10233, 1123, 800, -3343.1303902972739556477, 3.37480997013700672692981, - -2.98980536947426087305154}, - {10233, 1123, 15324, -11352.0607180353268830661, 7.55829905834770485145599, - -0.113119180727235553840235}, - {10233, 10586, 0.0004, -17.0607181926565361616021, - -1.26000103249281886845913e-9, 2492.75189435765523482408}, - {10233, 10586, 0.065, -12.175300607237463446918, - -2.04748918320454904634379e-7, 13.1257236766090680623184}, - {10233, 10586, 4.42, -9.43079204562662170137108, - -0.0000139172010501341588531831, 0.116749372001926599593782}, - {10233, 10586, 800, -7.27036619721226178082317, -0.002342942461614156602606, - 0.0000890483066241868231597611}, - {10233, 10586, 15324, -9.3278240351663417156768, - -0.0197218452194275363359762, -0.0000805948075011592832299515}, + {0,0.0000255999999999999988415517,0.000400000000000000019168694,-0.0000248141563677810554722069,-0.93984962406015038120717,-0.00188501497960301691484332}, + {0,0.0000255999999999999988415517,0.065000000000000002220446,-0.0000255949600924861392310515,-0.99960630889987943213184,-7.75166869111834814851761e-8}, + {0,0.0000255999999999999988415517,4.41999999999999992894573,-0.0000255999258645396469364285,-0.99999420817834177250031,-1.67726638232395618551723e-11}, + {0,0.0000255999999999999988415517,800.,-0.0000255999995904000075796848,-0.999999968000001023999969,-5.11999978154667406760709e-16}, + {0,0.0000255999999999999988415517,15324.,-0.0000255999999786165480692301,-0.999999998329417909342659,-1.39542226236663819726744e-18}, + {0,0.314000000000000001332268,0.000400000000000000019168694,-0.00266678271697168272833231,-0.00127226463104325705295582,-5.66822905706024975839158}, + {0,0.314000000000000001332268,0.065000000000000002220446,-0.11460468078714130271943,-0.171503957783641165200901,-0.934652892970430377577097}, + {0,0.314000000000000001332268,4.41999999999999992894573,-0.303348202309659617395206,-0.93367131389945078032175,-0.00230212890163621522485358}, + {0,0.314000000000000001332268,800.,-0.313938393619808992331269,-0.999607653995806645889824,-7.69878314071302376498577e-8}, + {0,0.314000000000000001332268,15324.,-0.313996782998787813729905,-0.999979509686371605280254,-2.09929343978617832505718e-10}, + {0,1.5,0.000400000000000000019168694,-0.00329191110003275507221173,-0.000266595574513463089285247,-7.23004434565640074923338}, + {0,1.5,0.065000000000000002220446,-0.206781499150110076176223,-0.0415335463258785956090882,-2.22278737940449504349247}, + {0,1.5,4.41999999999999992894573,-1.29150964740387939616191,-0.74662162162162161858047,-0.0388183744279291789704566}, + {0,1.5,800.,-1.49859550534427827334156,-0.998128509045539613225203,-1.75342721996106687969703e-6}, + {0,1.5,15324.,-1.49992659053829698010225,-0.999902123911128511304688,-4.79017695146261715054393e-9}, + {0,3.,0.000400000000000000019168694,-0.00356911664958785467088415,-0.000133315557925609925065371,-7.92292493952756185953978}, + {0,3.,0.065000000000000002220446,-0.250472012600853859503051,-0.0212071778140293644937542,-2.87462275628870399444374}, + {0,3.,4.41999999999999992894573,-2.28973397601639585934409,-0.595687331536388136290008,-0.113726692626070465736387}, + {0,3.,800.,-2.99438902306750149309853,-0.996264009962640099626401,-6.99624147447649277415792e-6}, + {0,3.,15324.,-2.99970638131217673536622,-0.999804266979839498923468,-1.91582075605741709616675e-8}, + {0,180.,0.000400000000000000019168694,-0.00520680203358650246376672,-2.22221728396159130295628e-6,-12.0170073061835394972106}, + {0,180.,0.065000000000000002220446,-0.5152345838836882774678,-0.000360980756948879583592839,-6.92704688665984518523008}, + {0,180.,4.41999999999999992894573,-16.4913562250745366389837,-0.023967031775295520717106,-2.75504310079668396055706}, + {0,180.,800.,-162.3526751973522458866,-0.816326530612244897959184,-0.0192673746089352053174335}, + {0,180.,15324.,-178.951041022560568926078,-0.988390092879256965944272,-0.0000679211892648339243088643}, + {0,1123.,0.000400000000000000019168694,-0.00593912212871338103184145,-3.56188653183026487941311e-7,-13.8478056779721050510975}, + {0,1123.,0.065000000000000002220446,-0.634217014783734223797677,-0.0000578773267798391030085681,-8.75724272015345987190877}, + {0,1123.,4.41999999999999992894573,-24.4936395934523254888155,-0.00392045555338737997305733,-4.54546787488649278326856}, + {0,1123.,800.,-701.624014336681947952778,-0.416016640665626625065003,-0.293046658586479060005975}, + {0,1123.,15324.,-1083.75715139725783359741,-0.931720070529579862588922,-0.00244293345030929573936621}, + {0,10586.,0.000400000000000000019168694,-0.00683653348042399192327693,-3.77857533426883319566749e-8,-16.0913337388457323318343}, + {0,10586.,0.065000000000000002220446,-0.780043017108597613744853,-6.14014744855619176912596e-6,-11.0006679418181806653922}, + {0,10586.,4.41999999999999992894573,-34.3945190758501995485746,-0.000417358329509122388817005,-6.7819827601055724937662}, + {0,10586.,800.,-2124.42246547447991619038,-0.0702617249253469172668189,-1.72578980676844681250479}, + {0,10586.,15324.,-8048.29915678058041924358,-0.591431879583172520262447,-0.116640647318788574768032}, + {6,0.0000255999999999999988415517,0.000400000000000000019168694,-26.48036259722249074196,220276.315789473695413011,-11595.463497838709066521}, + {6,0.0000255999999999999988415517,0.065000000000000002220446,-51.41938813644810311008,234281.729042100352628204,-74.6938075459730277737496}, + {6,0.0000255999999999999988415517,4.41999999999999992894573,-67.5203813751119080113018,234372.642547590685193838,-0.431255924758490035983718}, + {6,0.0000255999999999999988415517,800.,-69.9980790657427038228031,234373.99250003225060488,-0.0000233303844710378174910093}, + {6,0.0000255999999999999988415517,15324.,-70.0158073212983957030198,234373.999608459003690188,-6.38614276575077488493694e-8}, + {6,0.314000000000000001332268,0.000400000000000000019168694,-9.62519749441237577499515,0.0230385244971718457666188,2477.53054955581647437693}, + {6,0.314000000000000001332268,0.065000000000000002220446,-5.62316274126580026418416,3.10564173234962949352322,0.811756664687527711460638}, + {6,0.314000000000000001332268,4.41999999999999992894573,-11.7481186360489882881077,16.9071818179371882584098,-0.343526975436714230039528}, + {6,0.314000000000000001332268,800.,-13.8270107248858319921459,18.1011755433762947868859,-0.0000204650172704751119244161}, + {6,0.314000000000000001332268,15324.,-13.8425659569858167176518,18.107909210435378733015,-5.604917883004236869323e-8}, + {6,1.5,0.000400000000000000019168694,-9.61978396161923317848729,0.00079978672354038926785574,2491.05377011516723211824}, + {6,1.5,0.065000000000000002220446,-4.84100453988744407299957,0.124600638977635786827265,11.5208909282007767518774}, + {6,1.5,4.41999999999999992894573,-4.69471130087565244211116,2.23986486486486485574141,-0.126129611536089775574877}, + {6,1.5,800.,-5.6375883578559464150792,2.99438552713661883967561,-0.0000110478695320263035818071}, + {6,1.5,15324.,-5.64599569956598171509704,2.99970637173338553391406,-3.03295927479829163411156e-8}, + {6,3.,0.000400000000000000019168694,-9.61926132713561020240632,0.000133315557925609925065371,2492.36008977011386837543}, + {6,3.,0.065000000000000002220446,-4.75878244235486509222263,0.0212071778140293644937542,12.7453357216411121474773}, + {6,3.,4.41999999999999992894573,-2.88910819582874566312831,0.595687331536388136290008,0.00385024685205873591732729}, + {6,3.,800.,-2.98571724360242195248096,0.996264009962640099626401,-2.3069406647953774852549e-6}, + {6,3.,15324.,-2.98747963477610734281426,0.999804266979839498923468,-6.38245840446628643263247e-9}, + {6,180.,0.000400000000000000019168694,-9.62011239916672045724397,-2.14814337449620492619107e-6,2490.23240751308261564996}, + {6,180.,0.065000000000000002220446,-4.89709960487442545538356,-0.000348948065050583597473077,10.6171759350004771903562}, + {6,180.,4.41999999999999992894573,-11.8028833191445189961465,-0.0231681307161190033598691,-1.86137525666548784745946}, + {6,180.,800.,-138.973123190861697819951,-0.789115646258503401360544,-0.0179131542129975601896404}, + {6,180.,15324.,-154.441639359481734262519,-0.955443756449948400412797,-0.0000634392772194434652186986}, + {6,1123.,0.000400000000000000019168694,-9.62083352307562850466433,-3.54285597155334449715445e-7,2488.42959957075572856696}, + {6,1123.,0.065000000000000002220446,-5.01426303422777693881116,-0.0000575680979635621354056728,8.81495887967631239323725}, + {6,1123.,4.41999999999999992894573,-19.6831821663032128008537,-0.0038995092191751588868255,-3.62458748384772905786375}, + {6,1123.,800.,-671.304184750646975825767,-0.41379393376981739999787,-0.288690114015941777831476}, + {6,1123.,15324.,-1048.61720731875393149901,-0.926742047000481483982035,-0.00241626280594218362665218}, + {6,10586.,0.000400000000000000019168694,-9.62172902400956374565605,-3.77643368945439780938618e-8,2486.19084755337970635833}, + {6,10586.,0.065000000000000002220446,-5.15977860354001469077731,-6.13666729697000839952321e-6,6.57630939764217156062813}, + {6,10586.,4.41999999999999992894573,-29.5629973572818965727548,-0.00041712177651676883371282,-5.85634703346878398423394}, + {6,10586.,800.,-2091.3124520859014907288,-0.0702219015407302460497774,-1.71884010032985743252181}, + {6,10586.,15324.,-8002.42495594488889877697,-0.59109666408369216553719,-0.116480739324794834878369}, + {14,0.0000255999999999999988415517,0.000400000000000000019168694,-49.8145624383586412504773,513979.323308270702830867,-30391.5592215308054935068}, + {14,0.0000255999999999999988415517,0.065000000000000002220446,-114.928171090288373621844,546658.700573312689305051,-196.832392093265922277751}, + {14,0.0000255999999999999988415517,4.41999999999999992894573,-161.649312877052269679471,546870.832603322503241318,-1.65012869090202525000607}, + {14,0.0000255999999999999988415517,800.,-173.098986627797207395457,546873.982500032584746084,-0.000140607279245208991169695}, + {14,0.0000255999999999999988415517,15324.,-173.206165042629407730008,546873.999086402114500983,-3.87293689171005773693605e-7}, + {14,0.314000000000000001332268,0.000400000000000000019168694,-10.4823212403875677919956,0.0554529100014586495260517,2452.98201444586163091021}, + {14,0.314000000000000001332268,0.065000000000000002220446,-7.91753972042693522598031,7.47516931919399037182204,-19.4065385144529681904019}, + {14,0.314000000000000001332268,4.41999999999999992894573,-31.1096030160603968883541,40.6949859937193736433852,-1.4423583039713969676008}, + {14,0.314000000000000001332268,800.,-41.6146101076375483341583,43.5688864732057633639203,-0.000133818772002702504501651}, + {14,0.314000000000000001332268,15324.,-41.7166402819016445012403,43.5850941705977125174086,-3.68785202783475625902428e-7}, + {14,1.5,0.000400000000000000019168694,-10.4688561593594869703521,0.00222162978761219241071039,2486.61861613580826696107}, + {14,1.5,0.065000000000000002220446,-5.96960149272681241527387,0.346112886048988296742402,7.29895408232336579179109}, + {14,1.5,4.41999999999999992894573,-13.3341039738636535426733,6.22184684684684682150392,-0.886409460834882622189145}, + {14,1.5,800.,-20.9264151022685229463224,8.31773757537949677687669,-0.000109610174761583369512834}, + {14,1.5,15324.,-21.0100699378693506067827,8.3325176992594042608724,-3.02665838448691571323444e-7}, + {14,3.,0.000400000000000000019168694,-10.4672670714982932266983,0.000488823712393903058573027,2490.59053612251196637491}, + {14,3.,0.065000000000000002220446,-5.71949591388313641569191,0.0777596519847743364770988,11.0251057695297603161259}, + {14,3.,4.41999999999999992894573,-7.79006429060418244080376,2.18418688230008983306336,-0.483245366998347713019428}, + {14,3.,800.,-12.7443244787126682405839,3.6529680365296803652968,-0.0000822242550653573074282639}, + {14,3.,15324.,-12.8071593989944707311042,3.66594897892607816271938,-2.27631817501670696455485e-7}, + {14,180.,0.000400000000000000019168694,-10.467069325725552290929,-2.04937816187568975717079e-6,2491.08472067831368019905}, + {14,180.,0.065000000000000002220446,-5.68921919805166470578108,-0.000332904475852855615980062,11.4626317745298003372252}, + {14,180.,4.41999999999999992894573,-9.65337657959679917832682,-0.0221029293038836468835533,-1.31368299764513841447103}, + {14,180.,800.,-117.570556789937986073345,-0.752834467120181405895692,-0.0161936967338941701029113}, + {14,180.,15324.,-131.5984192349764106228,-0.911515307877536979704162,-0.0000577016781835615346878727}, + {14,1123.,0.000400000000000000019168694,-10.4677755213861685634857,-3.51748189118411732080956e-7,2489.31923330860236441056}, + {14,1123.,0.065000000000000002220446,-5.80395729200942357200564,-0.0000571557928751928452684791,9.6977197567649020595191}, + {14,1123.,4.41999999999999992894573,-17.3710293984633662562012,-0.00387158077355886410518306,-3.04061182895062280846571}, + {14,1123.,800.,-640.647914910330698665346,-0.41083032457540509990836,-0.282967557637372205015805}, + {14,1123.,15324.,-1011.59993064034851794618,-0.920104682295016979172854,-0.00238094023047733949128954}, + {14,10586.,0.000400000000000000019168694,-10.4686684750964033112778,-3.77357816303515062767776e-8,2487.08684934922314896474}, + {14,10586.,0.065000000000000002220446,-5.94905895063816047333042,-6.13202709485509724005287e-6,7.46543792757153450807576}, + {14,10586.,4.41999999999999992894573,-27.2227588675497963109583,-0.000416806372526964093573906,-5.26603093110764468933264}, + {14,10586.,800.,-2056.93593717552727578896,-0.0701688036945746844270555,-1.70965999479388506262815}, + {14,10586.,15324.,-7951.09533692356666073317,-0.590649710084385025903513,-0.116267766949827820373742}, + {1525,0.0000255999999999999988415517,0.000400000000000000019168694,-4301.78472746701591561319,5.59871348684210554788785e7,-3.5806687876344078642494e6}, + {1525,0.0000255999999999999988415517,0.065000000000000002220446,-11965.4671281234822402701,5.95468591985310427791447e7,-23429.1126891147666042428}, + {1525,0.0000255999999999999988415517,4.41999999999999992894573,-18367.3428918005844581777,5.95699664793796696369591e7,-339.05708253439450821354}, + {1525,0.0000255999999999999988415517,800.,-24826.2281356385314540934,5.95703095937500956956661e7,-0.838976287617641050521021}, + {1525,0.0000255999999999999988415517,15324.,-25707.7170288016101268158,5.95703114004829071688901e7,-0.00464306291332368931093165}, + {1525,0.314000000000000001332268,0.000400000000000000019168694,-17.0947387955188070694514,6.17771997212362870958894,-2348.27115497920553780678}, + {1525,0.314000000000000001332268,0.065000000000000002220446,-296.585568286099074874008,832.769692284422651260512,-4001.49218112616936417653}, + {1525,0.314000000000000001332268,4.41999999999999992894573,-4115.10160678526157468258,4533.61649969457963823061,-316.176485619091868439549}, + {1525,0.314000000000000001332268,800.,-10469.9426767525578568447,4853.78278834474664085128,-0.838228516034976412378816}, + {1525,0.314000000000000001332268,15324.,-11350.864477542964439615,4855.58840352125850604476,-0.00464102415296814454779679}, + {1525,1.5,0.000400000000000000019168694,-15.5605375416167689753134,0.270772238514174011017382,1484.28030775203761395908}, + {1525,1.5,0.065000000000000002220446,-74.4509275868752818011125,42.1842385516506936069639,-953.474508334327861816359}, + {1525,1.5,4.41999999999999992894573,-2072.19103657901873983403,758.318693693693690604898,-251.676626135276650941522}, + {1525,1.5,800.,-8088.5487996808837996978,1013.76585568725306716573,-0.835410572412918435298525}, + {1525,1.5,15324.,-8967.33164084000397251235,1015.56725718573619131513,-0.00463332752548632640449661}, + {1525,3.,0.000400000000000000019168694,-15.3575220720668965063351,0.0676354263875927686498315,1991.71749039935661708657}, + {1525,3.,0.065000000000000002220446,-42.4918294753981563747316,10.7591082109842309198313,-477.238467087057049352225}, + {1525,3.,4.41999999999999992894573,-1360.54978818586118224694,302.212039532794247811131,-199.675789571126135171012}, + {1525,3.,800.,-7035.84649923785032031894,505.437941054379410543794,-0.831861613850395752926704}, + {1525,3.,15324.,-7911.93122400832367818281,507.234031447771905787173,-0.00462360345575814251935502}, + {1525,180.,0.000400000000000000019168694,-15.1592288635917619446729,0.0000166049013718241127915344,2487.41676922898488796714}, + {1525,180.,0.065000000000000002220446,-10.6183839860155018633925,0.00269732843386801688851316,7.79296281407547718024725}, + {1525,180.,4.41999999999999992894573,-30.7569326420675970103087,0.179086987432069307580598,-5.06066771330890867384431}, + {1525,180.,800.,-1255.10606104316181434609,6.09977324263038548752834,-0.50811617220616562857323}, + {1525,180.,15324.,-1861.51726736161923065929,7.38547041623667010663915,-0.00355560001152251827139362}, + {1525,1123.,0.000400000000000000019168694,-15.1571154863562692398625,1.27504753855366561133043e-7,2492.70020501203960042957}, + {1525,1123.,0.065000000000000002220446,-10.2750368571307051553926,0.0000207183306905568293939843,13.074039765317042756658}, + {1525,1123.,4.41999999999999992894573,-7.75481686725872855763217,0.00140340439221881277753254,0.0654298516080506315262451}, + {1525,1123.,800.,-30.3901820482837344036952,0.148921362019218079497891,-0.0188047284729684005572389}, + {1525,1123.,15324.,-64.3938471491118556432688,0.333527576449591366661395,-0.000290976140796059790385352}, + {1525,10586.,0.000400000000000000019168694,-15.1575273331900733345777,-3.23424061059983918249983e-8,2491.67058800680726231035}, + {1525,10586.,0.065000000000000002220446,-10.341961135413218891829,-5.25560892040125199509261e-6,12.0444483664247286854037}, + {1525,10586.,4.41999999999999992894573,-12.3018556139457377868195,-0.00035723444395259379983666,-0.962437235779729779911197}, + {1525,10586.,800.,-744.016916706287313438782,-0.0601399480019429829354474,-0.792452568525027960065769}, + {1525,10586.,15324.,-4300.64559341391477270059,-0.506231273465249027592861,-0.080624196979174112177973}, + {10233,0.0000255999999999999988415517,0.000400000000000000019168694,-28781.0708528951573397343,3.75682858552631598053215e8,-2.40411931995216795644478e7}, + {10233,0.0000255999999999999988415517,0.065000000000000002220446,-80237.4790550341092525423,3.99569192710255671251893e8,-157343.697098361009501263}, + {10233,0.0000255999999999999988415517,4.41999999999999992894573,-123371.163364167740152869,3.99724246355043753581641e8,-2307.27997929395105479548}, + {10233,0.0000255999999999999988415517,800.,-173733.65594636811650329,3.99726548708750459408368e8,-10.1666354466535988554224}, + {10233,0.0000255999999999999988415517,15324.,-189611.393943800924397874,3.99726560832223983286441e8,-0.156271946909903467303064}, + {10233,0.314000000000000001332268,0.000400000000000000019168694,-30.0835346409569131744303,41.4607785935398146017316,-30043.5682705897920756525}, + {10233,0.314000000000000001332268,0.065000000000000002220446,-1936.716591758487041006,5589.00047056450946728878,-26975.8416131385263827685}, + {10233,0.314000000000000001332268,4.41999999999999992894573,-27734.5558869327518549392,30426.6413450334884297763,-2153.73427754141249439361}, + {10233,0.314000000000000001332268,800.,-77398.8345343110590054878,32575.3861354641231869532,-10.1616173371352784115513}, + {10233,0.314000000000000001332268,15324.,-93272.7669155443506617326,32587.5042326579588303572,-0.156258265294963792040359}, + {10233,1.5,0.000400000000000000019168694,-19.7852231333246170201452,1.81844841375633173201467,-4317.60144720493538394871}, + {10233,1.5,0.065000000000000002220446,-445.630392408020282583574,283.300319488817900649591,-6515.78789458981692128489}, + {10233,1.5,4.41999999999999992894573,-14020.6484936315299566843,5092.70608108108106033739,-1720.72113290933113059977}, + {10233,1.5,800.,-61412.5266404072312643186,6808.23456019962570180911,-10.1426989007295637839166}, + {10233,1.5,15324.,-77272.0989845637286907938,6820.33238719780757560928,-0.156206593508853883167535}, + {10233,3.,0.000400000000000000019168694,-18.4213731622889640481056,0.454606052526329844472915,-908.658303440053134799723}, + {10233,3.,0.065000000000000002220446,-230.930124889414052187924,72.3164763458401329237019,-3316.44389947819074719284}, + {10233,3.,4.41999999999999992894573,-9239.71902985399613363504,2031.29380053908354474893,-1371.35925605961202095728}, + {10233,3.,800.,-54340.1804040886113152815,3397.26027397260273972603,-10.1188548696496798960218}, + {10233,3.,15324.,-70181.625182690519906018,3409.33255040125269132903,-0.156141261363057784911755}, + {10233,180.,0.000400000000000000019168694,-17.0814417743218085107483,0.000124110835309254874270108,2440.94300115825922532467}, + {10233,180.,0.065000000000000002220446,-15.5422428149329861379767,0.02016077527559492474366,-38.6634853761835068674979}, + {10233,180.,4.41999999999999992894573,-235.497379149446594201917,1.33855872465025483205037,-50.3775345819770169845521}, + {10233,180.,800.,-14640.5024630709594885282,45.5918367346938775510204,-7.83648996527639800152069}, + {10233,180.,15324.,-28577.6446971680821285066,55.2015866873065015479876,-0.148587051440887372280679}, + {10233,1123.,0.000400000000000000019168694,-17.0630789988207188668825,2.88947340204574470627368e-6,2486.84988023336329186324}, + {10233,1123.,0.065000000000000002220446,-12.5589181079456256044661,0.000469512419380529143729346,7.22412495831966508988538}, + {10233,1123.,4.41999999999999992894573,-35.4550615786577835917049,0.031803517445555682595327,-5.7569606052102630173202}, + {10233,1123.,800.,-3343.1303902972739556477,3.37480997013700672692981,-2.98980536947426087305154}, + {10233,1123.,15324.,-11352.0607180353268830661,7.55829905834770485145599,-0.113119180727235553840235}, + {10233,10586.,0.000400000000000000019168694,-17.0607181926565361138193,-1.26000103249281892884057e-9,2492.75189435765511506763}, + {10233,10586.,0.065000000000000002220446,-12.175300607237463417773,-2.04748918320454911628704e-7,13.1257236766090675675961}, + {10233,10586.,4.41999999999999992894573,-9.43079204562662170966662,-0.0000139172010501341586295487,0.116749372001926601548071}, + {10233,10586.,800.,-7.27036619721226178082317,-0.002342942461614156602606,0.0000890483066241868231597611}, + {10233,10586.,15324.,-9.3278240351663417156768,-0.0197218452194275363359762,-0.0000805948075011592832299515}, }; } // namespace neg_binomial_2_test_internal From 360478cc6cf052836c2d30631ab1bc8ea96467e6 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Fri, 13 Mar 2020 17:07:58 +0100 Subject: [PATCH 75/82] Reducing the scope of neg_binomial_2_log_lpmf tests --- test/unit/math/prim/prob/neg_binomial_2_log_test.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/unit/math/prim/prob/neg_binomial_2_log_test.cpp b/test/unit/math/prim/prob/neg_binomial_2_log_test.cpp index 00645c9ceee..a9887050958 100644 --- a/test/unit/math/prim/prob/neg_binomial_2_log_test.cpp +++ b/test/unit/math/prim/prob/neg_binomial_2_log_test.cpp @@ -212,7 +212,10 @@ TEST(ProbNegBinomial2, log_matches_lpmf) { TEST(ProbDistributionsNegBinomial2Log, neg_binomial_2_log_grid_test) { std::vector mu_log_to_test = {-101, -27, -3, -1, -0.132, 0, 4, 10, 87}; - std::vector phi_to_test = {2e-5, 0.36, 1, 2.3e5, 1.8e10, 6e16}; + // TODO(martinmodrak) Reducing the span of the test, should be fixed + // along with #1495 + // std::vector phi_to_test = {2e-5, 0.36, 1, 10, 2.3e5, 1.8e10, 6e16}; + std::vector phi_to_test = {0.36, 1, 10}; std::vector n_to_test = {0, 1, 10, 39, 101, 3048, 150054}; // TODO(martinmdorak) Only weak tolerance for this quick fix From 1e121d347764c7e37953b331df7ce2f878ac4852 Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Fri, 13 Mar 2020 12:10:58 -0400 Subject: [PATCH 76/82] [Jenkins] auto-formatting by clang-format version 6.0.0 (tags/google/stable/2017-11-14) --- stan/math/prim/prob/neg_binomial_2_lpmf.hpp | 2 +- .../math/rev/prob/neg_binomial_2_test.cpp | 557 ++++++++++++------ 2 files changed, 382 insertions(+), 177 deletions(-) diff --git a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp index b69387ae5e5..8a1ca50a877 100644 --- a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp @@ -50,7 +50,7 @@ return_type_t neg_binomial_2_lpmf( size_t len_ep = max_size(mu, phi); size_t len_np = max_size(n, phi); - + size_t len_mu = size(mu); VectorBuilder mu_val(len_mu); for (size_t i = 0; i < len_mu; ++i) { diff --git a/test/unit/math/rev/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/prob/neg_binomial_2_test.cpp index cc28fc42fb8..e2175a673ef 100644 --- a/test/unit/math/rev/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/prob/neg_binomial_2_test.cpp @@ -21,7 +21,7 @@ struct TestValue { // but is also presented below for convenience: // // toCString[x_] := ToString[CForm[N[x, 24]]]; -// nb2[n_,mu_,phi_]:= LogGamma[n + phi] - LogGamma[n + 1] - LogGamma[phi] + +// nb2[n_,mu_,phi_]:= LogGamma[n + phi] - LogGamma[n + 1] - LogGamma[phi] + // n * (Log[mu] - Log[mu + phi]) + phi * (Log[phi] - Log[mu + phi]) // nb2dmu[n_,mu_,phi_]= D[nb2[n, mu, phi],mu]; // nb2dphi[n_,mu_,phi_]= D[nb2[n, mu, phi],phi]; @@ -48,181 +48,386 @@ struct TestValue { // out // std::vector testValues = { - {0,0.0000255999999999999988415517,0.000400000000000000019168694,-0.0000248141563677810554722069,-0.93984962406015038120717,-0.00188501497960301691484332}, - {0,0.0000255999999999999988415517,0.065000000000000002220446,-0.0000255949600924861392310515,-0.99960630889987943213184,-7.75166869111834814851761e-8}, - {0,0.0000255999999999999988415517,4.41999999999999992894573,-0.0000255999258645396469364285,-0.99999420817834177250031,-1.67726638232395618551723e-11}, - {0,0.0000255999999999999988415517,800.,-0.0000255999995904000075796848,-0.999999968000001023999969,-5.11999978154667406760709e-16}, - {0,0.0000255999999999999988415517,15324.,-0.0000255999999786165480692301,-0.999999998329417909342659,-1.39542226236663819726744e-18}, - {0,0.314000000000000001332268,0.000400000000000000019168694,-0.00266678271697168272833231,-0.00127226463104325705295582,-5.66822905706024975839158}, - {0,0.314000000000000001332268,0.065000000000000002220446,-0.11460468078714130271943,-0.171503957783641165200901,-0.934652892970430377577097}, - {0,0.314000000000000001332268,4.41999999999999992894573,-0.303348202309659617395206,-0.93367131389945078032175,-0.00230212890163621522485358}, - {0,0.314000000000000001332268,800.,-0.313938393619808992331269,-0.999607653995806645889824,-7.69878314071302376498577e-8}, - {0,0.314000000000000001332268,15324.,-0.313996782998787813729905,-0.999979509686371605280254,-2.09929343978617832505718e-10}, - {0,1.5,0.000400000000000000019168694,-0.00329191110003275507221173,-0.000266595574513463089285247,-7.23004434565640074923338}, - {0,1.5,0.065000000000000002220446,-0.206781499150110076176223,-0.0415335463258785956090882,-2.22278737940449504349247}, - {0,1.5,4.41999999999999992894573,-1.29150964740387939616191,-0.74662162162162161858047,-0.0388183744279291789704566}, - {0,1.5,800.,-1.49859550534427827334156,-0.998128509045539613225203,-1.75342721996106687969703e-6}, - {0,1.5,15324.,-1.49992659053829698010225,-0.999902123911128511304688,-4.79017695146261715054393e-9}, - {0,3.,0.000400000000000000019168694,-0.00356911664958785467088415,-0.000133315557925609925065371,-7.92292493952756185953978}, - {0,3.,0.065000000000000002220446,-0.250472012600853859503051,-0.0212071778140293644937542,-2.87462275628870399444374}, - {0,3.,4.41999999999999992894573,-2.28973397601639585934409,-0.595687331536388136290008,-0.113726692626070465736387}, - {0,3.,800.,-2.99438902306750149309853,-0.996264009962640099626401,-6.99624147447649277415792e-6}, - {0,3.,15324.,-2.99970638131217673536622,-0.999804266979839498923468,-1.91582075605741709616675e-8}, - {0,180.,0.000400000000000000019168694,-0.00520680203358650246376672,-2.22221728396159130295628e-6,-12.0170073061835394972106}, - {0,180.,0.065000000000000002220446,-0.5152345838836882774678,-0.000360980756948879583592839,-6.92704688665984518523008}, - {0,180.,4.41999999999999992894573,-16.4913562250745366389837,-0.023967031775295520717106,-2.75504310079668396055706}, - {0,180.,800.,-162.3526751973522458866,-0.816326530612244897959184,-0.0192673746089352053174335}, - {0,180.,15324.,-178.951041022560568926078,-0.988390092879256965944272,-0.0000679211892648339243088643}, - {0,1123.,0.000400000000000000019168694,-0.00593912212871338103184145,-3.56188653183026487941311e-7,-13.8478056779721050510975}, - {0,1123.,0.065000000000000002220446,-0.634217014783734223797677,-0.0000578773267798391030085681,-8.75724272015345987190877}, - {0,1123.,4.41999999999999992894573,-24.4936395934523254888155,-0.00392045555338737997305733,-4.54546787488649278326856}, - {0,1123.,800.,-701.624014336681947952778,-0.416016640665626625065003,-0.293046658586479060005975}, - {0,1123.,15324.,-1083.75715139725783359741,-0.931720070529579862588922,-0.00244293345030929573936621}, - {0,10586.,0.000400000000000000019168694,-0.00683653348042399192327693,-3.77857533426883319566749e-8,-16.0913337388457323318343}, - {0,10586.,0.065000000000000002220446,-0.780043017108597613744853,-6.14014744855619176912596e-6,-11.0006679418181806653922}, - {0,10586.,4.41999999999999992894573,-34.3945190758501995485746,-0.000417358329509122388817005,-6.7819827601055724937662}, - {0,10586.,800.,-2124.42246547447991619038,-0.0702617249253469172668189,-1.72578980676844681250479}, - {0,10586.,15324.,-8048.29915678058041924358,-0.591431879583172520262447,-0.116640647318788574768032}, - {6,0.0000255999999999999988415517,0.000400000000000000019168694,-26.48036259722249074196,220276.315789473695413011,-11595.463497838709066521}, - {6,0.0000255999999999999988415517,0.065000000000000002220446,-51.41938813644810311008,234281.729042100352628204,-74.6938075459730277737496}, - {6,0.0000255999999999999988415517,4.41999999999999992894573,-67.5203813751119080113018,234372.642547590685193838,-0.431255924758490035983718}, - {6,0.0000255999999999999988415517,800.,-69.9980790657427038228031,234373.99250003225060488,-0.0000233303844710378174910093}, - {6,0.0000255999999999999988415517,15324.,-70.0158073212983957030198,234373.999608459003690188,-6.38614276575077488493694e-8}, - {6,0.314000000000000001332268,0.000400000000000000019168694,-9.62519749441237577499515,0.0230385244971718457666188,2477.53054955581647437693}, - {6,0.314000000000000001332268,0.065000000000000002220446,-5.62316274126580026418416,3.10564173234962949352322,0.811756664687527711460638}, - {6,0.314000000000000001332268,4.41999999999999992894573,-11.7481186360489882881077,16.9071818179371882584098,-0.343526975436714230039528}, - {6,0.314000000000000001332268,800.,-13.8270107248858319921459,18.1011755433762947868859,-0.0000204650172704751119244161}, - {6,0.314000000000000001332268,15324.,-13.8425659569858167176518,18.107909210435378733015,-5.604917883004236869323e-8}, - {6,1.5,0.000400000000000000019168694,-9.61978396161923317848729,0.00079978672354038926785574,2491.05377011516723211824}, - {6,1.5,0.065000000000000002220446,-4.84100453988744407299957,0.124600638977635786827265,11.5208909282007767518774}, - {6,1.5,4.41999999999999992894573,-4.69471130087565244211116,2.23986486486486485574141,-0.126129611536089775574877}, - {6,1.5,800.,-5.6375883578559464150792,2.99438552713661883967561,-0.0000110478695320263035818071}, - {6,1.5,15324.,-5.64599569956598171509704,2.99970637173338553391406,-3.03295927479829163411156e-8}, - {6,3.,0.000400000000000000019168694,-9.61926132713561020240632,0.000133315557925609925065371,2492.36008977011386837543}, - {6,3.,0.065000000000000002220446,-4.75878244235486509222263,0.0212071778140293644937542,12.7453357216411121474773}, - {6,3.,4.41999999999999992894573,-2.88910819582874566312831,0.595687331536388136290008,0.00385024685205873591732729}, - {6,3.,800.,-2.98571724360242195248096,0.996264009962640099626401,-2.3069406647953774852549e-6}, - {6,3.,15324.,-2.98747963477610734281426,0.999804266979839498923468,-6.38245840446628643263247e-9}, - {6,180.,0.000400000000000000019168694,-9.62011239916672045724397,-2.14814337449620492619107e-6,2490.23240751308261564996}, - {6,180.,0.065000000000000002220446,-4.89709960487442545538356,-0.000348948065050583597473077,10.6171759350004771903562}, - {6,180.,4.41999999999999992894573,-11.8028833191445189961465,-0.0231681307161190033598691,-1.86137525666548784745946}, - {6,180.,800.,-138.973123190861697819951,-0.789115646258503401360544,-0.0179131542129975601896404}, - {6,180.,15324.,-154.441639359481734262519,-0.955443756449948400412797,-0.0000634392772194434652186986}, - {6,1123.,0.000400000000000000019168694,-9.62083352307562850466433,-3.54285597155334449715445e-7,2488.42959957075572856696}, - {6,1123.,0.065000000000000002220446,-5.01426303422777693881116,-0.0000575680979635621354056728,8.81495887967631239323725}, - {6,1123.,4.41999999999999992894573,-19.6831821663032128008537,-0.0038995092191751588868255,-3.62458748384772905786375}, - {6,1123.,800.,-671.304184750646975825767,-0.41379393376981739999787,-0.288690114015941777831476}, - {6,1123.,15324.,-1048.61720731875393149901,-0.926742047000481483982035,-0.00241626280594218362665218}, - {6,10586.,0.000400000000000000019168694,-9.62172902400956374565605,-3.77643368945439780938618e-8,2486.19084755337970635833}, - {6,10586.,0.065000000000000002220446,-5.15977860354001469077731,-6.13666729697000839952321e-6,6.57630939764217156062813}, - {6,10586.,4.41999999999999992894573,-29.5629973572818965727548,-0.00041712177651676883371282,-5.85634703346878398423394}, - {6,10586.,800.,-2091.3124520859014907288,-0.0702219015407302460497774,-1.71884010032985743252181}, - {6,10586.,15324.,-8002.42495594488889877697,-0.59109666408369216553719,-0.116480739324794834878369}, - {14,0.0000255999999999999988415517,0.000400000000000000019168694,-49.8145624383586412504773,513979.323308270702830867,-30391.5592215308054935068}, - {14,0.0000255999999999999988415517,0.065000000000000002220446,-114.928171090288373621844,546658.700573312689305051,-196.832392093265922277751}, - {14,0.0000255999999999999988415517,4.41999999999999992894573,-161.649312877052269679471,546870.832603322503241318,-1.65012869090202525000607}, - {14,0.0000255999999999999988415517,800.,-173.098986627797207395457,546873.982500032584746084,-0.000140607279245208991169695}, - {14,0.0000255999999999999988415517,15324.,-173.206165042629407730008,546873.999086402114500983,-3.87293689171005773693605e-7}, - {14,0.314000000000000001332268,0.000400000000000000019168694,-10.4823212403875677919956,0.0554529100014586495260517,2452.98201444586163091021}, - {14,0.314000000000000001332268,0.065000000000000002220446,-7.91753972042693522598031,7.47516931919399037182204,-19.4065385144529681904019}, - {14,0.314000000000000001332268,4.41999999999999992894573,-31.1096030160603968883541,40.6949859937193736433852,-1.4423583039713969676008}, - {14,0.314000000000000001332268,800.,-41.6146101076375483341583,43.5688864732057633639203,-0.000133818772002702504501651}, - {14,0.314000000000000001332268,15324.,-41.7166402819016445012403,43.5850941705977125174086,-3.68785202783475625902428e-7}, - {14,1.5,0.000400000000000000019168694,-10.4688561593594869703521,0.00222162978761219241071039,2486.61861613580826696107}, - {14,1.5,0.065000000000000002220446,-5.96960149272681241527387,0.346112886048988296742402,7.29895408232336579179109}, - {14,1.5,4.41999999999999992894573,-13.3341039738636535426733,6.22184684684684682150392,-0.886409460834882622189145}, - {14,1.5,800.,-20.9264151022685229463224,8.31773757537949677687669,-0.000109610174761583369512834}, - {14,1.5,15324.,-21.0100699378693506067827,8.3325176992594042608724,-3.02665838448691571323444e-7}, - {14,3.,0.000400000000000000019168694,-10.4672670714982932266983,0.000488823712393903058573027,2490.59053612251196637491}, - {14,3.,0.065000000000000002220446,-5.71949591388313641569191,0.0777596519847743364770988,11.0251057695297603161259}, - {14,3.,4.41999999999999992894573,-7.79006429060418244080376,2.18418688230008983306336,-0.483245366998347713019428}, - {14,3.,800.,-12.7443244787126682405839,3.6529680365296803652968,-0.0000822242550653573074282639}, - {14,3.,15324.,-12.8071593989944707311042,3.66594897892607816271938,-2.27631817501670696455485e-7}, - {14,180.,0.000400000000000000019168694,-10.467069325725552290929,-2.04937816187568975717079e-6,2491.08472067831368019905}, - {14,180.,0.065000000000000002220446,-5.68921919805166470578108,-0.000332904475852855615980062,11.4626317745298003372252}, - {14,180.,4.41999999999999992894573,-9.65337657959679917832682,-0.0221029293038836468835533,-1.31368299764513841447103}, - {14,180.,800.,-117.570556789937986073345,-0.752834467120181405895692,-0.0161936967338941701029113}, - {14,180.,15324.,-131.5984192349764106228,-0.911515307877536979704162,-0.0000577016781835615346878727}, - {14,1123.,0.000400000000000000019168694,-10.4677755213861685634857,-3.51748189118411732080956e-7,2489.31923330860236441056}, - {14,1123.,0.065000000000000002220446,-5.80395729200942357200564,-0.0000571557928751928452684791,9.6977197567649020595191}, - {14,1123.,4.41999999999999992894573,-17.3710293984633662562012,-0.00387158077355886410518306,-3.04061182895062280846571}, - {14,1123.,800.,-640.647914910330698665346,-0.41083032457540509990836,-0.282967557637372205015805}, - {14,1123.,15324.,-1011.59993064034851794618,-0.920104682295016979172854,-0.00238094023047733949128954}, - {14,10586.,0.000400000000000000019168694,-10.4686684750964033112778,-3.77357816303515062767776e-8,2487.08684934922314896474}, - {14,10586.,0.065000000000000002220446,-5.94905895063816047333042,-6.13202709485509724005287e-6,7.46543792757153450807576}, - {14,10586.,4.41999999999999992894573,-27.2227588675497963109583,-0.000416806372526964093573906,-5.26603093110764468933264}, - {14,10586.,800.,-2056.93593717552727578896,-0.0701688036945746844270555,-1.70965999479388506262815}, - {14,10586.,15324.,-7951.09533692356666073317,-0.590649710084385025903513,-0.116267766949827820373742}, - {1525,0.0000255999999999999988415517,0.000400000000000000019168694,-4301.78472746701591561319,5.59871348684210554788785e7,-3.5806687876344078642494e6}, - {1525,0.0000255999999999999988415517,0.065000000000000002220446,-11965.4671281234822402701,5.95468591985310427791447e7,-23429.1126891147666042428}, - {1525,0.0000255999999999999988415517,4.41999999999999992894573,-18367.3428918005844581777,5.95699664793796696369591e7,-339.05708253439450821354}, - {1525,0.0000255999999999999988415517,800.,-24826.2281356385314540934,5.95703095937500956956661e7,-0.838976287617641050521021}, - {1525,0.0000255999999999999988415517,15324.,-25707.7170288016101268158,5.95703114004829071688901e7,-0.00464306291332368931093165}, - {1525,0.314000000000000001332268,0.000400000000000000019168694,-17.0947387955188070694514,6.17771997212362870958894,-2348.27115497920553780678}, - {1525,0.314000000000000001332268,0.065000000000000002220446,-296.585568286099074874008,832.769692284422651260512,-4001.49218112616936417653}, - {1525,0.314000000000000001332268,4.41999999999999992894573,-4115.10160678526157468258,4533.61649969457963823061,-316.176485619091868439549}, - {1525,0.314000000000000001332268,800.,-10469.9426767525578568447,4853.78278834474664085128,-0.838228516034976412378816}, - {1525,0.314000000000000001332268,15324.,-11350.864477542964439615,4855.58840352125850604476,-0.00464102415296814454779679}, - {1525,1.5,0.000400000000000000019168694,-15.5605375416167689753134,0.270772238514174011017382,1484.28030775203761395908}, - {1525,1.5,0.065000000000000002220446,-74.4509275868752818011125,42.1842385516506936069639,-953.474508334327861816359}, - {1525,1.5,4.41999999999999992894573,-2072.19103657901873983403,758.318693693693690604898,-251.676626135276650941522}, - {1525,1.5,800.,-8088.5487996808837996978,1013.76585568725306716573,-0.835410572412918435298525}, - {1525,1.5,15324.,-8967.33164084000397251235,1015.56725718573619131513,-0.00463332752548632640449661}, - {1525,3.,0.000400000000000000019168694,-15.3575220720668965063351,0.0676354263875927686498315,1991.71749039935661708657}, - {1525,3.,0.065000000000000002220446,-42.4918294753981563747316,10.7591082109842309198313,-477.238467087057049352225}, - {1525,3.,4.41999999999999992894573,-1360.54978818586118224694,302.212039532794247811131,-199.675789571126135171012}, - {1525,3.,800.,-7035.84649923785032031894,505.437941054379410543794,-0.831861613850395752926704}, - {1525,3.,15324.,-7911.93122400832367818281,507.234031447771905787173,-0.00462360345575814251935502}, - {1525,180.,0.000400000000000000019168694,-15.1592288635917619446729,0.0000166049013718241127915344,2487.41676922898488796714}, - {1525,180.,0.065000000000000002220446,-10.6183839860155018633925,0.00269732843386801688851316,7.79296281407547718024725}, - {1525,180.,4.41999999999999992894573,-30.7569326420675970103087,0.179086987432069307580598,-5.06066771330890867384431}, - {1525,180.,800.,-1255.10606104316181434609,6.09977324263038548752834,-0.50811617220616562857323}, - {1525,180.,15324.,-1861.51726736161923065929,7.38547041623667010663915,-0.00355560001152251827139362}, - {1525,1123.,0.000400000000000000019168694,-15.1571154863562692398625,1.27504753855366561133043e-7,2492.70020501203960042957}, - {1525,1123.,0.065000000000000002220446,-10.2750368571307051553926,0.0000207183306905568293939843,13.074039765317042756658}, - {1525,1123.,4.41999999999999992894573,-7.75481686725872855763217,0.00140340439221881277753254,0.0654298516080506315262451}, - {1525,1123.,800.,-30.3901820482837344036952,0.148921362019218079497891,-0.0188047284729684005572389}, - {1525,1123.,15324.,-64.3938471491118556432688,0.333527576449591366661395,-0.000290976140796059790385352}, - {1525,10586.,0.000400000000000000019168694,-15.1575273331900733345777,-3.23424061059983918249983e-8,2491.67058800680726231035}, - {1525,10586.,0.065000000000000002220446,-10.341961135413218891829,-5.25560892040125199509261e-6,12.0444483664247286854037}, - {1525,10586.,4.41999999999999992894573,-12.3018556139457377868195,-0.00035723444395259379983666,-0.962437235779729779911197}, - {1525,10586.,800.,-744.016916706287313438782,-0.0601399480019429829354474,-0.792452568525027960065769}, - {1525,10586.,15324.,-4300.64559341391477270059,-0.506231273465249027592861,-0.080624196979174112177973}, - {10233,0.0000255999999999999988415517,0.000400000000000000019168694,-28781.0708528951573397343,3.75682858552631598053215e8,-2.40411931995216795644478e7}, - {10233,0.0000255999999999999988415517,0.065000000000000002220446,-80237.4790550341092525423,3.99569192710255671251893e8,-157343.697098361009501263}, - {10233,0.0000255999999999999988415517,4.41999999999999992894573,-123371.163364167740152869,3.99724246355043753581641e8,-2307.27997929395105479548}, - {10233,0.0000255999999999999988415517,800.,-173733.65594636811650329,3.99726548708750459408368e8,-10.1666354466535988554224}, - {10233,0.0000255999999999999988415517,15324.,-189611.393943800924397874,3.99726560832223983286441e8,-0.156271946909903467303064}, - {10233,0.314000000000000001332268,0.000400000000000000019168694,-30.0835346409569131744303,41.4607785935398146017316,-30043.5682705897920756525}, - {10233,0.314000000000000001332268,0.065000000000000002220446,-1936.716591758487041006,5589.00047056450946728878,-26975.8416131385263827685}, - {10233,0.314000000000000001332268,4.41999999999999992894573,-27734.5558869327518549392,30426.6413450334884297763,-2153.73427754141249439361}, - {10233,0.314000000000000001332268,800.,-77398.8345343110590054878,32575.3861354641231869532,-10.1616173371352784115513}, - {10233,0.314000000000000001332268,15324.,-93272.7669155443506617326,32587.5042326579588303572,-0.156258265294963792040359}, - {10233,1.5,0.000400000000000000019168694,-19.7852231333246170201452,1.81844841375633173201467,-4317.60144720493538394871}, - {10233,1.5,0.065000000000000002220446,-445.630392408020282583574,283.300319488817900649591,-6515.78789458981692128489}, - {10233,1.5,4.41999999999999992894573,-14020.6484936315299566843,5092.70608108108106033739,-1720.72113290933113059977}, - {10233,1.5,800.,-61412.5266404072312643186,6808.23456019962570180911,-10.1426989007295637839166}, - {10233,1.5,15324.,-77272.0989845637286907938,6820.33238719780757560928,-0.156206593508853883167535}, - {10233,3.,0.000400000000000000019168694,-18.4213731622889640481056,0.454606052526329844472915,-908.658303440053134799723}, - {10233,3.,0.065000000000000002220446,-230.930124889414052187924,72.3164763458401329237019,-3316.44389947819074719284}, - {10233,3.,4.41999999999999992894573,-9239.71902985399613363504,2031.29380053908354474893,-1371.35925605961202095728}, - {10233,3.,800.,-54340.1804040886113152815,3397.26027397260273972603,-10.1188548696496798960218}, - {10233,3.,15324.,-70181.625182690519906018,3409.33255040125269132903,-0.156141261363057784911755}, - {10233,180.,0.000400000000000000019168694,-17.0814417743218085107483,0.000124110835309254874270108,2440.94300115825922532467}, - {10233,180.,0.065000000000000002220446,-15.5422428149329861379767,0.02016077527559492474366,-38.6634853761835068674979}, - {10233,180.,4.41999999999999992894573,-235.497379149446594201917,1.33855872465025483205037,-50.3775345819770169845521}, - {10233,180.,800.,-14640.5024630709594885282,45.5918367346938775510204,-7.83648996527639800152069}, - {10233,180.,15324.,-28577.6446971680821285066,55.2015866873065015479876,-0.148587051440887372280679}, - {10233,1123.,0.000400000000000000019168694,-17.0630789988207188668825,2.88947340204574470627368e-6,2486.84988023336329186324}, - {10233,1123.,0.065000000000000002220446,-12.5589181079456256044661,0.000469512419380529143729346,7.22412495831966508988538}, - {10233,1123.,4.41999999999999992894573,-35.4550615786577835917049,0.031803517445555682595327,-5.7569606052102630173202}, - {10233,1123.,800.,-3343.1303902972739556477,3.37480997013700672692981,-2.98980536947426087305154}, - {10233,1123.,15324.,-11352.0607180353268830661,7.55829905834770485145599,-0.113119180727235553840235}, - {10233,10586.,0.000400000000000000019168694,-17.0607181926565361138193,-1.26000103249281892884057e-9,2492.75189435765511506763}, - {10233,10586.,0.065000000000000002220446,-12.175300607237463417773,-2.04748918320454911628704e-7,13.1257236766090675675961}, - {10233,10586.,4.41999999999999992894573,-9.43079204562662170966662,-0.0000139172010501341586295487,0.116749372001926601548071}, - {10233,10586.,800.,-7.27036619721226178082317,-0.002342942461614156602606,0.0000890483066241868231597611}, - {10233,10586.,15324.,-9.3278240351663417156768,-0.0197218452194275363359762,-0.0000805948075011592832299515}, + {0, 0.0000255999999999999988415517, 0.000400000000000000019168694, + -0.0000248141563677810554722069, -0.93984962406015038120717, + -0.00188501497960301691484332}, + {0, 0.0000255999999999999988415517, 0.065000000000000002220446, + -0.0000255949600924861392310515, -0.99960630889987943213184, + -7.75166869111834814851761e-8}, + {0, 0.0000255999999999999988415517, 4.41999999999999992894573, + -0.0000255999258645396469364285, -0.99999420817834177250031, + -1.67726638232395618551723e-11}, + {0, 0.0000255999999999999988415517, 800., -0.0000255999995904000075796848, + -0.999999968000001023999969, -5.11999978154667406760709e-16}, + {0, 0.0000255999999999999988415517, 15324., -0.0000255999999786165480692301, + -0.999999998329417909342659, -1.39542226236663819726744e-18}, + {0, 0.314000000000000001332268, 0.000400000000000000019168694, + -0.00266678271697168272833231, -0.00127226463104325705295582, + -5.66822905706024975839158}, + {0, 0.314000000000000001332268, 0.065000000000000002220446, + -0.11460468078714130271943, -0.171503957783641165200901, + -0.934652892970430377577097}, + {0, 0.314000000000000001332268, 4.41999999999999992894573, + -0.303348202309659617395206, -0.93367131389945078032175, + -0.00230212890163621522485358}, + {0, 0.314000000000000001332268, 800., -0.313938393619808992331269, + -0.999607653995806645889824, -7.69878314071302376498577e-8}, + {0, 0.314000000000000001332268, 15324., -0.313996782998787813729905, + -0.999979509686371605280254, -2.09929343978617832505718e-10}, + {0, 1.5, 0.000400000000000000019168694, -0.00329191110003275507221173, + -0.000266595574513463089285247, -7.23004434565640074923338}, + {0, 1.5, 0.065000000000000002220446, -0.206781499150110076176223, + -0.0415335463258785956090882, -2.22278737940449504349247}, + {0, 1.5, 4.41999999999999992894573, -1.29150964740387939616191, + -0.74662162162162161858047, -0.0388183744279291789704566}, + {0, 1.5, 800., -1.49859550534427827334156, -0.998128509045539613225203, + -1.75342721996106687969703e-6}, + {0, 1.5, 15324., -1.49992659053829698010225, -0.999902123911128511304688, + -4.79017695146261715054393e-9}, + {0, 3., 0.000400000000000000019168694, -0.00356911664958785467088415, + -0.000133315557925609925065371, -7.92292493952756185953978}, + {0, 3., 0.065000000000000002220446, -0.250472012600853859503051, + -0.0212071778140293644937542, -2.87462275628870399444374}, + {0, 3., 4.41999999999999992894573, -2.28973397601639585934409, + -0.595687331536388136290008, -0.113726692626070465736387}, + {0, 3., 800., -2.99438902306750149309853, -0.996264009962640099626401, + -6.99624147447649277415792e-6}, + {0, 3., 15324., -2.99970638131217673536622, -0.999804266979839498923468, + -1.91582075605741709616675e-8}, + {0, 180., 0.000400000000000000019168694, -0.00520680203358650246376672, + -2.22221728396159130295628e-6, -12.0170073061835394972106}, + {0, 180., 0.065000000000000002220446, -0.5152345838836882774678, + -0.000360980756948879583592839, -6.92704688665984518523008}, + {0, 180., 4.41999999999999992894573, -16.4913562250745366389837, + -0.023967031775295520717106, -2.75504310079668396055706}, + {0, 180., 800., -162.3526751973522458866, -0.816326530612244897959184, + -0.0192673746089352053174335}, + {0, 180., 15324., -178.951041022560568926078, -0.988390092879256965944272, + -0.0000679211892648339243088643}, + {0, 1123., 0.000400000000000000019168694, -0.00593912212871338103184145, + -3.56188653183026487941311e-7, -13.8478056779721050510975}, + {0, 1123., 0.065000000000000002220446, -0.634217014783734223797677, + -0.0000578773267798391030085681, -8.75724272015345987190877}, + {0, 1123., 4.41999999999999992894573, -24.4936395934523254888155, + -0.00392045555338737997305733, -4.54546787488649278326856}, + {0, 1123., 800., -701.624014336681947952778, -0.416016640665626625065003, + -0.293046658586479060005975}, + {0, 1123., 15324., -1083.75715139725783359741, -0.931720070529579862588922, + -0.00244293345030929573936621}, + {0, 10586., 0.000400000000000000019168694, -0.00683653348042399192327693, + -3.77857533426883319566749e-8, -16.0913337388457323318343}, + {0, 10586., 0.065000000000000002220446, -0.780043017108597613744853, + -6.14014744855619176912596e-6, -11.0006679418181806653922}, + {0, 10586., 4.41999999999999992894573, -34.3945190758501995485746, + -0.000417358329509122388817005, -6.7819827601055724937662}, + {0, 10586., 800., -2124.42246547447991619038, -0.0702617249253469172668189, + -1.72578980676844681250479}, + {0, 10586., 15324., -8048.29915678058041924358, -0.591431879583172520262447, + -0.116640647318788574768032}, + {6, 0.0000255999999999999988415517, 0.000400000000000000019168694, + -26.48036259722249074196, 220276.315789473695413011, + -11595.463497838709066521}, + {6, 0.0000255999999999999988415517, 0.065000000000000002220446, + -51.41938813644810311008, 234281.729042100352628204, + -74.6938075459730277737496}, + {6, 0.0000255999999999999988415517, 4.41999999999999992894573, + -67.5203813751119080113018, 234372.642547590685193838, + -0.431255924758490035983718}, + {6, 0.0000255999999999999988415517, 800., -69.9980790657427038228031, + 234373.99250003225060488, -0.0000233303844710378174910093}, + {6, 0.0000255999999999999988415517, 15324., -70.0158073212983957030198, + 234373.999608459003690188, -6.38614276575077488493694e-8}, + {6, 0.314000000000000001332268, 0.000400000000000000019168694, + -9.62519749441237577499515, 0.0230385244971718457666188, + 2477.53054955581647437693}, + {6, 0.314000000000000001332268, 0.065000000000000002220446, + -5.62316274126580026418416, 3.10564173234962949352322, + 0.811756664687527711460638}, + {6, 0.314000000000000001332268, 4.41999999999999992894573, + -11.7481186360489882881077, 16.9071818179371882584098, + -0.343526975436714230039528}, + {6, 0.314000000000000001332268, 800., -13.8270107248858319921459, + 18.1011755433762947868859, -0.0000204650172704751119244161}, + {6, 0.314000000000000001332268, 15324., -13.8425659569858167176518, + 18.107909210435378733015, -5.604917883004236869323e-8}, + {6, 1.5, 0.000400000000000000019168694, -9.61978396161923317848729, + 0.00079978672354038926785574, 2491.05377011516723211824}, + {6, 1.5, 0.065000000000000002220446, -4.84100453988744407299957, + 0.124600638977635786827265, 11.5208909282007767518774}, + {6, 1.5, 4.41999999999999992894573, -4.69471130087565244211116, + 2.23986486486486485574141, -0.126129611536089775574877}, + {6, 1.5, 800., -5.6375883578559464150792, 2.99438552713661883967561, + -0.0000110478695320263035818071}, + {6, 1.5, 15324., -5.64599569956598171509704, 2.99970637173338553391406, + -3.03295927479829163411156e-8}, + {6, 3., 0.000400000000000000019168694, -9.61926132713561020240632, + 0.000133315557925609925065371, 2492.36008977011386837543}, + {6, 3., 0.065000000000000002220446, -4.75878244235486509222263, + 0.0212071778140293644937542, 12.7453357216411121474773}, + {6, 3., 4.41999999999999992894573, -2.88910819582874566312831, + 0.595687331536388136290008, 0.00385024685205873591732729}, + {6, 3., 800., -2.98571724360242195248096, 0.996264009962640099626401, + -2.3069406647953774852549e-6}, + {6, 3., 15324., -2.98747963477610734281426, 0.999804266979839498923468, + -6.38245840446628643263247e-9}, + {6, 180., 0.000400000000000000019168694, -9.62011239916672045724397, + -2.14814337449620492619107e-6, 2490.23240751308261564996}, + {6, 180., 0.065000000000000002220446, -4.89709960487442545538356, + -0.000348948065050583597473077, 10.6171759350004771903562}, + {6, 180., 4.41999999999999992894573, -11.8028833191445189961465, + -0.0231681307161190033598691, -1.86137525666548784745946}, + {6, 180., 800., -138.973123190861697819951, -0.789115646258503401360544, + -0.0179131542129975601896404}, + {6, 180., 15324., -154.441639359481734262519, -0.955443756449948400412797, + -0.0000634392772194434652186986}, + {6, 1123., 0.000400000000000000019168694, -9.62083352307562850466433, + -3.54285597155334449715445e-7, 2488.42959957075572856696}, + {6, 1123., 0.065000000000000002220446, -5.01426303422777693881116, + -0.0000575680979635621354056728, 8.81495887967631239323725}, + {6, 1123., 4.41999999999999992894573, -19.6831821663032128008537, + -0.0038995092191751588868255, -3.62458748384772905786375}, + {6, 1123., 800., -671.304184750646975825767, -0.41379393376981739999787, + -0.288690114015941777831476}, + {6, 1123., 15324., -1048.61720731875393149901, -0.926742047000481483982035, + -0.00241626280594218362665218}, + {6, 10586., 0.000400000000000000019168694, -9.62172902400956374565605, + -3.77643368945439780938618e-8, 2486.19084755337970635833}, + {6, 10586., 0.065000000000000002220446, -5.15977860354001469077731, + -6.13666729697000839952321e-6, 6.57630939764217156062813}, + {6, 10586., 4.41999999999999992894573, -29.5629973572818965727548, + -0.00041712177651676883371282, -5.85634703346878398423394}, + {6, 10586., 800., -2091.3124520859014907288, -0.0702219015407302460497774, + -1.71884010032985743252181}, + {6, 10586., 15324., -8002.42495594488889877697, -0.59109666408369216553719, + -0.116480739324794834878369}, + {14, 0.0000255999999999999988415517, 0.000400000000000000019168694, + -49.8145624383586412504773, 513979.323308270702830867, + -30391.5592215308054935068}, + {14, 0.0000255999999999999988415517, 0.065000000000000002220446, + -114.928171090288373621844, 546658.700573312689305051, + -196.832392093265922277751}, + {14, 0.0000255999999999999988415517, 4.41999999999999992894573, + -161.649312877052269679471, 546870.832603322503241318, + -1.65012869090202525000607}, + {14, 0.0000255999999999999988415517, 800., -173.098986627797207395457, + 546873.982500032584746084, -0.000140607279245208991169695}, + {14, 0.0000255999999999999988415517, 15324., -173.206165042629407730008, + 546873.999086402114500983, -3.87293689171005773693605e-7}, + {14, 0.314000000000000001332268, 0.000400000000000000019168694, + -10.4823212403875677919956, 0.0554529100014586495260517, + 2452.98201444586163091021}, + {14, 0.314000000000000001332268, 0.065000000000000002220446, + -7.91753972042693522598031, 7.47516931919399037182204, + -19.4065385144529681904019}, + {14, 0.314000000000000001332268, 4.41999999999999992894573, + -31.1096030160603968883541, 40.6949859937193736433852, + -1.4423583039713969676008}, + {14, 0.314000000000000001332268, 800., -41.6146101076375483341583, + 43.5688864732057633639203, -0.000133818772002702504501651}, + {14, 0.314000000000000001332268, 15324., -41.7166402819016445012403, + 43.5850941705977125174086, -3.68785202783475625902428e-7}, + {14, 1.5, 0.000400000000000000019168694, -10.4688561593594869703521, + 0.00222162978761219241071039, 2486.61861613580826696107}, + {14, 1.5, 0.065000000000000002220446, -5.96960149272681241527387, + 0.346112886048988296742402, 7.29895408232336579179109}, + {14, 1.5, 4.41999999999999992894573, -13.3341039738636535426733, + 6.22184684684684682150392, -0.886409460834882622189145}, + {14, 1.5, 800., -20.9264151022685229463224, 8.31773757537949677687669, + -0.000109610174761583369512834}, + {14, 1.5, 15324., -21.0100699378693506067827, 8.3325176992594042608724, + -3.02665838448691571323444e-7}, + {14, 3., 0.000400000000000000019168694, -10.4672670714982932266983, + 0.000488823712393903058573027, 2490.59053612251196637491}, + {14, 3., 0.065000000000000002220446, -5.71949591388313641569191, + 0.0777596519847743364770988, 11.0251057695297603161259}, + {14, 3., 4.41999999999999992894573, -7.79006429060418244080376, + 2.18418688230008983306336, -0.483245366998347713019428}, + {14, 3., 800., -12.7443244787126682405839, 3.6529680365296803652968, + -0.0000822242550653573074282639}, + {14, 3., 15324., -12.8071593989944707311042, 3.66594897892607816271938, + -2.27631817501670696455485e-7}, + {14, 180., 0.000400000000000000019168694, -10.467069325725552290929, + -2.04937816187568975717079e-6, 2491.08472067831368019905}, + {14, 180., 0.065000000000000002220446, -5.68921919805166470578108, + -0.000332904475852855615980062, 11.4626317745298003372252}, + {14, 180., 4.41999999999999992894573, -9.65337657959679917832682, + -0.0221029293038836468835533, -1.31368299764513841447103}, + {14, 180., 800., -117.570556789937986073345, -0.752834467120181405895692, + -0.0161936967338941701029113}, + {14, 180., 15324., -131.5984192349764106228, -0.911515307877536979704162, + -0.0000577016781835615346878727}, + {14, 1123., 0.000400000000000000019168694, -10.4677755213861685634857, + -3.51748189118411732080956e-7, 2489.31923330860236441056}, + {14, 1123., 0.065000000000000002220446, -5.80395729200942357200564, + -0.0000571557928751928452684791, 9.6977197567649020595191}, + {14, 1123., 4.41999999999999992894573, -17.3710293984633662562012, + -0.00387158077355886410518306, -3.04061182895062280846571}, + {14, 1123., 800., -640.647914910330698665346, -0.41083032457540509990836, + -0.282967557637372205015805}, + {14, 1123., 15324., -1011.59993064034851794618, -0.920104682295016979172854, + -0.00238094023047733949128954}, + {14, 10586., 0.000400000000000000019168694, -10.4686684750964033112778, + -3.77357816303515062767776e-8, 2487.08684934922314896474}, + {14, 10586., 0.065000000000000002220446, -5.94905895063816047333042, + -6.13202709485509724005287e-6, 7.46543792757153450807576}, + {14, 10586., 4.41999999999999992894573, -27.2227588675497963109583, + -0.000416806372526964093573906, -5.26603093110764468933264}, + {14, 10586., 800., -2056.93593717552727578896, -0.0701688036945746844270555, + -1.70965999479388506262815}, + {14, 10586., 15324., -7951.09533692356666073317, + -0.590649710084385025903513, -0.116267766949827820373742}, + {1525, 0.0000255999999999999988415517, 0.000400000000000000019168694, + -4301.78472746701591561319, 5.59871348684210554788785e7, + -3.5806687876344078642494e6}, + {1525, 0.0000255999999999999988415517, 0.065000000000000002220446, + -11965.4671281234822402701, 5.95468591985310427791447e7, + -23429.1126891147666042428}, + {1525, 0.0000255999999999999988415517, 4.41999999999999992894573, + -18367.3428918005844581777, 5.95699664793796696369591e7, + -339.05708253439450821354}, + {1525, 0.0000255999999999999988415517, 800., -24826.2281356385314540934, + 5.95703095937500956956661e7, -0.838976287617641050521021}, + {1525, 0.0000255999999999999988415517, 15324., -25707.7170288016101268158, + 5.95703114004829071688901e7, -0.00464306291332368931093165}, + {1525, 0.314000000000000001332268, 0.000400000000000000019168694, + -17.0947387955188070694514, 6.17771997212362870958894, + -2348.27115497920553780678}, + {1525, 0.314000000000000001332268, 0.065000000000000002220446, + -296.585568286099074874008, 832.769692284422651260512, + -4001.49218112616936417653}, + {1525, 0.314000000000000001332268, 4.41999999999999992894573, + -4115.10160678526157468258, 4533.61649969457963823061, + -316.176485619091868439549}, + {1525, 0.314000000000000001332268, 800., -10469.9426767525578568447, + 4853.78278834474664085128, -0.838228516034976412378816}, + {1525, 0.314000000000000001332268, 15324., -11350.864477542964439615, + 4855.58840352125850604476, -0.00464102415296814454779679}, + {1525, 1.5, 0.000400000000000000019168694, -15.5605375416167689753134, + 0.270772238514174011017382, 1484.28030775203761395908}, + {1525, 1.5, 0.065000000000000002220446, -74.4509275868752818011125, + 42.1842385516506936069639, -953.474508334327861816359}, + {1525, 1.5, 4.41999999999999992894573, -2072.19103657901873983403, + 758.318693693693690604898, -251.676626135276650941522}, + {1525, 1.5, 800., -8088.5487996808837996978, 1013.76585568725306716573, + -0.835410572412918435298525}, + {1525, 1.5, 15324., -8967.33164084000397251235, 1015.56725718573619131513, + -0.00463332752548632640449661}, + {1525, 3., 0.000400000000000000019168694, -15.3575220720668965063351, + 0.0676354263875927686498315, 1991.71749039935661708657}, + {1525, 3., 0.065000000000000002220446, -42.4918294753981563747316, + 10.7591082109842309198313, -477.238467087057049352225}, + {1525, 3., 4.41999999999999992894573, -1360.54978818586118224694, + 302.212039532794247811131, -199.675789571126135171012}, + {1525, 3., 800., -7035.84649923785032031894, 505.437941054379410543794, + -0.831861613850395752926704}, + {1525, 3., 15324., -7911.93122400832367818281, 507.234031447771905787173, + -0.00462360345575814251935502}, + {1525, 180., 0.000400000000000000019168694, -15.1592288635917619446729, + 0.0000166049013718241127915344, 2487.41676922898488796714}, + {1525, 180., 0.065000000000000002220446, -10.6183839860155018633925, + 0.00269732843386801688851316, 7.79296281407547718024725}, + {1525, 180., 4.41999999999999992894573, -30.7569326420675970103087, + 0.179086987432069307580598, -5.06066771330890867384431}, + {1525, 180., 800., -1255.10606104316181434609, 6.09977324263038548752834, + -0.50811617220616562857323}, + {1525, 180., 15324., -1861.51726736161923065929, 7.38547041623667010663915, + -0.00355560001152251827139362}, + {1525, 1123., 0.000400000000000000019168694, -15.1571154863562692398625, + 1.27504753855366561133043e-7, 2492.70020501203960042957}, + {1525, 1123., 0.065000000000000002220446, -10.2750368571307051553926, + 0.0000207183306905568293939843, 13.074039765317042756658}, + {1525, 1123., 4.41999999999999992894573, -7.75481686725872855763217, + 0.00140340439221881277753254, 0.0654298516080506315262451}, + {1525, 1123., 800., -30.3901820482837344036952, 0.148921362019218079497891, + -0.0188047284729684005572389}, + {1525, 1123., 15324., -64.3938471491118556432688, + 0.333527576449591366661395, -0.000290976140796059790385352}, + {1525, 10586., 0.000400000000000000019168694, -15.1575273331900733345777, + -3.23424061059983918249983e-8, 2491.67058800680726231035}, + {1525, 10586., 0.065000000000000002220446, -10.341961135413218891829, + -5.25560892040125199509261e-6, 12.0444483664247286854037}, + {1525, 10586., 4.41999999999999992894573, -12.3018556139457377868195, + -0.00035723444395259379983666, -0.962437235779729779911197}, + {1525, 10586., 800., -744.016916706287313438782, + -0.0601399480019429829354474, -0.792452568525027960065769}, + {1525, 10586., 15324., -4300.64559341391477270059, + -0.506231273465249027592861, -0.080624196979174112177973}, + {10233, 0.0000255999999999999988415517, 0.000400000000000000019168694, + -28781.0708528951573397343, 3.75682858552631598053215e8, + -2.40411931995216795644478e7}, + {10233, 0.0000255999999999999988415517, 0.065000000000000002220446, + -80237.4790550341092525423, 3.99569192710255671251893e8, + -157343.697098361009501263}, + {10233, 0.0000255999999999999988415517, 4.41999999999999992894573, + -123371.163364167740152869, 3.99724246355043753581641e8, + -2307.27997929395105479548}, + {10233, 0.0000255999999999999988415517, 800., -173733.65594636811650329, + 3.99726548708750459408368e8, -10.1666354466535988554224}, + {10233, 0.0000255999999999999988415517, 15324., -189611.393943800924397874, + 3.99726560832223983286441e8, -0.156271946909903467303064}, + {10233, 0.314000000000000001332268, 0.000400000000000000019168694, + -30.0835346409569131744303, 41.4607785935398146017316, + -30043.5682705897920756525}, + {10233, 0.314000000000000001332268, 0.065000000000000002220446, + -1936.716591758487041006, 5589.00047056450946728878, + -26975.8416131385263827685}, + {10233, 0.314000000000000001332268, 4.41999999999999992894573, + -27734.5558869327518549392, 30426.6413450334884297763, + -2153.73427754141249439361}, + {10233, 0.314000000000000001332268, 800., -77398.8345343110590054878, + 32575.3861354641231869532, -10.1616173371352784115513}, + {10233, 0.314000000000000001332268, 15324., -93272.7669155443506617326, + 32587.5042326579588303572, -0.156258265294963792040359}, + {10233, 1.5, 0.000400000000000000019168694, -19.7852231333246170201452, + 1.81844841375633173201467, -4317.60144720493538394871}, + {10233, 1.5, 0.065000000000000002220446, -445.630392408020282583574, + 283.300319488817900649591, -6515.78789458981692128489}, + {10233, 1.5, 4.41999999999999992894573, -14020.6484936315299566843, + 5092.70608108108106033739, -1720.72113290933113059977}, + {10233, 1.5, 800., -61412.5266404072312643186, 6808.23456019962570180911, + -10.1426989007295637839166}, + {10233, 1.5, 15324., -77272.0989845637286907938, 6820.33238719780757560928, + -0.156206593508853883167535}, + {10233, 3., 0.000400000000000000019168694, -18.4213731622889640481056, + 0.454606052526329844472915, -908.658303440053134799723}, + {10233, 3., 0.065000000000000002220446, -230.930124889414052187924, + 72.3164763458401329237019, -3316.44389947819074719284}, + {10233, 3., 4.41999999999999992894573, -9239.71902985399613363504, + 2031.29380053908354474893, -1371.35925605961202095728}, + {10233, 3., 800., -54340.1804040886113152815, 3397.26027397260273972603, + -10.1188548696496798960218}, + {10233, 3., 15324., -70181.625182690519906018, 3409.33255040125269132903, + -0.156141261363057784911755}, + {10233, 180., 0.000400000000000000019168694, -17.0814417743218085107483, + 0.000124110835309254874270108, 2440.94300115825922532467}, + {10233, 180., 0.065000000000000002220446, -15.5422428149329861379767, + 0.02016077527559492474366, -38.6634853761835068674979}, + {10233, 180., 4.41999999999999992894573, -235.497379149446594201917, + 1.33855872465025483205037, -50.3775345819770169845521}, + {10233, 180., 800., -14640.5024630709594885282, 45.5918367346938775510204, + -7.83648996527639800152069}, + {10233, 180., 15324., -28577.6446971680821285066, 55.2015866873065015479876, + -0.148587051440887372280679}, + {10233, 1123., 0.000400000000000000019168694, -17.0630789988207188668825, + 2.88947340204574470627368e-6, 2486.84988023336329186324}, + {10233, 1123., 0.065000000000000002220446, -12.5589181079456256044661, + 0.000469512419380529143729346, 7.22412495831966508988538}, + {10233, 1123., 4.41999999999999992894573, -35.4550615786577835917049, + 0.031803517445555682595327, -5.7569606052102630173202}, + {10233, 1123., 800., -3343.1303902972739556477, 3.37480997013700672692981, + -2.98980536947426087305154}, + {10233, 1123., 15324., -11352.0607180353268830661, + 7.55829905834770485145599, -0.113119180727235553840235}, + {10233, 10586., 0.000400000000000000019168694, -17.0607181926565361138193, + -1.26000103249281892884057e-9, 2492.75189435765511506763}, + {10233, 10586., 0.065000000000000002220446, -12.175300607237463417773, + -2.04748918320454911628704e-7, 13.1257236766090675675961}, + {10233, 10586., 4.41999999999999992894573, -9.43079204562662170966662, + -0.0000139172010501341586295487, 0.116749372001926601548071}, + {10233, 10586., 800., -7.27036619721226178082317, + -0.002342942461614156602606, 0.0000890483066241868231597611}, + {10233, 10586., 15324., -9.3278240351663417156768, + -0.0197218452194275363359762, -0.0000805948075011592832299515}, }; } // namespace neg_binomial_2_test_internal From ce9e5254a2696c409ad00f8b29e27cbdb055a228 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Sun, 15 Mar 2020 14:33:35 +0100 Subject: [PATCH 77/82] Fixed duplicated from merge --- stan/math/prim/prob/neg_binomial_2_lpmf.hpp | 27 ++++++++++----------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp index 8a1ca50a877..ea008d8bcb8 100644 --- a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp @@ -6,7 +6,10 @@ #include #include #include +#include +#include #include +#include #include #include #include @@ -46,10 +49,7 @@ return_type_t neg_binomial_2_lpmf( size_t size_phi = stan::math::size(phi); size_t size_mu_phi = max_size(mu, phi); size_t size_n_phi = max_size(n, phi); - size_t max_size_seq_view = max_size(n, mu, phi); - - size_t len_ep = max_size(mu, phi); - size_t len_np = max_size(n, phi); + size_t size_all = max_size(n, mu, phi); size_t len_mu = size(mu); VectorBuilder mu_val(len_mu); @@ -57,29 +57,28 @@ return_type_t neg_binomial_2_lpmf( mu_val[i] = value_of(mu_vec[i]); } - size_t len_phi = size(phi); - VectorBuilder phi_val(len_phi); - VectorBuilder log_phi(len_phi); - for (size_t i = 0; i < len_phi; ++i) { + VectorBuilder phi_val(size_phi); + VectorBuilder log_phi(size_phi); + for (size_t i = 0; i < size_phi; ++i) { phi_val[i] = value_of(phi_vec[i]); log_phi[i] = log(phi_val[i]); } VectorBuilder mu_plus_phi( - len_ep); + size_mu_phi); VectorBuilder - log_mu_plus_phi(len_ep); - for (size_t i = 0; i < len_ep; ++i) { + log_mu_plus_phi(size_mu_phi); + for (size_t i = 0; i < size_mu_phi; ++i) { mu_plus_phi[i] = mu_val[i] + phi_val[i]; log_mu_plus_phi[i] = log(mu_plus_phi[i]); } - VectorBuilder n_plus_phi(len_np); - for (size_t i = 0; i < len_np; ++i) { + VectorBuilder n_plus_phi(size_n_phi); + for (size_t i = 0; i < size_n_phi; ++i) { n_plus_phi[i] = n_vec[i] + phi_val[i]; } - for (size_t i = 0; i < max_size_seq_view; i++) { + for (size_t i = 0; i < size_all; i++) { if (include_summand::value) { logp += binomial_coefficient_log(n_plus_phi[i] - 1, n_vec[i]); } From fb55067efa84ee2a734d78967ee541ced9f65a28 Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Sun, 15 Mar 2020 09:39:35 -0400 Subject: [PATCH 78/82] [Jenkins] auto-formatting by clang-format version 6.0.0 (tags/google/stable/2017-11-14) --- stan/math/prim/prob/neg_binomial_2_lpmf.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp index ea008d8bcb8..a2c09a077e6 100644 --- a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp @@ -73,7 +73,8 @@ return_type_t neg_binomial_2_lpmf( log_mu_plus_phi[i] = log(mu_plus_phi[i]); } - VectorBuilder n_plus_phi(size_n_phi); + VectorBuilder n_plus_phi( + size_n_phi); for (size_t i = 0; i < size_n_phi; ++i) { n_plus_phi[i] = n_vec[i] + phi_val[i]; } From 63bafd76d4fed4e71580cc47c4bd3c75044a1503 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Sun, 15 Mar 2020 14:54:09 +0100 Subject: [PATCH 79/82] A bit more cleanup --- stan/math/prim/prob/neg_binomial_2_lpmf.hpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp index a2c09a077e6..1a5ec1eb2f8 100644 --- a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp @@ -11,7 +11,6 @@ #include #include #include -#include #include #include #include @@ -51,9 +50,8 @@ return_type_t neg_binomial_2_lpmf( size_t size_n_phi = max_size(n, phi); size_t size_all = max_size(n, mu, phi); - size_t len_mu = size(mu); - VectorBuilder mu_val(len_mu); - for (size_t i = 0; i < len_mu; ++i) { + VectorBuilder mu_val(size_mu); + for (size_t i = 0; i < size_mu; ++i) { mu_val[i] = value_of(mu_vec[i]); } @@ -86,7 +84,6 @@ return_type_t neg_binomial_2_lpmf( if (include_summand::value) { logp += multiply_log(n_vec[i], mu_val[i]); } - // logp += phi_val[i] * (log_phi[i] - log_mu_plus_phi[i]) logp += -phi_val[i] * (log1p(mu_val[i] / phi_val[i])) - n_vec[i] * log_mu_plus_phi[i]; From 6cfff523bde2bf23517873837ec9e6eb786be203 Mon Sep 17 00:00:00 2001 From: martin_cerny Date: Sun, 15 Mar 2020 15:05:37 +0100 Subject: [PATCH 80/82] Removed unused headers --- stan/math/prim/prob/neg_binomial_2_lpmf.hpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp index 1a5ec1eb2f8..c67499b9915 100644 --- a/stan/math/prim/prob/neg_binomial_2_lpmf.hpp +++ b/stan/math/prim/prob/neg_binomial_2_lpmf.hpp @@ -5,14 +5,12 @@ #include #include #include -#include #include #include #include #include #include #include -#include #include namespace stan { From ce0b0625aa78bb442778bed17db69313f9ac3819 Mon Sep 17 00:00:00 2001 From: martinmodrak Date: Sun, 29 Mar 2020 15:54:05 +0200 Subject: [PATCH 81/82] Test against dphi for n = 1, lifted lbeta test restrictions --- test/unit/math/rev/fun/lbeta_test.cpp | 5 ----- test/unit/math/rev/prob/neg_binomial_2_test.cpp | 4 ++++ 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/test/unit/math/rev/fun/lbeta_test.cpp b/test/unit/math/rev/fun/lbeta_test.cpp index f4ea4ccf6bb..0c015a2c770 100644 --- a/test/unit/math/rev/fun/lbeta_test.cpp +++ b/test/unit/math/rev/fun/lbeta_test.cpp @@ -74,11 +74,6 @@ TEST(MathFunctions, lbeta_identities_gradient) { // Successors: beta(a,b) = beta(a + 1, b) + beta(a, b + 1) for (double x : to_test) { for (double y : to_test) { - // TODO(martinmodrak) this restriction on testing should be lifted once - // the log_sum_exp bug (#1679) is resolved - if (x > 1e10 || y > 1e10) { - continue; - } auto rh = [](const var& a, const var& b) { return stan::math::log_sum_exp(lbeta(a + 1, b), lbeta(a, b + 1)); }; diff --git a/test/unit/math/rev/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/prob/neg_binomial_2_test.cpp index e2175a673ef..42046d47756 100644 --- a/test/unit/math/rev/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/prob/neg_binomial_2_test.cpp @@ -589,6 +589,10 @@ TEST(ProbDistributionsNegBinomial2, derivativesZeroOne) { double expected_dmu_1 = (phi_dbl * (1 - mu_dbl)) / (mu_dbl * (mu_dbl + phi_dbl)); expect_near_rel("dmu, n = 1 " + msg.str(), gradients1[0], expected_dmu_1); + + double expected_dphi_1 + = mu_dbl * ( phi_dbl + 1) / (phi_dbl * (mu_dbl + phi_dbl)) + log(phi_dbl) - log(mu_dbl + phi_dbl); + expect_near_rel("dphi, n = 1 " + msg.str(), gradients1[1], expected_dphi_1); } } } From 4b2f032125a8e005b27302119fd681ab32d99c2f Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Sun, 29 Mar 2020 09:55:06 -0400 Subject: [PATCH 82/82] [Jenkins] auto-formatting by clang-format version 6.0.0 (tags/google/stable/2017-11-14) --- stan/math/opencl/kernel_generator/load.hpp | 2 +- test/unit/math/rev/prob/neg_binomial_2_test.cpp | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/stan/math/opencl/kernel_generator/load.hpp b/stan/math/opencl/kernel_generator/load.hpp index 799cdb551a0..ae0f7d1eb6d 100644 --- a/stan/math/opencl/kernel_generator/load.hpp +++ b/stan/math/opencl/kernel_generator/load.hpp @@ -49,7 +49,7 @@ class load_ * Creates a deep copy of this expression. * @return copy of \c *this */ - inline load_ deep_copy() const & { return load_(a_); } + inline load_ deep_copy() const& { return load_(a_); } inline load_ deep_copy() && { return load_(std::forward(a_)); } /** diff --git a/test/unit/math/rev/prob/neg_binomial_2_test.cpp b/test/unit/math/rev/prob/neg_binomial_2_test.cpp index 42046d47756..52542071c83 100644 --- a/test/unit/math/rev/prob/neg_binomial_2_test.cpp +++ b/test/unit/math/rev/prob/neg_binomial_2_test.cpp @@ -591,8 +591,10 @@ TEST(ProbDistributionsNegBinomial2, derivativesZeroOne) { expect_near_rel("dmu, n = 1 " + msg.str(), gradients1[0], expected_dmu_1); double expected_dphi_1 - = mu_dbl * ( phi_dbl + 1) / (phi_dbl * (mu_dbl + phi_dbl)) + log(phi_dbl) - log(mu_dbl + phi_dbl); - expect_near_rel("dphi, n = 1 " + msg.str(), gradients1[1], expected_dphi_1); + = mu_dbl * (phi_dbl + 1) / (phi_dbl * (mu_dbl + phi_dbl)) + + log(phi_dbl) - log(mu_dbl + phi_dbl); + expect_near_rel("dphi, n = 1 " + msg.str(), gradients1[1], + expected_dphi_1); } } }