Skip to content
Snippets Groups Projects
ExactSubtreeMatchingAutomaton.cpp 4.69 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*
     * ExactSubtreeMatchingAutomaton.cpp
     *
     *  Created on: 9. 2. 2014
     *      Author: Jan Travnicek
     */
    
    #include "ExactSubtreeMatchingAutomaton.h"
    
    #include <tree/ranked/PrefixRankedBarTree.h>
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    #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 {
    
    namespace exact {
    
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    automaton::Automaton ExactSubtreeMatchingAutomaton::construct ( const tree::Tree & pattern ) {
    
    	return dispatch ( pattern.getData ( ) );
    
    automaton::InputDrivenNPDA < > ExactSubtreeMatchingAutomaton::construct ( const tree::PrefixRankedTree < > & pattern ) {
    
    	automaton::InputDrivenNPDA < > res ( label::Label ( 0 ), alphabet::Symbol ( 'S' ) );
    
    	for ( const std::ranked_symbol < > & symbol : pattern.getAlphabet ( ) ) {
    		res.addInputSymbol ( alphabet::Symbol ( alphabet::RankedSymbol < > { symbol } ) );
    
    		res.setPushdownStoreOperation ( alphabet::Symbol ( alphabet::RankedSymbol < > { symbol } ), std::vector < alphabet::Symbol > ( 1, alphabet::Symbol ( 'S' ) ), std::vector < alphabet::Symbol > ( ( size_t ) symbol.getRank ( ), alphabet::Symbol ( 'S' ) ) );
    
    	for ( const std::ranked_symbol < > & symbol : pattern.getAlphabet ( ) ) {
    
    		res.addTransition ( label::Label ( 0 ), alphabet::Symbol ( alphabet::RankedSymbol < > { symbol } ), label::Label ( 0 ) );
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    
    
    	int i = 1;
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    
    
    	for ( const std::ranked_symbol < > & symbol : pattern.getContent ( ) ) {
    
    		res.addState ( label::Label ( i ) );
    		res.addTransition ( label::Label ( i - 1 ), alphabet::Symbol ( alphabet::RankedSymbol < > { symbol } ), label::Label ( i ) );
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    
    
    	res.addFinalState ( label::Label ( i - 1 ) );
    
    auto ExactSubtreeMatchingAutomatonPrefixRankedTree = ExactSubtreeMatchingAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA < >, tree::PrefixRankedTree < > > ( ExactSubtreeMatchingAutomaton::construct );
    
    automaton::InputDrivenNPDA < > ExactSubtreeMatchingAutomaton::construct ( const tree::PrefixRankedBarTree < > & pattern ) {
    
    	automaton::InputDrivenNPDA < > res ( label::Label ( 0 ), alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) );
    
    	res.setPushdownStoreAlphabet ( { alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ), alphabet::Symbol ( 'S' ) } );
    
    	for ( const std::ranked_symbol < > & symbol : pattern.getAlphabet ( ) ) {
    		res.addInputSymbol ( alphabet::Symbol ( alphabet::RankedSymbol < > { symbol } ) );
    
    		if ( pattern.getBars ( ).count ( symbol ) )
    
    			res.setPushdownStoreOperation ( alphabet::Symbol ( alphabet::RankedSymbol < > { symbol } ), std::vector < alphabet::Symbol > ( 1, alphabet::Symbol ( 'S' ) ), std::vector < alphabet::Symbol > { } );
    
    			res.setPushdownStoreOperation ( alphabet::Symbol ( alphabet::RankedSymbol < > { symbol } ), std::vector < alphabet::Symbol > { }, std::vector < alphabet::Symbol > ( 1, alphabet::Symbol ( 'S' ) ) );
    
    	for ( const std::ranked_symbol < > & symbol : pattern.getAlphabet ( ) ) {
    
    		res.addTransition ( label::Label ( 0 ), alphabet::Symbol ( alphabet::RankedSymbol < > { symbol } ), label::Label ( 0 ) );
    
    	for ( const std::ranked_symbol < > & symbol : pattern.getContent ( ) ) {
    
    		res.addState ( label::Label ( i ) );
    		res.addTransition ( label::Label ( i - 1 ), alphabet::Symbol ( alphabet::RankedSymbol < > { symbol } ), label::Label ( i ) );
    
    	res.addFinalState ( label::Label ( i - 1 ) );
    
    auto ExactSubtreeMatchingAutomatonPrefixRankedBarTree = ExactSubtreeMatchingAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA < >, tree::PrefixRankedBarTree < > > ( ExactSubtreeMatchingAutomaton::construct );
    
    label::Label constructRecursive ( const std::tree < std::ranked_symbol < > > & node, automaton::NFTA < > & res, int & nextState ) {
    
    	std::vector < label::Label > states;
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    
    
    	states.reserve ( ( size_t ) node.getData ( ).getRank ( ) );
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    
    
    	for ( const std::tree < std::ranked_symbol < > > & child : node.getChildren ( ) )
    
    		states.push_back ( constructRecursive ( child, res, nextState ) );
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    
    
    	label::Label state = label::Label ( nextState++ );
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    	res.addState ( state );
    
    	res.addTransition ( node.getData ( ), states, state );
    
    automaton::NFTA < > ExactSubtreeMatchingAutomaton::construct ( const tree::RankedTree < > & pattern ) {
    	automaton::NFTA < > res;
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    
    
    	res.setInputAlphabet ( pattern.getAlphabet ( ) );
    
    	int nextState = 0;
    
    	res.addFinalState ( constructRecursive ( pattern.getContent ( ), res, nextState ) );
    
    auto ExactSubtreeMatchingAutomatonRankedTree = ExactSubtreeMatchingAutomaton::RegistratorWrapper < automaton::NFTA < >, tree::RankedTree < > > ( ExactSubtreeMatchingAutomaton::construct );
    
    
    } /* namespace exact */
    
    } /* namespace arbology */