From 9bbb7c637f9f3cdecd6ec8e7fa4e14b71955dd2b Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Tue, 6 Dec 2016 08:47:08 +0100
Subject: [PATCH] template BorderArrayNaive algorithm

---
 .../src/arbology/exact/BorderArrayNaive.cpp   |  95 ---------------
 .../src/arbology/exact/BorderArrayNaive.h     | 115 +++++++++++++++++-
 2 files changed, 109 insertions(+), 101 deletions(-)

diff --git a/alib2algo/src/arbology/exact/BorderArrayNaive.cpp b/alib2algo/src/arbology/exact/BorderArrayNaive.cpp
index 14d3f367ff..b6a574c280 100644
--- a/alib2algo/src/arbology/exact/BorderArrayNaive.cpp
+++ b/alib2algo/src/arbology/exact/BorderArrayNaive.cpp
@@ -6,12 +6,6 @@
  */
 
 #include "BorderArrayNaive.h"
-#include "SubtreeJumpTable.h"
-
-#include <tree/ranked/PrefixRankedBarPattern.h>
-#include <tree/ranked/PrefixRankedPattern.h>
-#include <tree/Tree.h>
-#include <global/GlobalData.h>
 
 namespace arbology {
 
@@ -21,96 +15,7 @@ std::vector < size_t > BorderArrayNaive::ba ( const tree::Tree & pattern ) {
 	return dispatch ( pattern.getData ( ) );
 }
 
-bool BorderArrayNaive::matches ( const tree::PrefixRankedBarPattern < > & pattern, const std::vector < int > & subtreeJumpTable, int stop, int offset ) {
-	unsigned i = 0;
-
-	while ( offset < stop && i < pattern.getContent ( ).size ( ) )
-		if ( pattern.getContent ( )[i] == pattern.getContent ( )[offset] ) {
-			i++;
-			offset++;
-		} else if ( ( pattern.getContent ( )[i] == pattern.getSubtreeWildcard ( ) ) || ( pattern.getContent ( )[offset] == pattern.getSubtreeWildcard ( ) ) ) {
-			i = subtreeJumpTable[i];
-			offset = subtreeJumpTable[offset];
-		} else {
-			return false;
-		}
-
-	return true;
-}
-
-std::vector < size_t > BorderArrayNaive::ba ( const tree::PrefixRankedBarPattern < > & pattern ) {
-	std::vector < int > patternSubtreeJumpTable = SubtreeJumpTable::compute ( pattern );
-	std::vector < size_t > res;
-
-	for ( unsigned i = 0; i <= pattern.getContent ( ).size ( ); i++ )
-		res.push_back ( 0 );
-
-	res[0] = -1;
-
-	for ( unsigned i = 1; i <= pattern.getContent ( ).size ( ); i++ ) {
-		int min = i;
-
-		for ( unsigned j = 1; j < i; j++ )
-			if ( matches ( pattern, patternSubtreeJumpTable, i, j ) ) {
-				min = j;
-				break;
-			}
-
-		res[i] = i - min;
-	}
-
-	if ( common::GlobalData::verbose )
-		std::clog << res << std::endl;
-
-	return res;
-}
-
 auto BorderArrayPrefixRankedBarPattern = BorderArrayNaive::RegistratorWrapper < std::vector < size_t >, tree::PrefixRankedBarPattern < > > ( BorderArrayNaive::ba );
-
-bool BorderArrayNaive::matches ( const tree::PrefixRankedPattern < > & pattern, const std::vector < int > & subtreeJumpTable, int stop, int offset ) {
-	unsigned i = 0;
-
-	while ( offset < stop && i < pattern.getContent ( ).size ( ) )
-		if ( pattern.getContent ( )[i] == pattern.getContent ( )[offset] ) {
-			i++;
-			offset++;
-		} else if ( ( pattern.getContent ( )[i] == pattern.getSubtreeWildcard ( ) ) || ( pattern.getContent ( )[offset] == pattern.getSubtreeWildcard ( ) ) ) {
-			i = subtreeJumpTable[i];
-			offset = subtreeJumpTable[offset];
-		} else {
-			return false;
-		}
-
-	return true;
-}
-
-std::vector < size_t > BorderArrayNaive::ba ( const tree::PrefixRankedPattern < > & pattern ) {
-	std::vector < int > patternSubtreeJumpTable = SubtreeJumpTable::compute ( pattern );
-	std::vector < size_t > res;
-
-	for ( unsigned i = 0; i <= pattern.getContent ( ).size ( ); i++ )
-		res.push_back ( 0 );
-
-	res[0] = -1;
-
-	for ( unsigned i = 1; i <= pattern.getContent ( ).size ( ); i++ ) {
-		int min = i;
-
-		for ( unsigned j = 1; j < i; j++ )
-			if ( matches ( pattern, patternSubtreeJumpTable, i, j ) ) {
-				min = j;
-				break;
-			}
-
-		res[i] = i - min;
-	}
-
-	if ( common::GlobalData::verbose )
-		std::clog << res << std::endl;
-
-	return res;
-}
-
 auto BorderArrayPrefixRankedPattern = BorderArrayNaive::RegistratorWrapper < std::vector < size_t >, tree::PrefixRankedPattern < > > ( BorderArrayNaive::ba );
 
 } /* namespace exact */
diff --git a/alib2algo/src/arbology/exact/BorderArrayNaive.h b/alib2algo/src/arbology/exact/BorderArrayNaive.h
index 575af1b841..8724366dc4 100644
--- a/alib2algo/src/arbology/exact/BorderArrayNaive.h
+++ b/alib2algo/src/arbology/exact/BorderArrayNaive.h
@@ -8,10 +8,17 @@
 #ifndef _ARBOLOGY_BORDER_ARRAY_NAIVE_H_
 #define _ARBOLOGY_BORDER_ARRAY_NAIVE_H_
 
-#include <tree/TreeFeatures.h>
+#include <vector>
+
 #include <core/multipleDispatch.hpp>
+#include <global/GlobalData.h>
 
-#include <vector>
+#include "SubtreeJumpTable.h"
+
+#include <tree/Tree.h>
+#include <tree/TreeFeatures.h>
+#include <tree/ranked/PrefixRankedBarPattern.h>
+#include <tree/ranked/PrefixRankedPattern.h>
 
 namespace arbology {
 
@@ -22,9 +29,11 @@ namespace exact {
  * To get rid of zeros in BCS table we ignore last haystack character
  */
 class BorderArrayNaive : public std::SingleDispatch < BorderArrayNaive, std::vector < size_t >, const tree::TreeBase & > {
-	static bool matches ( const tree::PrefixRankedBarPattern < > & pattern, const std::vector < int > & subtreeJumpTable, int stop, int offset );
+	template < class SymbolType, class RankType >
+	static bool matches ( const tree::PrefixRankedBarPattern < SymbolType, RankType > & pattern, const std::vector < int > & subtreeJumpTable, int stop, int offset );
 
-	static bool matches ( const tree::PrefixRankedPattern < > & pattern, const std::vector < int > & subtreeJumpTable, int stop, int offset );
+	template < class SymbolType, class RankType >
+	static bool matches ( const tree::PrefixRankedPattern < SymbolType, RankType > & pattern, const std::vector < int > & subtreeJumpTable, int stop, int offset );
 
 public:
 	/**
@@ -37,16 +46,110 @@ public:
 	 * Search for pattern in linear string.
 	 * @return set set of occurences
 	 */
-	static std::vector < size_t > ba ( const tree::PrefixRankedBarPattern < > & pattern );
+	template < class SymbolType, class RankType >
+	static std::vector < size_t > ba ( const tree::PrefixRankedBarPattern < SymbolType, RankType > & pattern );
 
 	/**
 	 * Search for pattern in linear string.
 	 * @return set set of occurences
 	 */
-	static std::vector < size_t > ba ( const tree::PrefixRankedPattern < > & pattern );
+	template < class SymbolType, class RankType >
+	static std::vector < size_t > ba ( const tree::PrefixRankedPattern < SymbolType, RankType > & pattern );
 
 };
 
+template < class SymbolType, class RankType >
+bool BorderArrayNaive::matches ( const tree::PrefixRankedBarPattern < SymbolType, RankType > & pattern, const std::vector < int > & subtreeJumpTable, int stop, int offset ) {
+	unsigned i = 0;
+
+	while ( offset < stop && i < pattern.getContent ( ).size ( ) )
+		if ( pattern.getContent ( )[i] == pattern.getContent ( )[offset] ) {
+			i++;
+			offset++;
+		} else if ( ( pattern.getContent ( )[i] == pattern.getSubtreeWildcard ( ) ) || ( pattern.getContent ( )[offset] == pattern.getSubtreeWildcard ( ) ) ) {
+			i = subtreeJumpTable[i];
+			offset = subtreeJumpTable[offset];
+		} else {
+			return false;
+		}
+
+	return true;
+}
+
+template < class SymbolType, class RankType >
+std::vector < size_t > BorderArrayNaive::ba ( const tree::PrefixRankedBarPattern < SymbolType, RankType > & pattern ) {
+	std::vector < int > patternSubtreeJumpTable = SubtreeJumpTable::compute ( pattern );
+	std::vector < size_t > res;
+
+	for ( unsigned i = 0; i <= pattern.getContent ( ).size ( ); i++ )
+		res.push_back ( 0 );
+
+	res[0] = -1;
+
+	for ( unsigned i = 1; i <= pattern.getContent ( ).size ( ); i++ ) {
+		int min = i;
+
+		for ( unsigned j = 1; j < i; j++ )
+			if ( matches ( pattern, patternSubtreeJumpTable, i, j ) ) {
+				min = j;
+				break;
+			}
+
+		res[i] = i - min;
+	}
+
+	if ( common::GlobalData::verbose )
+		std::clog << res << std::endl;
+
+	return res;
+}
+
+template < class SymbolType, class RankType >
+bool BorderArrayNaive::matches ( const tree::PrefixRankedPattern < SymbolType, RankType > & pattern, const std::vector < int > & subtreeJumpTable, int stop, int offset ) {
+	unsigned i = 0;
+
+	while ( offset < stop && i < pattern.getContent ( ).size ( ) )
+		if ( pattern.getContent ( )[i] == pattern.getContent ( )[offset] ) {
+			i++;
+			offset++;
+		} else if ( ( pattern.getContent ( )[i] == pattern.getSubtreeWildcard ( ) ) || ( pattern.getContent ( )[offset] == pattern.getSubtreeWildcard ( ) ) ) {
+			i = subtreeJumpTable[i];
+			offset = subtreeJumpTable[offset];
+		} else {
+			return false;
+		}
+
+	return true;
+}
+
+template < class SymbolType, class RankType >
+std::vector < size_t > BorderArrayNaive::ba ( const tree::PrefixRankedPattern < SymbolType, RankType > & pattern ) {
+	std::vector < int > patternSubtreeJumpTable = SubtreeJumpTable::compute ( pattern );
+	std::vector < size_t > res;
+
+	for ( unsigned i = 0; i <= pattern.getContent ( ).size ( ); i++ )
+		res.push_back ( 0 );
+
+	res[0] = -1;
+
+	for ( unsigned i = 1; i <= pattern.getContent ( ).size ( ); i++ ) {
+		int min = i;
+
+		for ( unsigned j = 1; j < i; j++ )
+			if ( matches ( pattern, patternSubtreeJumpTable, i, j ) ) {
+				min = j;
+				break;
+			}
+
+		res[i] = i - min;
+	}
+
+	if ( common::GlobalData::verbose )
+		std::clog << res << std::endl;
+
+	return res;
+}
+
 } /* namespace exact */
 
 } /* namespace arbology */
-- 
GitLab