Skip to content

Commit 2bd56da

Browse files
committed
Updates from review round 2
1 parent bb657f5 commit 2bd56da

20 files changed

Lines changed: 57 additions & 42 deletions

stan/math/prim/fun/complex_schur_decompose.hpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@ namespace math {
2727
template <typename M, require_eigen_dense_dynamic_t<M>* = nullptr>
2828
inline Eigen::Matrix<complex_return_t<scalar_type_t<M>>, -1, -1>
2929
complex_schur_decompose_u(const M& m) {
30-
if (m.size() == 0)
30+
if (unlikely(m.size() == 0)) {
3131
return m;
32+
}
3233
check_square("complex_schur_decompose_u", "m", m);
3334
using MatType = Eigen::Matrix<scalar_type_t<M>, -1, -1>;
3435
// copy because ComplexSchur requires Eigen::Matrix type
35-
MatType mv = m;
36-
Eigen::ComplexSchur<MatType> cs(mv);
36+
Eigen::ComplexSchur<MatType> cs{MatType(m)};
3737
return cs.matrixU();
3838
}
3939

@@ -51,13 +51,13 @@ complex_schur_decompose_u(const M& m) {
5151
template <typename M, require_eigen_dense_dynamic_t<M>* = nullptr>
5252
inline Eigen::Matrix<complex_return_t<scalar_type_t<M>>, -1, -1>
5353
complex_schur_decompose_t(const M& m) {
54-
if (m.size() == 0)
54+
if (unlikely(m.size() == 0)) {
5555
return m;
56+
}
5657
check_square("complex_schur_decompose_t", "m", m);
5758
using MatType = Eigen::Matrix<scalar_type_t<M>, -1, -1>;
5859
// copy because ComplexSchur requires Eigen::Matrix type
59-
MatType mv = m;
60-
Eigen::ComplexSchur<MatType> cs(mv, false);
60+
Eigen::ComplexSchur<MatType> cs{MatType(m), false};
6161
return cs.matrixT();
6262
}
6363

@@ -81,13 +81,13 @@ template <typename M, require_eigen_dense_dynamic_t<M>* = nullptr>
8181
inline std::tuple<Eigen::Matrix<complex_return_t<scalar_type_t<M>>, -1, -1>,
8282
Eigen::Matrix<complex_return_t<scalar_type_t<M>>, -1, -1>>
8383
complex_schur_decompose(const M& m) {
84-
if (m.size() == 0)
84+
if (unlikely(m.size() == 0)) {
8585
return std::make_tuple(m, m);
86+
}
8687
check_square("complex_schur_decompose", "m", m);
8788
using MatType = Eigen::Matrix<scalar_type_t<M>, -1, -1>;
8889
// copy because ComplexSchur requires Eigen::Matrix type
89-
MatType mv = m;
90-
Eigen::ComplexSchur<MatType> cs(mv);
90+
Eigen::ComplexSchur<MatType> cs{MatType(m)};
9191
return std::make_tuple(std::move(cs.matrixU()), std::move(cs.matrixT()));
9292
}
9393

stan/math/prim/fun/eigendecompose_sym.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ eigendecompose_sym(const EigMat& m) {
2727
return std::make_tuple(Eigen::Matrix<value_type_t<EigMat>, -1, -1>(0, 0),
2828
Eigen::Matrix<value_type_t<EigMat>, -1, 1>(0, 1));
2929
}
30-
check_symmetric("eigendecompose_sym", "m", m);
3130
using PlainMat = plain_type_t<EigMat>;
3231
const PlainMat& m_eval = m;
32+
check_symmetric("eigendecompose_sym", "m", m_eval);
3333

3434
Eigen::SelfAdjointEigenSolver<PlainMat> solver(m_eval);
3535
return std::make_tuple(std::move(solver.eigenvectors()),

stan/math/prim/fun/eigenvalues_sym.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ Eigen::Matrix<value_type_t<EigMat>, -1, 1> eigenvalues_sym(const EigMat& m) {
2424
if (unlikely(m.size() == 0)) {
2525
return Eigen::Matrix<value_type_t<EigMat>, -1, 1>(0, 1);
2626
}
27-
check_symmetric("eigenvalues_sym", "m", m);
2827
using PlainMat = plain_type_t<EigMat>;
2928
const PlainMat& m_eval = m;
29+
check_symmetric("eigenvalues_sym", "m", m_eval);
3030

3131
Eigen::SelfAdjointEigenSolver<PlainMat> solver(m_eval,
3232
Eigen::EigenvaluesOnly);

stan/math/prim/fun/eigenvectors_sym.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ eigenvectors_sym(const EigMat& m) {
1515
if (unlikely(m.size() == 0)) {
1616
return Eigen::Matrix<value_type_t<EigMat>, -1, -1>(0, 0);
1717
}
18-
check_symmetric("eigenvalues_sym", "m", m);
19-
2018
using PlainMat = plain_type_t<EigMat>;
2119
const PlainMat& m_eval = m;
20+
check_symmetric("eigenvalues_sym", "m", m_eval);
21+
2222

2323
Eigen::SelfAdjointEigenSolver<PlainMat> solver(m_eval);
2424
return solver.eigenvectors();

stan/math/prim/fun/singular_values.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ namespace math {
2121
template <typename EigMat, require_eigen_matrix_dynamic_t<EigMat>* = nullptr,
2222
require_not_st_var<EigMat>* = nullptr>
2323
auto singular_values(const EigMat& m) {
24-
check_nonzero_size("singular_values", "m", m);
25-
24+
if (unlikely(m.size() == 0)) {
25+
return Eigen::Matrix<base_type_t<EigMat>, Eigen::Dynamic, 1>(0, 1);
26+
}
2627
return Eigen::JacobiSVD<Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic,
2728
Eigen::Dynamic> >(m)
2829
.singularValues();

stan/math/prim/fun/svd.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,11 @@ std::tuple<Eigen::Matrix<value_type_t<EigMat>, -1, -1>,
2222
Eigen::Matrix<base_type_t<EigMat>, -1, 1>,
2323
Eigen::Matrix<value_type_t<EigMat>, -1, -1>>
2424
svd(const EigMat& m) {
25-
check_nonzero_size("svd", "m", m);
25+
if (unlikely(m.size() == 0)) {
26+
return std::make_tuple(Eigen::Matrix<value_type_t<EigMat>, -1, -1>(0, 0),
27+
Eigen::Matrix<base_type_t<EigMat>, -1, 1>(0, 1),
28+
Eigen::Matrix<value_type_t<EigMat>, -1, -1>(0, 0));
29+
}
2630

2731
Eigen::JacobiSVD<Eigen::Matrix<value_type_t<EigMat>, -1, -1>> svd(
2832
m, Eigen::ComputeThinU | Eigen::ComputeThinV);

stan/math/prim/fun/svd_U.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ template <typename EigMat, require_eigen_matrix_dynamic_t<EigMat>* = nullptr,
1818
require_not_st_var<EigMat>* = nullptr>
1919
Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic, Eigen::Dynamic> svd_U(
2020
const EigMat& m) {
21-
check_nonzero_size("svd_U", "m", m);
22-
23-
return Eigen::JacobiSVD<Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic,
24-
Eigen::Dynamic> >(m,
25-
Eigen::ComputeThinU)
26-
.matrixU();
21+
using MatType
22+
= Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic, Eigen::Dynamic>;
23+
if (unlikely(m.size() == 0)) {
24+
return MatType(0, 0);
25+
}
26+
return Eigen::JacobiSVD<MatType> (m, Eigen::ComputeThinU).matrixU();
2727
}
2828

2929
} // namespace math

stan/math/prim/fun/svd_V.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ template <typename EigMat, require_eigen_matrix_dynamic_t<EigMat>* = nullptr,
1818
require_not_st_var<EigMat>* = nullptr>
1919
Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic, Eigen::Dynamic> svd_V(
2020
const EigMat& m) {
21-
check_nonzero_size("svd_V", "m", m);
22-
23-
return Eigen::JacobiSVD<Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic,
24-
Eigen::Dynamic> >(m,
25-
Eigen::ComputeThinV)
26-
.matrixV();
21+
using MatType
22+
= Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic, Eigen::Dynamic>;
23+
if (unlikely(m.size() == 0)) {
24+
return MatType(0, 0);
25+
}
26+
return Eigen::JacobiSVD<MatType>(m, Eigen::ComputeThinV).matrixV();
2727
}
2828

2929
} // namespace math

stan/math/rev/fun/singular_values.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ namespace math {
2222
template <typename EigMat, require_rev_matrix_t<EigMat>* = nullptr>
2323
inline auto singular_values(const EigMat& m) {
2424
using ret_type = return_var_matrix_t<Eigen::VectorXd, EigMat>;
25-
check_nonzero_size("singular_values", "m", m);
25+
if (unlikely(m.size() == 0)) {
26+
return ret_type(Eigen::VectorXd(0));
27+
}
2628

2729
auto arena_m = to_arena(m);
2830

stan/math/rev/fun/svd.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,11 @@ inline auto svd(const EigMat& m) {
2828
using mat_ret_type = return_var_matrix_t<Eigen::MatrixXd, EigMat>;
2929
using vec_ret_type = return_var_matrix_t<Eigen::VectorXd, EigMat>;
3030

31-
check_nonzero_size("svd", "m", m);
31+
if (unlikely(m.size() == 0)) {
32+
return std::make_tuple(mat_ret_type(Eigen::MatrixXd(0, 0)),
33+
vec_ret_type(Eigen::VectorXd(0, 1)),
34+
mat_ret_type(Eigen::MatrixXd(0, 0)));
35+
}
3236

3337
const int M = std::min(m.rows(), m.cols());
3438
auto arena_m = to_arena(m);

0 commit comments

Comments
 (0)