diff --git a/alib2algo/src/grammar/generate/RandomGrammarFactory.cpp b/alib2algo/src/grammar/generate/RandomGrammarFactory.cpp index 2e1044150ba63e9d576141f3e8ca5f27b51007ff..0ad08e2b20d8def7e2ce9be64ead3d2a23e1d749 100644 --- a/alib2algo/src/grammar/generate/RandomGrammarFactory.cpp +++ b/alib2algo/src/grammar/generate/RandomGrammarFactory.cpp @@ -12,7 +12,13 @@ namespace grammar { namespace generate { -auto GenerateCFG1 = registration::AbstractRegister < RandomGrammarFactory, grammar::CFG < >, ext::set < DefaultSymbolType >, ext::set < DefaultSymbolType >, double > ( RandomGrammarFactory::generateCFG, abstraction::AlgorithmCategories::AlgorithmCategory::DEFAULT, "nonterminals", "terminals", "density" ); +auto GenerateCFG1 = registration::AbstractRegister < RandomGrammarFactory, grammar::CFG < >, ext::set < DefaultSymbolType >, ext::set < DefaultSymbolType >, double > ( RandomGrammarFactory::generateCFG, abstraction::AlgorithmCategories::AlgorithmCategory::DEFAULT, "nonterminals", "terminals", "density" ).setDocumentation ( +"Generates a random context free grammar.\n\ +\n\ +@param nonterminals the nonterminals in the generated grammar\n\ +@param terminals the terminals in the generated grammar\n\ +@param density density of the rule set of the generated grammar\n\ +@return random context free grammar" ); grammar::CFG < std::string, std::string > RandomGrammarFactory::generateCFG ( size_t nonterminalsCount, size_t terminalsCount, bool randomizedAlphabet, double density ) { if(terminalsCount > 26) @@ -42,7 +48,15 @@ grammar::CFG < std::string, std::string > RandomGrammarFactory::generateCFG ( si return RandomGrammarFactory::randomCFG ( nonterminals, terminals, density ); } -auto GenerateCFG2 = registration::AbstractRegister < RandomGrammarFactory, grammar::CFG < std::string, std::string >, size_t, size_t, bool, double> ( RandomGrammarFactory::generateCFG, abstraction::AlgorithmCategories::AlgorithmCategory::DEFAULT, "nonterminalsCount", "terminalsCount", "randomizedAlphabet", "density" ); +auto GenerateCFG2 = registration::AbstractRegister < RandomGrammarFactory, grammar::CFG < std::string, std::string >, size_t, size_t, bool, double> ( RandomGrammarFactory::generateCFG, abstraction::AlgorithmCategories::AlgorithmCategory::DEFAULT, "nonterminalsCount", "terminalsCount", "randomizedAlphabet", "density" ).setDocumentation ( +"Generates a random context free grammar.\n\ +\n\ +@param nonterminalsCount number of nonterminals in the generated grammar\n\ +@param terminalsSize the number of terminals used in the generated grammar\n\ +@param randomizedAlphabet selects random symbols from a-z range for terminal and A-Z for nonterminal alphabet if true\n\ +@param density density of the rule set of the generated grammar\n\ +@return random context free grammar" ); + } /* namespace generate */ diff --git a/alib2algo/src/grammar/generate/RandomGrammarFactory.h b/alib2algo/src/grammar/generate/RandomGrammarFactory.h index cc5f3e457862f0ea4ecd2526b5aecebdbed2d397..0c965ea7a48647baf440ac0302b9c78dd4b57a29 100644 --- a/alib2algo/src/grammar/generate/RandomGrammarFactory.h +++ b/alib2algo/src/grammar/generate/RandomGrammarFactory.h @@ -24,8 +24,34 @@ namespace generate { class RandomGrammarFactory { public: + /** + * Generates a random context free grammar. + * + * \tparam TerminalSymbolType the type of terminal symbols of the random grammar + * \tparam NonterminalSymbolType the type of nonterminal symbols of the random grammar + * + * \param nonterminals the nonterminals in the generated grammar + * \param terminals the terminals in the generated grammar + * \param density density of the rule set of the generated grammar + * + * \return random context free grammar + */ template < class TerminalSymbolType, class NonterminalSymbolType > static grammar::CFG < TerminalSymbolType, NonterminalSymbolType > generateCFG ( ext::set < NonterminalSymbolType > nonterminals, ext::set < TerminalSymbolType > terminals, double density ); + + /** + * Generates a random context free grammar. + * + * \tparam TerminalSymbolType the type of terminal symbols of the random grammar + * \tparam NonterminalSymbolType the type of nonterminal symbols of the random grammar + * + * \param nonterminalsCount number of nonterminals in the generated grammar + * \param terminalsSize the number of terminals used in the generated grammar + * \param randomizedAlphabet selects random symbols from a-z range for terminal and A-Z for nonterminal alphabet if true + * \param density density of the rule set of the generated grammar + * + * \return random context free grammar + */ static grammar::CFG < std::string, std::string > generateCFG( size_t nonterminalsCount, size_t terminalsSize, bool randomizedAlphabet, double density ); private: diff --git a/alib2algo/src/grammar/generate/RandomizeGrammar.cpp b/alib2algo/src/grammar/generate/RandomizeGrammar.cpp index e8b69b1254c7f31f8a4337ef01c6dace42f5f3d1..0eb8e714c012eba163cbb9d7cc808f9bdf314402 100644 --- a/alib2algo/src/grammar/generate/RandomizeGrammar.cpp +++ b/alib2algo/src/grammar/generate/RandomizeGrammar.cpp @@ -12,11 +12,35 @@ namespace grammar { namespace generate { -auto RandomizeGrammarLeftRG = registration::AbstractRegister < RandomizeGrammar, grammar::LeftRG < >, const grammar::LeftRG < > & > ( RandomizeGrammar::randomize ); -auto RandomizeGrammarLeftLG = registration::AbstractRegister < RandomizeGrammar, grammar::LeftLG < >, const grammar::LeftLG < > & > ( RandomizeGrammar::randomize ); -auto RandomizeGrammarRightRG = registration::AbstractRegister < RandomizeGrammar, grammar::RightRG < >, const grammar::RightRG < > & > ( RandomizeGrammar::randomize ); -auto RandomizeGrammarRightLG = registration::AbstractRegister < RandomizeGrammar, grammar::RightLG < >, const grammar::RightLG < > & > ( RandomizeGrammar::randomize ); -auto RandomizeGrammarCFG = registration::AbstractRegister < RandomizeGrammar, grammar::CFG < >, const grammar::CFG < > & > ( RandomizeGrammar::randomize ); +auto RandomizeGrammarLeftRG = registration::AbstractRegister < RandomizeGrammar, grammar::LeftRG < >, const grammar::LeftRG < > & > ( RandomizeGrammar::randomize, "gram" ).setDocumentation ( +"Shuffle the set of nonterminal symbols.\n\ +\n\ +@param gram the grammar to shuffle\n\ +@return grammar with shuffled nonterminal symbols" ); + +auto RandomizeGrammarLeftLG = registration::AbstractRegister < RandomizeGrammar, grammar::LeftLG < >, const grammar::LeftLG < > & > ( RandomizeGrammar::randomize, "gram" ).setDocumentation ( +"Shuffle the set of nonterminal symbols.\n\ +\n\ +@param gram the grammar to shuffle\n\ +@return grammar with shuffled nonterminal symbols" ); + +auto RandomizeGrammarRightRG = registration::AbstractRegister < RandomizeGrammar, grammar::RightRG < >, const grammar::RightRG < > & > ( RandomizeGrammar::randomize, "gram" ).setDocumentation ( +"Shuffle the set of nonterminal symbols.\n\ +\n\ +@param gram the grammar to shuffle\n\ +@return grammar with shuffled nonterminal symbols" ); + +auto RandomizeGrammarRightLG = registration::AbstractRegister < RandomizeGrammar, grammar::RightLG < >, const grammar::RightLG < > & > ( RandomizeGrammar::randomize, "gram" ).setDocumentation ( +"Shuffle the set of nonterminal symbols.\n\ +\n\ +@param gram the grammar to shuffle\n\ +@return grammar with shuffled nonterminal symbols" ); + +auto RandomizeGrammarCFG = registration::AbstractRegister < RandomizeGrammar, grammar::CFG < >, const grammar::CFG < > & > ( RandomizeGrammar::randomize, "gram" ).setDocumentation ( +"Shuffle the set of nonterminal symbols.\n\ +\n\ +@param gram the grammar to shuffle\n\ +@return grammar with shuffled nonterminal symbols" ); } /* namespace generate */ diff --git a/alib2algo/src/grammar/generate/RandomizeGrammar.h b/alib2algo/src/grammar/generate/RandomizeGrammar.h index ed75379d5176ce84af89580c019ce12f966e796a..c6a512b90e17ef6c08656e9318b6a293be6e5bea 100644 --- a/alib2algo/src/grammar/generate/RandomizeGrammar.h +++ b/alib2algo/src/grammar/generate/RandomizeGrammar.h @@ -22,14 +22,40 @@ namespace generate { class RandomizeGrammar { public: + /** + * Shuffle the set of nonterminal symbols. + * + * \tparam TerminalSymbolType the type of terminal symbols of the random grammar + * \tparam NonterminalSymbolType the type of nonterminal symbols of the random grammar + * + * \param gram the grammar to shuffle + * + * \return grammar with shuffled nonterminal symbols + */ template < class TerminalSymbolType, class NonterminalSymbolType > static grammar::LeftRG < TerminalSymbolType, NonterminalSymbolType > randomize ( const grammar::LeftRG < TerminalSymbolType, NonterminalSymbolType > & gram ); + + /** + * \override + */ template < class TerminalSymbolType, class NonterminalSymbolType > static grammar::LeftLG < TerminalSymbolType, NonterminalSymbolType > randomize ( const grammar::LeftLG < TerminalSymbolType, NonterminalSymbolType > & gram ); + + /** + * \override + */ template < class TerminalSymbolType, class NonterminalSymbolType > static grammar::RightRG < TerminalSymbolType, NonterminalSymbolType > randomize ( const grammar::RightRG < TerminalSymbolType, NonterminalSymbolType > & gram ); + + /** + * \override + */ template < class TerminalSymbolType, class NonterminalSymbolType > static grammar::RightLG < TerminalSymbolType, NonterminalSymbolType > randomize ( const grammar::RightLG < TerminalSymbolType, NonterminalSymbolType > & gram ); + + /** + * \override + */ template < class TerminalSymbolType, class NonterminalSymbolType > static grammar::CFG < TerminalSymbolType, NonterminalSymbolType > randomize ( const grammar::CFG < TerminalSymbolType, NonterminalSymbolType > & gram );