From e8d1b92d6b11ba414fe57ba264866425cb0c35d0 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Mon, 4 Apr 2016 21:05:22 +0200
Subject: [PATCH] naive subtree repeats for prefix ranked bar trees

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

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