33#include < cmath> // for sqrt
44#include < lmisolver/ldlt_ext.hpp>
55
6+ template <typename Arr036>
7+ ldlt_ext<Arr036>::ldlt_ext(size_t N)
8+ : witness_vec(0.0 , N), _n{N}, T{N} {
9+ }
10+
611/* *
712 * @brief witness that certifies $A$ is not
813 * symmetric positive definite (spd)
@@ -16,11 +21,11 @@ template <typename Arr036> auto ldlt_ext<Arr036>::witness() -> double {
1621 const auto &start = this ->p .first ;
1722 const auto &n = this ->p .second ;
1823 auto m = n - 1 ; // assume stop > 0
19- this ->witness_vec (m) = 1 .;
24+ this ->witness_vec [m] = 1.0 ;
2025 for (auto i = m; i > start; --i) {
21- this ->witness_vec ( i - 1 ) = 0 .;
26+ this ->witness_vec [ i - 1 ] = 0.0 ;
2227 for (auto k = i; k != n; ++k) {
23- this ->witness_vec ( i - 1 ) -= this ->T (k, i - 1 ) * this ->witness_vec (k) ;
28+ this ->witness_vec [ i - 1 ] -= this ->T (k, i - 1 ) * this ->witness_vec [k] ;
2429 }
2530 }
2631 return -this ->T (m, m);
@@ -33,7 +38,7 @@ template <typename Arr036> auto ldlt_ext<Arr036>::witness() -> double {
3338 * @return double
3439 */
3540template <typename Arr036>
36- auto ldlt_ext<Arr036>::sym_quad(const typename ldlt_ext< Arr036>::Vec &A) const
41+ auto ldlt_ext<Arr036>::sym_quad(const Arr036 &A) const
3742 -> double {
3843 auto res = double {};
3944 const auto &v = this ->witness_vec ;
@@ -43,9 +48,9 @@ auto ldlt_ext<Arr036>::sym_quad(const typename ldlt_ext<Arr036>::Vec &A) const
4348 for (auto i = start; i != stop; ++i) {
4449 auto s = double {};
4550 for (auto j = i + 1 ; j != stop; ++j) {
46- s += A (i, j) * v (j) ;
51+ s += A (i, j) * v[j] ;
4752 }
48- res += v (i) * (A (i, i) * v (i) + 2 * s);
53+ res += v[i] * (A (i, i) * v[i] + 2 * s);
4954 }
5055 return res;
5156}
@@ -57,21 +62,16 @@ auto ldlt_ext<Arr036>::sym_quad(const typename ldlt_ext<Arr036>::Vec &A) const
5762
5863using Arr = xt::xarray<double , xt::layout_type::row_major>;
5964
60- template <typename Arr036>
61- ldlt_ext<Arr036>::ldlt_ext(size_t N)
62- : witness_vec{xt::zeros<double >({N})}, _n{N}, T{xt::zeros<double >({N, N})} {
63- }
64-
6565/* *
6666 * @brief Return upper triangular matrix $R$ where $A = R^T R$
6767 *
6868 * @return typename ldlt_ext<Arr036>::Mat
6969 */
7070template <typename Arr036>
71- auto ldlt_ext<Arr036>::sqrt() -> typename ldlt_ext< Arr036>::Mat {
71+ auto ldlt_ext<Arr036>::sqrt() -> Arr036 {
7272 assert (this ->is_spd ());
7373
74- ldlt_ext< Arr036>::Mat M = xt::zeros<double >({this ->_n , this ->_n });
74+ Arr036 M = xt::zeros<double >({this ->_n , this ->_n });
7575 for (auto i = 0U ; i != this ->_n ; ++i) {
7676 M (i, i) = std::sqrt (this ->T (i, i));
7777 for (auto j = i + 1 ; j != this ->_n ; ++j) {
@@ -81,4 +81,4 @@ auto ldlt_ext<Arr036>::sqrt() -> typename ldlt_ext<Arr036>::Mat {
8181 return M;
8282}
8383
84- template class ldlt_ext <Arr>;
84+ template class ldlt_ext <Arr>;
0 commit comments