1namespace muda::distance::details
4MUDA_GENERIC
void g_EECN2(
5 T v01, T v02, T v03, T v11, T v12, T v13, T v21, T v22, T v23, T v31, T v32, T v33, T g[12])
35 t23 = t8 * t12 + -(t9 * t11);
36 t24 = t8 * t13 + -(t10 * t11);
37 t25 = t9 * t13 + -(t10 * t12);
41 t29 = t10 * t24 * 2.0;
43 t31 = t10 * t25 * 2.0;
44 t32 = t11 * t23 * 2.0;
45 t33 = t12 * t23 * 2.0;
46 t23 = t11 * t24 * 2.0;
47 t10 = t13 * t24 * 2.0;
64MUDA_GENERIC
void H_EECN2(
65 T v01, T v02, T v03, T v11, T v12, T v13, T v21, T v22, T v23, T v31, T v32, T v33, T H[144])
126 t33 = t8 * t10 * 2.0;
127 t34 = t9 * t10 * 2.0;
128 t35 = t8 * t11 * 2.0;
137 t41 = t9 * t12 * 2.0;
148 t49 = t10 * t13 * 2.0;
149 t50 = t11 * t12 * 2.0;
150 t51 = t11 * t13 * 2.0;
151 t52 = t12 * t13 * 2.0;
154 t8 = t10 * t10 * 2.0;
155 t23 = t11 * t11 * 2.0;
156 t24 = t12 * t12 * 2.0;
157 t25 = t13 * t13 * 2.0;
334MUDA_GENERIC
void EEM(T input, T eps_x, T& e)
336 T input_div_eps_x = input / eps_x;
337 e = (-input_div_eps_x + 2.0) * input_div_eps_x;
341MUDA_GENERIC
void g_EEM(T input, T eps_x, T& g)
343 T one_div_eps_x = 1.0 / eps_x;
344 g = 2.0 * one_div_eps_x * (-one_div_eps_x * input + 1.0);
348MUDA_GENERIC
void H_EEM(T input, T eps_x, T& H)
350 H = -2.0 / (eps_x * eps_x);
354namespace muda::distance
357MUDA_GENERIC
void edge_edge_cross_norm2(
const Eigen::Vector<T, 3>& ea0,
358 const Eigen::Vector<T, 3>& ea1,
359 const Eigen::Vector<T, 3>& eb0,
360 const Eigen::Vector<T, 3>& eb1,
363 result = (ea1 - ea0).cross(eb1 - eb0).squaredNorm();
368MUDA_GENERIC
void edge_edge_cross_norm2_gradient(
const Eigen::Vector<T, 3>& ea0,
369 const Eigen::Vector<T, 3>& ea1,
370 const Eigen::Vector<T, 3>& eb0,
371 const Eigen::Vector<T, 3>& eb1,
372 Eigen::Vector<T, 12>& grad)
374 details::g_EECN2(ea0[0],
391MUDA_GENERIC
void edge_edge_cross_norm2_hessian(
const Eigen::Vector<T, 3>& ea0,
392 const Eigen::Vector<T, 3>& ea1,
393 const Eigen::Vector<T, 3>& eb0,
394 const Eigen::Vector<T, 3>& eb1,
395 Eigen::Matrix<T, 12, 12>& Hessian)
397 details::H_EECN2(ea0[0],
414MUDA_GENERIC
void edge_edge_mollifier(
const Eigen::Vector<T, 3>& ea0,
415 const Eigen::Vector<T, 3>& ea1,
416 const Eigen::Vector<T, 3>& eb0,
417 const Eigen::Vector<T, 3>& eb1,
422 edge_edge_cross_norm2(ea0, ea1, eb0, eb1, EECrossSqNorm);
423 if(EECrossSqNorm < eps_x)
425 details::EEM(EECrossSqNorm, eps_x, e);
434MUDA_GENERIC
void edge_edge_mollifier_gradient(
const Eigen::Vector<T, 3>& ea0,
435 const Eigen::Vector<T, 3>& ea1,
436 const Eigen::Vector<T, 3>& eb0,
437 const Eigen::Vector<T, 3>& eb1,
439 Eigen::Vector<T, 12>& g)
442 edge_edge_cross_norm2(ea0, ea1, eb0, eb1, EECrossSqNorm);
443 if(EECrossSqNorm < eps_x)
446 details::g_EEM(EECrossSqNorm, eps_x, q_g);
447 edge_edge_cross_norm2_gradient(ea0, ea1, eb0, eb1, g);
457MUDA_GENERIC
void edge_edge_mollifier_hessian(
const Eigen::Vector<T, 3>& ea0,
458 const Eigen::Vector<T, 3>& ea1,
459 const Eigen::Vector<T, 3>& eb0,
460 const Eigen::Vector<T, 3>& eb1,
462 Eigen::Matrix<T, 12, 12>& H)
465 edge_edge_cross_norm2(ea0, ea1, eb0, eb1, EECrossSqNorm);
466 if(EECrossSqNorm < eps_x)
469 details::g_EEM(EECrossSqNorm, eps_x, q_g);
470 details::H_EEM(EECrossSqNorm, eps_x, q_H);
472 Eigen::Matrix<T, 12, 1> g;
473 edge_edge_cross_norm2_gradient(ea0, ea1, eb0, eb1, g);
475 edge_edge_cross_norm2_hessian(ea0, ea1, eb0, eb1, H);
477 H += (q_H * g) * g.transpose();
486MUDA_GENERIC
void edge_edge_mollifier_threshold(
const Eigen::Vector<T, 3>& ea0_rest,
487 const Eigen::Vector<T, 3>& ea1_rest,
488 const Eigen::Vector<T, 3>& eb0_rest,
489 const Eigen::Vector<T, 3>& eb1_rest,
492 eps_x = 1.0e-3 * (ea0_rest - ea1_rest).squaredNorm()
493 * (eb0_rest - eb1_rest).squaredNorm();