Skip to content
Snippets Groups Projects
Commit e8d1b92d authored by Jan Trávníček's avatar Jan Trávníček
Browse files

naive subtree repeats for prefix ranked bar trees

parent 7249b9dc
No related branches found
No related tags found
No related merge requests found
......@@ -11,6 +11,7 @@
#include <exception/AlibException.h>
#include <tree/ranked/RankedTree.h>
#include <tree/ranked/PrefixRankedTree.h>
#include <tree/ranked/PrefixRankedBarTree.h>
#include <tree/Tree.h>
#include <global/GlobalData.h>
 
......@@ -51,7 +52,7 @@ tree::RankedTree ExactSubtreeRepeatsNaive::repeats ( const tree::RankedTree & tr
 
auto ExactRepeatsNaiveRankedTree = ExactSubtreeRepeatsNaive::RegistratorWrapper < tree::RankedTree, tree::RankedTree > ( ExactSubtreeRepeatsNaive::getInstance ( ), ExactSubtreeRepeatsNaive::repeats );
 
alphabet::RankedSymbol ExactSubtreeRepeatsNaive::repeats ( const std::vector < alphabet::RankedSymbol > & symbols, std::vector < alphabet::RankedSymbol > & res, std::map < std::pair < alphabet::RankedSymbol, std::vector < alphabet::RankedSymbol > >, int > & data, int & minId, int & index ) {
alphabet::RankedSymbol ExactSubtreeRepeatsNaive::repeatsPrefixRanked ( const std::vector < alphabet::RankedSymbol > & symbols, std::vector < alphabet::RankedSymbol > & res, std::map < std::pair < alphabet::RankedSymbol, std::vector < alphabet::RankedSymbol > >, int > & data, int & minId, int & index ) {
int begin = index;
std::pair < alphabet::RankedSymbol, std::vector < alphabet::RankedSymbol > > childRepeatsKey ( symbols[begin], std::vector < alphabet::RankedSymbol > ( ) );
 
......@@ -60,7 +61,7 @@ alphabet::RankedSymbol ExactSubtreeRepeatsNaive::repeats ( const std::vector < a
index++;
 
for ( unsigned i = 0; i < symbols[begin].getRank ( ).getData ( ); ++i )
childRepeatsKey.second.push_back ( repeats ( symbols, res, data, minId, index ) );
childRepeatsKey.second.push_back ( repeatsPrefixRanked ( symbols, res, data, minId, index ) );
 
int & uniqueRepeatId = data[childRepeatsKey];
 
......@@ -76,12 +77,46 @@ tree::PrefixRankedTree ExactSubtreeRepeatsNaive::repeats ( const tree::PrefixRan
std::vector < alphabet::RankedSymbol > res;
std::map < std::pair < alphabet::RankedSymbol, std::vector < alphabet::RankedSymbol > >, int > data;
 
repeats ( tree.getContent ( ), res, data, minId, index );
repeatsPrefixRanked ( tree.getContent ( ), res, data, minId, index );
return tree::PrefixRankedTree ( res );
}
 
auto ExactRepeatsNaivePrefixRankedTree = ExactSubtreeRepeatsNaive::RegistratorWrapper < tree::PrefixRankedTree, tree::PrefixRankedTree > ( ExactSubtreeRepeatsNaive::getInstance ( ), ExactSubtreeRepeatsNaive::repeats );
 
alphabet::RankedSymbol ExactSubtreeRepeatsNaive::repeatsPrefixRankedBar ( const std::vector < alphabet::RankedSymbol > & symbols, std::vector < alphabet::RankedSymbol > & res, std::map < std::pair < alphabet::RankedSymbol, std::vector < alphabet::RankedSymbol > >, int > & data, int & minId, int & index ) {
int begin = index;
std::pair < alphabet::RankedSymbol, std::vector < alphabet::RankedSymbol > > childRepeatsKey ( symbols[begin], std::vector < alphabet::RankedSymbol > ( ) );
res.push_back ( alphabet::RankedSymbol ( alphabet::symbolFrom ( 0 ), symbols[begin].getRank ( ) ) );
index++;
for ( unsigned i = 0; i < symbols[begin].getRank ( ).getData ( ); ++i )
childRepeatsKey.second.push_back ( repeatsPrefixRankedBar ( symbols, res, data, minId, index ) );
int & uniqueRepeatId = data[childRepeatsKey];
if ( uniqueRepeatId == 0 ) uniqueRepeatId = minId++;
res[begin] = alphabet::RankedSymbol ( alphabet::symbolFrom ( uniqueRepeatId ), symbols[begin].getRank ( ) );
res.push_back ( symbols[index] );
index++;
return res[begin];
}
tree::PrefixRankedBarTree ExactSubtreeRepeatsNaive::repeats ( const tree::PrefixRankedBarTree & tree ) {
int minId = 1;
int index = 0;
std::vector < alphabet::RankedSymbol > res;
std::map < std::pair < alphabet::RankedSymbol, std::vector < alphabet::RankedSymbol > >, int > data;
repeatsPrefixRankedBar ( tree.getContent ( ), res, data, minId, index );
return tree::PrefixRankedBarTree ( tree.getBarSymbol ( ), res );
}
auto ExactRepeatsNaivePrefixRankedBarTree = ExactSubtreeRepeatsNaive::RegistratorWrapper < tree::PrefixRankedBarTree, tree::PrefixRankedBarTree > ( ExactSubtreeRepeatsNaive::getInstance ( ), ExactSubtreeRepeatsNaive::repeats );
} /* namespace exact */
 
} /* namespace arbology */
......@@ -24,7 +24,8 @@ namespace exact {
*/
class ExactSubtreeRepeatsNaive : public std::SingleDispatch < tree::Tree, tree::TreeBase > {
static tree::RankedNode * repeats ( const tree::RankedNode & node, std::map < std::pair < alphabet::RankedSymbol, std::vector < alphabet::RankedSymbol > >, int > & data, int & minId );
static alphabet::RankedSymbol repeats ( const std::vector < alphabet::RankedSymbol > & symbols, std::vector < alphabet::RankedSymbol > & res, std::map < std::pair < alphabet::RankedSymbol, std::vector < alphabet::RankedSymbol > >, int > & data, int & minId, int & index );
static alphabet::RankedSymbol repeatsPrefixRanked ( const std::vector < alphabet::RankedSymbol > & symbols, std::vector < alphabet::RankedSymbol > & res, std::map < std::pair < alphabet::RankedSymbol, std::vector < alphabet::RankedSymbol > >, int > & data, int & minId, int & index );
static alphabet::RankedSymbol repeatsPrefixRankedBar ( const std::vector < alphabet::RankedSymbol > & symbols, std::vector < alphabet::RankedSymbol > & res, std::map < std::pair < alphabet::RankedSymbol, std::vector < alphabet::RankedSymbol > >, int > & data, int & minId, int & index );
 
public:
/**
......@@ -39,6 +40,7 @@ public:
*/
static tree::RankedTree repeats ( const tree::RankedTree & tree );
static tree::PrefixRankedTree repeats ( const tree::PrefixRankedTree & tree );
static tree::PrefixRankedBarTree repeats ( const tree::PrefixRankedBarTree & tree );
 
static ExactSubtreeRepeatsNaive & getInstance ( ) {
static ExactSubtreeRepeatsNaive res;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment