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