31 PONCA_MULTIARCH_STD_MATH(sqrt);
32 PONCA_MULTIARCH_STD_MATH(max);
33 PONCA_MULTIARCH_STD_MATH(abs);
36 if (Base::finalize() !=
STABLE)
37 return Base::m_eCurrentState;
38 if (Base::getNumNeighbors() < DataPoint::Dim)
40 if (Base::algebraicSphere().isValid())
43 Base::m_eCurrentState = Base::getNumNeighbors() < 2 * DataPoint::Dim ?
UNSTABLE :
STABLE;
46 Scalar epsilon = Eigen::NumTraits<Scalar>::dummy_precision();
50 m_nume = (m_sumDotPN - invSumW * Base::m_sumP.dot(Base::m_sumN));
51 Scalar den1 = invSumW * Base::m_sumP.dot(Base::m_sumP);
52 m_deno = m_sumDotPP - den1;
55 if (abs(m_deno) <= epsilon * max(m_sumDotPP, den1))
57 if (Base::m_ul.isZero(0))
61 Base::m_ul = s * Base::m_ul;
62 Base::m_uc = s * Base::m_uc;
68 Base::m_uq =
Scalar(.5) * m_nume / m_deno;
69 Base::m_ul = (Base::m_sumN - Base::m_sumP * (
Scalar(2.) * Base::m_uq)) * invSumW;
70 Base::m_uc = -invSumW * (Base::m_ul.dot(Base::m_sumP) + m_sumDotPP * Base::m_uq);
73 Base::m_isNormalized =
false;
75 return Base::m_eCurrentState;
109 PONCA_MULTIARCH_STD_MATH(sqrt);
117 Scalar nume = Base::m_sumDotPN - invSumW * Base::m_sumP.dot(Base::m_sumN);
118 Scalar deno = Base::m_sumDotPP - invSumW * Base::m_sumP.dot(Base::m_sumP);
123 m_dNume = m_dSumDotPN - invSumW * invSumW *
124 (Base::getWeightSum() * (Base::m_sumN.transpose() * Base::m_dSumP +
125 Base::m_sumP.transpose() * m_dSumN) -
126 Base::m_dSumW * Base::m_sumP.dot(Base::m_sumN));
128 m_dDeno = m_dSumDotPP - invSumW * invSumW *
129 (
Scalar(2.) * Base::getWeightSum() * Base::m_sumP.transpose() * Base::m_dSumP -
130 Base::m_dSumW * Base::m_sumP.dot(Base::m_sumP));
132 m_dUq =
Scalar(.5) * (deno * m_dNume - m_dDeno * nume) / (deno * deno);
136 m_dUl = invSumW * (m_dSumN - Base::m_ul * Base::m_dSumW -
137 Scalar(2.) * (Base::m_dSumP * Base::m_uq + Base::m_sumP * m_dUq));
139 -invSumW * (Base::m_sumP.transpose() * m_dUl + Base::m_sumDotPP * m_dUq +
140 Base::m_ul.transpose() * Base::m_dSumP + Base::m_uq * m_dSumDotPP + Base::m_dSumW * Base::m_uc);
143 return Base::m_eCurrentState;