libnabo 1.1.2
nabo_private.h
Go to the documentation of this file.
1/*
2
3Copyright (c) 2010--2011, Stephane Magnenat, ASL, ETHZ, Switzerland
4You can contact the author at <stephane at magnenat dot net>
5
6All rights reserved.
7
8Redistribution and use in source and binary forms, with or without
9modification, are permitted provided that the following conditions are met:
10 * Redistributions of source code must retain the above copyright
11 notice, this list of conditions and the following disclaimer.
12 * Redistributions in binary form must reproduce the above copyright
13 notice, this list of conditions and the following disclaimer in the
14 documentation and/or other materials provided with the distribution.
15 * Neither the name of the <organization> nor the
16 names of its contributors may be used to endorse or promote products
17 derived from this software without specific prior written permission.
18
19THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22DISCLAIMED. IN NO EVENT SHALL ETH-ASL BE LIABLE FOR ANY
23DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30*/
31
32#ifndef __NABO_PRIVATE_H
33#define __NABO_PRIVATE_H
34
35#include "nabo.h"
36
37#include <cstdint>
38using std::uint32_t;
39
40// OpenCL
41#ifdef HAVE_OPENCL
42 #define __CL_ENABLE_EXCEPTIONS
43 #include "CL/cl.hpp"
44#endif // HAVE_OPENCL
45
46// Unused macro, add support for your favorite compiler
47#if defined(__GNUC__)
48 #define _UNUSED __attribute__ ((unused))
49#else
50 #define _UNUSED
51#endif
52
58namespace Nabo
59{
61
62
64 template<typename T, typename A, typename B>
65 inline T dist2(const A& v0, const B& v1)
66 {
67 return (v0 - v1).squaredNorm();
68 }
69
71 template<typename T, typename CloudType = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> >
72 struct BruteForceSearch : public NearestNeighbourSearch<T, CloudType>
73 {
77 typedef typename NearestNeighbourSearch<T, CloudType>::IndexVector IndexVector;
78 typedef typename NearestNeighbourSearch<T, CloudType>::IndexMatrix IndexMatrix;
79
85
87 BruteForceSearch(const CloudType& cloud, const Index dim, const unsigned creationOptionFlags);
88 virtual unsigned long knn(const Matrix& query, IndexMatrix& indices, Matrix& dists2, const Index k, const T epsilon, const unsigned optionFlags, const T maxRadius) const;
89 virtual unsigned long knn(const Matrix& query, IndexMatrix& indices, Matrix& dists2, const Vector& maxRadii, const Index k = 1, const T epsilon = 0, const unsigned optionFlags = 0) const;
90 };
91
93 template<typename T, typename Heap, typename CloudType = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> >
95 {
99 typedef typename NearestNeighbourSearch<T, CloudType>::IndexVector IndexVector;
100 typedef typename NearestNeighbourSearch<T, CloudType>::IndexMatrix IndexMatrix;
101
108
109 protected:
111 typedef std::vector<Index> BuildPoints;
113 typedef typename BuildPoints::iterator BuildPointsIt;
115 typedef typename BuildPoints::const_iterator BuildPointsCstIt;
116
118 const unsigned bucketSize;
119
121 const uint32_t dimBitCount;
123 const uint32_t dimMask;
124
126 inline uint32_t createDimChildBucketSize(const uint32_t dim, const uint32_t childIndex) const
127 { return dim | (childIndex << dimBitCount); }
129 inline uint32_t getDim(const uint32_t dimChildBucketSize) const
130 { return dimChildBucketSize & dimMask; }
132 inline uint32_t getChildBucketSize(const uint32_t dimChildBucketSize) const
133 { return dimChildBucketSize >> dimBitCount; }
134
135 struct BucketEntry;
136
138 struct Node
139 {
141 union
142 {
144 uint32_t bucketIndex;
145 };
146
148 Node(const uint32_t dimChild, const T cutVal):
149 dimChildBucketSize(dimChild), cutVal(cutVal) {}
153 };
155 typedef std::vector<Node> Nodes;
156
159 {
160 const T* pt;
161 Index index;
162
164
167 BucketEntry(const T* pt = 0, const Index index = 0): pt(pt), index(index) {}
168 };
169
171 typedef std::vector<BucketEntry> Buckets;
172
175
178
180 std::pair<T,T> getBounds(const BuildPointsIt first, const BuildPointsIt last, const unsigned dim);
182 unsigned buildNodes(const BuildPointsIt first, const BuildPointsIt last, const Vector minValues, const Vector maxValues);
183
185
197 unsigned long onePointKnn(const Matrix& query, IndexMatrix& indices, Matrix& dists2, int i, Heap& heap, std::vector<T>& off, const T maxError, const T maxRadius2, const bool allowSelfMatch, const bool collectStatistics, const bool sortResults) const;
198
200
208 template<bool allowSelfMatch, bool collectStatistics>
209 unsigned long recurseKnn(const T* query, const unsigned n, T rd, Heap& heap, std::vector<T>& off, const T maxError, const T maxRadius2) const;
210
211 public:
213 KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt(const CloudType& cloud, const Index dim, const unsigned creationOptionFlags, const Parameters& additionalParameters);
214 virtual unsigned long knn(const Matrix& query, IndexMatrix& indices, Matrix& dists2, const Index k, const T epsilon, const unsigned optionFlags, const T maxRadius) const;
215 virtual unsigned long knn(const Matrix& query, IndexMatrix& indices, Matrix& dists2, const Vector& maxRadii, const Index k = 1, const T epsilon = 0, const unsigned optionFlags = 0) const;
216 };
217
218 #ifdef HAVE_OPENCL
219
221 template<typename T, typename CloudType = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> >
222 struct OpenCLSearch: public NearestNeighbourSearch<T, CloudType>
223 {
224 typedef typename NearestNeighbourSearch<T, CloudType>::Vector Vector;
225 typedef typename NearestNeighbourSearch<T, CloudType>::Matrix Matrix;
226 typedef typename NearestNeighbourSearch<T, CloudType>::Index Index;
227 typedef typename NearestNeighbourSearch<T, CloudType>::IndexVector IndexVector;
228 typedef typename NearestNeighbourSearch<T, CloudType>::IndexMatrix IndexMatrix;
229
234
235 protected:
236 const cl_device_type deviceType;
237 cl::Context& context;
238 mutable cl::Kernel knnKernel;
239 cl::CommandQueue queue;
240 cl::Buffer cloudCL;
241
243 OpenCLSearch(const CloudType& cloud, const Index dim, const unsigned creationOptionFlags, const cl_device_type deviceType);
245
249 void initOpenCL(const char* clFileName, const char* kernelName, const std::string& additionalDefines = "");
250
251 public:
252 virtual unsigned long knn(const Matrix& query, IndexMatrix& indices, Matrix& dists2, const Index k, const T epsilon, const unsigned optionFlags, const T maxRadius) const;
253 virtual unsigned long knn(const Matrix& query, IndexMatrix& indices, Matrix& dists2, const Vector& maxRadii, const Index k = 1, const T epsilon = 0, const unsigned optionFlags = 0) const;
254 };
255
257 template<typename T, typename CloudType = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> >
258 struct BruteForceSearchOpenCL: public OpenCLSearch<T, CloudType>
259 {
260 typedef typename NearestNeighbourSearch<T, CloudType>::Vector Vector;
261 typedef typename NearestNeighbourSearch<T, CloudType>::Matrix Matrix;
262 typedef typename NearestNeighbourSearch<T, CloudType>::Index Index;
263
265
267 BruteForceSearchOpenCL(const CloudType& cloud, const Index dim, const unsigned creationOptionFlags, const cl_device_type deviceType);
268 };
269
271 template<typename T, typename CloudType = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> >
273 {
274 typedef typename NearestNeighbourSearch<T, CloudType>::Vector Vector;
275 typedef typename NearestNeighbourSearch<T, CloudType>::Matrix Matrix;
276 typedef typename NearestNeighbourSearch<T, CloudType>::Index Index;
277 typedef typename NearestNeighbourSearch<T, CloudType>::IndexVector IndexVector;
278 typedef typename NearestNeighbourSearch<T, CloudType>::IndexMatrix IndexMatrix;
279
285
288
290
291 protected:
294 {
295 Vector pos;
296 size_t index;
298 BuildPoint(const Vector& pos = Vector(), const size_t index = 0): pos(pos), index(index) {}
299 };
301 typedef std::vector<BuildPoint> BuildPoints;
303 typedef typename BuildPoints::iterator BuildPointsIt;
305 typedef typename BuildPoints::const_iterator BuildPointsCstIt;
306
309 {
310 size_t dim;
312 CompareDim(const size_t dim):dim(dim){}
314 bool operator() (const BuildPoint& p0, const BuildPoint& p1) { return p0.pos(dim) < p1.pos(dim); }
315 };
316
318 struct Node
319 {
320 int dim;
323 Node(const int dim = -1, const T cutVal = 0):dim(dim), cutVal(cutVal) {}
324 };
326 typedef std::vector<Node> Nodes;
327
329 cl::Buffer nodesCL;
330
331
332 inline size_t childLeft(size_t pos) const { return 2*pos + 1; }
333 inline size_t childRight(size_t pos) const { return 2*pos + 2; }
334 inline size_t parent(size_t pos) const { return (pos-1)/2; }
335 size_t getTreeDepth(size_t size) const;
336 size_t getTreeSize(size_t size) const;
337
339 void buildNodes(const BuildPointsIt first, const BuildPointsIt last, const size_t pos, const Vector minValues, const Vector maxValues);
340
341 public:
343 KDTreeBalancedPtInLeavesStackOpenCL(const CloudType& cloud, const Index dim, const unsigned creationOptionFlags, const cl_device_type deviceType);
344 };
345
347 template<typename T, typename CloudType = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> >
349 {
350 typedef typename NearestNeighbourSearch<T, CloudType>::Vector Vector;
351 typedef typename NearestNeighbourSearch<T, CloudType>::Matrix Matrix;
352 typedef typename NearestNeighbourSearch<T, CloudType>::Index Index;
353 typedef typename NearestNeighbourSearch<T, CloudType>::IndexVector IndexVector;
354 typedef typename NearestNeighbourSearch<T, CloudType>::IndexMatrix IndexMatrix;
355
361
364
366
367 protected:
369 typedef Index BuildPoint;
371 typedef std::vector<BuildPoint> BuildPoints;
373 typedef typename BuildPoints::iterator BuildPointsIt;
375 typedef typename BuildPoints::const_iterator BuildPointsCstIt;
376
379 {
381 size_t dim;
383 CompareDim(const CloudType& cloud, const size_t dim): cloud(cloud), dim(dim){}
385 bool operator() (const BuildPoint& p0, const BuildPoint& p1) { return cloud.coeff(dim, p0) < cloud.coeff(dim, p1); }
386 };
387
389 struct Node
390 {
391 int dim;
392 Index index;
394 Node(const int dim = -2, const Index index = 0):dim(dim), index(index) {}
395 };
397 typedef std::vector<Node> Nodes;
398
400 cl::Buffer nodesCL;
401
402
403 inline size_t childLeft(size_t pos) const { return 2*pos + 1; }
404 inline size_t childRight(size_t pos) const { return 2*pos + 2; }
405 inline size_t parent(size_t pos) const { return (pos-1)/2; }
406 size_t getTreeDepth(size_t size) const;
407 size_t getTreeSize(size_t size) const;
408
410 void buildNodes(const BuildPointsIt first, const BuildPointsIt last, const size_t pos, const Vector minValues, const Vector maxValues);
411
412 public:
414 KDTreeBalancedPtInNodesStackOpenCL(const CloudType& cloud, const Index dim, const unsigned creationOptionFlags, const cl_device_type deviceType);
415 };
416
417 #endif // HAVE_OPENCL
418
420}
421
422#endif // __NABO_H
public interface
Namespace for Nabo.
Definition brute_force_cpu.cpp:41
T dist2(const A &v0, const B &v1)
Euclidean distance.
Definition nabo_private.h:65
KDTree, balanced, points in leaves, stack, implicit bounds, balance aspect ratio.
Definition nabo_private.h:259
Brute-force nearest neighbour.
Definition nabo_private.h:73
Point during kd-tree construction.
Definition nabo_private.h:294
Vector pos
point
Definition nabo_private.h:295
BuildPoint(const Vector &pos=Vector(), const size_t index=0)
Construct a build point, at a given pos with a specific index.
Definition nabo_private.h:298
size_t index
index of point in cloud
Definition nabo_private.h:296
Functor to compare point values on a given dimension.
Definition nabo_private.h:309
bool operator()(const BuildPoint &p0, const BuildPoint &p1)
Compare the values of p0 and p1 on dim, and return whether p0[dim] < p1[dim].
Definition nabo_private.h:314
CompareDim(const size_t dim)
Build the functor for a specific dimension.
Definition nabo_private.h:312
size_t dim
dimension on which to compare
Definition nabo_private.h:310
Tree node for CL.
Definition nabo_private.h:319
T cutVal
value of the cut
Definition nabo_private.h:321
Node(const int dim=-1, const T cutVal=0)
Build a tree node, with a given dimension and value to cut on, or, if leaf and dim <= -2,...
Definition nabo_private.h:323
int dim
dimension of the cut, or, if negative, index of the point: -1 == invalid, <= -2 = index of pt
Definition nabo_private.h:320
KDTree, balanced, points in leaves, stack, implicit bounds, balance aspect ratio.
Definition nabo_private.h:273
size_t getTreeDepth(size_t size) const
Return the max depth of a tree of a given size.
Definition kdtree_opencl.cpp:460
Nodes nodes
search nodes
Definition nabo_private.h:328
size_t childLeft(size_t pos) const
Return the left child of pos.
Definition nabo_private.h:332
std::vector< Node > Nodes
dense vector of search nodes
Definition nabo_private.h:326
void buildNodes(const BuildPointsIt first, const BuildPointsIt last, const size_t pos, const Vector minValues, const Vector maxValues)
Recurse to build nodes.
Definition kdtree_opencl.cpp:475
BuildPoints::iterator BuildPointsIt
iterator to points during kd-tree construction
Definition nabo_private.h:303
size_t parent(size_t pos) const
Return the parent of pos.
Definition nabo_private.h:334
std::vector< BuildPoint > BuildPoints
points during kd-tree construction
Definition nabo_private.h:301
cl::Buffer nodesCL
CL buffer for search nodes.
Definition nabo_private.h:329
size_t childRight(size_t pos) const
Return the right child of pos.
Definition nabo_private.h:333
BuildPoints::const_iterator BuildPointsCstIt
const-iterator to points during kd-tree construction
Definition nabo_private.h:305
size_t getTreeSize(size_t size) const
Return the storage size of tree of a given size.
Definition kdtree_opencl.cpp:440
Functor to compare point values on a given dimension.
Definition nabo_private.h:379
CompareDim(const CloudType &cloud, const size_t dim)
Build the functor for a specific dimension on a specific cloud.
Definition nabo_private.h:383
size_t dim
dimension on which to compare
Definition nabo_private.h:381
const CloudType & cloud
reference to data points used to compare
Definition nabo_private.h:380
bool operator()(const BuildPoint &p0, const BuildPoint &p1)
Compare the values of p0 and p1 on dim, and return whether p0[dim] < p1[dim].
Definition nabo_private.h:385
Tree node for CL.
Definition nabo_private.h:390
int dim
dimension of the cut, or, if -1 == leaf, -2 == invalid
Definition nabo_private.h:391
Index index
index of the point to cut
Definition nabo_private.h:392
Node(const int dim=-2, const Index index=0)
Build a tree node, with a given index and a given dimension to cut on.
Definition nabo_private.h:394
KDTree, balanced, points in nodes, stack, implicit bounds, balance aspect ratio.
Definition nabo_private.h:349
BuildPoints::iterator BuildPointsIt
iterator to points during kd-tree construction
Definition nabo_private.h:373
size_t getTreeDepth(size_t size) const
Return the max depth of a tree of a given size.
Definition kdtree_opencl.cpp:581
void buildNodes(const BuildPointsIt first, const BuildPointsIt last, const size_t pos, const Vector minValues, const Vector maxValues)
Recurse to build nodes.
Definition kdtree_opencl.cpp:594
size_t parent(size_t pos) const
Return the parent of pos.
Definition nabo_private.h:405
cl::Buffer nodesCL
CL buffer for search nodes.
Definition nabo_private.h:400
std::vector< BuildPoint > BuildPoints
points during kd-tree construction
Definition nabo_private.h:371
size_t childLeft(size_t pos) const
Return the left child of pos.
Definition nabo_private.h:403
Nodes nodes
search nodes
Definition nabo_private.h:399
Index BuildPoint
a point during kd-tree construction is just its index
Definition nabo_private.h:369
size_t getTreeSize(size_t size) const
Return the storage size of tree of a given size.
Definition kdtree_opencl.cpp:564
std::vector< Node > Nodes
dense vector of search nodes
Definition nabo_private.h:397
size_t childRight(size_t pos) const
Return the right child of pos.
Definition nabo_private.h:404
BuildPoints::const_iterator BuildPointsCstIt
const-iterator to points during kd-tree construction
Definition nabo_private.h:375
entry in a bucket
Definition nabo_private.h:159
Index index
index of point
Definition nabo_private.h:161
BucketEntry(const T *pt=0, const Index index=0)
create a new bucket entry for a point in the data
Definition nabo_private.h:167
const T * pt
pointer to first value of point data, 0 if end of bucket
Definition nabo_private.h:160
search node
Definition nabo_private.h:139
T cutVal
for split node, split value
Definition nabo_private.h:143
uint32_t bucketIndex
for leaf node, pointer to bucket
Definition nabo_private.h:144
Node(const uint32_t dimChild, const T cutVal)
construct a split node
Definition nabo_private.h:148
Node(const uint32_t bucketSize, const uint32_t bucketIndex)
construct a leaf node
Definition nabo_private.h:151
uint32_t dimChildBucketSize
cut dimension for split nodes (dimBitCount lsb), index of right node or number of bucket(rest)....
Definition nabo_private.h:140
KDTree, unbalanced, points in leaves, stack, implicit bounds, ANN_KD_SL_MIDPT, optimised implementati...
Definition nabo_private.h:95
uint32_t getChildBucketSize(const uint32_t dimChildBucketSize) const
get the child index or the bucket size out of the coumpount index
Definition nabo_private.h:132
const uint32_t dimMask
mask to access dim
Definition nabo_private.h:123
BuildPoints::const_iterator BuildPointsCstIt
const-iterator to indices of points during kd-tree construction
Definition nabo_private.h:115
BuildPoints::iterator BuildPointsIt
iterator to indices of points during kd-tree construction
Definition nabo_private.h:113
std::vector< Node > Nodes
dense vector of search nodes, provides better memory performances than many small objects
Definition nabo_private.h:155
uint32_t getDim(const uint32_t dimChildBucketSize) const
get the dimension out of the compound index
Definition nabo_private.h:129
std::pair< T, T > getBounds(const BuildPointsIt first, const BuildPointsIt last, const unsigned dim)
return the bounds of points from [first..last[ on dimension dim
Definition kdtree_cpu.cpp:94
unsigned long onePointKnn(const Matrix &query, IndexMatrix &indices, Matrix &dists2, int i, Heap &heap, std::vector< T > &off, const T maxError, const T maxRadius2, const bool allowSelfMatch, const bool collectStatistics, const bool sortResults) const
search one point, call recurseKnn with the correct template parameters
Definition kdtree_cpu.cpp:339
Buckets buckets
buckets
Definition nabo_private.h:177
std::vector< BucketEntry > Buckets
bucket data
Definition nabo_private.h:171
uint32_t createDimChildBucketSize(const uint32_t dim, const uint32_t childIndex) const
create the compound index containing the dimension and the index of the child or the bucket size
Definition nabo_private.h:126
std::vector< Index > BuildPoints
indices of points during kd-tree construction
Definition nabo_private.h:111
Nodes nodes
search nodes
Definition nabo_private.h:174
const uint32_t dimBitCount
number of bits required to store dimension index + number of dimensions
Definition nabo_private.h:121
unsigned buildNodes(const BuildPointsIt first, const BuildPointsIt last, const Vector minValues, const Vector maxValues)
construct nodes for points [first..last[ inside the hyperrectangle [minValues..maxValues]
Definition kdtree_cpu.cpp:110
const unsigned bucketSize
size of bucket
Definition nabo_private.h:118
unsigned long recurseKnn(const T *query, const unsigned n, T rd, Heap &heap, std::vector< T > &off, const T maxError, const T maxRadius2) const
recursive search, strongly inspired by ANN and [Arya & Mount, Algorithms for fast vector quantization...
Definition kdtree_cpu.cpp:368
Nearest neighbour search interface, templatized on scalar type.
Definition nabo.h:259
void checkSizesKnn(const Matrix &query, const IndexMatrix &indices, const Matrix &dists2, const Index k, const unsigned optionFlags, const Vector *maxRadii=0) const
Make sure that the output matrices have the right sizes. Throw an exception otherwise.
Definition nabo.cpp:103
int Index
an index to a Vector or a Matrix, for refering to data points
Definition nabo.h:267
Cloud_T CloudType
a column-major Eigen matrix in which each column is a point; this matrix has dim rows
Definition nabo.h:265
const Vector maxBound
the high bound of the search space (axis-aligned bounding box)
Definition nabo.h:282
const CloudType & cloud
the reference to the data-point cloud, which must remain valid during the lifetime of the NearestNeig...
Definition nabo.h:274
const unsigned creationOptionFlags
creation options
Definition nabo.h:278
Eigen::Matrix< Index, Eigen::Dynamic, 1 > IndexVector
a vector of indices to data points
Definition nabo.h:269
const Index dim
the dimensionality of the data-point cloud
Definition nabo.h:276
Eigen::Matrix< Index, Eigen::Dynamic, Eigen::Dynamic > IndexMatrix
a matrix of indices to data points
Definition nabo.h:271
const Vector minBound
the low bound of the search space (axis-aligned bounding box)
Definition nabo.h:280
Eigen::Matrix< T, Eigen::Dynamic, 1 > Vector
an Eigen vector of type T, to hold the coordinates of a point
Definition nabo.h:261
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > Matrix
a column-major Eigen matrix in which each column is a point; this matrix has dim rows
Definition nabo.h:263
OpenCL support for nearest neighbour search
Definition nabo_private.h:223
cl::Kernel knnKernel
the kernel to perform knnSearch, mutable because it is stateful, but conceptually const
Definition nabo_private.h:238
void initOpenCL(const char *clFileName, const char *kernelName, const std::string &additionalDefines="")
Initialize CL support.
Definition kdtree_opencl.cpp:239
cl::Buffer cloudCL
the buffer for the input data
Definition nabo_private.h:240
cl::CommandQueue queue
the command queue
Definition nabo_private.h:239
cl::Context & context
the CL context
Definition nabo_private.h:237
const cl_device_type deviceType
the type of device to run CL code on (CL_DEVICE_TYPE_CPU or CL_DEVICE_TYPE_GPU)
Definition nabo_private.h:236
Parameter vector.
Definition nabo.h:232