kde_stat.h
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 #ifndef KDE_STAT_H
00033 #define KDE_STAT_H
00034 
00035 template<typename TKernel>
00036 class VKdeStat {
00037  public:
00038 
00042   TKernel min_bandwidth_kernel_;
00043 
00047   TKernel max_bandwidth_kernel_;
00048 
00051   double weight_sum_;
00052 
00056   double mass_l_;
00057   
00061   double mass_u_;
00062   
00066   double used_error_;
00067   
00071   double n_pruned_;
00072 
00075   double postponed_l_;
00076   
00079   double postponed_e_;
00080 
00083   double postponed_u_;
00084 
00088   double postponed_used_error_;
00089 
00094   double postponed_n_pruned_;
00095 
00098   double get_weight_sum() {
00099     return weight_sum_;
00100   }
00101 
00104   void AddPostponed(const VKdeStat& parent_stat) {
00105     postponed_l_ += parent_stat.postponed_l_;
00106     postponed_e_ += parent_stat.postponed_e_;
00107     postponed_u_ += parent_stat.postponed_u_;
00108     postponed_used_error_ += parent_stat.postponed_used_error_;
00109     postponed_n_pruned_ += parent_stat.postponed_n_pruned_;
00110   }
00111 
00114   void ClearPostponed() {      
00115     postponed_l_ = 0;
00116     postponed_e_ = 0;
00117     postponed_u_ = 0;
00118     postponed_used_error_ = 0;
00119     postponed_n_pruned_ = 0;      
00120   }
00121 
00124   void RefineBoundStatistics(const VKdeStat &left_child_stat,
00125                              const VKdeStat &right_child_stat) {
00126     mass_l_ = std::min(left_child_stat.mass_l_ + left_child_stat.postponed_l_,
00127                        right_child_stat.mass_l_ +
00128                        right_child_stat.postponed_l_);
00129     mass_u_ = std::max(left_child_stat.mass_u_ + left_child_stat.postponed_u_,
00130                        right_child_stat.mass_u_ +
00131                        right_child_stat.postponed_u_);
00132     used_error_ =
00133       std::max(left_child_stat.used_error_ +
00134                left_child_stat.postponed_used_error_,
00135                right_child_stat.used_error_ +
00136                right_child_stat.postponed_used_error_);
00137     n_pruned_ = 
00138       std::min(left_child_stat.n_pruned_ + left_child_stat.postponed_n_pruned_,
00139                right_child_stat.n_pruned_ + right_child_stat.n_pruned_);
00140   }
00141 
00144   void ResetBoundStatistics() {
00145     mass_l_ = DBL_MAX;
00146     mass_u_ = -DBL_MAX;
00147     used_error_ = 0;
00148     n_pruned_ = DBL_MAX;
00149   }
00150 
00153   void Init() {
00154     weight_sum_ = 0;
00155     mass_l_ = 0;
00156     mass_u_ = 0;
00157     used_error_ = 0;
00158     n_pruned_ = 0;
00159      
00160     postponed_l_ = 0;
00161     postponed_e_ = 0;
00162     postponed_u_ = 0;
00163     postponed_used_error_ = 0;
00164     postponed_n_pruned_ = 0;
00165   }
00166     
00167   void Init(const Matrix& dataset, index_t &start, index_t &count) {
00168     Init();
00169   }
00170     
00171   void Init(const Matrix& dataset, index_t &start, index_t &count,
00172             const VKdeStat& left_stat, const VKdeStat& right_stat) {
00173     Init();
00174   }
00175   
00176   VKdeStat() {
00177   }
00178     
00179   ~VKdeStat() {
00180   }
00181     
00182 };
00183 
00184 template<typename TKernelAux>
00185 class KdeStat {
00186  public:
00187   
00191   double mass_l_;
00192   
00196   double mass_u_;
00197   
00201   double used_error_;
00202   
00206   double n_pruned_;
00207 
00210   double postponed_l_;
00211   
00214   double postponed_e_;
00215 
00218   double postponed_u_;
00219 
00223   double postponed_used_error_;
00224 
00229   double postponed_n_pruned_;
00230 
00234   typename TKernelAux::TFarFieldExpansion farfield_expansion_;
00235     
00238   typename TKernelAux::TLocalExpansion local_expansion_;
00239 
00242   double get_weight_sum() {
00243     return farfield_expansion_.get_weight_sum();
00244   }
00245  
00248   void AddPostponed(const KdeStat& parent_stat) {
00249     postponed_l_ += parent_stat.postponed_l_;
00250     postponed_e_ += parent_stat.postponed_e_;
00251     postponed_u_ += parent_stat.postponed_u_;
00252     postponed_used_error_ += parent_stat.postponed_used_error_;
00253     postponed_n_pruned_ += parent_stat.postponed_n_pruned_;
00254   }
00255 
00258   void ClearPostponed() {      
00259     postponed_l_ = 0;
00260     postponed_e_ = 0;
00261     postponed_u_ = 0;
00262     postponed_used_error_ = 0;
00263     postponed_n_pruned_ = 0;      
00264   }
00265 
00268   void RefineBoundStatistics(const KdeStat &left_child_stat,
00269                              const KdeStat &right_child_stat) {
00270     mass_l_ = std::min(left_child_stat.mass_l_ + left_child_stat.postponed_l_,
00271                        right_child_stat.mass_l_ +
00272                        right_child_stat.postponed_l_);
00273     mass_u_ = std::max(left_child_stat.mass_u_ + left_child_stat.postponed_u_,
00274                        right_child_stat.mass_u_ +
00275                        right_child_stat.postponed_u_);
00276     used_error_ =
00277       std::max(left_child_stat.used_error_ +
00278                left_child_stat.postponed_used_error_,
00279                right_child_stat.used_error_ +
00280                right_child_stat.postponed_used_error_);
00281     n_pruned_ = 
00282       std::min(left_child_stat.n_pruned_ + left_child_stat.postponed_n_pruned_,
00283                right_child_stat.n_pruned_ + right_child_stat.n_pruned_);
00284   }
00285 
00288   void ResetBoundStatistics() {
00289     mass_l_ = DBL_MAX;
00290     mass_u_ = -DBL_MAX;
00291     used_error_ = 0;
00292     n_pruned_ = DBL_MAX;
00293   }
00294 
00297   void Init() {
00298     mass_l_ = 0;
00299     mass_u_ = 0;
00300     used_error_ = 0;
00301     n_pruned_ = 0;
00302      
00303     postponed_l_ = 0;
00304     postponed_e_ = 0;
00305     postponed_u_ = 0;
00306     postponed_used_error_ = 0;
00307     postponed_n_pruned_ = 0;
00308   }
00309     
00310   void Init(const TKernelAux &ka) {
00311     farfield_expansion_.Init(ka);
00312     local_expansion_.Init(ka);
00313   }
00314     
00315   void Init(const Matrix& dataset, index_t &start, index_t &count) {
00316     Init();
00317   }
00318     
00319   void Init(const Matrix& dataset, index_t &start, index_t &count,
00320             const KdeStat& left_stat,
00321             const KdeStat& right_stat) {
00322     Init();
00323   }
00324     
00325   void Init(const Vector& center, const TKernelAux &ka) {
00326       
00327     farfield_expansion_.Init(center, ka);
00328     local_expansion_.Init(center, ka);
00329     Init();
00330   }
00331     
00332   KdeStat() { }
00333     
00334   ~KdeStat() { }
00335     
00336 };
00337 
00338 #endif