00001 00010 #ifndef SupportCounterLookupEdge_HPP 00011 #define SupportCounterLookupEdge_HPP 00012 00013 00014 #include "common.hpp" 00015 #include <vector> 00016 #include "apriori/bodon/Leaf.hpp" 00017 00018 00019 namespace Bodon 00020 { 00021 namespace sequence 00022 { 00023 template <class TRIE> 00024 class SupportCounterLookupEdge 00025 { 00026 public: 00027 SupportCounterLookupEdge( ){} 00028 00029 void updateCounters( 00030 TRIE& main_trie, const std::vector<item_t>& transaction, 00031 item_t candidate_size, const counter_t counter_incr) 00032 { 00033 findCandidates( 00034 &main_trie, transaction.end()-candidate_size+1, 00035 transaction.begin(), candidate_size, 00036 counter_incr ); 00037 } 00038 protected: 00039 typedef Leaf LEAF; 00042 void findCandidates( TRIE* subtrie, 00043 std::vector<item_t>::const_iterator it_transaction_upper_bound, 00044 std::vector<item_t>::const_iterator it_transaction, 00045 item_t step_to_candidate, 00046 const counter_t counter_incr ); 00047 00048 }; 00049 00050 template <class TRIE> void 00051 SupportCounterLookupEdge<TRIE>::findCandidates( 00052 TRIE* subtrie, std::vector<item_t>::const_iterator 00053 it_transaction_upper_bound, 00054 std::vector<item_t>::const_iterator it_transaction, 00055 item_t step_to_candidate, const counter_t counter_incr ) 00056 { 00057 --step_to_candidate; 00058 std::vector<bool>::size_type largestEdgelabel_p1 = 00059 subtrie->edgelist.largestEdgelabel()+1; 00060 std::vector<bool>::size_type smallestEdgelabel = 00061 subtrie->edgelist.smallestEdgelabel(); 00062 std::vector<bool> pattern(largestEdgelabel_p1 - smallestEdgelabel, true); 00063 void* subsubtrie; 00064 for(; it_transaction != it_transaction_upper_bound; ++it_transaction) 00065 if(*it_transaction < largestEdgelabel_p1 && 00066 *it_transaction >= smallestEdgelabel && 00067 pattern[*it_transaction - smallestEdgelabel]) 00068 { 00069 subtrie->edgelist.lookupNocheck(*it_transaction, subsubtrie); 00070 if(subsubtrie) 00071 { 00072 if( step_to_candidate ) 00073 findCandidates( static_cast<TRIE*>(subsubtrie), 00074 it_transaction_upper_bound + 1, it_transaction+1, 00075 step_to_candidate, counter_incr); 00076 else 00077 static_cast<LEAF*>(subsubtrie)->increaseCounter( counter_incr); 00078 } 00079 pattern[*it_transaction - smallestEdgelabel] = false; 00080 } 00081 } 00082 } 00083 } 00084 #endif