Skip to content
Snippets Groups Projects
DeterminizeIDPDAPart.cxx 2.23 KiB
Newer Older
Jan Trávníček's avatar
Jan Trávníček committed
/*
 * IDPDADeterminizer.cpp
 *
 *  Created on: 16. 1. 2014
 *	  Author: Jan Vesely
 */

#include "common/NFACommon.h"
#include <automaton/PDA/InputDrivenNPDA.h>
#include <alib/deque>
#include <alib/algorithm>
namespace automaton {
namespace determinize {
automaton::InputDrivenDPDA < > Determinize::determinize ( const automaton::InputDrivenNPDA < > & nfa ) {
Jan Trávníček's avatar
Jan Trávníček committed
	 // 1, 4
	DefaultStateType initialState ( createDFAState ( { nfa.getInitialState ( ) } ) );
	automaton::InputDrivenDPDA < > res ( initialState, nfa.getInitialSymbol ( ) );
Jan Trávníček's avatar
Jan Trávníček committed

	res.setInputAlphabet ( nfa.getInputAlphabet ( ) );
	res.setPushdownStoreAlphabet ( nfa.getPushdownStoreAlphabet ( ) );
Jan Trávníček's avatar
Jan Trávníček committed
	res.setPushdownStoreOperations ( nfa.getPushdownStoreOperations ( ) );

	 // 2
	ext::deque < DefaultStateType > todo;
Jan Trávníček's avatar
Jan Trávníček committed
	todo.push_back ( std::move ( initialState ) );
Jan Trávníček's avatar
Jan Trávníček committed
	do {
Jan Trávníček's avatar
Jan Trávníček committed
		 // 3a, c
		DefaultStateType state = std::move ( todo.front ( ) );
Jan Trávníček's avatar
Jan Trávníček committed
		todo.pop_front ( );

		 // 3b
		for ( const DefaultSymbolType & input : nfa.getInputAlphabet ( ) ) {
			ext::set < DefaultStateType > targetIDPDAStates;
Jan Trávníček's avatar
Jan Trávníček committed

			for ( DefaultStateType nfaState : recreateNFAStates ( state ) ) {
				auto iter = nfa.getTransitions ( ).find ( ext::make_pair ( std::move ( nfaState ), input ) );
Jan Trávníček's avatar
Jan Trávníček committed

				if ( iter != nfa.getTransitions ( ).end ( ) )
					targetIDPDAStates.insert ( iter->second.begin ( ), iter->second.end ( ) );
			DefaultStateType dfaState = createDFAState ( std::move ( targetIDPDAStates ) );
Jan Trávníček's avatar
Jan Trávníček committed
			 // 4
			bool existed = !res.addState ( dfaState );
Jan Trávníček's avatar
Jan Trávníček committed
			if ( !existed ) todo.push_back ( dfaState );
Jan Trávníček's avatar
Jan Trávníček committed
			 // 3b
			res.addTransition ( state, input, std::move ( dfaState ) );
Jan Trávníček's avatar
Jan Trávníček committed
	} while ( !todo.empty ( ) );

	 // 5
	const ext::set<DefaultStateType>& finalLabels = nfa.getFinalStates();
	for ( const DefaultStateType & dfaState : res.getStates ( ) ) {
		const ext::set < DefaultStateType > & nfaStates = recreateNFAStates ( dfaState );
Jan Trávníček's avatar
Jan Trávníček committed

		if(!ext::excludes(finalLabels.begin(), finalLabels.end(), nfaStates.begin(), nfaStates.end()))
Jan Trávníček's avatar
Jan Trávníček committed
			res.addFinalState ( dfaState );
Jan Trávníček's avatar
Jan Trávníček committed
	return res;
}

auto DeterminizeInputDrivenNPDA = registration::AbstractRegister < Determinize, automaton::InputDrivenDPDA < >, const automaton::InputDrivenNPDA < > & > ( Determinize::determinize );
} /* namespace determinize */

} /* namespace automaton */