Skip to content

Commit 60acdd4

Browse files
committed
explicit types
1 parent 3fb810f commit 60acdd4

2 files changed

Lines changed: 30 additions & 27 deletions

File tree

stan/math/prim/fun/log_gamma_q_dgamma.hpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -39,23 +39,23 @@ inline return_type_t<T_a, T_z> log_q_gamma_cf(const T_a& a, const T_z& z,
3939
double precision = 1.49012e-08,
4040
int max_steps = 250) {
4141
using T_return = return_type_t<T_a, T_z>;
42-
const auto log_prefactor = a * log(z) - z - lgamma(a);
42+
const T_return log_prefactor = a * log(z) - z - lgamma(a);
4343

44-
auto b_init = z + 1.0 - a;
45-
auto C = (fabs(value_of(b_init)) >= EPSILON) ? b_init : std::decay_t<decltype(b_init)>(EPSILON);
46-
auto D = 0.0;
47-
auto f = C;
44+
T_return b_init = z + 1.0 - a;
45+
T_return C = (fabs(value_of(b_init)) >= EPSILON) ? b_init : std::decay_t<decltype(b_init)>(EPSILON);
46+
T_return D = 0.0;
47+
T_return f = C;
4848
for (int i = 1; i <= max_steps; ++i) {
4949
T_a an = -i * (i - a);
50-
const auto b = b_init + 2.0 * i;
50+
const T_return b = b_init + 2.0 * i;
5151
D = b + an * D;
5252
D = (fabs(value_of(D)) >= EPSILON) ? D : std::decay_t<decltype(D)>(EPSILON);
5353
C = b + an / C;
5454
C = (fabs(value_of(C)) >= EPSILON) ? C : std::decay_t<decltype(C)>(EPSILON);
5555
D = inv(D);
56-
auto delta = C * D;
56+
const T_return delta = C * D;
5757
f *= delta;
58-
const auto delta_m1 = fabs(value_of(delta) - 1.0);
58+
const double delta_m1 = fabs(value_of(delta) - 1.0);
5959
if (delta_m1 < precision) {
6060
break;
6161
}
@@ -83,30 +83,30 @@ inline return_type_t<T_a, T_z> log_q_gamma_cf(const T_a& a, const T_z& z,
8383
* @return structure containing log(Q(a,z)) and d/da log(Q(a,z))
8484
*/
8585
template <typename T_a, typename T_z>
86-
inline auto log_gamma_q_dgamma(
86+
inline std::pair<return_type_t<T_a, T_z>, return_type_t<T_a, T_z>> log_gamma_q_dgamma(
8787
const T_a& a, const T_z& z, double precision = 1.49012e-08, int max_steps = 250) {
8888
using T_return = return_type_t<T_a, T_z>;
89-
const auto a_val = value_of(a);
90-
const auto z_val = value_of(z);
89+
const double a_val = value_of(a);
90+
const double z_val = value_of(z);
9191
// For z > a + 1, use continued fraction for better numerical stability
9292
if (z_val > a_val + 1.0) {
9393
std::pair<T_return, T_return> result{internal::log_q_gamma_cf(a_val, z_val, precision, max_steps), 0.0};
9494
// For gradient, use: d/da log(Q) = (1/Q) * dQ/da
9595
// grad_reg_inc_gamma computes dQ/da
96-
const auto Q_val = exp(result.first);
97-
const auto dQ_da
96+
const T_return Q_val = exp(result.first);
97+
const double dQ_da
9898
= grad_reg_inc_gamma(a_val, z_val, tgamma(a_val), digamma(a_val));
9999
result.second = dQ_da / Q_val;
100100
return result;
101101
} else {
102102
// For z <= a + 1, use log1m(P(a,z)) for better numerical accuracy
103-
const auto P_val = gamma_p(a_val, z_val);
103+
const double P_val = gamma_p(a_val, z_val);
104104
std::pair<T_return, T_return> result{log1m(P_val), 0.0};
105105
// Gradient: d/da log(Q) = (1/Q) * dQ/da
106106
// grad_reg_inc_gamma computes dQ/da
107-
const auto Q_val = exp(result.first);
107+
const T_return Q_val = exp(result.first);
108108
if (Q_val > 0) {
109-
const auto dQ_da
109+
const double dQ_da
110110
= grad_reg_inc_gamma(a_val, z_val, tgamma(a_val), digamma(a_val));
111111
result.second = dQ_da / Q_val;
112112
} else {

stan/math/prim/prob/gamma_lccdf.hpp

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <stan/math/prim/functor/partials_propagator.hpp>
2424
#include <cmath>
2525
#include <optional>
26+
2627
namespace stan {
2728
namespace math {
2829
namespace internal {
@@ -31,11 +32,12 @@ namespace internal {
3132
* Computes log q and d(log q) / d(alpha) using continued fraction.
3233
*/
3334
template <bool any_fvar, bool partials_fvar, typename T_shape, typename T1, typename T2>
34-
inline auto eval_q_cf(const T1& alpha, const T2& beta_y) {
35+
inline std::optional<std::pair<return_type_t<T1, T2>, return_type_t<T1, T2>>>
36+
eval_q_cf(const T1& alpha, const T2& beta_y) {
3537
using scalar_t = return_type_t<T1, T2>;
3638
using ret_t = std::pair<scalar_t, scalar_t>;
3739
if constexpr (!any_fvar && is_autodiff_v<T_shape>) {
38-
auto log_q_result
40+
std::pair<double, double> log_q_result
3941
= log_gamma_q_dgamma(value_of_rec(alpha), value_of_rec(beta_y));
4042
if (likely(std::isfinite(value_of_rec(log_q_result.first)))) {
4143
return std::optional{log_q_result};
@@ -69,7 +71,8 @@ inline auto eval_q_cf(const T1& alpha, const T2& beta_y) {
6971
* Computes log q and d(log q) / d(alpha) using log1m.
7072
*/
7173
template <bool partials_fvar, typename T_shape, typename T1, typename T2>
72-
inline auto eval_q_log1m(const T1& alpha, const T2& beta_y) {
74+
inline std::optional<std::pair<return_type_t<T1, T2>, return_type_t<T1, T2>>>
75+
eval_q_log1m(const T1& alpha, const T2& beta_y) {
7376
using scalar_t = return_type_t<T1, T2>;
7477
using ret_t = std::pair<scalar_t, scalar_t>;
7578
ret_t out{log1m(gamma_p(alpha, beta_y)), 0.0};
@@ -132,18 +135,18 @@ inline return_type_t<T_y, T_shape, T_inv_scale> gamma_lccdf(
132135
for (size_t n = 0; n < N; n++) {
133136
// Explicit results for extreme values
134137
// The gradients are technically ill-defined, but treated as zero
135-
const auto y_val = y_vec.val(n);
138+
const T_partials_return y_val = y_vec.val(n);
136139
if (y_val == 0.0) {
137140
continue;
138141
}
139142
if (y_val == INFTY) {
140143
return ops_partials.build(negative_infinity());
141144
}
142145

143-
const auto alpha_val = alpha_vec.val(n);
144-
const auto beta_val = beta_vec.val(n);
146+
const T_partials_return alpha_val = alpha_vec.val(n);
147+
const T_partials_return beta_val = beta_vec.val(n);
145148

146-
const auto beta_y = beta_val * y_val;
149+
const T_partials_return beta_y = beta_val * y_val;
147150
if (beta_y == INFTY) {
148151
return ops_partials.build(negative_infinity());
149152
}
@@ -164,14 +167,14 @@ inline return_type_t<T_y, T_shape, T_inv_scale> gamma_lccdf(
164167
P += result->first;
165168

166169
if constexpr (is_autodiff_v<T_y> || is_autodiff_v<T_inv_scale>) {
167-
const auto log_y = log(y_val);
168-
const auto alpha_minus_one = fma(alpha_val, log_y, -log_y);
170+
const T_partials_return log_y = log(y_val);
171+
const T_partials_return alpha_minus_one = fma(alpha_val, log_y, -log_y);
169172

170-
const auto log_pdf = alpha_val * log(beta_val)
173+
const T_partials_return log_pdf = alpha_val * log(beta_val)
171174
- lgamma(alpha_val) + alpha_minus_one
172175
- beta_y;
173176

174-
const auto hazard = exp(log_pdf - result->first); // f/Q
177+
const T_partials_return hazard = exp(log_pdf - result->first); // f/Q
175178

176179
if constexpr (is_autodiff_v<T_y>) {
177180
partials<0>(ops_partials)[n] -= hazard;

0 commit comments

Comments
 (0)