From 5e8f9023bf7b7994025ec8e1a0f9847832fcaac6 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Tue, 23 Sep 2014 10:57:45 +0200 Subject: [PATCH] attempt to speedup epsilon closure --- alib2algo/src/automaton/EpsilonClosure.cpp | 12 ++++++------ alib2algo/src/epsilon/fsm/FSMEpsilonRemover.cpp | 7 ++++--- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/alib2algo/src/automaton/EpsilonClosure.cpp b/alib2algo/src/automaton/EpsilonClosure.cpp index 993dbf0256..318bcf5a39 100644 --- a/alib2algo/src/automaton/EpsilonClosure.cpp +++ b/alib2algo/src/automaton/EpsilonClosure.cpp @@ -124,7 +124,7 @@ std::set<automaton::State> EpsilonClosure::epsilonClosure( const automaton::Comp std::set<automaton::State> EpsilonClosure::epsilonClosure(const Automaton& automaton, const automaton::State& q) { std::pair<automaton::State, std::set<automaton::State>> out = std::make_pair(q, std::set<automaton::State> {}); automaton.getData().Accept((void*) &out, EpsilonClosure::EPSILON_CLOSURE); - return out.second; + return std::move(out.second); } void EpsilonClosure::Visit(void*, const UnknownAutomaton&) const { @@ -133,27 +133,27 @@ void EpsilonClosure::Visit(void*, const UnknownAutomaton&) const { void EpsilonClosure::Visit(void* data, const EpsilonNFA& automaton) const { std::pair<automaton::State, std::set<automaton::State>> & out = *((std::pair<automaton::State, std::set<automaton::State>>*) data); - out.second = this->epsilonClosure(automaton, out.first); + out.second = std::move(this->epsilonClosure(automaton, out.first)); } void EpsilonClosure::Visit(void* data, const NFA& automaton) const { std::pair<automaton::State, std::set<automaton::State>> & out = *((std::pair<automaton::State, std::set<automaton::State>>*) data); - out.second = this->epsilonClosure(automaton, out.first); + out.second = std::move(this->epsilonClosure(automaton, out.first)); } void EpsilonClosure::Visit(void* data, const DFA& automaton) const { std::pair<automaton::State, std::set<automaton::State>> & out = *((std::pair<automaton::State, std::set<automaton::State>>*) data); - out.second = this->epsilonClosure(automaton, out.first); + out.second = std::move(this->epsilonClosure(automaton, out.first)); } void EpsilonClosure::Visit(void* data, const ExtendedNFA& automaton) const { std::pair<automaton::State, std::set<automaton::State>> & out = *((std::pair<automaton::State, std::set<automaton::State>>*) data); - out.second = this->epsilonClosure(automaton, out.first); + out.second = std::move(this->epsilonClosure(automaton, out.first)); } void EpsilonClosure::Visit(void* data, const CompactNFA& automaton) const { std::pair<automaton::State, std::set<automaton::State>> & out = *((std::pair<automaton::State, std::set<automaton::State>>*) data); - out.second = this->epsilonClosure(automaton, out.first); + out.second = std::move(this->epsilonClosure(automaton, out.first)); } void EpsilonClosure::Visit(void*, const DPDA&) const { diff --git a/alib2algo/src/epsilon/fsm/FSMEpsilonRemover.cpp b/alib2algo/src/epsilon/fsm/FSMEpsilonRemover.cpp index 5935e37174..158c7b2d79 100644 --- a/alib2algo/src/epsilon/fsm/FSMEpsilonRemover.cpp +++ b/alib2algo/src/epsilon/fsm/FSMEpsilonRemover.cpp @@ -38,9 +38,10 @@ automaton::NFA FSMEpsilonRemover::remove( const automaton::EpsilonNFA & origFSM */ for( const auto & from : origFSM.getStates( ) ) for( const auto & fromClosure : automaton::EpsilonClosure::epsilonClosure( origFSM, from ) ) - for( const auto & transition : origFSM.getSymbolTransitionsFromState( fromClosure ) ) - for( const auto & to : transition.second ) - fsm.addTransition( from, transition.first.second, to ); + for( const auto & transition : origFSM.getTransitions( ) ) + if (transition.first.first == fromClosure && transition.first.second.is<alphabet::Symbol>()) + for( const auto & to : transition.second ) + fsm.addTransition( from, transition.first.second.get<alphabet::Symbol>(), to ); /** * Step 2 from Melichar 2.41 -- GitLab