11template <
class DataPo
int,
class _WFunctor,
typename T>
19template <
class DataPo
int,
class _WFunctor,
typename T>
23 const DataPoint &attributes)
25 if( Base::addLocalNeighbor(w, localQ, attributes) ) {
26 m_cov += w * localQ * localQ.transpose();
33template <
class DataPo
int,
class _WFunctor,
typename T>
38 if(Base::finalize() !=
STABLE)
39 return Base::m_eCurrentState;
41 if(Base::getNumNeighbors() < DataPoint::Dim)
45 auto centroid = Base::barycenterLocal();
46 m_cov = m_cov/Base::getWeightSum() - centroid * centroid.transpose();
49 m_solver.computeDirect(m_cov);
51 m_solver.compute(m_cov);
53 Base::m_eCurrentState = ( m_solver.info() == Eigen::Success ?
STABLE :
UNDEFINED );
55 return Base::m_eCurrentState;
58template <
class DataPo
int,
class _WFunctor,
typename T>
62 return m_solver.eigenvalues()(0) / m_solver.eigenvalues().mean();
65template <
class DataPo
int,
class _WFunctor,
typename T>
69 return (m_solver.eigenvalues()(1) - m_solver.eigenvalues()(0)) /
70 m_solver.eigenvalues()(2);
73template <
class DataPo
int,
class _WFunctor,
typename T>
77 return (m_solver.eigenvalues()(2) - m_solver.eigenvalues()(1)) /
78 m_solver.eigenvalues()(2);
81template <
class DataPo
int,
class _WFunctor,
typename T>
85 return (m_solver.eigenvalues()(0)) / m_solver.eigenvalues()(2);
88template <
class DataPo
int,
class _WFunctor,
typename T>
92 return (m_solver.eigenvalues()(2) - m_solver.eigenvalues()(0)) /
93 m_solver.eigenvalues()(2);
96template <
class DataPo
int,
class _WFunctor,
typename T>
100 return -(m_solver.eigenvalues()(0) * log(m_solver.eigenvalues()(0)) +
101 m_solver.eigenvalues()(1) * log(m_solver.eigenvalues()(1)) +
102 m_solver.eigenvalues()(2) * log(m_solver.eigenvalues()(2)));
105template <
class DataPo
int,
class _WFunctor,
typename T>
109 return m_solver.eigenvalues()(0);
112template <
class DataPo
int,
class _WFunctor,
typename T>
116 return m_solver.eigenvalues()(1);
119template <
class DataPo
int,
class _WFunctor,
typename T>
123 return m_solver.eigenvalues()(2);
126template <
class DataPo
int,
class _WFunctor,
int DiffType,
typename T>
132 for(
int k=0; k<Base::NbDerivatives; ++k)
138template <
class DataPo
int,
class _WFunctor,
int DiffType,
typename T>
142 const DataPoint &attributes,
145 if( Base::addLocalNeighbor(w, localQ, attributes, dw) ) {
146 for(
int k=0; k<Base::NbDerivatives; ++k)
147 m_dCov[k] += dw[k] * localQ * localQ.transpose();
156template <
class DataPo
int,
class _WFunctor,
int DiffType,
typename T>
160 PONCA_MULTIARCH_STD_MATH(sqrt);
169 for(
int k=0; k<Base::NbDerivatives; ++k)
172 m_dCov[k] = m_dCov[k]
173 - cog * Base::m_dSumP.col(k).transpose()
174 - Base::m_dSumP.col(k) * cog.transpose()
175 + Base::m_dSumW[k] * cogSq;
179 return Base::m_eCurrentState;
Procedure that compute and decompose the covariance matrix of the neighbors positions in .
typename DataPoint::Scalar Scalar
Alias to scalar type.
typename Base::VectorType VectorType
Alias to vector type.
Internal generic class computing the derivatives of covariance matrix computed by CovarianceFitBase.
typename DataPoint::MatrixType MatrixType
Alias to matrix type.
typename Base::VectorType VectorType
Alias to vector type.
typename Base::ScalarArray ScalarArray
Alias to scalar derivatives array.
typename DataPoint::Scalar Scalar
Alias to scalar 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.