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

并行计算

开发平台:

Visual C++

  1. //----------------------------------------------------------------------
  2. // File: ANNperf.h
  3. // Programmer: Sunil Arya and David Mount
  4. // Last modified: 03/04/98 (Release 0.1)
  5. // Description: Include file for ANN performance stats
  6. //
  7. // Some of the code for statistics gathering has been adapted
  8. // from the SmplStat.h package in the g++ library.
  9. //----------------------------------------------------------------------
  10. // Copyright (c) 1997-2005 University of Maryland and Sunil Arya and
  11. // David Mount.  All Rights Reserved.
  12. // 
  13. // This software and related documentation is part of the Approximate
  14. // Nearest Neighbor Library (ANN).  This software is provided under
  15. // the provisions of the Lesser GNU Public License (LGPL).  See the
  16. // file ../ReadMe.txt for further information.
  17. // 
  18. // The University of Maryland (U.M.) and the authors make no
  19. // representations about the suitability or fitness of this software for
  20. // any purpose.  It is provided "as is" without express or implied
  21. // warranty.
  22. //----------------------------------------------------------------------
  23. //      History:
  24. //      Revision 0.1  03/04/98
  25. //          Initial release
  26. //      Revision 1.0  04/01/05
  27. //          Added ANN_ prefix to avoid name conflicts.
  28. //----------------------------------------------------------------------
  29. #ifndef ANNperf_H
  30. #define ANNperf_H
  31. //----------------------------------------------------------------------
  32. // basic includes
  33. //----------------------------------------------------------------------
  34. #include "ANN.h" // basic ANN includes
  35. //----------------------------------------------------------------------
  36. // kd-tree stats object
  37. // This object is used for collecting information about a kd-tree
  38. // or bd-tree.
  39. //----------------------------------------------------------------------
  40. class ANNkdStats { // stats on kd-tree
  41. public:
  42. int dim; // dimension of space
  43. int n_pts; // no. of points
  44. int bkt_size; // bucket size
  45. int n_lf; // no. of leaves (including trivial)
  46. int n_tl; // no. of trivial leaves (no points)
  47. int n_spl; // no. of splitting nodes
  48. int n_shr; // no. of shrinking nodes (for bd-trees)
  49. int depth; // depth of tree
  50. float sum_ar; // sum of leaf aspect ratios
  51. float avg_ar; // average leaf aspect ratio
  52.  //
  53. // reset stats
  54. void reset(int d=0, int n=0, int bs=0)
  55. {
  56. dim = d; n_pts = n; bkt_size = bs;
  57. n_lf = n_tl = n_spl = n_shr = depth = 0;
  58. sum_ar = avg_ar = 0.0;
  59. }
  60. ANNkdStats() // basic constructor
  61. { reset(); }
  62. void merge(const ANNkdStats &st); // merge stats from child 
  63. };
  64. //----------------------------------------------------------------------
  65. //  ANNsampStat
  66. // A sample stat collects numeric (double) samples and returns some
  67. // simple statistics.  Its main functions are:
  68. //
  69. // reset() Reset to no samples.
  70. // += x Include sample x.
  71. // samples() Return number of samples.
  72. // mean() Return mean of samples.
  73. // stdDev() Return standard deviation
  74. // min() Return minimum of samples.
  75. // max() Return maximum of samples.
  76. //----------------------------------------------------------------------
  77. class DLL_API ANNsampStat {
  78. int n; // number of samples
  79. double sum; // sum
  80. double sum2; // sum of squares
  81. double minVal, maxVal; // min and max
  82. public :
  83. void reset() // reset everything
  84. {  
  85. n = 0;
  86. sum = sum2 = 0;
  87. minVal = ANN_DBL_MAX;
  88. maxVal = -ANN_DBL_MAX; 
  89. }
  90. ANNsampStat() { reset(); } // constructor
  91. void operator+=(double x) // add sample
  92. {
  93. n++;  sum += x;  sum2 += x*x;
  94. if (x < minVal) minVal = x;
  95. if (x > maxVal) maxVal = x;
  96. }
  97. int samples() { return n; } // number of samples
  98. double mean() { return sum/n; } // mean
  99. // standard deviation
  100. double stdDev() { return sqrt((sum2 - (sum*sum)/n)/(n-1));}
  101. double min() { return minVal; } // minimum
  102. double max() { return maxVal; } // maximum
  103. };
  104. //----------------------------------------------------------------------
  105. // Operation count updates
  106. //----------------------------------------------------------------------
  107. #ifdef ANN_PERF
  108.   #define ANN_FLOP(n) {ann_Nfloat_ops += (n);}
  109.   #define ANN_LEAF(n) {ann_Nvisit_lfs += (n);}
  110.   #define ANN_SPL(n) {ann_Nvisit_spl += (n);}
  111.   #define ANN_SHR(n) {ann_Nvisit_shr += (n);}
  112.   #define ANN_PTS(n) {ann_Nvisit_pts += (n);}
  113.   #define ANN_COORD(n) {ann_Ncoord_hts += (n);}
  114. #else
  115.   #define ANN_FLOP(n)
  116.   #define ANN_LEAF(n)
  117.   #define ANN_SPL(n)
  118.   #define ANN_SHR(n)
  119.   #define ANN_PTS(n)
  120.   #define ANN_COORD(n)
  121. #endif
  122. //----------------------------------------------------------------------
  123. // Performance statistics
  124. // The following data and routines are used for computing performance
  125. // statistics for nearest neighbor searching.  Because these routines
  126. // can slow the code down, they can be activated and deactiviated by
  127. // defining the ANN_PERF variable, by compiling with the option:
  128. // -DANN_PERF
  129. //----------------------------------------------------------------------
  130. //----------------------------------------------------------------------
  131. // Global counters for performance measurement
  132. //
  133. // visit_lfs The number of leaf nodes visited in the
  134. // tree.
  135. //
  136. // visit_spl The number of splitting nodes visited in the
  137. // tree.
  138. //
  139. // visit_shr The number of shrinking nodes visited in the
  140. // tree.
  141. //
  142. // visit_pts The number of points visited in all the
  143. // leaf nodes visited. Equivalently, this
  144. // is the number of points for which distance
  145. // calculations are performed.
  146. //
  147. // coord_hts The number of times a coordinate of a 
  148. // data point is accessed. This is generally
  149. // less than visit_pts*d if partial distance
  150. // calculation is used.  This count is low
  151. // in the sense that if a coordinate is hit
  152. // many times in the same routine we may
  153. // count it only once.
  154. //
  155. // float_ops The number of floating point operations.
  156. // This includes all operations in the heap
  157. // as well as distance calculations to boxes.
  158. //
  159. // average_err The average error of each query (the
  160. // error of the reported point to the true
  161. // nearest neighbor).  For k nearest neighbors
  162. // the error is computed k times.
  163. //
  164. // rank_err The rank error of each query (the difference
  165. // in the rank of the reported point and its
  166. // true rank).
  167. //
  168. // data_pts The number of data points.  This is not
  169. // a counter, but used in stats computation.
  170. //----------------------------------------------------------------------
  171. extern int ann_Ndata_pts; // number of data points
  172. extern int ann_Nvisit_lfs; // number of leaf nodes visited
  173. extern int ann_Nvisit_spl; // number of splitting nodes visited
  174. extern int ann_Nvisit_shr; // number of shrinking nodes visited
  175. extern int ann_Nvisit_pts; // visited points for one query
  176. extern int ann_Ncoord_hts; // coordinate hits for one query
  177. extern int ann_Nfloat_ops; // floating ops for one query
  178. extern ANNsampStat ann_visit_lfs; // stats on leaf nodes visits
  179. extern ANNsampStat ann_visit_spl; // stats on splitting nodes visits
  180. extern ANNsampStat ann_visit_shr; // stats on shrinking nodes visits
  181. extern ANNsampStat ann_visit_nds; // stats on total nodes visits
  182. extern ANNsampStat ann_visit_pts; // stats on points visited
  183. extern ANNsampStat ann_coord_hts; // stats on coordinate hits
  184. extern ANNsampStat ann_float_ops; // stats on floating ops
  185. //----------------------------------------------------------------------
  186. //  The following need to be part of the public interface, because
  187. //  they are accessed outside the DLL in ann_test.cpp.
  188. //----------------------------------------------------------------------
  189. DLL_API extern ANNsampStat ann_average_err; // average error
  190. DLL_API extern ANNsampStat ann_rank_err; // rank error
  191. //----------------------------------------------------------------------
  192. // Declaration of externally accessible routines for statistics
  193. //----------------------------------------------------------------------
  194. DLL_API void annResetStats(int data_size); // reset stats for a set of queries
  195. DLL_API void annResetCounts(); // reset counts for one queries
  196. DLL_API void annUpdateStats(); // update stats with current counts
  197. DLL_API void annPrintStats(ANNbool validate); // print statistics for a run
  198. #endif