@@ -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-
140107TYPED_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
242187TYPED_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