10template <
class DataPo
int,
class _NFilter,
typename T>
11 requires COVARIANCE_FIT_BASE_REQUIREMENTS
18template <
class DataPo
int,
class _NFilter,
typename T>
19 requires COVARIANCE_FIT_BASE_REQUIREMENTS
27template <
class DataPo
int,
class _NFilter,
typename T>
28 requires COVARIANCE_FIT_BASE_REQUIREMENTS
32 if (Base::finalize() !=
STABLE)
33 return Base::m_eCurrentState;
35 if (Base::getNumNeighbors() < DataPoint::Dim)
39 auto centroid = Base::barycenterLocal();
43 m_solver.computeDirect(m_cov);
47 Base::m_eCurrentState = (m_solver.info() == Eigen::Success ?
STABLE :
UNDEFINED);
49 return Base::m_eCurrentState;
52template <
class DataPo
int,
class _NFilter,
typename T>
53 requires COVARIANCE_FIT_BASE_REQUIREMENTS
56 return m_solver.eigenvalues()(0) / m_solver.eigenvalues().mean();
59template <
class DataPo
int,
class _WFunctor,
typename T>
60 requires COVARIANCE_FIT_BASE_REQUIREMENTS
63 PONCA_ASSERT(DataPoint::Dim == 3);
64 return (m_solver.eigenvalues()(1) - m_solver.eigenvalues()(0)) / m_solver.eigenvalues()(2);
67template <
class DataPo
int,
class _WFunctor,
typename T>
71 PONCA_ASSERT(DataPoint::Dim == 3);
72 return (m_solver.eigenvalues()(2) - m_solver.eigenvalues()(1)) / m_solver.eigenvalues()(2);
75template <
class DataPo
int,
class _WFunctor,
typename T>
76 requires COVARIANCE_FIT_BASE_REQUIREMENTS
79 PONCA_ASSERT(DataPoint::Dim == 3);
80 return (m_solver.eigenvalues()(0)) / m_solver.eigenvalues()(2);
83template <
class DataPo
int,
class _WFunctor,
typename T>
84 requires COVARIANCE_FIT_BASE_REQUIREMENTS
87 return (m_solver.eigenvalues()(2) - m_solver.eigenvalues()(0)) / m_solver.eigenvalues()(2);
90template <
class DataPo
int,
class _WFunctor,
typename T>
91 requires COVARIANCE_FIT_BASE_REQUIREMENTS
94 return -(m_solver.eigenvalues().array() * m_solver.eigenvalues().array().log()).
matrix().sum();
97template <
class DataPo
int,
class _WFunctor,
typename T>
98 requires COVARIANCE_FIT_BASE_REQUIREMENTS
101 return m_solver.eigenvalues()(0);
104template <
class DataPo
int,
class _WFunctor,
typename T>
105 requires COVARIANCE_FIT_BASE_REQUIREMENTS
108 return m_solver.eigenvalues()(1);
111template <
class DataPo
int,
class _WFunctor,
typename T>
112 requires COVARIANCE_FIT_BASE_REQUIREMENTS
115 return m_solver.eigenvalues()(2);
118template <
class DataPo
int,
class _NFilter,
int DiffType,
typename T>
119 requires COVARIANCE_FIT_DER_REQUIREMENTS
124 for (
int k = 0; k < Base::NbDerivatives; ++k)
128template <
class DataPo
int,
class _NFilter,
int DiffType,
typename T>
129 requires COVARIANCE_FIT_DER_REQUIREMENTS
134 for (
int k = 0; k < Base::NbDerivatives; ++k)
138template <
class DataPo
int,
class _NFilter,
int DiffType,
typename T>
139 requires COVARIANCE_FIT_DER_REQUIREMENTS
142 PONCA_MULTIARCH_STD_MATH(
sqrt);
151 for (
int k = 0; k < Base::NbDerivatives; ++k)
154 m_dCov[k] = m_dCov[k] -
cog * Base::m_dSumP.col(k).transpose() - Base::m_dSumP.col(k) *
cog.transpose() +
155 Base::m_dSumW[k] *
cogSq;
159 return Base::m_eCurrentState;
Aggregator class used to declare specialized structures using CRTP.
Procedure that compute and decompose the covariance matrix of the neighbors positions.
typename Base::VectorType VectorType
Alias to vector type.
typename DataPoint::Scalar Scalar
Alias to scalar type.
Internal generic class computing the derivatives of covariance matrix computed by covarianceBase.
typename DataPoint::MatrixType MatrixType
Alias to matrix type.
typename DataPoint::Scalar Scalar
Alias to scalar type.
typename Base::ScalarArray ScalarArray
Alias to scalar derivatives array.
typename Base::VectorType VectorType
Alias to vector type.
FIT_RESULT
Enum corresponding to the state of a fitting method (and what the finalize function returns)
@ UNDEFINED
The fitting is undefined, you can't use it for valid results.
@ STABLE
The fitting is stable and ready to use.
FIT_RESULT compute(const IteratorBegin &begin, const IteratorEnd &end)
Convenience function for STL-like iterators Add neighbors stored in a container using STL-like iterat...