From 7249b9dc5336d21f6a3d7df0e4ac6d9bff1c696c Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Mon, 4 Apr 2016 19:14:56 +0200
Subject: [PATCH] naive subtree repeats on PrefixRankedTree

---
 .../exact/ExactSubtreeRepeatsNaive.cpp        | 36 +++++++++++++++++--
 .../arbology/exact/ExactSubtreeRepeatsNaive.h |  2 ++
 2 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/alib2algo/src/arbology/exact/ExactSubtreeRepeatsNaive.cpp b/alib2algo/src/arbology/exact/ExactSubtreeRepeatsNaive.cpp
index f20ba3a504..611290913b 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 6b7764c6ba..c9874bf1fd 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;
-- 
GitLab