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