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