From ff971762ca3b15401b0fa62749358300d9e0691e Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Fri, 13 Jan 2017 12:41:25 +0100
Subject: [PATCH] simplify ExactNonlinearTreePatternAutomaton algo

---
 .../ExactNonlinearTreePatternAutomaton.cpp      | 17 ++++++++---------
 .../exact/ExactNonlinearTreePatternAutomaton.h  |  2 +-
 2 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/alib2algo/src/arbology/exact/ExactNonlinearTreePatternAutomaton.cpp b/alib2algo/src/arbology/exact/ExactNonlinearTreePatternAutomaton.cpp
index a8125ff4e7..28649b9ca6 100644
--- a/alib2algo/src/arbology/exact/ExactNonlinearTreePatternAutomaton.cpp
+++ b/alib2algo/src/arbology/exact/ExactNonlinearTreePatternAutomaton.cpp
@@ -24,14 +24,14 @@ automaton::Automaton ExactNonlinearTreePatternAutomaton::construct ( const tree:
 	return dispatch ( tree.getData ( ), subtreeWildcard, nonlinearVariables );
 }
 
-void ExactNonlinearTreePatternAutomaton::constructTail ( automaton::InputDrivenNPDA < > & res, const tree::PrefixRankedTree < > & tree, const DefaultSymbolType & subtreeWildcard, const DefaultSymbolType & currentNonlinearVariable, const std::set < DefaultSymbolType > & nonlinearVariables, const std::ranked_symbol < unsigned, DefaultRankType > & subtreeSettings, unsigned subtreeId, std::vector < std::ranked_symbol < > >::const_iterator rankedSymbolsIter, int i, std::vector < std::ranked_symbol < unsigned, DefaultRankType > >::const_iterator subtreeRepeatsIter ) {
+void ExactNonlinearTreePatternAutomaton::constructTail ( automaton::InputDrivenNPDA < > & res, const tree::PrefixRankedTree < > & tree, const DefaultSymbolType & subtreeWildcard, const DefaultSymbolType & currentNonlinearVariable, const std::set < DefaultSymbolType > & nonlinearVariables, unsigned subtreeId, std::vector < std::ranked_symbol < > >::const_iterator rankedSymbolsIter, int i, std::vector < std::ranked_symbol < unsigned, DefaultRankType > >::const_iterator subtreeRepeatsIter ) {
 	std::deque < std::pair < size_t, int > > subtreeJumps;
-	std::deque < std::ranked_symbol < unsigned, DefaultRankType > > subtreeRepeatsStack;
+	std::deque < unsigned > subtreeRepeatsStack;
 
 	for (++ rankedSymbolsIter, ++ subtreeRepeatsIter, ++i; rankedSymbolsIter != tree.getContent ( ).end ( ); ++ rankedSymbolsIter, ++ subtreeRepeatsIter, ++i ) {
 		DefaultSymbolType symbol ( alphabet::RankedSymbol < > { * rankedSymbolsIter } );
 		subtreeJumps.push_back ( std::make_pair ( ( size_t ) rankedSymbolsIter->getRank ( ), i - 1 ) );
-		subtreeRepeatsStack.push_back ( * subtreeRepeatsIter );
+		subtreeRepeatsStack.push_back ( subtreeRepeatsIter->getSymbol ( ) );
 
 		DefaultStateType currentState = DefaultStateType ( i, subtreeId );
 		DefaultStateType previousState = DefaultStateType ( i - 1, subtreeId );
@@ -45,7 +45,7 @@ void ExactNonlinearTreePatternAutomaton::constructTail ( automaton::InputDrivenN
 			res.addTransition ( jumpSource, subtreeWildcard, currentState );
 
 			for ( const DefaultSymbolType & nonlinearVariable : nonlinearVariables )
-				if ( nonlinearVariable != currentNonlinearVariable || subtreeSettings == subtreeRepeatsStack.back ( ) )
+				if ( nonlinearVariable != currentNonlinearVariable || subtreeId == subtreeRepeatsStack.back ( ) )
 					res.addTransition ( jumpSource, nonlinearVariable, currentState );
 
 			if ( subtreeJumps.size ( ) ) {
@@ -80,14 +80,14 @@ automaton::InputDrivenNPDA < > ExactNonlinearTreePatternAutomaton::constructInte
 
 	int i = 1;
 	std::deque < std::pair < size_t, int > > subtreeJumps;
-	std::deque < std::ranked_symbol < unsigned, DefaultRankType > > subtreeRepeatsStack;
+	std::deque < unsigned > subtreeRepeatsStack;
 
 	std::vector < std::ranked_symbol < > >::const_iterator rankedSymbolsIter;
 	std::vector < std::ranked_symbol < unsigned, DefaultRankType > >::const_iterator subtreeRepeatsIter;
 	for ( rankedSymbolsIter = tree.getContent ( ).begin(), subtreeRepeatsIter = repeats.getContent ( ).begin ( ); rankedSymbolsIter != tree.getContent ( ).end ( ); ++ rankedSymbolsIter, ++ subtreeRepeatsIter, ++ i ) {
 		DefaultSymbolType symbol ( alphabet::RankedSymbol < > { * rankedSymbolsIter } );
 		subtreeJumps.push_back ( std::make_pair ( ( size_t ) rankedSymbolsIter->getRank ( ), i - 1 ) );
-		subtreeRepeatsStack.push_back ( * subtreeRepeatsIter );
+		subtreeRepeatsStack.push_back ( subtreeRepeatsIter->getSymbol ( ) );
 
 		DefaultStateType currentState = DefaultStateType ( i );
 		DefaultStateType previousState = DefaultStateType ( i - 1 );
@@ -105,14 +105,13 @@ automaton::InputDrivenNPDA < > ExactNonlinearTreePatternAutomaton::constructInte
 				if ( nonlinearVariable != currentNonlinearVariable )
 					res.addTransition ( jumpSource, nonlinearVariable, currentState );
 				else {
-					const std::ranked_symbol < unsigned, DefaultRankType > & subtreeSettings = subtreeRepeatsStack.back ( );
-					unsigned subtreeId = subtreeSettings.getSymbol ( );
+					unsigned subtreeId = subtreeRepeatsStack.back ( );
 					DefaultStateType targetState = DefaultStateType ( i, subtreeId );
 
 					res.addState ( targetState );
 					res.addTransition ( jumpSource, nonlinearVariable, targetState );
 
-					constructTail ( res, tree, subtreeWildcard, currentNonlinearVariable, nonlinearVariables, subtreeSettings, subtreeId, rankedSymbolsIter, i, subtreeRepeatsIter );
+					constructTail ( res, tree, subtreeWildcard, currentNonlinearVariable, nonlinearVariables, subtreeId, rankedSymbolsIter, i, subtreeRepeatsIter );
 				}
 
 			subtreeJumps.pop_back ( );
diff --git a/alib2algo/src/arbology/exact/ExactNonlinearTreePatternAutomaton.h b/alib2algo/src/arbology/exact/ExactNonlinearTreePatternAutomaton.h
index 43fa3879ef..95f836f5c2 100644
--- a/alib2algo/src/arbology/exact/ExactNonlinearTreePatternAutomaton.h
+++ b/alib2algo/src/arbology/exact/ExactNonlinearTreePatternAutomaton.h
@@ -23,7 +23,7 @@ namespace exact {
 class ExactNonlinearTreePatternAutomaton : public std::SingleDispatch < ExactNonlinearTreePatternAutomaton, automaton::Automaton, const tree::TreeBase &, const DefaultSymbolType &, const std::set < DefaultSymbolType > & > {
 	static automaton::InputDrivenNPDA < > constructInternal ( const tree::PrefixRankedTree < > & tree, const DefaultSymbolType & subtreeWildcard, const DefaultSymbolType & currentNonlinearVariable, const std::set < DefaultSymbolType > & nonlinearVariables );
 
-	static void constructTail ( automaton::InputDrivenNPDA < > & res, const tree::PrefixRankedTree < > & tree, const DefaultSymbolType & subtreeWildcard, const DefaultSymbolType & currentNonlinearVariable, const std::set < DefaultSymbolType > & nonlinearVariables, const std::ranked_symbol < unsigned, DefaultRankType > & subtreeSettings, unsigned subtreeId, std::vector < std::ranked_symbol < > >::const_iterator rankedSymbolsIter, int i, std::vector < std::ranked_symbol < unsigned, DefaultRankType > >::const_iterator subtreeRepeatsIter );
+	static void constructTail ( automaton::InputDrivenNPDA < > & res, const tree::PrefixRankedTree < > & tree, const DefaultSymbolType & subtreeWildcard, const DefaultSymbolType & currentNonlinearVariable, const std::set < DefaultSymbolType > & nonlinearVariables, unsigned subtreeId, std::vector < std::ranked_symbol < > >::const_iterator rankedSymbolsIter, int i, std::vector < std::ranked_symbol < unsigned, DefaultRankType > >::const_iterator subtreeRepeatsIter );
 
 public:
 	/**
-- 
GitLab