1 #ifndef GfxTL__L2NORM_HEADER__
2 #define GfxTL__L2NORM_HEADER__
32 template <
unsigned int SizeT>
55 template <
class VectorKernelT,
class MaskElemSizeT = FixedMaskElementSize<1>>
61 template <
class ScalarAT,
class ScalarBT>
67 template <
class Po
intAT,
class Po
intBT>
72 typedef typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
75 DistType d = p[0] -
v[0], di;
77 for (
unsigned int i = 1; i < VectorKernelT::m_dim; ++i)
85 template <
class Po
intAT,
class Po
intBT>
86 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
90 typedef typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
93 DistType d = p[0] -
v[0], di;
95 for (
unsigned int i = 1; i < VectorKernelT::m_dim; ++i)
103 template <
class Po
intAT,
class Po
intBT>
104 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
112 typedef typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
115 DistType d = p[0] -
v[0], di;
117 for (
unsigned int i = 1; i < VectorKernelT::m_dim && d < abortDist; ++i)
125 template <
class Po
intAT,
class Po
intBT,
class MaskAT,
class MaskBT>
126 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
128 SqrDistance(
const PointAT& p,
const MaskAT& ma,
const PointBT&
v,
const MaskBT& mb)
const
130 typedef typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
134 for (
unsigned int i = 0; i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize; ++i)
136 if (!(ma[i] && mb[i]))
140 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
142 dj = p[i * MaskElemSizeT::m_maskElemSize + j] -
143 v[i * MaskElemSizeT::m_maskElemSize + j];
150 template <
class Po
intAT,
class Po
intBT,
class MaskAT,
class MaskBT>
151 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
161 typedef typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
165 for (
unsigned int i = 0;
166 i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize && d < abortDist;
169 if (!(ma[i] && mb[i]))
173 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize && d < abortDist; ++j)
175 dj = p[i * MaskElemSizeT::m_maskElemSize + j] -
176 v[i * MaskElemSizeT::m_maskElemSize + j];
183 template <
class Po
intAT,
class Po
intBT,
class MaskBT>
184 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
186 SqrDistance(
const PointAT& p,
const PointBT&
v,
const MaskBT& mb)
const
188 typedef typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
192 for (
unsigned int i = 0; i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize; ++i)
198 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
200 dj = p[i * MaskElemSizeT::m_maskElemSize + j] -
201 v[i * MaskElemSizeT::m_maskElemSize + j];
208 template <
class Po
intAT,
class Po
intBT,
class MaskBT>
209 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
218 typedef typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
222 for (
unsigned int i = 0;
223 i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize && d < abortDist;
230 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize && d < abortDist; ++j)
232 dj = p[i * MaskElemSizeT::m_maskElemSize + j] -
233 v[i * MaskElemSizeT::m_maskElemSize + j];
240 template <
class Po
intAT,
class Po
intBT,
class MaskAT,
class MaskBT>
241 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
243 Distance(
const PointAT& p,
const PointBT&
v,
const MaskAT& ma,
const MaskBT& mb)
const
248 template <
class ScalarT>
255 template <
class DistScalarT,
class DiffScalarT>
259 DiffScalarT cutDiff)
const
261 return boxSqrDist - ((DistScalarT)boxDiff * (DistScalarT)boxDiff) +
262 ((DistScalarT)cutDiff * (DistScalarT)cutDiff);
265 template <
class Po
intAT,
class Po
intBT>
266 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
270 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
274 for (
unsigned int i = 0; i < VectorKernelT::m_dim; ++i)
281 else if (
a[i] >
max[i])
290 template <
class Po
intAT,
class Po
intBT>
291 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
295 typedef typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
298 DistType sqrDist = 0, t;
299 for (
unsigned int i = 0; i < VectorKernelT::m_dim; ++i)
306 template <
class Po
intAT,
class MaskAT,
class Po
intBT>
307 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
312 const PointBT&
max)
const
314 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
318 for (
unsigned int i = 0; i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize; ++i)
324 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
326 if (
min[i * MaskElemSizeT::m_maskElemSize + j] >
327 max[i * MaskElemSizeT::m_maskElemSize + j])
331 if (
a[i * MaskElemSizeT::m_maskElemSize + j] <
332 min[i * MaskElemSizeT::m_maskElemSize + j])
334 t =
min[i * MaskElemSizeT::m_maskElemSize + j] -
335 a[i * MaskElemSizeT::m_maskElemSize + j];
338 else if (
a[i * MaskElemSizeT::m_maskElemSize + j] >
339 max[i * MaskElemSizeT::m_maskElemSize + j])
341 t =
a[i * MaskElemSizeT::m_maskElemSize + j] -
342 max[i * MaskElemSizeT::m_maskElemSize + j];
350 template <
class Po
intAT,
class MaskAT,
class Po
intBT>
351 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
356 const PointBT&
max)
const
358 typedef typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
361 DistType sqrDist = 0, t;
362 for (
unsigned int i = 0; i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize; ++i)
368 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
370 if (
min[i * MaskElemSizeT::m_maskElemSize + j] >
371 max[i * MaskElemSizeT::m_maskElemSize + j])
378 a[i * MaskElemSizeT::m_maskElemSize + j]),
380 a[i * MaskElemSizeT::m_maskElemSize + j]))) *
387 template <
class Po
intAT,
class Po
intBT,
class W
idthT>
388 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType, WidthT>
::Type
391 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType, WidthT>
::Type
394 for (
unsigned int i = 0; i < VectorKernelT::m_dim; ++i)
401 else if (
a[i] >
min[i] + width)
403 t =
a[i] - (
min[i] + width);
418 template <
class Po
intAT,
class Po
intBT>
422 for (
unsigned int i = 0; i < VectorKernelT::m_dim; ++i)
424 (*bboxMin)[i] = vec[i];
428 template <
class Po
intAT,
class Po
intBT>
432 for (
unsigned int i = 0; i < VectorKernelT::m_dim; ++i)
434 (*bboxMax)[i] = vec[i];
438 template <
class Po
intAT,
class MaskAT,
class Po
intBT>
443 for (
unsigned int i = 0; i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize; ++i)
445 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
447 (*bboxMin)[i * MaskElemSizeT::m_maskElemSize + j] =
448 vec[i * MaskElemSizeT::m_maskElemSize + j];
451 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
453 (*bboxMin)[i * MaskElemSizeT::m_maskElemSize + j] =
454 -std::numeric_limits<ScalarType>::infinity();
458 template <
class Po
intAT,
class MaskAT,
class Po
intBT>
463 for (
unsigned int i = 0; i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize; ++i)
465 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
467 (*bboxMin)[i * MaskElemSizeT::m_maskElemSize + j] =
468 vec[i * MaskElemSizeT::m_maskElemSize + j];
471 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
473 (*bboxMin)[i * MaskElemSizeT::m_maskElemSize + j] =
474 std::numeric_limits<ScalarType>::infinity();
478 template <
class Po
intAT,
class MaskAT,
class Po
intBT>
483 for (
unsigned int i = 0; i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize; ++i)
485 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
487 (*bboxMax)[i * MaskElemSizeT::m_maskElemSize + j] =
488 vec[i * MaskElemSizeT::m_maskElemSize + j];
491 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
493 (*bboxMax)[i * MaskElemSizeT::m_maskElemSize + j] =
494 std::numeric_limits<ScalarType>::infinity();
498 template <
class Po
intAT,
class MaskAT,
class Po
intBT>
503 for (
unsigned int i = 0; i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize; ++i)
505 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
507 (*bboxMax)[i * MaskElemSizeT::m_maskElemSize + j] =
508 vec[i * MaskElemSizeT::m_maskElemSize + j];
511 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
513 (*bboxMax)[i * MaskElemSizeT::m_maskElemSize + j] =
514 -std::numeric_limits<ScalarType>::infinity();
518 template <
class BoxPo
intT>
523 for (
unsigned int i = 0; i < VectorKernelT::m_dim; ++i)
530 template <
class Po
intT,
class BoxPo
intT>
534 for (
unsigned int i = 0; i < VectorKernelT::m_dim; ++i)
536 if (box[0][i] > p[i])
540 else if (box[1][i] < p[i])
547 template <
class Po
intT,
class MaskT,
class BoxPo
intT>
552 for (
unsigned int i = 0; i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize; ++i)
555 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
557 if (box[0][i * MaskElemSizeT::m_maskElemSize + j] >
558 p[i * MaskElemSizeT::m_maskElemSize + j])
560 box[0][i * MaskElemSizeT::m_maskElemSize + j] =
561 p[i * MaskElemSizeT::m_maskElemSize + j];
563 else if (box[1][i * MaskElemSizeT::m_maskElemSize + j] <
564 p[i * MaskElemSizeT::m_maskElemSize + j])
566 box[1][i * MaskElemSizeT::m_maskElemSize + j] =
567 p[i * MaskElemSizeT::m_maskElemSize + j];
571 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
573 box[0][i * MaskElemSizeT::m_maskElemSize + j] =
574 -std::numeric_limits<ScalarType>::infinity();
575 box[1][i * MaskElemSizeT::m_maskElemSize + j] =
576 std::numeric_limits<ScalarType>::infinity();
581 template <
class Po
intT,
class MaskT,
class BoxPo
intT>
587 for (
unsigned int i = 0; i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize; ++i)
589 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
591 if (box[0][i * MaskElemSizeT::m_maskElemSize + j] >
592 p[i * MaskElemSizeT::m_maskElemSize + j])
594 box[0][i * MaskElemSizeT::m_maskElemSize + j] =
595 p[i * MaskElemSizeT::m_maskElemSize + j];
597 else if (box[1][i * MaskElemSizeT::m_maskElemSize + j] <
598 p[i * MaskElemSizeT::m_maskElemSize + j])
600 box[1][i * MaskElemSizeT::m_maskElemSize + j] =
601 p[i * MaskElemSizeT::m_maskElemSize + j];
607 template <
class VectorKernelT>
612 template <
class MaskElemSizeT>
615 template <
class VectorKernelT>