Skip to content

Commit

Permalink
added frequency to each pattern
Browse files Browse the repository at this point in the history
  • Loading branch information
integeruser committed Sep 6, 2014
1 parent 642c927 commit 0a704a2
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 65 deletions.
33 changes: 25 additions & 8 deletions fptree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,15 +123,18 @@ std::set<Pattern> fptree_growth(const FPTree& fptree) {
std::shared_ptr<FPNode> curr_fpnode = fptree.root->children.front();
while ( curr_fpnode ) {
const Item& curr_fpnode_item = curr_fpnode->item;

const unsigned curr_fpnode_frequency = curr_fpnode->frequency;

// add a pattern formed only by the item of the current node
Pattern new_pattern = { curr_fpnode_item };
Pattern new_pattern = { { curr_fpnode_item }, curr_fpnode_frequency };
single_path_patterns.insert( new_pattern );

// create a new pattern by adding the item of the current node to each pattern generated until now
for ( const Pattern& pattern : single_path_patterns ) {
Pattern new_pattern{ pattern };
new_pattern.insert( curr_fpnode_item );
new_pattern.first.insert( curr_fpnode_item );
assert( curr_fpnode_frequency <= pattern.second );
new_pattern.second = curr_fpnode_frequency;

single_path_patterns.insert( new_pattern );
}
Expand Down Expand Up @@ -205,14 +208,28 @@ std::set<Pattern> fptree_growth(const FPTree& fptree) {
// call recursively fptree_growth on the conditional fptree (empty fptree: no patterns)
std::set<Pattern> conditional_patterns = fptree_growth( conditional_fptree );

// construct patterns relative to the current item using the conditional patterns
// construct patterns relative to the current item using both the current item and the conditional patterns
std::set<Pattern> curr_item_patterns;
curr_item_patterns.insert( { curr_item } );
// add the current item to each conditional pattern

// the first pattern is made only by the current item
// compute the frequency of this pattern by summing the frequency of the nodes which have the same item (follow the node links)
unsigned curr_item_frequency = 0;
std::shared_ptr<FPNode> fpnode = pair.second;
while ( fpnode ) {
curr_item_frequency += fpnode->frequency;
fpnode = fpnode->node_link;
}
// add the pattern as a result
Pattern pattern{ { curr_item }, curr_item_frequency };
curr_item_patterns.insert( pattern );

// the next patterns are generated by adding the current item to each conditional pattern
for ( const Pattern& pattern : conditional_patterns ) {
Pattern new_pattern{ pattern };
new_pattern.insert( curr_item );

new_pattern.first.insert( curr_item );
assert( curr_item_frequency >= pattern.second );
new_pattern.second = pattern.second;

curr_item_patterns.insert( { new_pattern } );
}

Expand Down
3 changes: 2 additions & 1 deletion fptree.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@
#include <set>
#include <string>
#include <vector>
#include <utility>


using Item = std::string;
using Transaction = std::vector<Item>;
using TransformedPrefixPath = std::pair<std::vector<Item>, unsigned>;
using Pattern = std::set<Item>;
using Pattern = std::pair<std::set<Item>, unsigned>;


struct FPNode {
Expand Down
112 changes: 56 additions & 56 deletions main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,25 +33,25 @@ void test_1() {
const std::set<Pattern> patterns = fptree_growth( fptree );

assert( patterns.size() == 19 );
assert( patterns.count( { a } ) );
assert( patterns.count( { b, a } ) );
assert( patterns.count( { b } ) );
assert( patterns.count( { c, b } ) );
assert( patterns.count( { c, a, b } ) );
assert( patterns.count( { c, a } ) );
assert( patterns.count( { c } ) );
assert( patterns.count( { d, a } ) );
assert( patterns.count( { d, c, a } ) );
assert( patterns.count( { d, c } ) );
assert( patterns.count( { d, b, a } ) );
assert( patterns.count( { d, b, c } ) );
assert( patterns.count( { d, b } ) );
assert( patterns.count( { d } ) );
assert( patterns.count( { e, d } ) );
assert( patterns.count( { e, c } ) );
assert( patterns.count( { e, a, d } ) );
assert( patterns.count( { e, a } ) );
assert( patterns.count( { e } ) );
assert( patterns.count( { { a }, 8 } ) );
assert( patterns.count( { { b, a }, 5 } ) );
assert( patterns.count( { { b }, 7 } ) );
assert( patterns.count( { { c, b }, 5 } ) );
assert( patterns.count( { { c, a, b }, 3 } ) );
assert( patterns.count( { { c, a }, 4 } ) );
assert( patterns.count( { { c }, 6 } ) );
assert( patterns.count( { { d, a }, 4 } ) );
assert( patterns.count( { { d, c, a }, 2 } ) );
assert( patterns.count( { { d, c }, 3 } ) );
assert( patterns.count( { { d, b, a }, 2 } ) );
assert( patterns.count( { { d, b, c }, 2 } ) );
assert( patterns.count( { { d, b }, 3 } ) );
assert( patterns.count( { { d }, 5 } ) );
assert( patterns.count( { { e, d }, 2 } ) );
assert( patterns.count( { { e, c }, 2 } ) );
assert( patterns.count( { { e, a, d }, 2 } ) );
assert( patterns.count( { { e, a }, 2 } ) );
assert( patterns.count( { { e }, 3 } ) );
}

void test_2() {
Expand All @@ -77,25 +77,25 @@ void test_2() {
const std::set<Pattern> patterns = fptree_growth( fptree );

assert( patterns.size() == 19 );
assert( patterns.count( { e, b } ) );
assert( patterns.count( { e } ) );
assert( patterns.count( { a, b, e } ) );
assert( patterns.count( { a, b } ) );
assert( patterns.count( { a, e } ) );
assert( patterns.count( { a } ) );
assert( patterns.count( { d, a, b } ) );
assert( patterns.count( { d, a } ) );
assert( patterns.count( { d, e, b, a } ) );
assert( patterns.count( { d, e, b } ) );
assert( patterns.count( { d, e, a } ) );
assert( patterns.count( { d, e } ) );
assert( patterns.count( { d, b } ) );
assert( patterns.count( { d } ) );
assert( patterns.count( { c, e, b } ) );
assert( patterns.count( { c, e } ) );
assert( patterns.count( { c, b } ) );
assert( patterns.count( { c } ) );
assert( patterns.count( { b } ) );
assert( patterns.count( { { e, b }, 5 } ) );
assert( patterns.count( { { e }, 5 } ) );
assert( patterns.count( { { a, b, e }, 4 } ) );
assert( patterns.count( { { a, b }, 4 } ) );
assert( patterns.count( { { a, e }, 4 } ) );
assert( patterns.count( { { a }, 4 } ) );
assert( patterns.count( { { d, a, b }, 3 } ) );
assert( patterns.count( { { d, a }, 3 } ) );
assert( patterns.count( { { d, e, b, a }, 3 } ) );
assert( patterns.count( { { d, e, b }, 3 } ) );
assert( patterns.count( { { d, e, a }, 3 } ) );
assert( patterns.count( { { d, e }, 3 } ) );
assert( patterns.count( { { d, b }, 4 } ) );
assert( patterns.count( { { d }, 4 } ) );
assert( patterns.count( { { c, e, b }, 3 } ) );
assert( patterns.count( { { c, e }, 3 } ) );
assert( patterns.count( { { c, b }, 4 } ) );
assert( patterns.count( { { c }, 4 } ) );
assert( patterns.count( { { b }, 6 } ) );
}

void test_3() {
Expand Down Expand Up @@ -132,24 +132,24 @@ void test_3() {
const std::set<Pattern> patterns = fptree_growth( fptree );

assert( patterns.size() == 18 );
assert( patterns.count( { f } ) );
assert( patterns.count( { c, f } ) );
assert( patterns.count( { c } ) );
assert( patterns.count( { b } ) );
assert( patterns.count( { p, c } ) );
assert( patterns.count( { p } ) );
assert( patterns.count( { m, f, c } ) );
assert( patterns.count( { m, f } ) );
assert( patterns.count( { m, c } ) );
assert( patterns.count( { m } ) );
assert( patterns.count( { a, f, c, m } ) );
assert( patterns.count( { a, f, c } ) );
assert( patterns.count( { a, f, m } ) );
assert( patterns.count( { a, f } ) );
assert( patterns.count( { a, c, m } ) );
assert( patterns.count( { a, c } ) );
assert( patterns.count( { a, m } ) );
assert( patterns.count( { a } ) );
assert( patterns.count( { { f }, 4 } ) );
assert( patterns.count( { { c, f }, 3 } ) );
assert( patterns.count( { { c }, 4 } ) );
assert( patterns.count( { { b }, 3 } ) );
assert( patterns.count( { { p, c }, 3 } ) );
assert( patterns.count( { { p }, 3 } ) );
assert( patterns.count( { { m, f, c }, 3 } ) );
assert( patterns.count( { { m, f }, 3 } ) );
assert( patterns.count( { { m, c }, 3 } ) );
assert( patterns.count( { { m }, 3 } ) );
assert( patterns.count( { { a, f, c, m }, 3 } ) );
assert( patterns.count( { { a, f, c }, 3 } ) );
assert( patterns.count( { { a, f, m }, 3 } ) );
assert( patterns.count( { { a, f }, 3 } ) );
assert( patterns.count( { { a, c, m }, 3 } ) );
assert( patterns.count( { { a, c }, 3 } ) );
assert( patterns.count( { { a, m }, 3 } ) );
assert( patterns.count( { { a }, 3 } ) );
}

int main(int argc, const char *argv[]) {
Expand Down

0 comments on commit 0a704a2

Please sign in to comment.