@@ -27,6 +27,35 @@ void expect_matvar(const T1& x, const T2& lb) {
27
27
stan::test::expect_ad_matvar (f3, x, lb);
28
28
stan::test::expect_ad_matvar (f4, x, lb);
29
29
}
30
+
31
+ template <typename T1, typename T2>
32
+ void expect_vec_matvar (const T1& x, const T2& lb) {
33
+ auto f1 = [](const auto & x, const auto & lb) {
34
+ return stan::math::lb_constrain (x, lb);
35
+ };
36
+ auto f2 = [](const auto & x, const auto & lb) {
37
+ stan::return_type_t <decltype (x), decltype (lb)> lp = 0 ;
38
+ return stan::math::lb_constrain (x, lb, lp);
39
+ };
40
+ auto f3 = [](const auto & x, const auto & lb) {
41
+ stan::return_type_t <decltype (x), decltype (lb)> lp = 0 ;
42
+ stan::math::lb_constrain (x, lb, lp);
43
+ return lp;
44
+ };
45
+ auto f4 = [](const auto & x, const auto & lb) {
46
+ stan::return_type_t <decltype (x), decltype (lb)> lp = 0 ;
47
+ auto xx = stan::math::eval (stan::math::lb_constrain (x, lb, lp));
48
+ stan::return_type_t <decltype (x), decltype (lb)> xx_acc = 0 ;
49
+ for (size_t i = 0 ; i < xx.size (); ++i) {
50
+ xx_acc += stan::math::sum (xx[i]);
51
+ }
52
+ return stan::math::add (lp, xx_acc);
53
+ };
54
+ stan::test::expect_ad_matvar (f1, x, lb);
55
+ stan::test::expect_ad_matvar (f2, x, lb);
56
+ stan::test::expect_ad_matvar (f3, x, lb);
57
+ stan::test::expect_ad_matvar (f4, x, lb);
58
+ }
30
59
} // namespace lb_constrain_test
31
60
32
61
TEST (mathMixMatFun, lb_matvar_constrain) {
@@ -37,7 +66,10 @@ TEST(mathMixMatFun, lb_matvar_constrain) {
37
66
A << 5.0 , 2.0 , 0.0 , 0.005 ;
38
67
Eigen::MatrixXd lbm (2 , 2 );
39
68
lbm << 7.0 , 5.0 , 0.0 , 0.0005 ;
69
+ Eigen::MatrixXd lbm_bad (2 , 1 );
70
+ lbm_bad << 7.0 , 5.0 ;
40
71
lb_constrain_test::expect_matvar (A, lbm);
72
+ lb_constrain_test::expect_matvar (A, lbm_bad);
41
73
double lbd = 6.0 ;
42
74
lb_constrain_test::expect_matvar (A, lbd);
43
75
}
@@ -50,3 +82,77 @@ TEST(mathMixMatFun, lb_matvar_constrain_neg_inf) {
50
82
lb_constrain_test::expect_matvar (A, lbm);
51
83
lb_constrain_test::expect_matvar (A, stan::math::NEGATIVE_INFTY);
52
84
}
85
+
86
+ // matrix[], matrix
87
+ // matrix[], real
88
+ TEST (mathMixMatFun, lb_stdvec_mat_mat_constrain_matvar) {
89
+ Eigen::MatrixXd A_inner (2 , 3 );
90
+ A_inner << 5.0 , 2.0 , 4.0 , -2.0 , 0.0 , 0.005 ;
91
+ Eigen::MatrixXd lbm_inner (2 , 3 );
92
+ lbm_inner << 7.0 , 5.0 , 6.0 , 100.0 , 0.0 , 0.0005 ;
93
+ Eigen::MatrixXd lbm_inner_bad (2 , 2 );
94
+ lbm_inner_bad << 7.0 , 5.0 , 6.0 , 100.0 ;
95
+ Eigen::MatrixXd A_inner2 = 2.0 * A_inner;
96
+ std::vector<Eigen::MatrixXd> A;
97
+ A.push_back (A_inner);
98
+ A.push_back (A_inner2);
99
+ lb_constrain_test::expect_vec_matvar (A, lbm_inner);
100
+ lb_constrain_test::expect_vec_matvar (A, lbm_inner_bad);
101
+ double lbd = 6.0 ;
102
+ lb_constrain_test::expect_vec_matvar (A, lbd);
103
+ }
104
+
105
+ TEST (mathMixMatFun, lb_stdvec_mat_mat_constrain_matvar_neg_inf) {
106
+ Eigen::MatrixXd A_inner (2 , 3 );
107
+ A_inner << 5.0 , 2.0 , 4.0 , -2.0 , 0.0 , 0.005 ;
108
+ Eigen::MatrixXd lbm_inner (2 , 3 );
109
+ lbm_inner << 7.0 , 5.0 , 6.0 , stan::math::NEGATIVE_INFTY, 0.0 , 0.0005 ;
110
+ Eigen::MatrixXd A_inner2 = 2.0 * A_inner;
111
+ std::vector<Eigen::MatrixXd> A;
112
+ A.push_back (A_inner);
113
+ A.push_back (A_inner2);
114
+ lb_constrain_test::expect_vec_matvar (A, lbm_inner);
115
+ double lbi = stan::math::NEGATIVE_INFTY;
116
+ lb_constrain_test::expect_vec_matvar (A, lbi);
117
+ }
118
+
119
+ // matrix[], matrix[]
120
+ TEST (mathMixMatFun, lb_stdvec_mat_constrain_matvar) {
121
+ Eigen::MatrixXd A_inner (2 , 3 );
122
+ A_inner << 5.0 , 2.0 , 4.0 , -2.0 , 0.0 , 0.005 ;
123
+ Eigen::MatrixXd lbm_inner (2 , 3 );
124
+ lbm_inner << 7.0 , 5.0 , 6.0 , 100.0 , 0.0 , 0.0005 ;
125
+ Eigen::MatrixXd A_inner2 = 2.0 * A_inner;
126
+ Eigen::MatrixXd lbm_inner2 = 3.0 * lbm_inner;
127
+ std::vector<Eigen::MatrixXd> A;
128
+ A.push_back (A_inner);
129
+ A.push_back (A_inner2);
130
+ std::vector<Eigen::MatrixXd> lbm;
131
+ lbm.push_back (lbm_inner);
132
+ lbm.push_back (lbm_inner2);
133
+ std::vector<Eigen::MatrixXd> lbm_bad1;
134
+ lbm_bad1.push_back (lbm_inner);
135
+ Eigen::MatrixXd lbm_inner_bad (2 , 2 );
136
+ lbm_inner_bad << 7.0 , 5.0 , 6.0 , 100.0 ;
137
+ std::vector<Eigen::MatrixXd> lbm_bad2;
138
+ lbm_bad2.push_back (lbm_inner_bad);
139
+ lb_constrain_test::expect_vec_matvar (A, lbm);
140
+ lb_constrain_test::expect_vec_matvar (A, lbm_bad1);
141
+ lb_constrain_test::expect_vec_matvar (A, lbm_bad2);
142
+ }
143
+
144
+ TEST (mathMixMatFun, lb_stdvec_mat_constrain_matvar_neg_inf) {
145
+ Eigen::MatrixXd A_inner (2 , 2 );
146
+ A_inner << 5.0 , 2.0 , 4.0 , -2.0 ;
147
+ Eigen::MatrixXd lbm_inner (2 , 2 );
148
+ lbm_inner << 7.0 , 5.0 , stan::math::NEGATIVE_INFTY, 100.0 ;
149
+ Eigen::MatrixXd A_inner2 = 2 * A_inner;
150
+ Eigen::MatrixXd lbm_inner2 (2 , 2 );
151
+ lbm_inner << 7.0 , stan::math::NEGATIVE_INFTY, 5.0 , 100.0 ;
152
+ std::vector<Eigen::MatrixXd> A{A_inner, A_inner2};
153
+ std::vector<Eigen::MatrixXd> lbm{lbm_inner, lbm_inner2};
154
+ lb_constrain_test::expect_vec_matvar (A, lbm);
155
+ lb_constrain_test::expect_vec_matvar (A, A_inner);
156
+ lb_constrain_test::expect_vec_matvar (A, stan::math::NEGATIVE_INFTY);
157
+ }
158
+
0 commit comments