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
21 const DataPoint& attributes)
23 Base::addLocalNeighbor(w, localQ, attributes);
24 m_cov += w * localQ * localQ.transpose();
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();
40 m_cov = m_cov / Base::getWeightSum() - centroid * centroid.transpose();
43 m_solver.computeDirect(m_cov);
45 m_solver.compute(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
133 Base::addLocalNeighbor(w, localQ, attributes, dw);
134 for (
int k = 0; k < Base::NbDerivatives; ++k)
135 m_dCov[k] += dw[k] * localQ * localQ.transpose();
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;
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.