From 1a4de925c48aace75ff364fbc85dc7d8ffac5924 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Tr=C3=A1vn=C3=AD=C4=8Dek?= <jan.travnicek@fit.cvut.cz>
Date: Fri, 18 Mar 2022 23:20:28 +0100
Subject: [PATCH] algo: reduce registrations in determinization

---
 .../src/automaton/determinize/Determinize.cpp | 24 ++++++++++++++
 .../determinize/DeterminizeIDPDAPart.cpp      | 19 -----------
 .../determinize/DeterminizeNFAPart.cpp        | 19 -----------
 .../determinize/DeterminizeNFTAPart.cpp       | 26 ---------------
 .../determinize/DeterminizeRHDPDAPart.cpp     | 33 -------------------
 .../automaton/determinize/DeterminizeTM.cpp   | 25 --------------
 .../determinize/DeterminizeVPAPart.cpp        | 19 -----------
 .../determinize/DeterminizeZAutomataPart.cpp  | 12 -------
 8 files changed, 24 insertions(+), 153 deletions(-)
 create mode 100644 alib2algo/src/automaton/determinize/Determinize.cpp
 delete mode 100644 alib2algo/src/automaton/determinize/DeterminizeTM.cpp

diff --git a/alib2algo/src/automaton/determinize/Determinize.cpp b/alib2algo/src/automaton/determinize/Determinize.cpp
new file mode 100644
index 0000000000..7f101f1e43
--- /dev/null
+++ b/alib2algo/src/automaton/determinize/Determinize.cpp
@@ -0,0 +1,24 @@
+#include "Determinize.h"
+#include <registration/AlgoRegistration.hpp>
+
+namespace {
+
+using deterministicAutomata = ext::variant <
+	automaton::DFA < >,
+	automaton::DFTA < >,
+	automaton::UnorderedDFTA < >,
+	automaton::InputDrivenDPDA < >,
+	automaton::VisiblyPushdownDPDA < >,
+	automaton::RealTimeHeightDeterministicDPDA < >,
+	automaton::SinglePopDPDA < >,
+	automaton::DPDA < >,
+	automaton::OneTapeDTM < >
+>;
+
+auto DeterminizeDeterministicAutomata = registration::AbstractRegister < automaton::determinize::Determinize, deterministicAutomata, const deterministicAutomata & > ( [ ] ( const auto & param ) { return param; }, "automaton" ).setDocumentation (
+"No-op determinisation of automata that are already deterministic.\n\
+\n\
+@param automaton a deterministic automaton\n\
+@return the parameter unchanged" );
+
+} /* namespace */
diff --git a/alib2algo/src/automaton/determinize/DeterminizeIDPDAPart.cpp b/alib2algo/src/automaton/determinize/DeterminizeIDPDAPart.cpp
index fc5dc23ca4..fca55b8402 100644
--- a/alib2algo/src/automaton/determinize/DeterminizeIDPDAPart.cpp
+++ b/alib2algo/src/automaton/determinize/DeterminizeIDPDAPart.cpp
@@ -1,27 +1,8 @@
 #include "Determinize.h"
-#include <automaton/FSM/DFA.h>
-#include <automaton/FSM/MultiInitialStateNFA.h>
-#include <automaton/PDA/DPDA.h>
-#include <automaton/PDA/NPDA.h>
-#include <automaton/PDA/InputDrivenDPDA.h>
-#include <automaton/PDA/InputDrivenNPDA.h>
-#include <automaton/PDA/SinglePopDPDA.h>
-#include <automaton/PDA/VisiblyPushdownDPDA.h>
-#include <automaton/TM/OneTapeDTM.h>
-#include <automaton/TA/DFTA.h>
-#include <automaton/TA/UnorderedDFTA.h>
-#include <automaton/PDA/RealTimeHeightDeterministicNPDA.h>
 #include <registration/AlgoRegistration.hpp>
 
 namespace {
 
-auto DeterminizeInputDrivenDPDA = registration::AbstractRegister < automaton::determinize::Determinize, automaton::InputDrivenDPDA < >, const automaton::InputDrivenDPDA < > & > ( automaton::determinize::Determinize::determinize, "dpda" ).setDocumentation (
-"Determinization of deterministic input-driven pushdown automata.\n\
-Implemented as a no-op.\n\
-\n\
-@param dpda deterministic input-driven pushdown automaton\n\
-@return deterministic input-driven pushdown automaton equivalent to @p dpda" );
-
 auto DeterminizeInputDrivenNPDA = registration::AbstractRegister < automaton::determinize::Determinize, automaton::InputDrivenDPDA < DefaultSymbolType, DefaultSymbolType, ext::set < DefaultStateType > >, const automaton::InputDrivenNPDA < > & > ( automaton::determinize::Determinize::determinize, "npda" ).setDocumentation (
 "Implementation of determinization for input-driven pushdown automata.\n\
 \n\
diff --git a/alib2algo/src/automaton/determinize/DeterminizeNFAPart.cpp b/alib2algo/src/automaton/determinize/DeterminizeNFAPart.cpp
index fd03ac53fc..193b884331 100644
--- a/alib2algo/src/automaton/determinize/DeterminizeNFAPart.cpp
+++ b/alib2algo/src/automaton/determinize/DeterminizeNFAPart.cpp
@@ -1,27 +1,8 @@
 #include "Determinize.h"
-#include <automaton/FSM/DFA.h>
-#include <automaton/FSM/MultiInitialStateNFA.h>
-#include <automaton/PDA/DPDA.h>
-#include <automaton/PDA/NPDA.h>
-#include <automaton/PDA/InputDrivenDPDA.h>
-#include <automaton/PDA/InputDrivenNPDA.h>
-#include <automaton/PDA/SinglePopDPDA.h>
-#include <automaton/PDA/VisiblyPushdownDPDA.h>
-#include <automaton/TM/OneTapeDTM.h>
-#include <automaton/TA/DFTA.h>
-#include <automaton/TA/UnorderedDFTA.h>
-#include <automaton/PDA/RealTimeHeightDeterministicNPDA.h>
 #include <registration/AlgoRegistration.hpp>
 
 namespace {
 
-auto DeterminizeDFA = registration::AbstractRegister < automaton::determinize::Determinize, automaton::DFA < >, const automaton::DFA < > & > ( automaton::determinize::Determinize::determinize, "dfa" ).setDocumentation (
-"Determinization of deterministic finite automata.\n\
-Implemented as a no-op.\n\
-\n\
-@param dfa deterministic finite automaton\n\
-@return deterministic finite automaton equivalent to @p dfa" );
-
 auto DeterminizeNFA = registration::AbstractRegister < automaton::determinize::Determinize, automaton::DFA < DefaultSymbolType, ext::set < DefaultStateType > >, const automaton::NFA < > & > ( automaton::determinize::Determinize::determinize, "nfa" ).setDocumentation (
 "Implementation of subset determinization for nondeterministic finite automata.\n\
 \n\
diff --git a/alib2algo/src/automaton/determinize/DeterminizeNFTAPart.cpp b/alib2algo/src/automaton/determinize/DeterminizeNFTAPart.cpp
index 7e17b67152..f9798cebfe 100644
--- a/alib2algo/src/automaton/determinize/DeterminizeNFTAPart.cpp
+++ b/alib2algo/src/automaton/determinize/DeterminizeNFTAPart.cpp
@@ -1,40 +1,14 @@
 #include "Determinize.h"
-#include <automaton/FSM/DFA.h>
-#include <automaton/FSM/MultiInitialStateNFA.h>
-#include <automaton/PDA/DPDA.h>
-#include <automaton/PDA/NPDA.h>
-#include <automaton/PDA/InputDrivenDPDA.h>
-#include <automaton/PDA/InputDrivenNPDA.h>
-#include <automaton/PDA/SinglePopDPDA.h>
-#include <automaton/PDA/VisiblyPushdownDPDA.h>
-#include <automaton/TM/OneTapeDTM.h>
-#include <automaton/TA/DFTA.h>
-#include <automaton/TA/UnorderedDFTA.h>
-#include <automaton/PDA/RealTimeHeightDeterministicNPDA.h>
 #include <registration/AlgoRegistration.hpp>
 
 namespace {
 
-auto DeterminizeUnorderedDFTA = registration::AbstractRegister < automaton::determinize::Determinize, automaton::UnorderedDFTA < >, const automaton::UnorderedDFTA < > & > ( automaton::determinize::Determinize::determinize, "dfta" ).setDocumentation (
-"Determinization of deterministic finite tree automata.\n\
-Implemented as a no-op.\n\
-\n\
-@param dfta deterministic finite tree automaton\n\
-@return deterministic finite tree automaton equivalent to @p dfta" );
-
 auto DeterminizeUnorderedNFTA = registration::AbstractRegister < automaton::determinize::Determinize, automaton::UnorderedDFTA < DefaultSymbolType, ext::set < DefaultSymbolType > >, const automaton::UnorderedNFTA < > & > ( automaton::determinize::Determinize::determinize, "nfta" ).setDocumentation (
 "Implementation of subset determinization for nondeterministic finite tree automata.\n\
 \n\
 @param nfta nondeterministic finite tree automaton\n\
 @return deterministic finite tree automaton equivalent to @p nfta" );
 
-auto DeterminizeDFTA = registration::AbstractRegister < automaton::determinize::Determinize, automaton::DFTA < >, const automaton::DFTA < > & > ( automaton::determinize::Determinize::determinize, "dfta" ).setDocumentation (
-"Determinization of deterministic finite tree automata.\n\
-Implemented as a no-op.\n\
-\n\
-@param dfta deterministic finite tree automaton\n\
-@return deterministic finite tree automaton equivalent to @p dfta" );
-
 auto DeterminizeNFTA = registration::AbstractRegister < automaton::determinize::Determinize, automaton::DFTA < DefaultSymbolType, ext::set < DefaultSymbolType > >, const automaton::NFTA < > & > ( automaton::determinize::Determinize::determinize, "nfta" ).setDocumentation (
 "Implementation of subset determinization for nondeterministic finite tree automata.\n\
 \n\
diff --git a/alib2algo/src/automaton/determinize/DeterminizeRHDPDAPart.cpp b/alib2algo/src/automaton/determinize/DeterminizeRHDPDAPart.cpp
index 121edc5501..cd01f91f97 100644
--- a/alib2algo/src/automaton/determinize/DeterminizeRHDPDAPart.cpp
+++ b/alib2algo/src/automaton/determinize/DeterminizeRHDPDAPart.cpp
@@ -1,47 +1,14 @@
 #include "Determinize.h"
-#include <automaton/FSM/DFA.h>
-#include <automaton/FSM/MultiInitialStateNFA.h>
-#include <automaton/PDA/DPDA.h>
-#include <automaton/PDA/NPDA.h>
-#include <automaton/PDA/InputDrivenDPDA.h>
-#include <automaton/PDA/InputDrivenNPDA.h>
-#include <automaton/PDA/SinglePopDPDA.h>
-#include <automaton/PDA/VisiblyPushdownDPDA.h>
-#include <automaton/TM/OneTapeDTM.h>
-#include <automaton/TA/DFTA.h>
-#include <automaton/TA/UnorderedDFTA.h>
-#include <automaton/PDA/RealTimeHeightDeterministicNPDA.h>
 #include <registration/AlgoRegistration.hpp>
 
 namespace {
 
-auto DeterminizeRealTimeHeightDeterministicDPDA = registration::AbstractRegister < automaton::determinize::Determinize, automaton::RealTimeHeightDeterministicDPDA < >, const automaton::RealTimeHeightDeterministicDPDA < > & > ( automaton::determinize::Determinize::determinize, "dpda" ).setDocumentation (
-"Determinization of deterministic real-time height-deterministic pushdown automata.\n\
-Implemented as a no-op.\n\
-\n\
-@param dpda deterministic real-time height-deterministic pushdown automaton\n\
-@return deterministic pushdown automaton equivalent to @p dpda" );
-
 auto DeterminizeRealTimeHeightDeterministicNPDA = registration::AbstractRegister < automaton::determinize::Determinize, automaton::RealTimeHeightDeterministicDPDA < DefaultSymbolType, ext::pair < ext::set < ext::pair < DefaultStateType, DefaultStateType > >, common::symbol_or_epsilon < DefaultSymbolType > >, ext::set < ext::pair < DefaultStateType, DefaultStateType > > >, const automaton::RealTimeHeightDeterministicNPDA < > & > ( automaton::determinize::Determinize::determinize, "npda" ).setDocumentation (
 "Determinization of nondeterministic real-time height-deterministic pushdown automata.\n\
 \n\
 @param npda nondeterministic real-time height-deterministic pushdown automaton\n\
 @return deterministic pushdown automaton equivalent to @p npda" );
 
-auto DeterminizeSinglePopDPDA = registration::AbstractRegister < automaton::determinize::Determinize, automaton::SinglePopDPDA < >, const automaton::SinglePopDPDA < > & > ( automaton::determinize::Determinize::determinize, "dpda" ).setDocumentation (
-"Determinization of deterministic single pop pushdown automata.\n\
-Implemented as a no-op.\n\
-\n\
-@param dpda nondeterministic finite automaton with multiple initial states\n\
-@return deterministic single pop deterministic pushdown automaton equivalent do @p dpda" );
-
-auto DeterminizeDPDA = registration::AbstractRegister < automaton::determinize::Determinize, automaton::DPDA < >, const automaton::DPDA < > & > ( automaton::determinize::Determinize::determinize, "dpda" ).setDocumentation (
-"Determinization of deterministic pushdown automata.\n\
-Implemented as a no-op.\n\
-\n\
-@param dpda deterministic pushdown automaton\n\
-@return deterministic pushdown automaton equivalent to @p dpda" );
-
 auto DeterminizeNPDA = registration::AbstractRegister < automaton::determinize::Determinize, automaton::RealTimeHeightDeterministicDPDA < DefaultSymbolType, ext::pair < ext::set < ext::pair < ext::variant < DefaultStateType, std::string >, ext::variant < DefaultStateType, std::string > > >, common::symbol_or_epsilon < DefaultSymbolType > >, ext::set < ext::pair < ext::variant < DefaultStateType, std::string >, ext::variant < DefaultStateType, std::string > > > >, const automaton::NPDA < > & > ( automaton::determinize::Determinize::determinize, "npda" ).setDocumentation (
 "Determinization of nondeterministic pushdown automata is implemented as a cast of such automaton to RhPDA.\n\
 \n\
diff --git a/alib2algo/src/automaton/determinize/DeterminizeTM.cpp b/alib2algo/src/automaton/determinize/DeterminizeTM.cpp
deleted file mode 100644
index 61fd20f61c..0000000000
--- a/alib2algo/src/automaton/determinize/DeterminizeTM.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-#include "Determinize.h"
-#include <automaton/FSM/DFA.h>
-#include <automaton/FSM/MultiInitialStateNFA.h>
-#include <automaton/PDA/DPDA.h>
-#include <automaton/PDA/NPDA.h>
-#include <automaton/PDA/InputDrivenDPDA.h>
-#include <automaton/PDA/InputDrivenNPDA.h>
-#include <automaton/PDA/SinglePopDPDA.h>
-#include <automaton/PDA/VisiblyPushdownDPDA.h>
-#include <automaton/TM/OneTapeDTM.h>
-#include <automaton/TA/DFTA.h>
-#include <automaton/TA/UnorderedDFTA.h>
-#include <automaton/PDA/RealTimeHeightDeterministicNPDA.h>
-#include <registration/AlgoRegistration.hpp>
-
-namespace {
-
-auto DeterminizeOneTapeDTM = registration::AbstractRegister < automaton::determinize::Determinize, automaton::OneTapeDTM < >, const automaton::OneTapeDTM < > & > ( automaton::determinize::Determinize::determinize, "dtm" ).setDocumentation (
-"Determinization of deterministic pushdown automata.\n\
-Implemented as a no-op.\n\
-\n\
-@param dtm deterministic one-tape turing machine\n\
-@return deterministic one-tape turing machine equivalent to @p dtm" );
-
-} /* namespace */
diff --git a/alib2algo/src/automaton/determinize/DeterminizeVPAPart.cpp b/alib2algo/src/automaton/determinize/DeterminizeVPAPart.cpp
index 7281736234..f766e02977 100644
--- a/alib2algo/src/automaton/determinize/DeterminizeVPAPart.cpp
+++ b/alib2algo/src/automaton/determinize/DeterminizeVPAPart.cpp
@@ -1,27 +1,8 @@
 #include "Determinize.h"
-#include <automaton/FSM/DFA.h>
-#include <automaton/FSM/MultiInitialStateNFA.h>
-#include <automaton/PDA/DPDA.h>
-#include <automaton/PDA/NPDA.h>
-#include <automaton/PDA/InputDrivenDPDA.h>
-#include <automaton/PDA/InputDrivenNPDA.h>
-#include <automaton/PDA/SinglePopDPDA.h>
-#include <automaton/PDA/VisiblyPushdownDPDA.h>
-#include <automaton/TM/OneTapeDTM.h>
-#include <automaton/TA/DFTA.h>
-#include <automaton/TA/UnorderedDFTA.h>
-#include <automaton/PDA/RealTimeHeightDeterministicNPDA.h>
 #include <registration/AlgoRegistration.hpp>
 
 namespace {
 
-auto DeterminizeVisiblyPushdownDPDA = registration::AbstractRegister < automaton::determinize::Determinize, automaton::VisiblyPushdownDPDA < >, const automaton::VisiblyPushdownDPDA < > & > ( automaton::determinize::Determinize::determinize, "dpda" ).setDocumentation (
-"Determinization of deterministic visibly pushdown automata.\n\
-Implemented as a no-op.\n\
-\n\
-@param dpda deterministic visibly pushdown automaton\n\
-@return deterministic pushdown automaton equivalent to @p dpda" );
-
 auto DeterminizeVisiblyPushdownNPDA = registration::AbstractRegister < automaton::determinize::Determinize, automaton::VisiblyPushdownDPDA < DefaultSymbolType, ext::pair < ext::set < ext::pair < DefaultStateType, DefaultStateType > >, DefaultSymbolType >, ext::set < ext::pair < DefaultStateType, DefaultStateType > > >, const automaton::VisiblyPushdownNPDA < > & > ( automaton::determinize::Determinize::determinize, "npda" ).setDocumentation (
 "Determinization of nondeterministic visibly pushdown automata.\n\
 \n\
diff --git a/alib2algo/src/automaton/determinize/DeterminizeZAutomataPart.cpp b/alib2algo/src/automaton/determinize/DeterminizeZAutomataPart.cpp
index 262164e05b..33c7d7a58d 100644
--- a/alib2algo/src/automaton/determinize/DeterminizeZAutomataPart.cpp
+++ b/alib2algo/src/automaton/determinize/DeterminizeZAutomataPart.cpp
@@ -1,16 +1,4 @@
 #include "Determinize.h"
-#include <automaton/FSM/DFA.h>
-#include <automaton/FSM/MultiInitialStateNFA.h>
-#include <automaton/PDA/DPDA.h>
-#include <automaton/PDA/NPDA.h>
-#include <automaton/PDA/InputDrivenDPDA.h>
-#include <automaton/PDA/InputDrivenNPDA.h>
-#include <automaton/PDA/SinglePopDPDA.h>
-#include <automaton/PDA/VisiblyPushdownDPDA.h>
-#include <automaton/TM/OneTapeDTM.h>
-#include <automaton/TA/DFTA.h>
-#include <automaton/TA/UnorderedDFTA.h>
-#include <automaton/PDA/RealTimeHeightDeterministicNPDA.h>
 #include <registration/AlgoRegistration.hpp>
 
 namespace {
-- 
GitLab