ANN.cpp
上传用户:chinafayin
上传日期:2022-04-05
资源大小:153k
文件大小:6k
源码类别:

并行计算

开发平台:

Visual C++

  1. //----------------------------------------------------------------------
  2. // File: ANN.cpp
  3. // Programmer: Sunil Arya and David Mount
  4. // Description: Methods for ANN.h and ANNx.h
  5. // Last modified: 01/04/05 (Version 1.0)
  6. //----------------------------------------------------------------------
  7. // Copyright (c) 1997-2005 University of Maryland and Sunil Arya and
  8. // David Mount.  All Rights Reserved.
  9. // 
  10. // This software and related documentation is part of the Approximate
  11. // Nearest Neighbor Library (ANN).  This software is provided under
  12. // the provisions of the Lesser GNU Public License (LGPL).  See the
  13. // file ../ReadMe.txt for further information.
  14. // 
  15. // The University of Maryland (U.M.) and the authors make no
  16. // representations about the suitability or fitness of this software for
  17. // any purpose.  It is provided "as is" without express or implied
  18. // warranty.
  19. //----------------------------------------------------------------------
  20. // History:
  21. // Revision 0.1  03/04/98
  22. // Initial release
  23. // Revision 1.0  04/01/05
  24. // Added performance counting to annDist()
  25. //----------------------------------------------------------------------
  26. #include "../ANNx.h" // all ANN includes
  27. #include "../ANNperf.h" // ANN performance 
  28. using namespace std; // make std:: accessible
  29. //----------------------------------------------------------------------
  30. // Point methods
  31. //----------------------------------------------------------------------
  32. //----------------------------------------------------------------------
  33. // Distance utility.
  34. // (Note: In the nearest neighbor search, most distances are
  35. // computed using partial distance calculations, not this
  36. // procedure.)
  37. //----------------------------------------------------------------------
  38. ANNdist annDist( // interpoint squared distance
  39. int dim,
  40. ANNpoint p,
  41. ANNpoint q)
  42. {
  43. register int d;
  44. register ANNcoord diff;
  45. register ANNcoord dist;
  46. dist = 0;
  47. for (d = 0; d < dim; d++) {
  48. diff = p[d] - q[d];
  49. dist = ANN_SUM(dist, ANN_POW(diff));
  50. }
  51. ANN_FLOP(3*dim) // performance counts
  52. ANN_PTS(1)
  53. ANN_COORD(dim)
  54. return dist;
  55. }
  56. //----------------------------------------------------------------------
  57. // annPrintPoint() prints a point to a given output stream.
  58. //----------------------------------------------------------------------
  59. void annPrintPt( // print a point
  60. ANNpoint pt, // the point
  61. int dim, // the dimension
  62. std::ostream &out) // output stream
  63. {
  64. for (int j = 0; j < dim; j++) {
  65. out << pt[j];
  66. if (j < dim-1) out << " ";
  67. }
  68. }
  69. //----------------------------------------------------------------------
  70. // Point allocation/deallocation:
  71. //
  72. // Because points (somewhat like strings in C) are stored
  73. // as pointers.  Consequently, creating and destroying
  74. // copies of points may require storage allocation.  These
  75. // procedures do this.
  76. //
  77. // annAllocPt() and annDeallocPt() allocate a deallocate
  78. // storage for a single point, and return a pointer to it.
  79. //
  80. // annAllocPts() allocates an array of points as well a place
  81. // to store their coordinates, and initializes the points to
  82. // point to their respective coordinates.  It allocates point
  83. // storage in a contiguous block large enough to store all the
  84. // points.  It performs no initialization.
  85. //
  86. // annDeallocPts() should only be used on point arrays allocated
  87. // by annAllocPts since it assumes that points are allocated in
  88. // a block.
  89. //
  90. // annCopyPt() copies a point taking care to allocate storage
  91. // for the new point.
  92. //
  93. // annAssignRect() assigns the coordinates of one rectangle to
  94. // another.  The two rectangles must have the same dimension
  95. // (and it is not possible to test this here).
  96. //----------------------------------------------------------------------
  97. ANNpoint annAllocPt(int dim, ANNcoord c) // allocate 1 point
  98. {
  99. ANNpoint p = new ANNcoord[dim];
  100. for (int i = 0; i < dim; i++) p[i] = c;
  101. return p;
  102. }
  103.    
  104. ANNpointArray annAllocPts(int n, int dim) // allocate n pts in dim
  105. {
  106. ANNpointArray pa = new ANNpoint[n]; // allocate points
  107. ANNpoint   p  = new ANNcoord[n*dim]; // allocate space for coords
  108. for (int i = 0; i < n; i++) {
  109. pa[i] = &(p[i*dim]);
  110. }
  111. return pa;
  112. }
  113. void annDeallocPt(ANNpoint &p) // deallocate 1 point
  114. {
  115. delete [] p;
  116. p = NULL;
  117. }
  118.    
  119. void annDeallocPts(ANNpointArray &pa) // deallocate points
  120. {
  121. delete [] pa[0]; // dealloc coordinate storage
  122. delete [] pa; // dealloc points
  123. pa = NULL;
  124. }
  125.    
  126. ANNpoint annCopyPt(int dim, ANNpoint source) // copy point
  127. {
  128. ANNpoint p = new ANNcoord[dim];
  129. for (int i = 0; i < dim; i++) p[i] = source[i];
  130. return p;
  131. }
  132.    
  133. // assign one rect to another
  134. void annAssignRect(int dim, ANNorthRect &dest, const ANNorthRect &source)
  135. {
  136. for (int i = 0; i < dim; i++) {
  137. dest.lo[i] = source.lo[i];
  138. dest.hi[i] = source.hi[i];
  139. }
  140. }
  141. // is point inside rectangle?
  142. ANNbool ANNorthRect::inside(int dim, ANNpoint p)
  143. {
  144. for (int i = 0; i < dim; i++) {
  145. if (p[i] < lo[i] || p[i] > hi[i]) return ANNfalse;
  146. }
  147. return ANNtrue;
  148. }
  149. //----------------------------------------------------------------------
  150. // Error handler
  151. //----------------------------------------------------------------------
  152. void annError(char *msg, ANNerr level)
  153. {
  154. if (level == ANNabort) {
  155. cerr << "ANN: ERROR------->" << msg << "<-------------ERRORn";
  156. exit(1);
  157. }
  158. else {
  159. cerr << "ANN: WARNING----->" << msg << "<-------------WARNINGn";
  160. }
  161. }
  162. //----------------------------------------------------------------------
  163. // Limit on number of points visited
  164. // We have an option for terminating the search early if the
  165. // number of points visited exceeds some threshold.  If the
  166. // threshold is 0 (its default)  this means there is no limit
  167. // and the algorithm applies its normal termination condition.
  168. // This is for applications where there are real time constraints
  169. // on the running time of the algorithm.
  170. //----------------------------------------------------------------------
  171. ANN_THREAD_LOCAL int ANNmaxPtsVisited = 0; // maximum number of pts visited
  172. ANN_THREAD_LOCAL int ANNptsVisited; // number of pts visited in search
  173. //----------------------------------------------------------------------
  174. // Global function declarations
  175. //----------------------------------------------------------------------
  176. void annMaxPtsVisit( // set limit on max. pts to visit in search
  177. int maxPts) // the limit
  178. {
  179. ANNmaxPtsVisited = maxPts;
  180. }