22#include <Eigen/src/Core/ArithmeticSequence.h>
23#include <Eigen/src/Core/MatrixBase.h>
24#include <Eigen/src/Core/util/Meta.h>
39template<
typename DerivedL,
typename DerivedZ,
typename DerivedA>
40void gauss(Eigen::MatrixBase<DerivedL>& L, Eigen::Index i, Eigen::Index j, Eigen::MatrixBase<DerivedA>& a, Eigen::MatrixBase<DerivedZ>& Z, Eigen::Index n)
44 auto mu = std::round(L(i, j));
47 L(seq(i, n - 1), j) -= mu * L(seq(i, n - 1), i);
48 Z(seq(0, n - 1), j) -= mu * Z(seq(0, n - 1), i);
61template<
typename DerivedL,
typename DerivedD,
typename DerivedA,
typename DerivedZ>
62void permute(Eigen::MatrixBase<DerivedL>& L, Eigen::MatrixBase<DerivedD>& D, Eigen::Index k,
double delta, Eigen::MatrixBase<DerivedA>& a, Eigen::MatrixBase<DerivedZ>& Z, Eigen::Index n)
66 auto eta = D(k) / delta;
67 auto lambda = D(k + 1) * L(k + 1, k) / delta;
68 D(k) = eta * D(k + 1);
71 L(seq(k, k + 1), seq(0, k - 1)) = (Eigen::MatrixXd(2, 2) << -L(k + 1, k), 1,
74 * L(seq(k, k + 1), seq(0, k - 1));
76 L(seq(k + 2, n - 1), k).swap(L(seq(k + 2, n - 1), k + 1));
77 Z.col(k).swap(Z.col(k + 1));
78 std::swap(a(k), a(k + 1));
88template<
typename DerivedA,
typename DerivedQ>
89[[nodiscard]] std::optional<std::tuple<
typename DerivedQ::PlainObject,
90 typename DerivedQ::PlainObject,
91 typename DerivedQ::PlainObject,
92 typename DerivedA::PlainObject,
93 typename DerivedA::PlainObject>>
96 static_assert(DerivedA::ColsAtCompileTime == Eigen::Dynamic || DerivedA::ColsAtCompileTime == 1);
103 if (!ltdl_decomp) {
return {}; }
104 auto [L, D] = *ltdl_decomp;
106 typename DerivedQ::PlainObject Z;
107 if constexpr (DerivedQ::RowsAtCompileTime == Eigen::Dynamic) { Z.setIdentity(n, n); }
108 else { Z.setIdentity(); }
110 typename DerivedA::PlainObject z = a;
119 for (
auto i = k + 1; i < n; i++)
124 auto delta = D(k) + std::pow(L(k + 1, k), 2) * D(k + 1);
125 if (delta + 1e-6 < D(k + 1))
137 typename DerivedQ::PlainObject Qz = Z.transpose() * Q * Z;
139 return std::make_tuple(Qz, Z, L, D, z);
#define INS_ASSERT_USER_ERROR(_EXP, _MSG)
Assert function with message.
Utility class for logging to console and file.
void gauss(Eigen::MatrixBase< DerivedL > &L, Eigen::Index i, Eigen::Index j, Eigen::MatrixBase< DerivedA > &a, Eigen::MatrixBase< DerivedZ > &Z, Eigen::Index n)
chang2005 Chang 2005, Integer Gauss Transformations algorithm
void permute(Eigen::MatrixBase< DerivedL > &L, Eigen::MatrixBase< DerivedD > &D, Eigen::Index k, double delta, Eigen::MatrixBase< DerivedA > &a, Eigen::MatrixBase< DerivedZ > &Z, Eigen::Index n)
chang2005 Chang 2005, Permutations algorithm
std::optional< std::tuple< typename DerivedQ::PlainObject, typename DerivedQ::PlainObject, typename DerivedQ::PlainObject, typename DerivedA::PlainObject, typename DerivedA::PlainObject > > decorrelate_ztrafo(const Eigen::MatrixBase< DerivedA > &a, const Eigen::MatrixBase< DerivedQ > &Q)
Decorrelates the ambiguities.
std::optional< std::pair< Eigen::Matrix< typename Derived::Scalar, Derived::RowsAtCompileTime, Derived::ColsAtCompileTime >, Eigen::Vector< typename Derived::Scalar, Derived::RowsAtCompileTime > > > LtDLdecomp_choleskyFact(const Eigen::MatrixBase< Derived > &Q)
Find (L^T D L)-decomposition of Q-matrix via a backward Cholesky factorization in a bordering method ...