| | #ifndef FLANN_UTIL_CUDA_HEAP_H |
| | #define FLANN_UTIL_CUDA_HEAP_H |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | namespace flann |
| | { |
| | namespace cuda |
| | { |
| | template <class T> |
| | __device__ __host__ void swap( T& x, T& y ) |
| | { |
| | T t=x; |
| | x=y; |
| | y=t; |
| | } |
| |
|
| | namespace heap |
| | { |
| |
|
| | |
| | |
| | template <class GreaterThan, class RandomAccessIterator> |
| | __host__ __device__ void |
| | sift_down( RandomAccessIterator array, size_t begin, size_t length, GreaterThan c = GreaterThan() ) |
| | { |
| |
|
| | while( 2*begin+1 < length ) { |
| | size_t left = 2*begin+1; |
| | size_t right = 2*begin+2; |
| | size_t largest=begin; |
| | if((left < length)&& c(array[left], array[largest]) ) largest=left; |
| |
|
| | if((right < length)&& c(array[right], array[largest]) ) largest=right; |
| |
|
| | if( largest != begin ) { |
| | cuda::swap( array[begin], array[largest] ); |
| | begin=largest; |
| | } |
| | else return; |
| | } |
| | } |
| |
|
| | |
| | |
| | template <class GreaterThan, class RandomAccessIterator> |
| | __host__ __device__ void |
| | make_heap( RandomAccessIterator begin, size_t length, GreaterThan c = GreaterThan() ) |
| | { |
| | int i=length/2-1; |
| | while( i>=0 ) { |
| | sift_down( begin, i, length, c ); |
| | i--; |
| | } |
| | } |
| |
|
| |
|
| | |
| | |
| | template <class GreaterThan, class RandomAccessIterator> |
| | __host__ __device__ bool |
| | is_heap( RandomAccessIterator begin, size_t length, GreaterThan c = GreaterThan() ) |
| | { |
| | for( unsigned i=0; i<length; i++ ) { |
| | if((2*i+1 < length)&& c(begin[2*i+1],begin[i]) ) return false; |
| | if((2*i+2 < length)&& c(begin[2*i+2],begin[i]) ) return false; |
| | } |
| | return true; |
| | } |
| |
|
| |
|
| | |
| | |
| | template <class GreaterThan, class RandomAccessIterator, class RandomAccessIterator2> |
| | __host__ __device__ void |
| | sift_down( RandomAccessIterator key, RandomAccessIterator2 value, size_t begin, size_t length, GreaterThan c = GreaterThan() ) |
| | { |
| |
|
| | while( 2*begin+1 < length ) { |
| | size_t left = 2*begin+1; |
| | size_t right = 2*begin+2; |
| | size_t largest=begin; |
| | if((left < length)&& c(key[left], key[largest]) ) largest=left; |
| |
|
| | if((right < length)&& c(key[right], key[largest]) ) largest=right; |
| |
|
| | if( largest != begin ) { |
| | cuda::swap( key[begin], key[largest] ); |
| | cuda::swap( value[begin], value[largest] ); |
| | begin=largest; |
| | } |
| | else return; |
| | } |
| | } |
| |
|
| | |
| | |
| | template <class GreaterThan, class RandomAccessIterator, class RandomAccessIterator2> |
| | __host__ __device__ void |
| | make_heap( RandomAccessIterator key, RandomAccessIterator2 value, size_t length, GreaterThan c = GreaterThan() ) |
| | { |
| | int i=length/2-1; |
| | while( i>=0 ) { |
| | sift_down( key, value, i, length, c ); |
| | i--; |
| | } |
| | } |
| |
|
| | } |
| |
|
| | } |
| | } |
| |
|
| | #endif |
| |
|