From 9a664d5df170fde01f6012fbe51a16207f24e6e4 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Tue, 9 Apr 2019 14:35:03 +0200 Subject: [PATCH] add rename algo for DFTA and NFTA automata --- alib2algo/src/automaton/simplify/Rename.cpp | 12 +++ alib2algo/src/automaton/simplify/Rename.h | 87 +++++++++++++++++++++ 2 files changed, 99 insertions(+) diff --git a/alib2algo/src/automaton/simplify/Rename.cpp b/alib2algo/src/automaton/simplify/Rename.cpp index 8ae7524f40..0034c3916f 100644 --- a/alib2algo/src/automaton/simplify/Rename.cpp +++ b/alib2algo/src/automaton/simplify/Rename.cpp @@ -24,6 +24,18 @@ auto RenameNFA = registration::AbstractRegister < Rename, automaton::NFA < Defau @param automaton finite automaton to normalize\n\ @return @p automaton with renamed properties" ); +auto RenameDFTA = registration::AbstractRegister < Rename, automaton::DFTA < DefaultSymbolType, DefaultRankType, unsigned >, const automaton::DFTA < > & > ( Rename::rename, "automaton" ).setDocumentation ( +"Rename automaton's states.\n\ +\n\ +@param automaton finite tree automaton to normalize\n\ +@return @p automaton with renamed properties" ); + +auto RenameNFTA = registration::AbstractRegister < Rename, automaton::NFTA < DefaultSymbolType, DefaultRankType, unsigned >, const automaton::NFTA < > & > ( Rename::rename, "automaton" ).setDocumentation ( +"Rename automaton's states.\n\ +\n\ +@param automaton finite tree automaton to normalize\n\ +@return @p automaton with renamed properties" ); + auto RenameDPDA = registration::AbstractRegister < Rename, automaton::DPDA < DefaultSymbolType, DefaultEpsilonType, unsigned, unsigned >, const automaton::DPDA < > & > ( Rename::rename, "automaton" ).setDocumentation ( "Rename automaton's states and pushdown store symbols.\n\ \n\ diff --git a/alib2algo/src/automaton/simplify/Rename.h b/alib2algo/src/automaton/simplify/Rename.h index a3430dad06..27c00907c4 100644 --- a/alib2algo/src/automaton/simplify/Rename.h +++ b/alib2algo/src/automaton/simplify/Rename.h @@ -33,6 +33,8 @@ #include <automaton/FSM/DFA.h> #include <automaton/FSM/NFA.h> #include <automaton/FSM/EpsilonNFA.h> +#include <automaton/TA/DFTA.h> +#include <automaton/TA/NFTA.h> #include <automaton/PDA/DPDA.h> #include <automaton/PDA/NPDA.h> #include <automaton/PDA/InputDrivenDPDA.h> @@ -88,6 +90,30 @@ public: template < class T > static ext::require < isDFA < T > || isNFA < T >, Rename::RenamedAutomaton < T > > rename ( const T & fsm ); + /** + * Rename automaton's states. + * + * @tparam T Type of automaton to rename + * + * @param nfa finite automaton to rename + * + * @return @p dfa with renamed states + */ + template < class SymbolType, class RankType, class StateType > + static DFTA < SymbolType, RankType, unsigned > rename ( const DFTA < SymbolType, RankType, StateType > & fta ); + + /** + * Rename automaton's states. + * + * @tparam T Type of automaton to rename + * + * @param nfa finite automaton to rename + * + * @return @p dfa with renamed states + */ + template < class SymbolType, class RankType, class StateType > + static NFTA < SymbolType, RankType, unsigned > rename ( const NFTA < SymbolType, RankType, StateType > & fta ); + /** * @overload * Rename automaton's states and pushdown store symbols. @@ -209,6 +235,67 @@ ext::require < isDFA < T > || isNFA < T >, Rename::RenamedAutomaton < T > > Rena return result; } +template < class SymbolType, class RankType, class StateType > +DFTA < SymbolType, RankType, unsigned > Rename::rename ( const DFTA < SymbolType, RankType, StateType > & fta ) { + unsigned counter = 0; + ext::map < StateType, unsigned > renamingData; + + for ( const StateType & state : fta.getStates ( ) ) + renamingData.insert ( std::make_pair ( state, counter++ ) ); + + automaton::DFTA < SymbolType, RankType, unsigned > result; + + result.setInputAlphabet ( fta.getInputAlphabet ( ) ); + + for ( const StateType & state : fta.getStates ( ) ) + result.addState ( renamingData.at ( state ) ); + + for ( const StateType & state : fta.getFinalStates ( ) ) + result.addFinalState ( renamingData.at ( state ) ); + + for ( const auto & transition : fta.getTransitions ( ) ) { + ext::vector < unsigned > sourceStates; + + for ( const StateType & source : transition.first.second ) + sourceStates.push_back ( renamingData.at ( source ) ); + + result.addTransition ( transition.first.first, sourceStates, renamingData.at ( transition.second ) ); + } + + return result; +} + +template < class SymbolType, class RankType, class StateType > +NFTA < SymbolType, RankType, unsigned > Rename::rename ( const NFTA < SymbolType, RankType, StateType > & fta ) { + unsigned counter = 0; + ext::map < StateType, unsigned > renamingData; + + for ( const StateType & state : fta.getStates ( ) ) + renamingData.insert ( std::make_pair ( state, counter++ ) ); + + automaton::NFTA < SymbolType, RankType, unsigned > result; + + result.setInputAlphabet ( fta.getInputAlphabet ( ) ); + + for ( const StateType & state : fta.getStates ( ) ) + result.addState ( renamingData.at ( state ) ); + + for ( const StateType & state : fta.getFinalStates ( ) ) + result.addFinalState ( renamingData.at ( state ) ); + + for ( const auto & transition : fta.getTransitions ( ) ) { + ext::vector < unsigned > sourceStates; + + for ( const StateType & source : transition.first.second ) + sourceStates.push_back ( renamingData.at ( source ) ); + + for ( const StateType & target : transition.second ) + result.addTransition ( transition.first.first, sourceStates, renamingData.at ( target ) ); + } + + return result; +} + template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > automaton::DPDA < InputSymbolType, EpsilonType, unsigned, unsigned > Rename::rename ( const automaton::DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & pda ) { unsigned counterState = 0; -- GitLab