39 PONCA_MULTIARCH_STD_MATH(sqrt);
40 PONCA_MULTIARCH_STD_MATH(max);
41 PONCA_MULTIARCH_STD_MATH(abs);
44 if(Base::finalize() !=
STABLE)
45 return Base::m_eCurrentState;
46 if(Base::getNumNeighbors() < DataPoint::Dim)
48 if (Base::algebraicSphere().isValid())
51 Base::m_eCurrentState = Base::getNumNeighbors() < 2*DataPoint::Dim ?
UNSTABLE :
STABLE;
54 Scalar epsilon = Eigen::NumTraits<Scalar>::dummy_precision();
58 m_nume = (m_sumDotPN - invSumW * Base::m_sumP.dot(Base::m_sumN));
59 Scalar den1 = invSumW * Base::m_sumP.dot(Base::m_sumP);
60 m_deno = m_sumDotPP - den1;
63 if(abs(m_deno) < epsilon * max(m_sumDotPP, den1))
65 if (Base::m_ul.isZero(0))
69 Base::m_ul = s*Base::m_ul;
70 Base::m_uc = s*Base::m_uc;
76 Base::m_uq =
Scalar(.5) * m_nume / m_deno;
77 Base::m_ul = (Base::m_sumN - Base::m_sumP * (
Scalar(2.) * Base::m_uq)) * invSumW;
78 Base::m_uc = -invSumW * (Base::m_ul.dot(Base::m_sumP) + m_sumDotPP * Base::m_uq);
81 Base::m_isNormalized =
false;
83 return Base::m_eCurrentState;
127 PONCA_MULTIARCH_STD_MATH(sqrt);
135 Scalar nume = Base::m_sumDotPN - invSumW*Base::m_sumP.dot(Base::m_sumN);
136 Scalar deno = Base::m_sumDotPP - invSumW*Base::m_sumP.dot(Base::m_sumP);
141 m_dNume = m_dSumDotPN
142 - invSumW*invSumW * ( Base::getWeightSum() * ( Base::m_sumN.transpose() * Base::m_dSumP + Base::m_sumP.transpose() * m_dSumN )
143 - Base::m_dSumW*Base::m_sumP.dot(Base::m_sumN) );
145 m_dDeno = m_dSumDotPP
146 - invSumW*invSumW*(
Scalar(2.) * Base::getWeightSum() * Base::m_sumP.transpose() * Base::m_dSumP
147 - Base::m_dSumW*Base::m_sumP.dot(Base::m_sumP) );
149 m_dUq =
Scalar(.5) * (deno * m_dNume - m_dDeno * nume)/(deno*deno);
153 m_dUl = invSumW * ( m_dSumN - Base::m_ul*Base::m_dSumW -
Scalar(2.)*(Base::m_dSumP * Base::m_uq + Base::m_sumP * m_dUq) );
154 m_dUc = -invSumW*( Base::m_sumP.transpose() * m_dUl
155 + Base::m_sumDotPP * m_dUq
156 + Base::m_ul.transpose() * Base::m_dSumP
157 + Base::m_uq * m_dSumDotPP
158 + Base::m_dSumW * Base::m_uc);
161 return Base::m_eCurrentState;
165typename OrientedSphereDerImpl <DataPoint, _WFunctor, DiffType, T>::VectorArray
180typename OrientedSphereDerImpl <DataPoint, _WFunctor, DiffType, T>::ScalarArray