9#ifndef EVENTPRIMITIVES_EVENTPRIMITIVESCOVARIANCEHELPERS_H
10#define EVENTPRIMITIVES_EVENTPRIMITIVESCOVARIANCEHELPERS_H
14#include <Eigen/Cholesky>
64 constexpr double upper_covariance_cutoff = std::numeric_limits<float>::max();
65 return !(std::isnan(ele) || std::isinf(ele) ||
66 std::abs(ele) > upper_covariance_cutoff);
74 constexpr int dim = N;
75 for (
int i = 0; i < dim; ++i) {
84 for (
int i = 0; i < dim; ++i) {
97 constexpr double MIN_COV_EPSILON = std::numeric_limits<float>::min();
98 constexpr int dim = N;
99 for (
int i = 0; i < dim; ++i) {
106 constexpr double MIN_COV_EPSILON = std::numeric_limits<float>::min();
107 int dim = mat.rows();
108 for (
int i = 0; i < dim; ++i) {
124 return (ldltCov.info() == Eigen::Success && ldltCov.isPositive());
131 Eigen::LDLT<Amg::MatrixX> ldltCov(mat);
132 return (ldltCov.info() == Eigen::Success && ldltCov.isPositive());
144 return (lltCov.info() == Eigen::Success);
151 Eigen::LLT<Amg::MatrixX> lltCov(mat);
152 return (lltCov.info() == Eigen::Success);
163 Eigen::SelfAdjointEigenSolver<
AmgSymMatrix(5)> eigensolver(mat);
164 auto res = eigensolver.eigenvalues();
165 for (
size_t i = 0; i < N; ++i) {
177 Eigen::SelfAdjointEigenSolver<Amg::MatrixX> eigensolver(mat);
178 auto res = eigensolver.eigenvalues();
179 int dim = mat.rows();
180 for (
int i = 0; i < dim; ++i) {
193 Eigen::SelfAdjointEigenSolver<
AmgSymMatrix(5)> eigensolver(mat);
194 auto res = eigensolver.eigenvalues();
195 for (
size_t i = 0; i < N; ++i) {
207 Eigen::SelfAdjointEigenSolver<Amg::MatrixX> eigensolver(mat);
208 auto res = eigensolver.eigenvalues();
209 int dim = mat.rows();
210 for (
int i = 0; i < dim; ++i) {
220template <
typename T,
typename U>
221inline double chi2(
const T& precision,
const U& residual,
const int sign = 1) {
222 return sign * residual.transpose() * precision * residual;
#define AmgSymMatrix(dim)
std::pair< std::vector< unsigned int >, bool > res
Definition of ATLAS Math & Geometry primitives (Amg)
bool isPositiveDefinite(const AmgSymMatrix(N) &mat)
Check if is positive semidefinit using that fact that is needed for Cholesky decomposition.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
bool isPositiveSemiDefinite(const AmgSymMatrix(N) &mat)
Check if is positive semidefinit using that fact that is needed for Cholesky decomposition.
double chi2(const T &precision, const U &residual, const int sign=1)
bool saneCovarianceElement(double ele)
A covariance matrix formally needs to be positive semi definite.
bool hasPositiveDiagElems(const AmgSymMatrix(N) &mat)
Returns true if all diagonal elements of the covariance matrix are finite aka sane in the above defin...
bool hasPositiveOrZeroDiagElems(const AmgSymMatrix(N) &mat)
Returns true if all diagonal elements of the covariance matrix are finite aka sane in the above defin...
bool isPositiveDefiniteSlow(const AmgSymMatrix(N) &mat)
bool isPositiveSemiDefiniteSlow(const AmgSymMatrix(N) &mat)
These are the slow test following the definition.