MUDA
Loading...
Searching...
No Matches
edge_edge_mollified.inl
1namespace muda::distance::details
2{
3template <class T>
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])
6{
7 T t8;
8 T t9;
9 T t10;
10 T t11;
11 T t12;
12 T t13;
13 T t23;
14 T t24;
15 T t25;
16 T t26;
17 T t27;
18 T t28;
19 T t29;
20 T t30;
21 T t31;
22 T t32;
23 T t33;
24
25 /* COMPUTEEECROSSSQNORMGRADIENT */
26 /* G = COMPUTEEECROSSSQNORMGRADIENT(V01,V02,V03,V11,V12,V13,V21,V22,V23,V31,V32,V33) */
27 /* This function was generated by the Symbolic Math Toolbox version 8.3. */
28 /* 01-Nov-2019 16:54:23 */
29 t8 = -v11 + v01;
30 t9 = -v12 + v02;
31 t10 = -v13 + v03;
32 t11 = -v31 + v21;
33 t12 = -v32 + v22;
34 t13 = -v33 + v23;
35 t23 = t8 * t12 + -(t9 * t11);
36 t24 = t8 * t13 + -(t10 * t11);
37 t25 = t9 * t13 + -(t10 * t12);
38 t26 = t8 * t23 * 2.0;
39 t27 = t9 * t23 * 2.0;
40 t28 = t8 * t24 * 2.0;
41 t29 = t10 * t24 * 2.0;
42 t30 = t9 * t25 * 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;
48 t9 = t12 * t25 * 2.0;
49 t8 = t13 * t25 * 2.0;
50 g[0] = t33 + t10;
51 g[1] = -t32 + t8;
52 g[2] = -t23 - t9;
53 g[3] = -t33 - t10;
54 g[4] = t32 - t8;
55 g[5] = t23 + t9;
56 g[6] = -t27 - t29;
57 g[7] = t26 - t31;
58 g[8] = t28 + t30;
59 g[9] = t27 + t29;
60 g[10] = -t26 + t31;
61 g[11] = -t28 - t30;
62}
63template <class T>
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])
66{
67 T t8;
68 T t9;
69 T t10;
70 T t11;
71 T t12;
72 T t13;
73 T t32;
74 T t33;
75 T t34;
76 T t35;
77 T t48;
78 T t36;
79 T t49;
80 T t37;
81 T t38;
82 T t39;
83 T t40;
84 T t41;
85 T t42;
86 T t43;
87 T t44;
88 T t45;
89 T t46;
90 T t47;
91 T t50;
92 T t51;
93 T t52;
94 T t20;
95 T t23;
96 T t24;
97 T t25;
98 T t86;
99 T t87;
100 T t88;
101 T t74;
102 T t75;
103 T t76;
104 T t77;
105 T t78;
106 T t79;
107 T t89;
108 T t90;
109 T t91;
110 T t92;
111 T t93;
112 T t94;
113 T t95;
114
115 /* COMPUTEEECROSSSQNORMHESSIAN */
116 /* H = COMPUTEEECROSSSQNORMHESSIAN(V01,V02,V03,V11,V12,V13,V21,V22,V23,V31,V32,V33) */
117 /* This function was generated by the Symbolic Math Toolbox version 8.3. */
118 /* 01-Nov-2019 16:54:23 */
119 t8 = -v11 + v01;
120 t9 = -v12 + v02;
121 t10 = -v13 + v03;
122 t11 = -v31 + v21;
123 t12 = -v32 + v22;
124 t13 = -v33 + v23;
125 t32 = t8 * t9 * 2.0;
126 t33 = t8 * t10 * 2.0;
127 t34 = t9 * t10 * 2.0;
128 t35 = t8 * t11 * 2.0;
129 t48 = t8 * t12;
130 t36 = t48 * 2.0;
131 t49 = t9 * t11;
132 t37 = t49 * 2.0;
133 t38 = t48 * 4.0;
134 t48 = t8 * t13;
135 t39 = t48 * 2.0;
136 t40 = t49 * 4.0;
137 t41 = t9 * t12 * 2.0;
138 t49 = t10 * t11;
139 t42 = t49 * 2.0;
140 t43 = t48 * 4.0;
141 t48 = t9 * t13;
142 t44 = t48 * 2.0;
143 t45 = t49 * 4.0;
144 t49 = t10 * t12;
145 t46 = t49 * 2.0;
146 t47 = t48 * 4.0;
147 t48 = t49 * 4.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;
152 t20 = t8 * t8 * 2.0;
153 t9 = t9 * t9 * 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;
158 t86 = t35 + t41;
159 t87 = t35 + t49;
160 t88 = t41 + t49;
161 t74 = t20 + t9;
162 t75 = t20 + t8;
163 t76 = t9 + t8;
164 t77 = t23 + t24;
165 t78 = t23 + t25;
166 t79 = t24 + t25;
167 t89 = t40 + -t36;
168 t90 = t36 + -t40;
169 t91 = t37 + -t38;
170 t92 = t38 + -t37;
171 t93 = t45 + -t39;
172 t94 = t39 + -t45;
173 t95 = t42 + -t43;
174 t37 = t43 + -t42;
175 t39 = t48 + -t44;
176 t45 = t44 + -t48;
177 t38 = t46 + -t47;
178 t40 = t47 + -t46;
179 t36 = -t35 + -t41;
180 t13 = -t35 + -t49;
181 t11 = -t41 + -t49;
182 t12 = -t20 + -t9;
183 t10 = -t20 + -t8;
184 t8 = -t9 + -t8;
185 t9 = -t23 + -t24;
186 t49 = -t23 + -t25;
187 t48 = -t24 + -t25;
188 H[0] = t79;
189 H[1] = -t50;
190 H[2] = -t51;
191 H[3] = t48;
192 H[4] = t50;
193 H[5] = t51;
194 H[6] = t11;
195 H[7] = t92;
196 H[8] = t37;
197 H[9] = t88;
198 H[10] = t91;
199 H[11] = t95;
200 H[12] = -t50;
201 H[13] = t78;
202 H[14] = -t52;
203 H[15] = t50;
204 H[16] = t49;
205 H[17] = t52;
206 H[18] = t89;
207 H[19] = t13;
208 H[20] = t40;
209 H[21] = t90;
210 H[22] = t87;
211 H[23] = t38;
212 H[24] = -t51;
213 H[25] = -t52;
214 H[26] = t77;
215 H[27] = t51;
216 H[28] = t52;
217 H[29] = t9;
218 H[30] = t93;
219 H[31] = t39;
220 H[32] = t36;
221 H[33] = t94;
222 H[34] = t45;
223 H[35] = t86;
224 H[36] = t48;
225 H[37] = t50;
226 H[38] = t51;
227 H[39] = t79;
228 H[40] = -t50;
229 H[41] = -t51;
230 H[42] = t88;
231 H[43] = t91;
232 H[44] = t95;
233 H[45] = t11;
234 H[46] = t92;
235 H[47] = t37;
236 H[48] = t50;
237 H[49] = t49;
238 H[50] = t52;
239 H[51] = -t50;
240 H[52] = t78;
241 H[53] = -t52;
242 H[54] = t90;
243 H[55] = t87;
244 H[56] = t38;
245 H[57] = t89;
246 H[58] = t13;
247 H[59] = t40;
248 H[60] = t51;
249 H[61] = t52;
250 H[62] = t9;
251 H[63] = -t51;
252 H[64] = -t52;
253 H[65] = t77;
254 H[66] = t94;
255 H[67] = t45;
256 H[68] = t86;
257 H[69] = t93;
258 H[70] = t39;
259 H[71] = t36;
260 H[72] = t11;
261 H[73] = t89;
262 H[74] = t93;
263 H[75] = t88;
264 H[76] = t90;
265 H[77] = t94;
266 H[78] = t76;
267 H[79] = -t32;
268 H[80] = -t33;
269 H[81] = t8;
270 H[82] = t32;
271 H[83] = t33;
272 H[84] = t92;
273 H[85] = t13;
274 H[86] = t39;
275 H[87] = t91;
276 H[88] = t87;
277 H[89] = t45;
278 H[90] = -t32;
279 H[91] = t75;
280 H[92] = -t34;
281 H[93] = t32;
282 H[94] = t10;
283 H[95] = t34;
284 H[96] = t37;
285 H[97] = t40;
286 H[98] = t36;
287 H[99] = t95;
288 H[100] = t38;
289 H[101] = t86;
290 H[102] = -t33;
291 H[103] = -t34;
292 H[104] = t74;
293 H[105] = t33;
294 H[106] = t34;
295 H[107] = t12;
296 H[108] = t88;
297 H[109] = t90;
298 H[110] = t94;
299 H[111] = t11;
300 H[112] = t89;
301 H[113] = t93;
302 H[114] = t8;
303 H[115] = t32;
304 H[116] = t33;
305 H[117] = t76;
306 H[118] = -t32;
307 H[119] = -t33;
308 H[120] = t91;
309 H[121] = t87;
310 H[122] = t45;
311 H[123] = t92;
312 H[124] = t13;
313 H[125] = t39;
314 H[126] = t32;
315 H[127] = t10;
316 H[128] = t34;
317 H[129] = -t32;
318 H[130] = t75;
319 H[131] = -t34;
320 H[132] = t95;
321 H[133] = t38;
322 H[134] = t86;
323 H[135] = t37;
324 H[136] = t40;
325 H[137] = t36;
326 H[138] = t33;
327 H[139] = t34;
328 H[140] = t12;
329 H[141] = -t33;
330 H[142] = -t34;
331 H[143] = t74;
332}
333template <class T>
334MUDA_GENERIC void EEM(T input, T eps_x, T& e)
335{
336 T input_div_eps_x = input / eps_x;
337 e = (-input_div_eps_x + 2.0) * input_div_eps_x;
338}
339
340template <class T>
341MUDA_GENERIC void g_EEM(T input, T eps_x, T& g)
342{
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);
345}
346
347template <class T>
348MUDA_GENERIC void H_EEM(T input, T eps_x, T& H)
349{
350 H = -2.0 / (eps_x * eps_x);
351}
352} // namespace muda::distance::details
353
354namespace muda::distance
355{
356template <class T>
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,
361 T& result)
362{
363 result = (ea1 - ea0).cross(eb1 - eb0).squaredNorm();
364}
365
366
367template <class T>
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)
373{
374 details::g_EECN2(ea0[0],
375 ea0[1],
376 ea0[2],
377 ea1[0],
378 ea1[1],
379 ea1[2],
380 eb0[0],
381 eb0[1],
382 eb0[2],
383 eb1[0],
384 eb1[1],
385 eb1[2],
386 grad.data());
387}
388
389
390template <class T>
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)
396{
397 details::H_EECN2(ea0[0],
398 ea0[1],
399 ea0[2],
400 ea1[0],
401 ea1[1],
402 ea1[2],
403 eb0[0],
404 eb0[1],
405 eb0[2],
406 eb1[0],
407 eb1[1],
408 eb1[2],
409 Hessian.data());
410}
411
412
413template <class T>
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,
418 T eps_x,
419 T& e)
420{
421 T EECrossSqNorm;
422 edge_edge_cross_norm2(ea0, ea1, eb0, eb1, EECrossSqNorm);
423 if(EECrossSqNorm < eps_x)
424 {
425 details::EEM(EECrossSqNorm, eps_x, e);
426 }
427 else
428 {
429 e = 1.0;
430 }
431}
432
433template <class T>
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,
438 T eps_x,
439 Eigen::Vector<T, 12>& g)
440{
441 T EECrossSqNorm;
442 edge_edge_cross_norm2(ea0, ea1, eb0, eb1, EECrossSqNorm);
443 if(EECrossSqNorm < eps_x)
444 {
445 T q_g;
446 details::g_EEM(EECrossSqNorm, eps_x, q_g);
447 edge_edge_cross_norm2_gradient(ea0, ea1, eb0, eb1, g);
448 g *= q_g;
449 }
450 else
451 {
452 g.setZero();
453 }
454}
455
456template <class T>
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,
461 T eps_x,
462 Eigen::Matrix<T, 12, 12>& H)
463{
464 T EECrossSqNorm;
465 edge_edge_cross_norm2(ea0, ea1, eb0, eb1, EECrossSqNorm);
466 if(EECrossSqNorm < eps_x)
467 {
468 T q_g, q_H;
469 details::g_EEM(EECrossSqNorm, eps_x, q_g);
470 details::H_EEM(EECrossSqNorm, eps_x, q_H);
471
472 Eigen::Matrix<T, 12, 1> g;
473 edge_edge_cross_norm2_gradient(ea0, ea1, eb0, eb1, g);
474
475 edge_edge_cross_norm2_hessian(ea0, ea1, eb0, eb1, H);
476 H *= q_g;
477 H += (q_H * g) * g.transpose();
478 }
479 else
480 {
481 H.setZero();
482 }
483}
484
485template <class T>
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,
490 T& eps_x)
491{
492 eps_x = 1.0e-3 * (ea0_rest - ea1_rest).squaredNorm()
493 * (eb0_rest - eb1_rest).squaredNorm();
494}
495
496} // namespace muda::distance