Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members

CandidateGeneratorSimplePrune.hpp

Go to the documentation of this file.
00001 #ifndef CandidateGeneratorSimplePrune_HPP
00002 #define CandidateGeneratorSimplePrune_HPP
00003 
00004 #include "apriori/bodon-vector/vector_typedef.hpp"
00005 #include "common/log.h"
00006 //#include <cstdio>
00007 //#include <iterator>   //for test
00008 
00009 
00010 
00011 
00012 bool lessItemvector( const itemvecCounterPair& elem1, 
00013                      const itemvecCounterPair& elem2 )
00014 {
00015         return elem1.first < elem2.first;
00016 }
00017 
00018 namespace Bodon
00019 {
00020 namespace vector_based
00021 {
00022    template <class D, class DUMMY>
00023    class CandidateGeneratorSimplePrune 
00024    {
00025       protected:
00026          cand_vector_t& candidates; 
00027       public:
00028          CandidateGeneratorSimplePrune<D, DUMMY> 
00029          ( cand_vector_t& candidates, D& decoder, DUMMY& dummy) :
00030             candidates(candidates){}
00031 
00032 
00038          void generateCandidate(unsigned int candidate_size);
00039       
00040          void afterWorkCandGen(){}
00041 
00042          bool isThereAnyCandidate()
00043          {
00044             return !candidates.empty();
00045          }
00046    };
00047 
00048 
00049    template <class D, class DUMMY> inline
00050    void CandidateGeneratorSimplePrune<D, DUMMY>::
00051    generateCandidate(const unsigned int candidate_size)
00052    {
00053       if(!candidates.empty())
00054       {
00055          cand_vector_t::size_type orig_size(candidates.size());
00056          itemvector new_candidate;
00057          cand_vector_t::size_type index=0, index2;
00058          for(;index < orig_size -1; ++index) // minden gener�orra
00059          {
00060             new_candidate.clear();
00061             new_candidate.insert(new_candidate.end(), // j jel�t az egyik gener�orb� k�z�ik
00062                                  candidates[index].first.begin(), // gener�or els�eleme
00063                                  candidates[index].first.end()); // gener�or utls�eleme
00064             index2 = index +1;
00065             while(index2 < orig_size && // minden nagyobb gener�orra, am� a prefixek megyeznek
00066                   candidates[index].first.haveSamePrefix(candidates[index2].first))
00067             {
00068                   new_candidate.push_back(candidates[index2].first.back()); // az j jel�t v��e fzi a m�ik gener�or utols�elem�
00069                   // innent� �tam � a k�ot
00070                   // Koll� Bal�s, N2ZZL4
00071                   // ide kell majd egy el�az�, hogy csak akkor veszi f� jel�tnek,
00072                   // ha minden egyes kisebb m�et r�zhalmaza szerepel a cand_vector-ban
00073                   // a new_candidate elemeit egyes�el kiveszi, � ellen�zi, hogy a marad� benne van-e
00074                   // a candidates vektor els�fel�en
00075                   bool isAllSubsetFrequent = true;
00076                   std::vector<item_t>::iterator item_it = new_candidate.end()-1;
00077                   register item_t deleted_item = *item_it, temp_item;
00078                   new_candidate.erase(item_it);
00079                   while (isAllSubsetFrequent && item_it != new_candidate.begin())
00080                   {
00081                         // 0..orig_size-1 intervallumban kell keresni new_candidate-et a candidates vektorban
00082                         // btw el� lower_bound..orig_size-1 intervallumban is keresni,
00083                         // ahol lower_bound az el��keres� eredm�ye
00084                         // de a binary_search nem adja vissza, hogy milyen indexen tal�ta meg a vektorban amit keresett
00085                         if (!std::binary_search(
00086                                         candidates.begin(),
00087                                         candidates.begin()+orig_size,
00088                                         //new_candidate // ez lenne, ha a lessItemVector funktor mkdne
00089                                                         itemvecCounterPair(new_candidate, 0)
00090                                    ,::lessItemvector // ez is akkor lenne
00091                                         )
00092                            )
00093                                         // negyedik funktor param�er az�t nem kell, mert a pair funktora megfelel
00094                                         // �mindig tud majd d�teni a p� els�eleme alapj�
00095                                         // k��b ezt ki kell cser�ni saj� funktorra, hogy ne kelljen p�t adni a
00096                                         // bin�is keres�ek param�erl
00097                         {
00098                                 isAllSubsetFrequent = false; // ez volt a ciklust�zs utols�fut�a
00099                         }
00100                         else // csak akkor kell a ciklusv�toz� kezelni, ha lefut m� a ciklust�zs
00101                         {
00102                                 --item_it;
00103                                 temp_item = *item_it;
00104                                 *item_it = deleted_item;
00105                                 deleted_item = temp_item;
00106                         }
00107                   }
00108                   new_candidate.insert(item_it, deleted_item); // vissza a t��t elemet
00109                   if (isAllSubsetFrequent)
00110                   // id�g tart az � �talam �t k�
00111                   // Koll� Bal�s, N2ZZL4
00112                   {
00113                         candidates.push_back( // felveszi a jel�tek k��az j jel�tet null� t�ogatotts�gal
00114                              itemvecCounterPair(new_candidate, 0));
00115                   }
00116                   new_candidate.pop_back(); // lev�ja az j jel�tb� a gener�or utols�elem�
00117                   ++index2;
00118             }
00119          }
00120          candidates.erase(candidates.begin(), candidates.begin()+orig_size); // t�li a gener�orokat
00121       }
00122    }
00123 }
00124 }
00125 #endif

Generated on Sun Sep 17 17:50:38 2006 for FIM environment by  doxygen 1.4.4