diff --git a/alib2algo/src/automaton/generate/RandomizeAutomaton.h b/alib2algo/src/automaton/generate/RandomizeAutomaton.h index d2274c1fc8f0165454f20d2f36f4b2ac349bb361..5ede196ddc40da5d6fda41439a5dcf3926a19d5b 100644 --- a/alib2algo/src/automaton/generate/RandomizeAutomaton.h +++ b/alib2algo/src/automaton/generate/RandomizeAutomaton.h @@ -16,31 +16,13 @@ #include <automaton/FSM/NFA.h> #include <automaton/FSM/DFA.h> -#include <algorithm> -#include <foreach> +#include <common/Permutation.hpp> namespace automaton { namespace generate { class RandomizeAutomaton : public std::SingleDispatch < RandomizeAutomaton, automaton::Automaton, const automaton::AutomatonBase & > { - - template < class T > - static std::map < T, T > permutationMap ( const std::set < T > & data ) { - std::vector < T > dataVector ( data.begin ( ), data.end ( ) ); - - std::shuffle ( dataVector.begin ( ), dataVector.end ( ), std::random_devices::semirandom ); - std::map < T, T > permutation; - for ( const std::tuple < const T &, const T & > & fromToPair : std::make_tuple_foreach ( data, dataVector ) ) { - permutation.insert ( std::make_pair ( std::get < 0 > ( fromToPair ), std::get < 1 > ( fromToPair ) ) ); - } - - if(common::GlobalData::verbose) - std::clog << "permutation map: " << permutation << std::endl; - - return permutation; - } - public: static automaton::Automaton randomize ( const automaton::Automaton & automaton ); @@ -56,7 +38,7 @@ public: template < class SymbolType, class StateType > automaton::DFA < SymbolType, StateType > RandomizeAutomaton::randomize(const automaton::DFA < SymbolType, StateType > & origFSM) { - std::map < StateType, StateType > statePermutationMap = permutationMap ( origFSM.getStates ( ) ); + std::map < StateType, StateType > statePermutationMap = common::Permutation::permutationMap ( origFSM.getStates ( ) ); automaton::DFA < SymbolType, StateType > res ( statePermutationMap.find ( origFSM.getInitialState ( ) )->second ); @@ -74,7 +56,7 @@ automaton::DFA < SymbolType, StateType > RandomizeAutomaton::randomize(const aut template < class SymbolType, class StateType > automaton::MultiInitialStateNFA < SymbolType, StateType > RandomizeAutomaton::randomize(const automaton::MultiInitialStateNFA < SymbolType, StateType > & origFSM) { - std::map < StateType, StateType > statePermutationMap = permutationMap ( origFSM.getStates ( ) ); + std::map < StateType, StateType > statePermutationMap = common::Permutation::permutationMap ( origFSM.getStates ( ) ); automaton::MultiInitialStateNFA < SymbolType, StateType > res; @@ -96,7 +78,7 @@ automaton::MultiInitialStateNFA < SymbolType, StateType > RandomizeAutomaton::ra template < class SymbolType, class StateType > automaton::NFA < SymbolType, StateType > RandomizeAutomaton::randomize(const automaton::NFA < SymbolType, StateType > & origFSM) { - std::map < StateType, StateType > statePermutationMap = permutationMap ( origFSM.getStates ( ) ); + std::map < StateType, StateType > statePermutationMap = common::Permutation::permutationMap ( origFSM.getStates ( ) ); automaton::NFA < SymbolType, StateType > res ( statePermutationMap.find ( origFSM.getInitialState ( ) )->second ); @@ -115,7 +97,7 @@ automaton::NFA < SymbolType, StateType > RandomizeAutomaton::randomize(const aut template < class SymbolType, class EpsilonType, class StateType > automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > RandomizeAutomaton::randomize( const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & origFSM ) { - std::map < StateType, StateType > statePermutationMap = permutationMap ( origFSM.getStates ( ) ); + std::map < StateType, StateType > statePermutationMap = common::Permutation::permutationMap ( origFSM.getStates ( ) ); automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > res ( statePermutationMap.find ( origFSM.getInitialState ( ) )->second ); diff --git a/alib2algo/src/common/Permutation.hpp b/alib2algo/src/common/Permutation.hpp new file mode 100644 index 0000000000000000000000000000000000000000..ab4b2786679d3738e252231a65b926be288618ed --- /dev/null +++ b/alib2algo/src/common/Permutation.hpp @@ -0,0 +1,43 @@ +/* + * Permutation.h + * + * Created on: 10. 2. 2017 + * Author: Jan Travnicek + */ + +#ifndef PERMUTATION_H_ +#define PERMUTATION_H_ + +#include <set> +#include <vector> +#include <map> +#include <random> +#include <algorithm> +#include <foreach> + +#include <global/GlobalData.h> + +namespace common { + +class Permutation { +public: + template < class T > + static std::map < T, T > permutationMap ( const std::set < T > & data ) { + std::vector < T > dataVector ( data.begin ( ), data.end ( ) ); + + std::shuffle ( dataVector.begin ( ), dataVector.end ( ), std::random_devices::semirandom ); + std::map < T, T > permutation; + for ( const std::tuple < const T &, const T & > & fromToPair : std::make_tuple_foreach ( data, dataVector ) ) { + permutation.insert ( std::make_pair ( std::get < 0 > ( fromToPair ), std::get < 1 > ( fromToPair ) ) ); + } + + if(common::GlobalData::verbose) + std::clog << "permutation map: " << permutation << std::endl; + + return permutation; + } +}; + +} /* namespace common */ + +#endif /* PERMUTATION_H_ */ diff --git a/alib2algo/src/grammar/generate/RandomizeGrammar.h b/alib2algo/src/grammar/generate/RandomizeGrammar.h index e02737598af7f5021c78aff570bbf4baabbfcc5f..e1c1818ca5e3f4abfef89affeddbedc9d2c81d81 100644 --- a/alib2algo/src/grammar/generate/RandomizeGrammar.h +++ b/alib2algo/src/grammar/generate/RandomizeGrammar.h @@ -13,31 +13,13 @@ #include <grammar/Grammar.h> #include <grammar/Regular/LeftRG.h> -#include <algorithm> -#include <foreach> +#include <common/Permutation.hpp> namespace grammar { namespace generate { class RandomizeGrammar : public std::SingleDispatch < RandomizeGrammar, grammar::Grammar, const grammar::GrammarBase & > { - - template < class T > - static std::map < T, T > permutationMap ( const std::set < T > & data ) { - std::vector < T > dataVector ( data.begin ( ), data.end ( ) ); - - std::shuffle ( dataVector.begin ( ), dataVector.end ( ), std::random_devices::semirandom ); - std::map < T, T > permutation; - for ( const std::tuple < const T &, const T & > & fromToPair : std::make_tuple_foreach ( data, dataVector ) ) { - permutation.insert ( std::make_pair ( std::get < 0 > ( fromToPair ), std::get < 1 > ( fromToPair ) ) ); - } - - if(common::GlobalData::verbose) - std::clog << "permutation map: " << permutation << std::endl; - - return permutation; - } - public: static grammar::Grammar randomize ( const grammar::Grammar & grammar ); @@ -47,7 +29,7 @@ public: template < class SymbolType > grammar::LeftRG < SymbolType > RandomizeGrammar::randomize(const grammar::LeftRG < SymbolType > & gram ) { - std::map < SymbolType, SymbolType > symbolPermutationMap = permutationMap ( gram.getNonterminalAlphabet ( ) ); + std::map < SymbolType, SymbolType > symbolPermutationMap = common::Permutation::permutationMap ( gram.getNonterminalAlphabet ( ) ); grammar::LeftRG < SymbolType > res ( symbolPermutationMap.find ( gram.getInitialSymbol ( ) )->second );