diff --git a/alib2algo/src/string/generate/RandomStringFactory.cpp b/alib2algo/src/string/generate/RandomStringFactory.cpp index 8f2c9826ce68739311f4333381e3aa032c75a0dc..c2ed626b7a24b4a1b9b7399ee3d5620545c5e7ed 100644 --- a/alib2algo/src/string/generate/RandomStringFactory.cpp +++ b/alib2algo/src/string/generate/RandomStringFactory.cpp @@ -8,10 +8,6 @@ #include "RandomStringFactory.h" #include <alib/algorithm> -#include <alib/random> -#include <alib/vector> - -#include <exception/CommonException.h> #include <registration/AlgoRegistration.hpp> @@ -19,58 +15,42 @@ namespace string { namespace generate { -string::LinearString < > RandomStringFactory::generateLinearString ( size_t size, size_t alphabetSize, bool randomizedAlphabet, bool integerSymbols ) { +string::LinearString < std::string > RandomStringFactory::generateLinearString ( size_t size, size_t alphabetSize, bool randomizedAlphabet, bool integerSymbols ) { if ( !integerSymbols ) return generateLinearString ( size, alphabetSize, randomizedAlphabet ); if ( alphabetSize <= 0 ) throw exception::CommonException ( "Alphabet size must be greater than 0." ); - ext::vector < DefaultSymbolType > elems; + ext::vector < std::string > elems; for ( size_t i = 0; i < size; i++ ) - elems.push_back ( DefaultSymbolType ( static_cast < int > ( ext::random_devices::semirandom ( ) % alphabetSize ) ) ); + elems.push_back ( ext::to_string ( static_cast < int > ( ext::random_devices::semirandom ( ) % alphabetSize ) ) ); - return string::LinearString < > ( elems ); + return string::LinearString < std::string > ( elems ); } -auto GenerateLinearString1 = registration::AbstractRegister < RandomStringFactory, string::LinearString < >, size_t, size_t, bool, bool > ( RandomStringFactory::generateLinearString, abstraction::AlgorithmCategories::AlgorithmCategory::DEFAULT, "size", "alphabetSize", "randomizedAlphabet", "integerSymbols" ); +auto GenerateLinearString1 = registration::AbstractRegister < RandomStringFactory, string::LinearString < std::string >, size_t, size_t, bool, bool > ( RandomStringFactory::generateLinearString, abstraction::AlgorithmCategories::AlgorithmCategory::DEFAULT, "size", "alphabetSize", "randomizedAlphabet", "integerSymbols" ); -string::LinearString < > RandomStringFactory::generateLinearString ( size_t size, size_t alphabetSize, bool randomizedAlphabet ) { +string::LinearString < std::string > RandomStringFactory::generateLinearString ( size_t size, size_t alphabetSize, bool randomizedAlphabet ) { if ( alphabetSize > 26 ) throw exception::CommonException ( "Too big alphabet." ); if ( alphabetSize <= 0 ) throw exception::CommonException ( "Alphabet size must be greater than 0." ); - ext::vector < DefaultSymbolType > symbols; + ext::vector < std::string > symbols; - for ( int i = 0; i < 26; i++ ) symbols.push_back ( DefaultSymbolType ( ( char ) ( i + 'a' ) ) ); + for(char i = 'a'; i <= 'z'; i++) + symbols.push_back ( std::string ( 1, i ) ); if ( randomizedAlphabet ) shuffle ( symbols.begin ( ), symbols.end ( ), ext::random_devices::semirandom ); - ext::set < DefaultSymbolType > alphabet ( symbols.begin ( ), symbols.begin ( ) + alphabetSize ); + ext::set < std::string > alphabet ( symbols.begin ( ), symbols.begin ( ) + alphabetSize ); return RandomStringFactory::generateLinearString ( size, alphabet ); } -auto GenerateLinearString2 = registration::AbstractRegister < RandomStringFactory, string::LinearString < >, size_t, size_t, bool > ( RandomStringFactory::generateLinearString, abstraction::AlgorithmCategories::AlgorithmCategory::DEFAULT, "size", "alphabetSize", "randomizedAlphabet" ); - -string::LinearString < > RandomStringFactory::generateLinearString ( size_t size, ext::set < DefaultSymbolType > alphabet ) { - - if ( alphabet.size ( ) > 26 ) - throw exception::CommonException ( "Too big alphabet." ); - - if ( alphabet.size ( ) <= 0 ) - throw exception::CommonException ( "Alphabet size must be greater than 0." ); - - ext::vector < DefaultSymbolType > alphabetList ( alphabet.begin ( ), alphabet.end ( ) ); - ext::vector < DefaultSymbolType > elems; - - for ( size_t i = 0; i < size; i++ ) - elems.push_back ( alphabetList[ext::random_devices::semirandom ( ) % alphabetList.size ( )] ); - - return string::LinearString < > ( elems ); -} +auto GenerateLinearString2 = registration::AbstractRegister < RandomStringFactory, string::LinearString < std::string >, size_t, size_t, bool > ( RandomStringFactory::generateLinearString, abstraction::AlgorithmCategories::AlgorithmCategory::DEFAULT, "size", "alphabetSize", "randomizedAlphabet" ); auto GenerateLinearString3 = registration::AbstractRegister < RandomStringFactory, string::LinearString < >, size_t, ext::set < DefaultSymbolType > > ( RandomStringFactory::generateLinearString, abstraction::AlgorithmCategories::AlgorithmCategory::DEFAULT, "size", "alphabet" ); diff --git a/alib2algo/src/string/generate/RandomStringFactory.h b/alib2algo/src/string/generate/RandomStringFactory.h index 6a4782e8007acacbaba2a2fc502036017914ca67..e9ad4110ea5f0ee27ea63478576ab007febecb55 100644 --- a/alib2algo/src/string/generate/RandomStringFactory.h +++ b/alib2algo/src/string/generate/RandomStringFactory.h @@ -9,19 +9,74 @@ #define RANDOM_STRING_FACTORY_H_ #include <alib/set> +#include <alib/random> +#include <alib/vector> + +#include <exception/CommonException.h> + #include <string/LinearString.h> namespace string { namespace generate { +/** + * Generator of random strings. + * + */ class RandomStringFactory { public: - static string::LinearString < > generateLinearString ( size_t size, size_t alphabetSize, bool randomizedAlphabet, bool integerSymbols ); - static string::LinearString < > generateLinearString ( size_t size, size_t alphabetSize, bool randomizedAlphabet ); - static string::LinearString < > generateLinearString ( size_t size, ext::set < DefaultSymbolType > alphabet ); + /** + * Generates a random string of given size. + * + * \param size the length of the generated string + * \param alphabetSize size of the alphabet (1-26 for characters and 0-INT_MAX for integers) + * \param randomizedAlphabet selects random symbols from a-z range if true + * \param integerSymbols use integers as symbols in the generated string is true, randomize alphabet is not used if integer alphabet is requested + * + * \return random string + */ + static string::LinearString < std::string > generateLinearString ( size_t size, size_t alphabetSize, bool randomizedAlphabet, bool integerSymbols ); + + /** + * Generates a random string of given size. + * + * \param size the length of the generated string + * \param alphabetSize size of the alphabet (1-26 for characters) + * \param randomizedAlphabet selects random symbols from a-z range if true + * + * \return random string + */ + static string::LinearString < std::string > generateLinearString ( size_t size, size_t alphabetSize, bool randomizedAlphabet ); + + /** + * Generates a random string of given size + * \tparam SymbolType the type of symbols of the random string + * + * \param size the length of the generated string + * \param alphabet alphabet of the generated string + * + * \return random string + */ + template < class SymbolType > + static string::LinearString < SymbolType > generateLinearString ( size_t size, ext::set < SymbolType > alphabet ); }; +template < class SymbolType > +string::LinearString < SymbolType > RandomStringFactory::generateLinearString ( size_t size, ext::set < SymbolType > alphabet ) { + + if ( alphabet.size ( ) <= 0 ) + throw exception::CommonException ( "Alphabet size must be greater than 0." ); + + ext::vector < SymbolType > alphabetList ( alphabet.begin ( ), alphabet.end ( ) ); + ext::vector < SymbolType > elems; + + for ( size_t i = 0; i < size; i++ ) + elems.push_back ( alphabetList[ext::random_devices::semirandom ( ) % alphabetList.size ( )] ); + + return string::LinearString < SymbolType > ( elems ); +} + } /* namespace generate */ } /* namespace string */ diff --git a/alib2algo/test-src/stringology/matching/BackwardNondeterministicDAWGMatchingTest.cpp b/alib2algo/test-src/stringology/matching/BackwardNondeterministicDAWGMatchingTest.cpp index e42ddcdf27b32c372e467c05b0800add1ad6a1dd..e85af2b1f034e532b16485718eb6234ae6cbe66f 100644 --- a/alib2algo/test-src/stringology/matching/BackwardNondeterministicDAWGMatchingTest.cpp +++ b/alib2algo/test-src/stringology/matching/BackwardNondeterministicDAWGMatchingTest.cpp @@ -48,7 +48,7 @@ void BackwardNondeterministicDAWGMatchingTest::testBNDM ( ) { auto longSubject = string::generate::RandomStringFactory::generateLinearString (64 * 64 * 64, 512, false, true); auto longPattern = string::generate::RandomSubstringFactory::generateSubstring(64 * 32 * 32, longSubject ); - indexes::stringology::BitSetIndex < > pattern = stringology::matching::BNDMMatcherConstruction::construct ( longPattern ); + indexes::stringology::BitSetIndex < std::string > pattern = stringology::matching::BNDMMatcherConstruction::construct ( longPattern ); ext::set < unsigned > res = stringology::query::BNDMOccurrences::query ( pattern, longSubject ); ext::set < unsigned > ref = stringology::exact::ExactFactorMatch::match ( longSubject, longPattern ); std::cout << "long: " << res << std::endl; diff --git a/alib2algo/test-src/stringology/query/DAWGMatcherTest.cpp b/alib2algo/test-src/stringology/query/DAWGMatcherTest.cpp index 0aafbfbb759f490fda65f1711e8bbec4cf351c19..7d7e5c66e14be01905cf89f14a290f8ee1a49d20 100644 --- a/alib2algo/test-src/stringology/query/DAWGMatcherTest.cpp +++ b/alib2algo/test-src/stringology/query/DAWGMatcherTest.cpp @@ -46,7 +46,7 @@ void DAWGMatcherTest::testBackwardDAWGMatching ( ) { auto longSubject = string::generate::RandomStringFactory::generateLinearString (64 * 64, 512, false, true); auto longPattern = string::generate::RandomSubstringFactory::generateSubstring(64 * 5, longSubject ); - indexes::stringology::SuffixAutomaton < > suffixAutomaton = stringology::matching::DAWGMatcherConstruction::construct ( longPattern ); + indexes::stringology::SuffixAutomaton < std::string > suffixAutomaton = stringology::matching::DAWGMatcherConstruction::construct ( longPattern ); ext::set < unsigned > res = stringology::query::BackwardDAWGMatching::match ( longSubject, suffixAutomaton ); ext::set < unsigned > resRef = stringology::exact::ExactFactorMatch::match ( longSubject, longPattern ); std::cout << "long: " << res << std::endl; diff --git a/alib2algo/test-src/stringology/query/OracleMatcherTest.cpp b/alib2algo/test-src/stringology/query/OracleMatcherTest.cpp index 39bd8d76aa392fb2bc484dffafe6d5ec63e0a291..a7f3515c087518a1a589a03c29db5ba472a9aa5a 100644 --- a/alib2algo/test-src/stringology/query/OracleMatcherTest.cpp +++ b/alib2algo/test-src/stringology/query/OracleMatcherTest.cpp @@ -45,7 +45,7 @@ void OracleMatcherTest::testBackwardOracleMatching ( ) { auto longSubject = string::generate::RandomStringFactory::generateLinearString (64 * 64, 512, false, true); auto longPattern = string::generate::RandomSubstringFactory::generateSubstring(64 * 5, longSubject ); - automaton::DFA < DefaultSymbolType, unsigned > oracleAutomaton = stringology::matching::OracleMatcherConstruction::construct ( longPattern ); + automaton::DFA < std::string, unsigned > oracleAutomaton = stringology::matching::OracleMatcherConstruction::construct ( longPattern ); ext::set < unsigned > res = stringology::query::BackwardOracleMatching::match ( longSubject, oracleAutomaton ); ext::set < unsigned > resRef = stringology::exact::ExactFactorMatch::match ( longSubject, longPattern ); std::cout << "long: " << res << std::endl; diff --git a/alib2algo_experimental/test-src/stringology/query/CompactSuffixAutomatonQueryTest.cpp b/alib2algo_experimental/test-src/stringology/query/CompactSuffixAutomatonQueryTest.cpp index faeec4e29249017780a3a370165da85ee31d2159..c4378aa609f7151bee56fb362dc8aeba783bc862 100644 --- a/alib2algo_experimental/test-src/stringology/query/CompactSuffixAutomatonQueryTest.cpp +++ b/alib2algo_experimental/test-src/stringology/query/CompactSuffixAutomatonQueryTest.cpp @@ -49,7 +49,7 @@ void CompactSuffixAutomatonQueryTest::testCDAWG ( ) { auto longSubject = string::generate::RandomStringFactory::generateLinearString (4000, 26, false, true); auto longPattern = string::generate::RandomSubstringFactory::generateSubstring(2, longSubject ); - indexes::stringology::CompactSuffixAutomatonTerminatingSymbol < > index = stringology::indexing::ExperimentalCompactSuffixAutomatonConstruct::construct ( longSubject ); + indexes::stringology::CompactSuffixAutomatonTerminatingSymbol < std::string > index = stringology::indexing::ExperimentalCompactSuffixAutomatonConstruct::construct ( longSubject ); ext::set < unsigned > res = stringology::query::CompactSuffixAutomatonFactors::query ( index, longPattern ); ext::set < unsigned > ref = stringology::exact::ExactFactorMatch::match ( longSubject, longPattern );