Skip to content
Snippets Groups Projects
Commit ff971762 authored by Jan Trávníček's avatar Jan Trávníček
Browse files

simplify ExactNonlinearTreePatternAutomaton algo

parent 53e3ece9
No related branches found
No related tags found
No related merge requests found
......@@ -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 ( );
......
......@@ -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:
/**
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment