diff --git a/alib2algo/src/arbology/exact/SubtreeJumpTable.cpp b/alib2algo/src/arbology/exact/SubtreeJumpTable.cpp index b35fbd55d450138cf2734e6d054133c147b22ba1..e5917860750cadd29278926ec13b8efbc6374136 100644 --- a/alib2algo/src/arbology/exact/SubtreeJumpTable.cpp +++ b/alib2algo/src/arbology/exact/SubtreeJumpTable.cpp @@ -7,13 +7,6 @@ #include "SubtreeJumpTable.h" -#include <tree/ranked/PrefixRankedTree.h> -#include <tree/ranked/PrefixRankedPattern.h> -#include <tree/ranked/PrefixRankedBarTree.h> -#include <tree/ranked/PrefixRankedBarPattern.h> - -#include <map> - namespace arbology { namespace exact { @@ -22,90 +15,11 @@ std::vector < int > SubtreeJumpTable::compute ( const tree::RankedTreeWrapper & return dispatch ( subject.getData ( ) ); } -std::vector < int > SubtreeJumpTable::compute ( const tree::PrefixRankedBarTree < > & subject ) { - std::vector < int > res; - - buildDataPointersBar ( res, subject, 0 ); - - return res; -} - auto SubtreeSizesPrefixRankedBarTree = SubtreeJumpTable::RegistratorWrapper < std::vector < int >, tree::PrefixRankedBarTree < > > ( SubtreeJumpTable::compute ); - -std::vector < int > SubtreeJumpTable::compute ( const tree::PrefixRankedBarPattern < > & pattern ) { - std::vector < int > res; - - buildDataPointersBar ( res, pattern, 0 ); - - return res; -} - auto SubtreeSizesPrefixRankedBarPattern = SubtreeJumpTable::RegistratorWrapper < std::vector < int >, tree::PrefixRankedBarPattern < > > ( SubtreeJumpTable::compute ); - -std::vector < int > SubtreeJumpTable::compute ( const tree::PrefixRankedTree < > & subject ) { - std::vector < int > res; - - buildDataPointersPrefixRanked ( res, subject, 0 ); - - return res; -} - auto SubtreeSizesPrefixRankedTree = SubtreeJumpTable::RegistratorWrapper < std::vector < int >, tree::PrefixRankedTree < > > ( SubtreeJumpTable::compute ); - -std::vector < int > SubtreeJumpTable::compute ( const tree::PrefixRankedPattern < > & pattern ) { - std::vector < int > res; - - buildDataPointersPrefixRanked ( res, pattern, 0 ); - - return res; -} - auto SubtreeSizesPrefixRankedPattern = SubtreeJumpTable::RegistratorWrapper < std::vector < int >, tree::PrefixRankedPattern < > > ( SubtreeJumpTable::compute ); -/** - * used to compute subtree jump table. - * @param begin - index of a root node of a complete subtree to process - * @return index, increased by one, of the last node in the subtree starting at index begin - */ -template < class T > -int SubtreeJumpTable::buildDataPointersBar ( std::vector < int > & res, const T & subject, int begin ) { - res.push_back ( 0 ); - int index = begin + 1; - - if ( ! subject.getBars ( ).count ( subject.getContent ( )[begin] ) ) - for ( unsigned i = 0; i < ( unsigned ) subject.getContent ( )[begin].getRank ( ); i++ ) - index = buildDataPointersBar ( res, subject, index ); - - index++; - res[begin] = index; - res.push_back ( begin - 1 ); - return index; -} - -/** - * used to compute subtree jump table. - * @param begin - index of a root node of a complete subtree to process - * @return index, increased by one, of the last node in the subtree starting at index begin - */ -template < class T > -int SubtreeJumpTable::buildDataPointersPrefixRanked ( std::vector < int > & res, const T & subject, int begin ) { - for ( unsigned i = 0; i < subject.getContent ( ).size ( ); i++ ) - res.push_back ( 0 ); - - return buildDataPointersPrefixRankedInternal ( res, subject, begin ); -} - -template < class T > -int SubtreeJumpTable::buildDataPointersPrefixRankedInternal ( std::vector < int > & res, const T & subject, int begin ) { - int index = begin + 1; - - for ( unsigned i = 0; i < ( unsigned ) subject.getContent ( )[begin].getRank ( ); i++ ) - index = buildDataPointersPrefixRankedInternal ( res, subject, index ); - - res[begin] = index; - return index; -} - } /* namespace exact */ } /* namespace arbology */ diff --git a/alib2algo/src/arbology/exact/SubtreeJumpTable.h b/alib2algo/src/arbology/exact/SubtreeJumpTable.h index 770b8814773d18690f8f312034b6edf1c197b1ba..9bf88690b9096265646c2de44d9b8a0fb3e8f384 100644 --- a/alib2algo/src/arbology/exact/SubtreeJumpTable.h +++ b/alib2algo/src/arbology/exact/SubtreeJumpTable.h @@ -8,11 +8,16 @@ #ifndef _SUBTREE_JUMP_TABLE_H_ #define _SUBTREE_JUMP_TABLE_H_ +#include <vector> + #include <tree/RankedTreeWrapper.h> #include <tree/TreeFeatures.h> #include <core/multipleDispatch.hpp> -#include <vector> +#include <tree/ranked/PrefixRankedTree.h> +#include <tree/ranked/PrefixRankedPattern.h> +#include <tree/ranked/PrefixRankedBarTree.h> +#include <tree/ranked/PrefixRankedBarPattern.h> namespace arbology { @@ -29,13 +34,97 @@ class SubtreeJumpTable : public std::SingleDispatch < SubtreeJumpTable, std::vec public: static std::vector < int > compute ( const tree::RankedTreeWrapper & subject ); - static std::vector < int > compute ( const tree::PrefixRankedBarTree < > & subject ); - static std::vector < int > compute ( const tree::PrefixRankedBarPattern < > & pattern ); - static std::vector < int > compute ( const tree::PrefixRankedTree < > & subject ); - static std::vector < int > compute ( const tree::PrefixRankedPattern < > & pattern ); + template < class SymbolType, class RankType > + static std::vector < int > compute ( const tree::PrefixRankedBarTree < SymbolType, RankType > & subject ); + template < class SymbolType, class RankType > + static std::vector < int > compute ( const tree::PrefixRankedBarPattern < SymbolType, RankType > & pattern ); + template < class SymbolType, class RankType > + static std::vector < int > compute ( const tree::PrefixRankedTree < SymbolType, RankType > & subject ); + template < class SymbolType, class RankType > + static std::vector < int > compute ( const tree::PrefixRankedPattern < SymbolType, RankType > & pattern ); }; +template < class SymbolType, class RankType > +std::vector < int > SubtreeJumpTable::compute ( const tree::PrefixRankedBarTree < SymbolType, RankType > & subject ) { + std::vector < int > res; + + buildDataPointersBar ( res, subject, 0 ); + + return res; +} + +template < class SymbolType, class RankType > +std::vector < int > SubtreeJumpTable::compute ( const tree::PrefixRankedBarPattern < SymbolType, RankType > & pattern ) { + std::vector < int > res; + + buildDataPointersBar ( res, pattern, 0 ); + + return res; +} + +template < class SymbolType, class RankType > +std::vector < int > SubtreeJumpTable::compute ( const tree::PrefixRankedTree < SymbolType, RankType > & subject ) { + std::vector < int > res; + + buildDataPointersPrefixRanked ( res, subject, 0 ); + + return res; +} + +template < class SymbolType, class RankType > +std::vector < int > SubtreeJumpTable::compute ( const tree::PrefixRankedPattern < SymbolType, RankType > & pattern ) { + std::vector < int > res; + + buildDataPointersPrefixRanked ( res, pattern, 0 ); + + return res; +} + +/** + * used to compute subtree jump table. + * @param begin - index of a root node of a complete subtree to process + * @return index, increased by one, of the last node in the subtree starting at index begin + */ +template < class T > +int SubtreeJumpTable::buildDataPointersBar ( std::vector < int > & res, const T & subject, int begin ) { + res.push_back ( 0 ); + int index = begin + 1; + + if ( ! subject.getBars ( ).count ( subject.getContent ( )[begin] ) ) + for ( unsigned i = 0; i < ( unsigned ) subject.getContent ( )[begin].getRank ( ); i++ ) + index = buildDataPointersBar ( res, subject, index ); + + index++; + res[begin] = index; + res.push_back ( begin - 1 ); + return index; +} + +/** + * used to compute subtree jump table. + * @param begin - index of a root node of a complete subtree to process + * @return index, increased by one, of the last node in the subtree starting at index begin + */ +template < class T > +int SubtreeJumpTable::buildDataPointersPrefixRanked ( std::vector < int > & res, const T & subject, int begin ) { + for ( unsigned i = 0; i < subject.getContent ( ).size ( ); i++ ) + res.push_back ( 0 ); + + return buildDataPointersPrefixRankedInternal ( res, subject, begin ); +} + +template < class T > +int SubtreeJumpTable::buildDataPointersPrefixRankedInternal ( std::vector < int > & res, const T & subject, int begin ) { + int index = begin + 1; + + for ( unsigned i = 0; i < ( unsigned ) subject.getContent ( )[begin].getRank ( ); i++ ) + index = buildDataPointersPrefixRankedInternal ( res, subject, index ); + + res[begin] = index; + return index; +} + } /* namespace exact */ } /* namespace arbology */ diff --git a/alib2algo/src/arbology/transform/BeginToEndIndex.cpp b/alib2algo/src/arbology/transform/BeginToEndIndex.cpp index c3f5487a7d43b0a7947d0522e441d147ec0746d7..06031a5e833f911ec7ea780f3afef1bb00c3fcf6 100644 --- a/alib2algo/src/arbology/transform/BeginToEndIndex.cpp +++ b/alib2algo/src/arbology/transform/BeginToEndIndex.cpp @@ -6,13 +6,6 @@ */ #include "BeginToEndIndex.h" -#include "../exact/SubtreeJumpTable.h" - -#include <tree/Tree.h> -#include <tree/ranked/PrefixRankedBarTree.h> -#include <tree/ranked/PrefixRankedTree.h> - -#include <map> namespace arbology { @@ -22,28 +15,7 @@ std::set < unsigned > BeginToEndIndex::transform ( const tree::Tree & subject, c return dispatch ( subject.getData ( ), indexes ); } -std::set < unsigned > BeginToEndIndex::transform ( const tree::PrefixRankedBarTree < > & subject, const std::set < unsigned > & indexes ) { - std::vector < int > subjectSubtreeJumpTable = exact::SubtreeJumpTable::compute ( subject ); - std::set < unsigned > res; - - for ( unsigned index : indexes ) - res.insert ( subjectSubtreeJumpTable[index] ); - - return res; -} - auto BeginToEndIndexPrefixRankedBarTreePrefixRankedBarTree = BeginToEndIndex::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < > > ( BeginToEndIndex::transform ); - -std::set < unsigned > BeginToEndIndex::transform ( const tree::PrefixRankedTree < > & subject, const std::set < unsigned > & indexes ) { - std::vector < int > subjectSubtreeJumpTable = exact::SubtreeJumpTable::compute ( subject ); - std::set < unsigned > res; - - for ( unsigned index : indexes ) - res.insert ( subjectSubtreeJumpTable[index] ); - - return res; -} - auto BeginToEndIndexPrefixRankedBarTreePrefixRankedBarPattern = BeginToEndIndex::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < > > ( BeginToEndIndex::transform ); } /* namespace transform */ diff --git a/alib2algo/src/arbology/transform/BeginToEndIndex.h b/alib2algo/src/arbology/transform/BeginToEndIndex.h index 6af6a473a48daa37a87bcb39cd85b43c3816a131..a44e3880f3d67b69266cc60a92333d5686de52cd 100644 --- a/alib2algo/src/arbology/transform/BeginToEndIndex.h +++ b/alib2algo/src/arbology/transform/BeginToEndIndex.h @@ -12,6 +12,12 @@ #include <core/multipleDispatch.hpp> #include <tree/TreeFeatures.h> +#include <arbology/exact/SubtreeJumpTable.h> + +#include <tree/Tree.h> +#include <tree/ranked/PrefixRankedBarTree.h> +#include <tree/ranked/PrefixRankedTree.h> + namespace arbology { namespace transform { @@ -26,11 +32,35 @@ public: */ static std::set < unsigned > transform ( const tree::Tree & subject, const std::set < unsigned > & indexes ); - static std::set < unsigned > transform ( const tree::PrefixRankedBarTree < > & subject, const std::set < unsigned > & indexes ); - static std::set < unsigned > transform ( const tree::PrefixRankedTree < > & subject, const std::set < unsigned > & indexes ); + template < class SymbolType, class RankType > + static std::set < unsigned > transform ( const tree::PrefixRankedBarTree < SymbolType, RankType > & subject, const std::set < unsigned > & indexes ); + template < class SymbolType, class RankType > + static std::set < unsigned > transform ( const tree::PrefixRankedTree < SymbolType, RankType > & subject, const std::set < unsigned > & indexes ); }; +template < class SymbolType, class RankType > +std::set < unsigned > BeginToEndIndex::transform ( const tree::PrefixRankedBarTree < SymbolType, RankType > & subject, const std::set < unsigned > & indexes ) { + std::vector < int > subjectSubtreeJumpTable = exact::SubtreeJumpTable::compute ( subject ); + std::set < unsigned > res; + + for ( unsigned index : indexes ) + res.insert ( subjectSubtreeJumpTable[index] ); + + return res; +} + +template < class SymbolType, class RankType > +std::set < unsigned > BeginToEndIndex::transform ( const tree::PrefixRankedTree < SymbolType, RankType > & subject, const std::set < unsigned > & indexes ) { + std::vector < int > subjectSubtreeJumpTable = exact::SubtreeJumpTable::compute ( subject ); + std::set < unsigned > res; + + for ( unsigned index : indexes ) + res.insert ( subjectSubtreeJumpTable[index] ); + + return res; +} + } /* namespace transform */ } /* namespace arbology */