Skip to content
Snippets Groups Projects
Commit f36e443d authored by Jan Trávníček's avatar Jan Trávníček
Browse files

move e-closure computation to automaton properties

parent c062ea28
No related branches found
No related tags found
No related merge requests found
......@@ -14,6 +14,10 @@
#include <automaton/FSM/NFA.h>
#include <automaton/FSM/DFA.h>
 
#include <set>
#include <map>
#include <queue>
namespace automaton {
 
template<class T>
......@@ -126,5 +130,30 @@ std::set<automaton::State> AutomatonPropertiesFSM::getUnreachableStates( const a
return Qi.at( i );
}
 
std::set<automaton::State> AutomatonPropertiesFSM::epsilonClosure( automaton::EpsilonNFA const& fsm, automaton::State const& q ) {
std::set<automaton::State> closure;
std::queue<automaton::State> queue;
std::map<automaton::State, bool> visited;
for( const auto & p : fsm.getStates( ) )
visited[ p ] = false;
queue.push( q );
while( ! queue.empty( ) )
{
const automaton::State & p = queue.front( );
queue.pop( );
visited[ p ] = true;
closure.insert( p );
for( const auto & transition : fsm.getEpsilonTransitionsFromState( p ) )
for (const auto & to : transition.second )
if( visited [ to ] == false )
queue.push( to );
}
return closure;
}
}
 
......@@ -29,6 +29,11 @@ public:
*/
template<class T>
static std::set<automaton::State> getUnreachableStates( const T & fsm );
/**
* Computes epsilon closure of a state in epsilon nonfree automaton
*/
static std::set<automaton::State> epsilonClosure( const automaton::EpsilonNFA & fsm, const automaton::State & state );
};
 
}
......
/*
* EpsilonNFAEpsilonClosure.cpp
*
* Created on: 16. 1. 2014
* Author: Tomas Pecka
*/
#include "EpsilonNFAEpsilonClosure.h"
namespace epsilon {
std::set<automaton::State> EpsilonClosure::closure( automaton::EpsilonNFA const& fsm, automaton::State const& q ) {
std::set<automaton::State> closure;
std::queue<automaton::State> queue;
std::map<automaton::State, bool> visited;
for( const auto & p : fsm.getStates( ) )
visited[ p ] = false;
queue.push( q );
while( ! queue.empty( ) )
{
const automaton::State & p = queue.front( );
queue.pop( );
visited[ p ] = true;
closure.insert( p );
for( const auto & transition : fsm.getEpsilonTransitionsFromState( p ) )
for (const auto & to : transition.second )
if( visited [ to ] == false )
queue.push( to );
}
return closure;
}
} /* namespace epsilon */
/*
* EpsilonNFAEpsilonClosure.h
*
* Created on: 16. 1. 2014
* Author: Tomas Pecka
*/
#ifndef EPSILON_NFA_EPSILON_CLOSURE_H_
#define EPSILON_NFA_EPSILON_CLOSURE_H_
#include <automaton/FSM/EpsilonNFA.h>
#include <automaton/common/State.h>
#include <exception/AlibException.h>
#include <set>
#include <map>
#include <queue>
namespace epsilon {
class EpsilonClosure {
public:
static std::set<automaton::State> closure( const automaton::EpsilonNFA & fsm, const automaton::State & state );
};
} /* namespace epsilon */
#endif /* EPSILON_NFA_EPSILON_CLOSURE_H_ */
......@@ -7,6 +7,8 @@
 
#include "EpsilonNFAEpsilonRemover.h"
 
#include "../../automaton/AutomatonPropertiesFSM.h"
namespace epsilon {
 
automaton::NFA EpsilonNFAEpsilonRemover::remove( const automaton::EpsilonNFA & origFSM ) {
......@@ -25,7 +27,7 @@ automaton::NFA EpsilonNFAEpsilonRemover::remove( const automaton::EpsilonNFA & o
* Step 1 from Melichar 2.41
*/
for( const auto & from : origFSM.getStates( ) )
for( const auto & fromClosure : EpsilonClosure::closure( origFSM, from ) )
for( const auto & fromClosure : automaton::AutomatonPropertiesFSM::epsilonClosure( origFSM, from ) )
for( const auto & transition : origFSM.getSymbolTransitionsFromState( fromClosure ) )
for( const auto & to : transition.second )
fsm.addTransition( from, transition.first.second, to );
......@@ -37,7 +39,7 @@ automaton::NFA EpsilonNFAEpsilonRemover::remove( const automaton::EpsilonNFA & o
 
for( const auto & q : fsm.getStates( ) )
{
const std::set<automaton::State> & cl = EpsilonClosure::closure( origFSM, q );
const std::set<automaton::State> & cl = automaton::AutomatonPropertiesFSM::epsilonClosure( origFSM, q );
const std::set<automaton::State> & F = origFSM.getFinalStates( );
std::set<automaton::State> intersect;
 
......
......@@ -15,8 +15,6 @@
#include <automaton/FSM/NFA.h>
#include <exception/AlibException.h>
 
#include "EpsilonNFAEpsilonClosure.h"
namespace epsilon {
 
class EpsilonNFAEpsilonRemover {
......
......@@ -135,7 +135,7 @@ automaton::NFA RandomAutomatonFactory::LeslieConnectedNFA( size_t n, const std::
}
 
double mnn100 = 100.0 / alphabet.size( ) / n / n;
while( automaton.getTransitions( ).size( ) * mnn100 < density ) {
while( automaton.transitionsSize( ) * mnn100 < density ) {
int y = rand( ) % n;
int z = rand( ) % n;
int a = rand( ) % alphabet.size();
......
......@@ -118,7 +118,15 @@ bool NFA::isDeterministic() const {
}
 
bool NFA::isTotal() const {
return isDeterministic() && transitions.size() == inputAlphabet.size() * states.size();
return isDeterministic() && transitionsSize() == inputAlphabet.size() * states.size();
}
unsigned NFA::transitionsSize() const {
int res = 0;
for(const auto& transition : transitions ){
res += transition.second.size();
}
return res;
}
 
bool NFA::operator==(const ObjectBase& other) const {
......
......@@ -89,6 +89,8 @@ public:
*/
bool isTotal() const;
 
unsigned transitionsSize() const;
virtual bool operator<(const alib::ObjectBase& other) const;
virtual bool operator==(const alib::ObjectBase& other) const;
virtual bool operator>(const alib::ObjectBase& other) const;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment