diff --git a/alib2algo/src/arbology/exact/ExactSubtreeRepeatsNaive.cpp b/alib2algo/src/arbology/exact/ExactSubtreeRepeatsNaive.cpp index 611290913b608db905eac1abf35b58e47eabd893..06548909652407b5257353ec665a72f2d90056d8 100644 --- a/alib2algo/src/arbology/exact/ExactSubtreeRepeatsNaive.cpp +++ b/alib2algo/src/arbology/exact/ExactSubtreeRepeatsNaive.cpp @@ -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 */ diff --git a/alib2algo/src/arbology/exact/ExactSubtreeRepeatsNaive.h b/alib2algo/src/arbology/exact/ExactSubtreeRepeatsNaive.h index c9874bf1fd5021579749e16aa3fc177b37da72f5..f2d3f837cde9cbec022e3e30f631a05640b78089 100644 --- a/alib2algo/src/arbology/exact/ExactSubtreeRepeatsNaive.h +++ b/alib2algo/src/arbology/exact/ExactSubtreeRepeatsNaive.h @@ -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;