From 9daecb34643a504e65772dde74cdbaa448c76f80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <peckato1@fit.cvut.cz> Date: Thu, 11 Sep 2014 19:10:39 +0200 Subject: [PATCH] Cleanup --- aconversions/src/fa2re/StateElimination.cpp | 228 -------------------- aconversions/src/fa2re/StateElimination.h | 112 ---------- 2 files changed, 340 deletions(-) delete mode 100644 aconversions/src/fa2re/StateElimination.cpp delete mode 100644 aconversions/src/fa2re/StateElimination.h diff --git a/aconversions/src/fa2re/StateElimination.cpp b/aconversions/src/fa2re/StateElimination.cpp deleted file mode 100644 index 6b6551f0e4..0000000000 --- a/aconversions/src/fa2re/StateElimination.cpp +++ /dev/null @@ -1,228 +0,0 @@ -/* - * StateElimination.cpp - * - * Created on: 9. 2. 2014 - * Author: tomas - */ - -#include "StateElimination.h" - -using namespace alib; -using namespace automaton; -using namespace regexp; -using namespace std; - -namespace conversions -{ - -StateElimination::StateElimination( const FSM & automaton ) : m_automaton( automaton ) -{ - -} - -StateElimination::~StateElimination( void ) -{ - deleteTransitions( ); -} - -void StateElimination::deleteTransitions( void ) -{ - for( const auto & transition : m_MR.m_transitions ) - delete transition.m_regexp; -} - -RegExp StateElimination::convert( void ) -{ - if( m_automaton.getFinalStates( ).size( ) <= 0 ) - { - RegExp ret; - ret.setRegExp( new RegExpEmpty( ) ); - return ret; - } - - m_MR = ExtendedNFA( ); - - // steps 1 + 2 - constructExtendedNFA( ); - extendExtendedNFA( ); // yup, i am extending extended thing! - - // we are sure there is only 1 initial and 1 final state (follows from step2) - const State & q0 = * m_MR.m_initialStates.begin( ); - const State & f = * m_MR.m_finalStates.begin( ); - - // step 3 - iterating over all states except q0 and f, equivalent to the steps in Melichar 2.118 - for( auto it = m_MR.m_states.begin( ); it != m_MR.m_states.end( ); ) - { - if( * it == q0 || * it == f ) - it ++; - else - eliminate( * it ++ ); - } - - // step 4 - Iteration * iter = new Iteration( ); - iter->setElement( transition( f, f ) ); - - Concatenation* concat = new Concatenation( ); - concat->getElements( ).push_back( transition( q0, f ) ); - concat->getElements( ).push_back( iter ); - - RegExpOptimize opt; - - RegExp ret; - ret.setRegExp( opt.optimize( concat ) ); - - delete concat; - - return ret; -} - -void StateElimination::constructExtendedNFA( void ) -{ - for( const auto & state : m_automaton.getStates( ) ) - m_MR.m_states.insert( state ); - - for( const auto & symbol : m_automaton.getInputAlphabet( ) ) - m_MR.m_alphabet.insert( symbol ); - - for( const auto & transition : m_automaton.getTransitions( ) ) - m_MR.m_transitions.insert( TransitionExtendedNFA( transition.getFrom( ), new RegExpSymbol( transition.getInput( ).getSymbol( ) ), transition.getTo( ) ) ); - - for( const auto & state : m_automaton.getInitialStates( ) ) - m_MR.m_initialStates.insert( state ); - - for( const auto & state : m_automaton.getFinalStates( ) ) - m_MR.m_finalStates.insert( state ); -} - -void StateElimination::extendExtendedNFA( void ) -{ - if( isInSet( * m_MR.m_initialStates.begin( ), m_MR.m_finalStates ) || m_MR.transitionsToState( * m_MR.m_initialStates.begin( ) ).size( ) > 0 ) - { - State q0 = m_MR.createUniqueState( "q0" ); - - for( const auto & state : m_MR.m_initialStates ) - m_MR.m_transitions.insert( TransitionExtendedNFA( q0, new RegExpEpsilon( ), state ) ); - - m_MR.m_initialStates.clear( ); - m_MR.m_initialStates.insert( q0 ); - } - - if( m_MR.m_finalStates.size( ) > 1 ) - { - State f = m_MR.createUniqueState( "f" ); - - for( const auto & state : m_MR.m_finalStates ) - m_MR.m_transitions.insert( TransitionExtendedNFA( state, new RegExpEpsilon( ), f ) ); - - m_MR.m_finalStates.clear( ); - m_MR.m_finalStates.insert( f ); - } -} - -void StateElimination::eliminate( const State & q ) -{ - set<TransitionExtendedNFA> newTransitions; - RegExpOptimize opt; - - for( const auto & p : m_MR.m_states ) - { - for( const auto & r : m_MR.m_states ) - { - if( p == q || r == q ) continue; - - // new transition function y(p,r) = y(p,r) + y(p,q)y(q,q)*y(q,r) - Iteration* iter = new Iteration( ); - iter->setElement( transition( q, q ) ); - - Concatenation* concat = new Concatenation( ); - concat->getElements( ).push_back( transition( p, q ) ); - concat->getElements( ).push_back( iter ); - concat->getElements( ).push_back( transition( q, r ) ); - - Alternation* alt = new Alternation( ); - alt->getElements( ).push_back( transition( p, r ) ); - alt->getElements( ).push_back( concat ); - - newTransitions.insert( TransitionExtendedNFA( p, opt.optimize( alt ), r ) ); - delete alt; - } - } - - m_MR.m_states.erase( q ); - - deleteTransitions( ); - m_MR.m_transitions = newTransitions; -} - -RegExpElement* StateElimination::transition( const State & p, const State & q ) const -{ - Alternation* alt = new Alternation( ); - - alt->getElements( ).push_back( new RegExpEmpty( ) ); - - for( const auto & transition : m_MR.m_transitions ) - if( transition.m_from == p && transition.m_to == q ) - alt->getElements( ).push_back( transition.m_regexp->clone( ) ); - - return alt; -} - -// ---------------------------------------------------------------------------- - -set<StateElimination::TransitionExtendedNFA> StateElimination::ExtendedNFA::transitionsToState( const State & toState ) const -{ - if( ! isInSet( toState, m_states ) ) - throw AlibException( "StateElimination::ExtendedNFA::transitionsToState - unknown state!" ); - - set<TransitionExtendedNFA> transitions; - - for( const auto & transition : m_transitions ) - if( transition.m_to == toState ) - transitions.insert( transition ); - - return transitions; -} - -const State & StateElimination::ExtendedNFA::createUniqueState( const string & name ) -{ - State uniqueState( name ); - if( ! isInSet( uniqueState, m_states ) ) - { - m_states.insert( uniqueState ); - return * m_states.find( uniqueState ); - } - - int i = 0; - while( i < INT_MAX ) - { - State uniqueState( name + std::to_string( ++ i ) ); - - if( ! isInSet( uniqueState, m_states ) ) - { - m_states.insert( uniqueState ); - return * m_states.find( uniqueState ); - } - } - - throw AlibException( "StateElimination::ExtendedNFA::createUniqueState - could not create unique state." ); -} - -// ---------------------------------------------------------------------------- - -StateElimination::TransitionExtendedNFA::TransitionExtendedNFA( const State & from, RegExpElement* regexp, const State & to ) : m_from( from ), m_to( to ), m_regexp( regexp ) -{ - -} - -bool StateElimination::TransitionExtendedNFA::operator<( const StateElimination::TransitionExtendedNFA & x ) const -{ - if( m_from != x.m_from ) - return m_from < x.m_from; - else if( m_regexp != x.m_regexp ) - return m_regexp < x.m_regexp; - else - return m_to < x.m_to; -} - -} /* namespace conversions */ diff --git a/aconversions/src/fa2re/StateElimination.h b/aconversions/src/fa2re/StateElimination.h deleted file mode 100644 index 93a81ca51a..0000000000 --- a/aconversions/src/fa2re/StateElimination.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * StateElimination.h - * - * Created on: 9. 2. 2014 - * Author: tomas - */ - -#ifndef STATEELIMINATION_H_ -#define STATEELIMINATION_H_ - -#include <set> - -#include <automaton/FSM/FSM.h> -#include <regexp/RegExp.h> -#include <regexp/RegExpElements.h> - -#include "../interface/IConversionRE.h" -#include "../include/macros.h" - -#include "RegExpOptimize.h" - -namespace conversions -{ - -/** - * Converts FSM to RE using State Elimination algorithm. - * Source: Melichar 2.118 - */ -class StateElimination: public IConversionRE -{ -public: - /** - * @param fsm Source automaton. - */ - StateElimination( const automaton::FSM & fsm ); - - ~StateElimination( void ); - - /** - * Performs conversion. - * @return regular expression equivalent to source automaton. - */ - regexp::RegExp convert( void ); - -private: - /** - * Representation of extended NFA transition function (Q x R_T -> Q, R_T = regexp over alphabet T) - */ - struct TransitionExtendedNFA - { - const automaton::State m_from, m_to; - regexp::RegExpElement* m_regexp; - - /** - * @param from From state - * @param to To state - * @param regexp Expression - */ - TransitionExtendedNFA( const automaton::State & from, regexp::RegExpElement* regexp ,const automaton::State & to ); - bool operator<( const TransitionExtendedNFA & rhs ) const; - }; - - /** - * Stores extended NFA. - */ - struct ExtendedNFA - { - std::set<automaton::State> m_states, m_finalStates, m_initialStates; - std::set<alphabet::Symbol> m_alphabet; - std::set<TransitionExtendedNFA> m_transitions; - - const automaton::State & createUniqueState( const std::string & name ); - std::set<StateElimination::TransitionExtendedNFA> transitionsToState( const automaton::State & toState ) const; - }; - - void constructExtendedNFA( void ); - - void extendExtendedNFA( void ); - - /** - * Eliminates given state - * @param q given state - */ - void eliminate( const automaton::State & q ); - - /** - * Cleanup - */ - void deleteTransitions( void ); - - /** - * gets regexp representing transition from state P to state Q - * @param p from state - * @param q to state - * @return RegExpElement - */ - regexp::RegExpElement* transition( const automaton::State & p, const automaton::State & q ) const; - - /** - * Extended NFA. - */ - ExtendedNFA m_MR; - - /** - * Input automaton - */ - const automaton::FSM & m_automaton; -}; - -} /* namespace conversions */ - -#endif /* STATEELIMINATION_H_ */ -- GitLab