diff --git a/alib2algo/src/tree/NormalizeTreeLabels.cpp b/alib2algo/src/tree/NormalizeTreeLabels.cpp new file mode 100644 index 0000000000000000000000000000000000000000..26b509933e4630171d4c1d78e1561f8d5c81b462 --- /dev/null +++ b/alib2algo/src/tree/NormalizeTreeLabels.cpp @@ -0,0 +1,19 @@ +/* + * NormalizeTreeLabels.cpp + * + * Created on: 10. 5. 2017 + * Author: Aleksandr Shatrovskii + */ + +#include "NormalizeTreeLabels.h" +#include <tree/Tree.h> + +namespace tree { + +tree::Tree NormalizeTreeLabels::normalize ( const tree::Tree & tree ) { + return dispatch ( tree.getData ( ) ); +} + +auto NormalizeTreeLabelsRankedTree = NormalizeTreeLabels::RegistratorWrapper < tree::RankedTree < unsigned, DefaultRankType >, tree::RankedTree < > > ( NormalizeTreeLabels::normalize ); + +} /* namespace tree */ diff --git a/alib2algo/src/tree/NormalizeTreeLabels.h b/alib2algo/src/tree/NormalizeTreeLabels.h new file mode 100644 index 0000000000000000000000000000000000000000..951ac0553d01f581d9478a3b5bd59b294e184d80 --- /dev/null +++ b/alib2algo/src/tree/NormalizeTreeLabels.h @@ -0,0 +1,85 @@ +/* + * NormalizeTreeLabels.h + * + * Created on: 10. 5. 2017 + * Author: Aleksandr Shatrovskii + */ + +#ifndef _ARBOLOGY_NORMALIZE_TREE_LABELS_H_ +#define _ARBOLOGY_NORMALIZE_TREE_LABELS_H_ + +#include <tree/TreeFeatures.h> +#include <alphabet/SymbolFeatures.h> +#include <core/multipleDispatch.hpp> + +#include <map> +#include <vector> +#include <tree> +#include <alphabet/RankedSymbol.h> +#include <primitive/Unsigned.h> + +#include "properties/SubtreeJumpTable.h" + +#include <tree/ranked/RankedTree.h> +#include <global/GlobalData.h> + +namespace tree { + +/** + * Simple computation of subtree repeats + */ +class NormalizeTreeLabels : public std::SingleDispatch < NormalizeTreeLabels, tree::Tree, const tree::TreeBase & > { + template < class SymbolType, class RankType > + static std::tree < std::ranked_symbol < unsigned, RankType > > normalize ( const std::tree < std::ranked_symbol < SymbolType, RankType > > & tree, std::map < std::ranked_symbol < SymbolType, RankType >, unsigned > & mapping, unsigned & counter ); + +public: + /** + * Compute a same shaped tree with nodes containing unique subtree ids. + * @return Tree of repeats + */ + static tree::Tree normalize ( const tree::Tree & pattern ); + + /** + * Compute a same shaped tree with nodes containing unique subtree ids. + * @return Tree of repeats + */ + template < class SymbolType, class RankType > + static tree::RankedTree < unsigned, RankType > normalize ( const tree::RankedTree < SymbolType, RankType > & tree ); + +}; + +template < class SymbolType, class RankType > +std::tree < std::ranked_symbol < unsigned, RankType > > NormalizeTreeLabels::normalize ( const std::tree < std::ranked_symbol < SymbolType, RankType > > & tree, std::map < std::ranked_symbol < SymbolType, RankType >, unsigned > & mapping, unsigned & counter ) { + + std::vector < std::tree < std::ranked_symbol < unsigned, RankType > > > children; + + for ( const std::tree < std::ranked_symbol < SymbolType, RankType > > & child : tree ) + children.push_back ( normalize < SymbolType, RankType > ( child, mapping, counter ) ); + + auto newLabelIt = mapping.find ( tree.getData ( ) ); + unsigned newLabel; + + if ( newLabelIt == mapping.end ( ) ) { + mapping.insert ( std::make_pair ( tree.getData ( ), counter ) ); + newLabel = counter; + counter += 1; + } else { + newLabel = newLabelIt->second; + } + + return std::tree < std::ranked_symbol < unsigned, RankType > > ( std::ranked_symbol < unsigned, RankType > ( newLabel, tree.getData ( ).getRank ( ) ), std::move ( children ) ); + +} + +template < class SymbolType, class RankType > +tree::RankedTree < unsigned, RankType > NormalizeTreeLabels::normalize ( const tree::RankedTree < SymbolType, RankType > & tree ) { + + std::map < std::ranked_symbol < SymbolType, RankType >, unsigned > mapping; + unsigned counter = 1; + + return tree::RankedTree < unsigned, RankType > ( normalize ( tree.getContent ( ), mapping, counter ) ); +} + +} /* namespace tree */ + +#endif /* _ARBOLOGY_NORMALIZE_TREE_LABELS_H_ */