00001
00024 #ifndef __MLPACK_METHODS_RANN_RA_SEARCH_RULES_HPP
00025 #define __MLPACK_METHODS_RANN_RA_SEARCH_RULES_HPP
00026
00027 namespace mlpack {
00028 namespace neighbor {
00029
00030 template<typename SortPolicy, typename MetricType, typename TreeType>
00031 class RASearchRules
00032 {
00033 public:
00034 RASearchRules(const arma::mat& referenceSet,
00035 const arma::mat& querySet,
00036 arma::Mat<size_t>& neighbors,
00037 arma::mat& distances,
00038 MetricType& metric,
00039 const double tau = 5,
00040 const double alpha = 0.95,
00041 const bool naive = false,
00042 const bool sampleAtLeaves = false,
00043 const bool firstLeafExact = false,
00044 const size_t singleSampleLimit = 20);
00045
00046
00047
00048 double BaseCase(const size_t queryIndex, const size_t referenceIndex);
00049
00061 double Prescore(TreeType& queryNode,
00062 TreeType& referenceNode,
00063 TreeType& referenceChildNode,
00064 const double baseCaseResult) const;
00065 double PrescoreQ(TreeType& queryNode,
00066 TreeType& queryChildNode,
00067 TreeType& referenceNode,
00068 const double baseCaseResult) const;
00069
00070
00071
00094 double Score(const size_t queryIndex, TreeType& referenceNode);
00095
00119 double Score(const size_t queryIndex,
00120 TreeType& referenceNode,
00121 const double baseCaseResult);
00122
00140 double Rescore(const size_t queryIndex,
00141 TreeType& referenceNode,
00142 const double oldScore);
00143
00162 double Score(TreeType& queryNode, TreeType& referenceNode);
00163
00184 double Score(TreeType& queryNode,
00185 TreeType& referenceNode,
00186 const double baseCaseResult);
00187
00210 double Rescore(TreeType& queryNode,
00211 TreeType& referenceNode,
00212 const double oldScore);
00213
00214
00215 size_t NumDistComputations() { return numDistComputations; }
00216 size_t NumEffectiveSamples()
00217 {
00218 if (numSamplesMade.n_elem == 0)
00219 return 0;
00220 else
00221 return arma::sum(numSamplesMade);
00222 }
00223
00224 private:
00226 const arma::mat& referenceSet;
00227
00229 const arma::mat& querySet;
00230
00232 arma::Mat<size_t>& neighbors;
00233
00235 arma::mat& distances;
00236
00238 MetricType& metric;
00239
00241 bool sampleAtLeaves;
00242
00244 bool firstLeafExact;
00245
00247 size_t singleSampleLimit;
00248
00250 size_t numSamplesReqd;
00251
00253 arma::Col<size_t> numSamplesMade;
00254
00256 double samplingRatio;
00257
00258
00259 size_t numDistComputations;
00260
00270 void InsertNeighbor(const size_t queryIndex,
00271 const size_t pos,
00272 const size_t neighbor,
00273 const double distance);
00274
00284 size_t MinimumSamplesReqd(const size_t n,
00285 const size_t k,
00286 const double tau,
00287 const double alpha) const;
00288
00298 double SuccessProbability(const size_t n,
00299 const size_t k,
00300 const size_t m,
00301 const size_t t) const;
00302
00312 void ObtainDistinctSamples(const size_t numSamples,
00313 const size_t rangeUpperBound,
00314 arma::uvec& distinctSamples) const;
00315
00319 double Score(const size_t queryIndex,
00320 TreeType& referenceNode,
00321 const double distance,
00322 const double bestDistance);
00323
00327 double Score(TreeType& queryNode,
00328 TreeType& referenceNode,
00329 const double distance,
00330 const double bestDistance);
00331
00332 };
00333
00334 };
00335 };
00336
00337
00338 #include "ra_search_rules_impl.hpp"
00339
00340 #endif // __MLPACK_METHODS_RANN_RA_SEARCH_RULES_HPP