Skip to content

Commit a68d76d

Browse files
committed
Fix size=0 for QR
1 parent ac18c10 commit a68d76d

12 files changed

Lines changed: 27 additions & 12 deletions

File tree

stan/math/prim/fun/qr.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ std::tuple<Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic, Eigen::Dynamic>,
2525
qr(const EigMat& m) {
2626
using matrix_t
2727
= Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic, Eigen::Dynamic>;
28-
check_nonzero_size("qr", "m", m);
28+
if (unlikely(m.size() == 0)) {
29+
return std::make_tuple(matrix_t(0, 0), matrix_t(0, 0));
30+
}
31+
2932
Eigen::HouseholderQR<matrix_t> qr(m.rows(), m.cols());
3033
qr.compute(m);
3134
matrix_t Q = qr.householderQ();

stan/math/prim/fun/qr_Q.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@ Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic, Eigen::Dynamic> qr_Q(
2121
const EigMat& m) {
2222
using matrix_t
2323
= Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic, Eigen::Dynamic>;
24-
check_nonzero_size("qr_Q", "m", m);
24+
if (unlikely(m.size() == 0)) {
25+
return matrix_t(0, 0);
26+
}
27+
2528
Eigen::HouseholderQR<matrix_t> qr(m.rows(), m.cols());
2629
qr.compute(m);
2730
matrix_t Q = qr.householderQ();

stan/math/prim/fun/qr_R.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic, Eigen::Dynamic> qr_R(
2020
const EigMat& m) {
2121
using matrix_t
2222
= Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic, Eigen::Dynamic>;
23-
check_nonzero_size("qr_R", "m", m);
23+
if (unlikely(m.size() == 0)) {
24+
return matrix_t(0, 0);
25+
}
2426
Eigen::HouseholderQR<matrix_t> qr(m.rows(), m.cols());
2527
qr.compute(m);
2628
matrix_t R = qr.matrixQR();

stan/math/prim/fun/qr_thin.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ std::tuple<Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic, Eigen::Dynamic>,
2525
qr_thin(const EigMat& m) {
2626
using matrix_t
2727
= Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic, Eigen::Dynamic>;
28-
check_nonzero_size("qr_thin", "m", m);
28+
if (unlikely(m.size() == 0)) {
29+
return std::make_tuple(matrix_t(0, 0), matrix_t(0, 0));
30+
}
31+
2932
Eigen::HouseholderQR<matrix_t> qr(m.rows(), m.cols());
3033
qr.compute(m);
3134
const int min_size = std::min(m.rows(), m.cols());

stan/math/prim/fun/qr_thin_Q.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic, Eigen::Dynamic> qr_thin_Q(
2020
const EigMat& m) {
2121
using matrix_t
2222
= Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic, Eigen::Dynamic>;
23-
check_nonzero_size("qr_thin_Q", "m", m);
23+
if (unlikely(m.size() == 0)) {
24+
return matrix_t(0, 0);
25+
}
2426
Eigen::HouseholderQR<matrix_t> qr(m.rows(), m.cols());
2527
qr.compute(m);
2628
const int min_size = std::min(m.rows(), m.cols());

stan/math/prim/fun/qr_thin_R.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic, Eigen::Dynamic> qr_thin_R(
2020
const EigMat& m) {
2121
using matrix_t
2222
= Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic, Eigen::Dynamic>;
23-
check_nonzero_size("qr_thin_R", "m", m);
23+
if (unlikely(m.size() == 0)) {
24+
return matrix_t(0, 0);
25+
}
2426
Eigen::HouseholderQR<matrix_t> qr(m.rows(), m.cols());
2527
qr.compute(m);
2628
const int min_size = std::min(m.rows(), m.cols());

test/unit/math/prim/fun/qr_Q_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ TEST(MathMatrixPrimMat, qr_Q) {
88

99
using stan::math::qr_Q;
1010
using stan::math::transpose;
11-
EXPECT_THROW(qr_Q(m0), std::invalid_argument);
11+
EXPECT_NO_THROW(qr_Q(m0));
1212
EXPECT_NO_THROW(qr_Q(m1));
1313
EXPECT_NO_THROW(qr_Q(transpose(m1)));
1414
}

test/unit/math/prim/fun/qr_R_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ TEST(MathMatrixPrimMat, qr_R) {
99
using stan::math::qr_Q;
1010
using stan::math::qr_R;
1111
using stan::math::transpose;
12-
EXPECT_THROW(qr_R(m0), std::invalid_argument);
12+
EXPECT_NO_THROW(qr_R(m0));
1313
EXPECT_NO_THROW(qr_R(m1));
1414

1515
stan::math::matrix_d m2(4, 2);

test/unit/math/prim/fun/qr_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ TEST(MathMatrixPrimMat, qr) {
88

99
using stan::math::qr;
1010
using stan::math::transpose;
11-
EXPECT_THROW(qr(m0), std::invalid_argument);
11+
EXPECT_NO_THROW(qr(m0));
1212
EXPECT_NO_THROW(qr(m1));
1313

1414
stan::math::matrix_d m2(4, 2);

test/unit/math/prim/fun/qr_thin_Q_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ TEST(MathMatrixPrimMat, qr_thin_Q) {
88

99
using stan::math::qr_thin_Q;
1010
using stan::math::transpose;
11-
EXPECT_THROW(qr_thin_Q(m0), std::invalid_argument);
11+
EXPECT_NO_THROW(qr_thin_Q(m0));
1212
EXPECT_NO_THROW(qr_thin_Q(m1));
1313
EXPECT_NO_THROW(qr_thin_Q(transpose(m1)));
1414
}

0 commit comments

Comments
 (0)