From 85a06d5158895d31eaad9f5d10d5cc18dfcc9ee9 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <jan.travnicek@.fit.cvut.cz> Date: Fri, 4 Oct 2019 13:12:04 +0200 Subject: [PATCH] allow NFA to be minimized by equivalence classes --- .../simplify/MinimizeByPartitioning.cpp | 6 ++++ .../simplify/MinimizeByPartitioning.h | 31 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/alib2algo/src/automaton/simplify/MinimizeByPartitioning.cpp b/alib2algo/src/automaton/simplify/MinimizeByPartitioning.cpp index 414f20ed4d..82a2b39975 100644 --- a/alib2algo/src/automaton/simplify/MinimizeByPartitioning.cpp +++ b/alib2algo/src/automaton/simplify/MinimizeByPartitioning.cpp @@ -16,6 +16,12 @@ auto MinimizeDistinguishableStatesDFA = registration::AbstractRegister < automat @param dfa finite automaton to minimize.\n\ @return Minimal deterministic finite automaton equivalent to @p dfa" ); +auto MinimizeDistinguishableStatesNFA = registration::AbstractRegister < automaton::simplify::MinimizeByPartitioning, automaton::NFA < DefaultSymbolType, ext::set < DefaultStateType > >, const automaton::NFA < > &, const ext::set < ext::set < DefaultStateType > > & > ( automaton::simplify::MinimizeByPartitioning::minimize, "nfa" ).setDocumentation ( +"Minimizes the given automaton using Distinguishable states method.\n\ +\n\ +@param nfa finite automaton to minimize.\n\ +@return Minimal deterministic finite automaton equivalent to @p nfa" ); + auto MinimizeDistinguishableStatesDFTA = registration::AbstractRegister < automaton::simplify::MinimizeByPartitioning, automaton::DFTA < DefaultSymbolType, ext::set < DefaultStateType > >, const automaton::DFTA < > &, const ext::set < ext::set < DefaultStateType > > & > ( automaton::simplify::MinimizeByPartitioning::minimize, "dfta" ).setDocumentation ( "Minimizes the given automaton using Distinguishable states method.\n\ \n\ diff --git a/alib2algo/src/automaton/simplify/MinimizeByPartitioning.h b/alib2algo/src/automaton/simplify/MinimizeByPartitioning.h index b7c0f8f553..839e8f4626 100644 --- a/alib2algo/src/automaton/simplify/MinimizeByPartitioning.h +++ b/alib2algo/src/automaton/simplify/MinimizeByPartitioning.h @@ -28,6 +28,7 @@ #include <alib/map> #include <automaton/FSM/DFA.h> +#include <automaton/FSM/NFA.h> #include <automaton/TA/DFTA.h> #include <automaton/TA/NFTA.h> @@ -43,6 +44,20 @@ namespace simplify { */ class MinimizeByPartitioning { public: + /** + * Aggregates the given automaton with respect to a state partitioning. + * + * @tparam SymbolType Type for input symbols. + * @tparam StateType Type for states. + * + * @param nfa deterministic finite automaton to minimize. + * @param partitions state partitioning + * + * @return Minimal deterministic finite automaton equivalent to @p nfa + */ + template < class SymbolType, class StateType > + static automaton::NFA < SymbolType, ext::set < StateType > > minimize ( const automaton::NFA < SymbolType, StateType > & nfa, const ext::set < ext::set < StateType > > & partitions ); + /** * Aggregates the given automaton with respect to a state partitioning. * @@ -112,6 +127,22 @@ ext::map < StateType, ext::set < StateType > > MinimizeByPartitioning::partition return res; } +template < class SymbolType, class StateType > +automaton::NFA < SymbolType, ext::set < StateType > > MinimizeByPartitioning::minimize ( const automaton::NFA < SymbolType, StateType > & nfa, const ext::set < ext::set < StateType > > & partitions ) { + const ext::map < StateType, ext::set < StateType > > statePartitionMap = partitionMap ( partitions ); + + automaton::NFA < SymbolType, ext::set < StateType > > res ( statePartitionMap.at ( nfa.getInitialState ( ) ) ); + res.setStates ( partitions ); + res.addInputSymbols ( nfa.getInputAlphabet ( ) ); + for ( const StateType & state : nfa.getFinalStates ( ) ) + res.addFinalState ( statePartitionMap.at ( state ) ); + + for ( const auto & transition : nfa.getTransitions ( ) ) + res.addTransition ( statePartitionMap.at ( transition.first.first ), transition.first.second, statePartitionMap.at ( transition.second ) ); + + return res; +} + template < class SymbolType, class StateType > automaton::DFA < SymbolType, ext::set < StateType > > MinimizeByPartitioning::minimize ( const automaton::DFA < SymbolType, StateType > & dfa, const ext::set < ext::set < StateType > > & partitions ) { const ext::map < StateType, ext::set < StateType > > statePartitionMap = partitionMap ( partitions ); -- GitLab