diff --git a/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp b/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp index daed1b36a1806a2f38767d01dbb6a6afaa2ffcdb..a854e54b0b940222de9da402ad802a83a7494ad8 100644 --- a/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp +++ b/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp @@ -14,11 +14,16 @@ #include <tree/ranked/RankedPattern.h> #include <tree/ranked/PrefixRankedTree.h> #include <tree/ranked/PrefixRankedPattern.h> +#include <tree/ranked/PrefixRankedBarTree.h> +#include <tree/ranked/PrefixRankedBarPattern.h> #include <automaton/PDA/InputDrivenNPDA.h> +#include <automaton/PDA/VisiblyPushdownNPDA.h> #include <automaton/PDA/NPDA.h> #include <automaton/TA/NFTA.h> +#include <alphabet/BottomOfTheStackSymbol.h> + #include <deque> namespace arbology { @@ -62,6 +67,8 @@ automaton::NPDA ExactPatternMatchingAutomaton::construct ( const tree::PrefixRan automaton::NPDA res ( automaton::State ( 0 ), alphabet::symbolFrom ( 'T' ) ); for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) { + if ( symbol == pattern.getSubtreeWildcard ( ) ) continue; + res.addInputSymbol ( alphabet::Symbol { symbol } ); } @@ -111,6 +118,79 @@ automaton::NPDA ExactPatternMatchingAutomaton::construct ( const tree::PrefixRan auto ExactPatternMatchingAutomatonPrefixRankedPattern = ExactPatternMatchingAutomaton::RegistratorWrapper < automaton::NPDA, tree::PrefixRankedPattern > ( ExactPatternMatchingAutomaton::getInstance ( ), ExactPatternMatchingAutomaton::construct ); +automaton::InputDrivenNPDA ExactPatternMatchingAutomaton::construct ( const tree::PrefixRankedBarTree & pattern ) { + return ExactSubtreeMatchingAutomaton::construct ( pattern ); +} + +auto ExactPatternMatchingAutomatonPrefixRankedBarTree = ExactPatternMatchingAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA, tree::PrefixRankedBarTree > ( ExactPatternMatchingAutomaton::getInstance ( ), ExactPatternMatchingAutomaton::construct ); + +automaton::VisiblyPushdownNPDA ExactPatternMatchingAutomaton::construct ( const tree::PrefixRankedBarPattern & pattern ) { + automaton::VisiblyPushdownNPDA res ( alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } ); + + res.addState ( automaton::State ( 0 ) ); + res.addInitialState ( automaton::State ( 0 ) ); + + for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) { + if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) ) continue; + + if ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) ) + res.addReturnInputSymbol ( alphabet::Symbol { symbol } ); + else + res.addCallInputSymbol ( alphabet::Symbol { symbol } ); + } + + res.setStackAlphabet ( { alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK }, alphabet::symbolFrom ( 'T' ), alphabet::symbolFrom ( 'R' ) } ); + + for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) { + if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) ) continue; + + if ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) ) + res.addReturnTransition ( automaton::State ( 0 ), alphabet::Symbol { symbol }, alphabet::symbolFrom ( 'T' ), automaton::State ( 0 ) ); + else + res.addCallTransition ( automaton::State ( 0 ), alphabet::Symbol { symbol }, automaton::State ( 0 ), alphabet::symbolFrom ( 'T' ) ); + } + + int i = 1; + + for ( const alphabet::RankedSymbol & symbol : pattern.getContent ( ) ) { + res.addState ( automaton::State ( i ) ); + + if ( symbol == pattern.getSubtreeWildcard ( ) ) { + for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) { + if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) || ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) ) ) continue; + + res.addCallTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, automaton::State ( i ), alphabet::symbolFrom ( 'R' ) ); + } + } else if ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) { + for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) { + if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) ) continue; + + if ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) ) + res.addReturnTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, alphabet::symbolFrom ( 'T' ), automaton::State ( i - 1 ) ); + else + res.addCallTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, automaton::State ( i - 1 ), alphabet::symbolFrom ( 'T' ) ); + } + + for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) { + if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) || ( symbol.getSymbol ( ) != pattern.getBarSymbol ( ) ) ) continue; + + res.addReturnTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, alphabet::symbolFrom ( 'R' ), automaton::State ( i ) ); + } + } else if ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) ) { + res.addReturnTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, alphabet::symbolFrom ( 'T' ), automaton::State ( i ) ); + } else { + res.addCallTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, automaton::State ( i ), alphabet::symbolFrom ( 'T' ) ); + } + + i++; + } + + res.addFinalState ( automaton::State ( i - 1 ) ); + return res; +} + +auto ExactPatternMatchingAutomatonPrefixRankedBarPattern = ExactPatternMatchingAutomaton::RegistratorWrapper < automaton::VisiblyPushdownNPDA, tree::PrefixRankedBarPattern > ( ExactPatternMatchingAutomaton::getInstance ( ), ExactPatternMatchingAutomaton::construct ); + automaton::NFTA ExactPatternMatchingAutomaton::construct ( const tree::RankedTree & pattern ) { return ExactSubtreeMatchingAutomaton::construct ( pattern ); } diff --git a/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.h b/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.h index 45595dd7d6f659d0f0ed2838c33e180622746c96..2b20255f07b773531cbefd12641a569a0535b4aa 100644 --- a/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.h +++ b/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.h @@ -30,6 +30,8 @@ public: static automaton::NPDA construct ( const tree::PrefixRankedPattern & pattern ); static automaton::InputDrivenNPDA construct ( const tree::PrefixRankedTree & pattern ); + static automaton::VisiblyPushdownNPDA construct ( const tree::PrefixRankedBarPattern & pattern ); + static automaton::InputDrivenNPDA construct ( const tree::PrefixRankedBarTree & pattern ); static automaton::NFTA construct ( const tree::RankedTree & pattern ); static automaton::NFTA construct ( const tree::RankedPattern & pattern ); diff --git a/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp b/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp index f624c50fe52678cec32c6d6c344def5965ea3df1..7ec04894153ac964f6cbf378d7f72ed059f63719 100644 --- a/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp +++ b/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp @@ -7,12 +7,15 @@ #include "ExactSubtreeMatchingAutomaton.h" #include <exception/AlibException.h> +#include <tree/ranked/PrefixRankedBarTree.h> #include <tree/ranked/PrefixRankedTree.h> #include <tree/ranked/RankedTree.h> #include <automaton/PDA/InputDrivenNPDA.h> #include <automaton/TA/NFTA.h> +#include <alphabet/BottomOfTheStackSymbol.h> + #include <deque> namespace arbology { @@ -49,6 +52,38 @@ automaton::InputDrivenNPDA ExactSubtreeMatchingAutomaton::construct ( const tree auto ExactSubtreeMatchingAutomatonPrefixRankedTree = ExactSubtreeMatchingAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA, tree::PrefixRankedTree > ( ExactSubtreeMatchingAutomaton::getInstance ( ), ExactSubtreeMatchingAutomaton::construct ); +automaton::InputDrivenNPDA ExactSubtreeMatchingAutomaton::construct ( const tree::PrefixRankedBarTree & pattern ) { + automaton::InputDrivenNPDA res ( automaton::State ( 0 ), alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } ); + + res.setStackAlphabet ( { alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK }, alphabet::symbolFrom ( 'S' ) } ); + + for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) { + res.addInputSymbol ( alphabet::Symbol { symbol } ); + + if ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) ) + res.setPushdownStoreOperation ( alphabet::Symbol { symbol }, std::vector < alphabet::Symbol > { 1, alphabet::symbolFrom ( 'S' ) }, std::vector < alphabet::Symbol > { } ); + else + res.setPushdownStoreOperation ( alphabet::Symbol { symbol }, std::vector < alphabet::Symbol > { }, std::vector < alphabet::Symbol > { 1, alphabet::symbolFrom ( 'S' ) } ); + } + + for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) { + res.addTransition ( automaton::State ( 0 ), alphabet::Symbol { symbol }, automaton::State ( 0 ) ); + } + + int i = 1; + + for ( const alphabet::RankedSymbol & symbol : pattern.getContent ( ) ) { + res.addState ( automaton::State ( i ) ); + res.addTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, automaton::State ( i ) ); + i++; + } + + res.addFinalState ( automaton::State ( i - 1 ) ); + return res; +} + +auto ExactSubtreeMatchingAutomatonPrefixRankedBarTree = ExactSubtreeMatchingAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA, tree::PrefixRankedBarTree > ( ExactSubtreeMatchingAutomaton::getInstance ( ), ExactSubtreeMatchingAutomaton::construct ); + automaton::State constructRecursive ( const tree::RankedNode & node, automaton::NFTA & res, int & nextState ) { std::vector < automaton::State > states; diff --git a/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.h b/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.h index 24cc730c379de5d19848813a61786fdf1e9579f5..f3c28a4d19df3dfcdca8523009a620092130ef58 100644 --- a/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.h +++ b/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.h @@ -29,6 +29,7 @@ public: static automaton::Automaton construct ( const tree::Tree & pattern ); static automaton::InputDrivenNPDA construct ( const tree::PrefixRankedTree & pattern ); + static automaton::InputDrivenNPDA construct ( const tree::PrefixRankedBarTree & pattern ); static automaton::NFTA construct ( const tree::RankedTree & pattern ); static ExactSubtreeMatchingAutomaton & getInstance ( ) {