Skip to content

Commit 8b3204e

Browse files
author
Jachym.Barvinek
committed
fix broken rev test
1 parent 02de278 commit 8b3204e

2 files changed

Lines changed: 19 additions & 88 deletions

File tree

stan/math/prim/prob/multinomial_logit_glm_lpmf.hpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ namespace math {
7878
* @throw std::invalid_argument if container sizes mismatch
7979
*/
8080
template <bool propto, typename T_x, typename T_alpha, typename T_beta,
81-
require_eigen_matrix_dynamic_t<T_x>* = nullptr,
81+
require_matrix_t<T_x>* = nullptr,
8282
require_matrix_t<T_alpha>* = nullptr,
8383
require_matrix_t<T_beta>* = nullptr>
8484
inline return_type_t<T_x, T_alpha, T_beta> multinomial_logit_glm_lpmf(
@@ -185,10 +185,7 @@ inline return_type_t<T_x, T_alpha, T_beta> multinomial_logit_glm_lpmf(
185185
return ops_partials.build(logp);
186186
}
187187

188-
template <typename T_x, typename T_alpha, typename T_beta,
189-
require_eigen_matrix_dynamic_t<T_x>* = nullptr,
190-
require_matrix_t<T_alpha>* = nullptr,
191-
require_matrix_t<T_beta>* = nullptr>
188+
template <typename T_x, typename T_alpha, typename T_beta>
192189
inline return_type_t<T_x, T_alpha, T_beta> multinomial_logit_glm_lpmf(
193190
const std::vector<std::vector<int>>& y, const T_x& x, const T_alpha& alpha,
194191
const T_beta& beta) {

test/unit/math/rev/prob/multinomial_logit_glm_lpmf_test.cpp

Lines changed: 17 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,12 @@ TYPED_TEST(ProbDistributionsMultinomialLogitGLM, glm_matches_simple_vars) {
6868
Eigen::RowVectorXd alpha_val(K);
6969
alpha_val << 0.2, -0.1, 0.5;
7070

71-
matrix_v x1 = x_val, x2 = x_val;
72-
matrix_v beta1 = beta_val, beta2 = beta_val;
73-
row_vector_v alpha1 = alpha_val, alpha2 = alpha_val;
71+
// Reference always uses Matrix<var> so multinomial_logit_lpmf can extract rows.
72+
Eigen::Matrix<var, Eigen::Dynamic, Eigen::Dynamic> x1 = x_val, beta1 = beta_val;
73+
Eigen::Matrix<var, 1, Eigen::Dynamic> alpha1 = alpha_val;
74+
matrix_v x2 = x_val;
75+
matrix_v beta2 = beta_val;
76+
row_vector_v alpha2 = alpha_val;
7477

7578
var res1 = multinomial_logit_glm_simple_lpmf<false>(y, x1, alpha1, beta1);
7679
var res2 = multinomial_logit_glm_lpmf(y, x2, alpha2, beta2);
@@ -101,42 +104,6 @@ TYPED_TEST(ProbDistributionsMultinomialLogitGLM, glm_matches_simple_vars) {
101104
EXPECT_NEAR(alpha1.adj()[i], alpha2.adj()[i], eps);
102105
}
103106

104-
TYPED_TEST(ProbDistributionsMultinomialLogitGLM, x_broadcasting) {
105-
using stan::math::multinomial_logit_glm_lpmf;
106-
using stan::math::var;
107-
using matrix_v = typename TypeParam::matrix_v;
108-
using row_vector_v = typename TypeParam::row_vector_v;
109-
const size_t N = 4, M = 2, K = 3;
110-
const double eps = 1e-13;
111-
std::vector<std::vector<int>> y{{1, 2, 0}, {3, 0, 1}, {0, 1, 4}, {2, 2, 1}};
112-
Eigen::RowVectorXd x_row_val(M);
113-
x_row_val << 0.7, -0.3;
114-
Eigen::MatrixXd beta_val(M, K);
115-
beta_val << 0.4, -0.1, 0.2, -0.2, 0.5, -0.1;
116-
Eigen::RowVectorXd alpha_val(K);
117-
alpha_val << 0.1, 0.2, -0.3;
118-
119-
row_vector_v x_row = x_row_val;
120-
matrix_v x_full = x_row_val.replicate(N, 1);
121-
matrix_v beta1 = beta_val, beta2 = beta_val;
122-
row_vector_v alpha1 = alpha_val, alpha2 = alpha_val;
123-
124-
var res1 = multinomial_logit_glm_lpmf(y, x_row, alpha1, beta1);
125-
var res2 = multinomial_logit_glm_lpmf(y, x_full, alpha2, beta2);
126-
(res1 + res2).grad();
127-
EXPECT_NEAR(res1.val(), res2.val(), eps);
128-
for (size_t i = 0; i < M; ++i) {
129-
double x_sum = 0;
130-
for (size_t j = 0; j < N; ++j)
131-
x_sum += x_full.adj()(j, i);
132-
EXPECT_NEAR(x_row.adj()[i], x_sum, eps);
133-
for (size_t j = 0; j < K; ++j)
134-
EXPECT_NEAR(beta1.adj()(i, j), beta2.adj()(i, j), eps);
135-
}
136-
for (size_t i = 0; i < K; ++i)
137-
EXPECT_NEAR(alpha1.adj()[i], alpha2.adj()[i], eps);
138-
}
139-
140107
TYPED_TEST(ProbDistributionsMultinomialLogitGLM, glm_matches_simple_big) {
141108
using stan::math::multinomial_logit_glm_lpmf;
142109
using stan::math::var;
@@ -154,9 +121,11 @@ TYPED_TEST(ProbDistributionsMultinomialLogitGLM, glm_matches_simple_big) {
154121
Eigen::MatrixXd beta_val = Eigen::MatrixXd::Random(M, K);
155122
Eigen::RowVectorXd alpha_val = Eigen::RowVectorXd::Random(K);
156123

157-
matrix_v x1 = x_val, x2 = x_val;
158-
matrix_v beta1 = beta_val, beta2 = beta_val;
159-
row_vector_v alpha1 = alpha_val, alpha2 = alpha_val;
124+
Eigen::Matrix<var, Eigen::Dynamic, Eigen::Dynamic> x1 = x_val, beta1 = beta_val;
125+
Eigen::Matrix<var, 1, Eigen::Dynamic> alpha1 = alpha_val;
126+
matrix_v x2 = x_val;
127+
matrix_v beta2 = beta_val;
128+
row_vector_v alpha2 = alpha_val;
160129

161130
var res1 = multinomial_logit_glm_simple_lpmf<false>(y, x1, alpha1, beta1);
162131
var res2 = multinomial_logit_glm_lpmf(y, x2, alpha2, beta2);
@@ -176,7 +145,6 @@ TYPED_TEST(ProbDistributionsMultinomialLogitGLM, matrix_alpha_grads) {
176145
using stan::math::multinomial_logit_glm_lpmf;
177146
using stan::math::var;
178147
using matrix_v = typename TypeParam::matrix_v;
179-
using row_vector_v = typename TypeParam::row_vector_v;
180148
const size_t N = 4, M = 2, K = 3;
181149
const double eps = 1e-13;
182150
std::vector<std::vector<int>> y{{2, 1, 3}, {0, 4, 1}, {3, 0, 2}, {1, 2, 0}};
@@ -186,13 +154,13 @@ TYPED_TEST(ProbDistributionsMultinomialLogitGLM, matrix_alpha_grads) {
186154
alpha_val << 0.2, -0.1, 0.5, -0.3, 0.4, 0.1, 0.1, 0.0, -0.2, 0.5, -0.3, 0.2;
187155
Eigen::MatrixXd beta_val(M, K);
188156
beta_val << 0.3, -0.2, 0.1, -0.1, 0.4, -0.3;
189-
Eigen::RowVectorXd x_row_val(M);
190-
x_row_val << 0.7, -0.3;
191-
192157
// full x + matrix alpha: exercises the T_alpha_rows != 1 gradient path
193-
matrix_v x1 = x_val, x2 = x_val;
194-
matrix_v alpha1 = alpha_val, alpha2 = alpha_val;
195-
matrix_v beta1 = beta_val, beta2 = beta_val;
158+
// Reference uses Matrix<var> so multinomial_logit_lpmf can extract Eigen rows.
159+
Eigen::Matrix<var, Eigen::Dynamic, Eigen::Dynamic> x1 = x_val, alpha1 = alpha_val,
160+
beta1 = beta_val;
161+
matrix_v x2 = x_val;
162+
matrix_v alpha2 = alpha_val;
163+
matrix_v beta2 = beta_val;
196164

197165
var res1 = 0.0;
198166
{
@@ -214,29 +182,6 @@ TYPED_TEST(ProbDistributionsMultinomialLogitGLM, matrix_alpha_grads) {
214182
for (size_t k = 0; k < K; ++k)
215183
EXPECT_NEAR(alpha1.adj()(n, k), alpha2.adj()(n, k), eps);
216184

217-
stan::math::set_zero_all_adjoints();
218-
219-
// broadcast x + matrix alpha: exercises the sum_delta_for_x gradient path
220-
row_vector_v x_row = x_row_val;
221-
matrix_v x_full = x_row_val.replicate(N, 1);
222-
matrix_v alpha3 = alpha_val, alpha4 = alpha_val;
223-
matrix_v beta3 = beta_val, beta4 = beta_val;
224-
225-
var res3 = multinomial_logit_glm_lpmf(y, x_full, alpha3, beta3);
226-
var res4 = multinomial_logit_glm_lpmf(y, x_row, alpha4, beta4);
227-
(res3 + res4).grad();
228-
EXPECT_NEAR(res3.val(), res4.val(), eps);
229-
for (size_t i = 0; i < M; ++i) {
230-
double x_sum = 0;
231-
for (size_t j = 0; j < N; ++j)
232-
x_sum += x_full.adj()(j, i);
233-
EXPECT_NEAR(x_row.adj()[i], x_sum, eps);
234-
for (size_t j = 0; j < K; ++j)
235-
EXPECT_NEAR(beta3.adj()(i, j), beta4.adj()(i, j), eps);
236-
}
237-
for (size_t n = 0; n < N; ++n)
238-
for (size_t k = 0; k < K; ++k)
239-
EXPECT_NEAR(alpha3.adj()(n, k), alpha4.adj()(n, k), eps);
240185
}
241186

242187
TYPED_TEST(ProbDistributionsMultinomialLogitGLM, interfaces) {
@@ -247,14 +192,12 @@ TYPED_TEST(ProbDistributionsMultinomialLogitGLM, interfaces) {
247192
std::vector<std::vector<int>> y{{1, 2, 0}, {0, 1, 3}, {2, 0, 1}};
248193
Eigen::MatrixXd x_d(N, M);
249194
x_d << 1.0, -0.5, 0.3, 0.7, -0.2, 0.4;
250-
Eigen::RowVectorXd x_row_d = x_d.row(0);
251195
Eigen::MatrixXd beta_d(M, K);
252196
beta_d << 0.1, 0.2, 0.3, 0.4, 0.5, 0.6;
253197
Eigen::RowVectorXd alpha_d(K);
254198
alpha_d << 0.1, 0.2, 0.3;
255199

256200
matrix_v x_v = x_d;
257-
row_vector_v x_row_v = x_row_d;
258201
matrix_v beta_v = beta_d;
259202
row_vector_v alpha_v = alpha_d;
260203

@@ -266,13 +209,4 @@ TYPED_TEST(ProbDistributionsMultinomialLogitGLM, interfaces) {
266209
EXPECT_NO_THROW(multinomial_logit_glm_lpmf(y, x_v, alpha_d, beta_v));
267210
EXPECT_NO_THROW(multinomial_logit_glm_lpmf(y, x_d, alpha_v, beta_v));
268211
EXPECT_NO_THROW(multinomial_logit_glm_lpmf(y, x_v, alpha_v, beta_v));
269-
270-
EXPECT_NO_THROW(multinomial_logit_glm_lpmf(y, x_row_d, alpha_d, beta_d));
271-
EXPECT_NO_THROW(multinomial_logit_glm_lpmf(y, x_row_v, alpha_d, beta_d));
272-
EXPECT_NO_THROW(multinomial_logit_glm_lpmf(y, x_row_d, alpha_v, beta_d));
273-
EXPECT_NO_THROW(multinomial_logit_glm_lpmf(y, x_row_d, alpha_d, beta_v));
274-
EXPECT_NO_THROW(multinomial_logit_glm_lpmf(y, x_row_v, alpha_v, beta_d));
275-
EXPECT_NO_THROW(multinomial_logit_glm_lpmf(y, x_row_v, alpha_d, beta_v));
276-
EXPECT_NO_THROW(multinomial_logit_glm_lpmf(y, x_row_d, alpha_v, beta_v));
277-
EXPECT_NO_THROW(multinomial_logit_glm_lpmf(y, x_row_v, alpha_v, beta_v));
278212
}

0 commit comments

Comments
 (0)