diff --git a/alib2algo/src/arbology/exact/ExactSubtreeRepeatsNaive.cpp b/alib2algo/src/arbology/exact/ExactSubtreeRepeatsNaive.cpp index f20ba3a504d1cbfcdcbd17343fb9a8e825f394a2..611290913b608db905eac1abf35b58e47eabd893 100644 --- a/alib2algo/src/arbology/exact/ExactSubtreeRepeatsNaive.cpp +++ b/alib2algo/src/arbology/exact/ExactSubtreeRepeatsNaive.cpp @@ -10,6 +10,7 @@ #include <exception/AlibException.h> #include <tree/ranked/RankedTree.h> +#include <tree/ranked/PrefixRankedTree.h> #include <tree/Tree.h> #include <global/GlobalData.h> @@ -34,7 +35,7 @@ tree::RankedNode * ExactSubtreeRepeatsNaive::repeats ( const tree::RankedNode & if ( uniqueRepeatId == 0 ) uniqueRepeatId = minId++; - return new tree::RankedNode ( alphabet::RankedSymbol ( alphabet::symbolFrom ( uniqueRepeatId ), children.size ( ) ), std::move ( children ) ); + return new tree::RankedNode ( alphabet::RankedSymbol ( alphabet::symbolFrom ( uniqueRepeatId ), node.getSymbol ( ).getRank ( ) ), std::move ( children ) ); } tree::RankedTree ExactSubtreeRepeatsNaive::repeats ( const tree::RankedTree & tree ) { @@ -48,7 +49,38 @@ tree::RankedTree ExactSubtreeRepeatsNaive::repeats ( const tree::RankedTree & tr return res; } -auto ExactRepeatsSimpleRankedTree = ExactSubtreeRepeatsNaive::RegistratorWrapper < tree::RankedTree, tree::RankedTree > ( ExactSubtreeRepeatsNaive::getInstance ( ), ExactSubtreeRepeatsNaive::repeats ); +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 ) { + 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 ( repeats ( symbols, res, data, minId, index ) ); + + int & uniqueRepeatId = data[childRepeatsKey]; + + if ( uniqueRepeatId == 0 ) uniqueRepeatId = minId++; + + res[begin] = alphabet::RankedSymbol ( alphabet::symbolFrom ( uniqueRepeatId ), symbols[begin].getRank ( ) ); + return res[begin]; +} + +tree::PrefixRankedTree ExactSubtreeRepeatsNaive::repeats ( const tree::PrefixRankedTree & tree ) { + int minId = 1; + int index = 0; + std::vector < alphabet::RankedSymbol > res; + std::map < std::pair < alphabet::RankedSymbol, std::vector < alphabet::RankedSymbol > >, int > data; + + repeats ( tree.getContent ( ), res, data, minId, index ); + return tree::PrefixRankedTree ( res ); +} + +auto ExactRepeatsNaivePrefixRankedTree = ExactSubtreeRepeatsNaive::RegistratorWrapper < tree::PrefixRankedTree, tree::PrefixRankedTree > ( ExactSubtreeRepeatsNaive::getInstance ( ), ExactSubtreeRepeatsNaive::repeats ); } /* namespace exact */ diff --git a/alib2algo/src/arbology/exact/ExactSubtreeRepeatsNaive.h b/alib2algo/src/arbology/exact/ExactSubtreeRepeatsNaive.h index 6b7764c6ba319d3001f176b0326abb5124890e6d..c9874bf1fd5021579749e16aa3fc177b37da72f5 100644 --- a/alib2algo/src/arbology/exact/ExactSubtreeRepeatsNaive.h +++ b/alib2algo/src/arbology/exact/ExactSubtreeRepeatsNaive.h @@ -24,6 +24,7 @@ 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 ); public: /** @@ -37,6 +38,7 @@ public: * @return Tree of repeats */ static tree::RankedTree repeats ( const tree::RankedTree & tree ); + static tree::PrefixRankedTree repeats ( const tree::PrefixRankedTree & tree ); static ExactSubtreeRepeatsNaive & getInstance ( ) { static ExactSubtreeRepeatsNaive res;