diff --git a/alib2algo/src/stringology/indexing/ExactFactorOracleAutomaton.cpp b/alib2algo/src/stringology/indexing/ExactFactorOracleAutomaton.cpp new file mode 100644 index 0000000000000000000000000000000000000000..459e1325d77fbb27c10f412ee8c7cfce9e3bb60a --- /dev/null +++ b/alib2algo/src/stringology/indexing/ExactFactorOracleAutomaton.cpp @@ -0,0 +1,60 @@ +/* + * Author: Radovan Cerveny + */ + +#include "ExactFactorOracleAutomaton.h" +#include <string/LinearString.h> + +namespace stringology { + +namespace indexing { + +automaton::Automaton ExactFactorOracleAutomaton::construct ( const string::String & pattern ) { + return dispatch ( pattern.getData ( ) ); +} + +automaton::DFA < > ExactFactorOracleAutomaton::construct ( const string::LinearString < > & pattern ) { + automaton::DFA < > oracle ( DefaultStateType ( 0 ) ); + + oracle.addFinalState ( oracle.getInitialState ( ) ); + + std::map < DefaultStateType, DefaultStateType > supplyFunction { { DefaultStateType ( 0 ), DefaultStateType ( -1 ) } }; + + oracle.setInputAlphabet ( pattern.getAlphabet ( ) ); + + for ( const DefaultSymbolType & symbol : pattern.getContent ( ) ) + oracleAddLetter ( oracle, symbol, supplyFunction ); + + return oracle; +} + +void ExactFactorOracleAutomaton::oracleAddLetter ( automaton::DFA < > & oracle, const DefaultSymbolType & symbol, std::map < DefaultStateType, DefaultStateType > & supplyFunction ) { + int m = ( int ) oracle.getStates ( ).size ( ) - 1; + + DefaultStateType lastState = DefaultStateType ( m ); + DefaultStateType newState = DefaultStateType ( m + 1 ); + + oracle.addState ( newState ); + oracle.addFinalState ( newState ); + + oracle.addTransition ( lastState, symbol, newState ); + DefaultStateType kState = supplyFunction.find( lastState ) -> second; + + while ( kState != DefaultStateType ( -1 ) && oracle.getTransitions ( ).find ( { kState, symbol } ) == oracle.getTransitions ( ).end ( ) ) { + oracle.addTransition ( kState, symbol, newState ); + kState = supplyFunction.find( kState ) -> second; + } + + DefaultStateType supplyState = DefaultStateType ( 0 ); + + if ( kState != DefaultStateType ( -1 ) ) + supplyState = oracle.getTransitions ( ).find( { kState, symbol } ) -> second; + + supplyFunction.insert( { newState, supplyState } ); +} + +auto FactorOracleAutomatonLinearString = ExactFactorOracleAutomaton::RegistratorWrapper < automaton::DFA < >, string::LinearString < > > ( ExactFactorOracleAutomaton::construct ); + +} /* namespace indexing */ + +} /* namespace stringology */ diff --git a/alib2algo/src/stringology/indexing/ExactFactorOracleAutomaton.h b/alib2algo/src/stringology/indexing/ExactFactorOracleAutomaton.h new file mode 100644 index 0000000000000000000000000000000000000000..8bb6bbc7aefe010c79a5fb0bcd1eebb4bdc0378d --- /dev/null +++ b/alib2algo/src/stringology/indexing/ExactFactorOracleAutomaton.h @@ -0,0 +1,37 @@ +/* + * Author: Radovan Cerveny + */ + +#ifndef EXACT_FACTOR_ORACLE_AUTOMATON_H_ +#define EXACT_FACTOR_ORACLE_AUTOMATON_H_ + +#include <automaton/Automaton.h> +#include <automaton/FSM/DFA.h> +#include <string/LinearString.h> +#include <string/String.h> +#include <core/multipleDispatch.hpp> + +namespace stringology { + +namespace indexing { + +class ExactFactorOracleAutomaton : public std::SingleDispatch < ExactFactorOracleAutomaton, automaton::Automaton, const string::StringBase & > { +private: + static void oracleAddLetter ( automaton::DFA < > & oracle, const DefaultSymbolType & symbol, std::map < DefaultStateType, DefaultStateType > & supplyFunction ); + +public: + /** + * Constructs factor oracle automaton for given pattern. + * @return factor oracle automaton for given pattern + */ + static automaton::Automaton construct ( const string::String & pattern ); + + static automaton::DFA < > construct ( const string::LinearString < > & pattern ); + +}; + +} /* namespace indexing */ + +} /* namespace stringology */ + +#endif /* EXACT_FACTOR_ORACLE_AUTOMATON_H_ */ diff --git a/alib2algo/src/stringology/matching/DAWGMatcherConstruction.cpp b/alib2algo/src/stringology/matching/DAWGMatcherConstruction.cpp index 2ccae37ac0c8e7d93804dc9f13dbf280229c0e05..1a5268690eaec6b7585f0bee5ff5dcd6c24016f7 100644 --- a/alib2algo/src/stringology/matching/DAWGMatcherConstruction.cpp +++ b/alib2algo/src/stringology/matching/DAWGMatcherConstruction.cpp @@ -21,7 +21,7 @@ automaton::DFA < > DAWGMatcherConstruction::construct ( const string::LinearStri return stringology::indexing::ExactSuffixAutomaton::construct ( reversedPattern ); } -auto SuffixAutomatonLinearString = DAWGMatcherConstruction::RegistratorWrapper < automaton::DFA < >, string::LinearString < > > ( DAWGMatcherConstruction::construct ); +auto DAWGMatcherConstructionLinearString = DAWGMatcherConstruction::RegistratorWrapper < automaton::DFA < >, string::LinearString < > > ( DAWGMatcherConstruction::construct ); } /* namespace matching */ diff --git a/alib2algo/src/stringology/matching/NaiveDAWGMatcherConstruction.cpp b/alib2algo/src/stringology/matching/NaiveDAWGMatcherConstruction.cpp index bf55f3ce2cc9cca29c4c545b7d87817cf724a69f..c9f139a74279f500e2da0d1e4b000b23fa07d107 100644 --- a/alib2algo/src/stringology/matching/NaiveDAWGMatcherConstruction.cpp +++ b/alib2algo/src/stringology/matching/NaiveDAWGMatcherConstruction.cpp @@ -27,7 +27,7 @@ automaton::DFA < DefaultSymbolType, std::set < unsigned > > NaiveDAWGMatcherCons } -auto SuffixAutomatonNaiveLinearString = NaiveDAWGMatcherConstruction::RegistratorWrapper < automaton::DFA < DefaultSymbolType, std::set < unsigned > >, string::LinearString < > > ( NaiveDAWGMatcherConstruction::naiveConstruct ); +auto NaiveDAWGMatcherConstructionLinearString = NaiveDAWGMatcherConstruction::RegistratorWrapper < automaton::DFA < DefaultSymbolType, std::set < unsigned > >, string::LinearString < > > ( NaiveDAWGMatcherConstruction::naiveConstruct ); } /* namespace matching */ diff --git a/alib2algo/src/stringology/matching/OracleMatcherConstruction.cpp b/alib2algo/src/stringology/matching/OracleMatcherConstruction.cpp new file mode 100644 index 0000000000000000000000000000000000000000..aa9b1f24dd03e7e317976bdc4a0d95c468089402 --- /dev/null +++ b/alib2algo/src/stringology/matching/OracleMatcherConstruction.cpp @@ -0,0 +1,28 @@ +/* + * Author: Radovan Cerveny + */ + +#include "OracleMatcherConstruction.h" +#include <stringology/indexing/ExactSuffixAutomaton.h> + +namespace stringology { + +namespace matching { + +automaton::Automaton OracleMatcherConstruction::construct ( const string::String & pattern ) { + return dispatch ( pattern.getData ( ) ); +} + +automaton::DFA < > OracleMatcherConstruction::construct ( const string::LinearString < > & pattern ) { + auto patternData = pattern.getContent ( ); + reverse ( patternData.begin ( ), patternData.end ( ) ); + string::LinearString < > reversedPattern ( pattern.getAlphabet ( ), std::move ( patternData ) ); + + return stringology::indexing::ExactSuffixAutomaton::construct ( reversedPattern ); +} + +auto OracleMatcherConstructionLinearString = OracleMatcherConstruction::RegistratorWrapper < automaton::DFA < >, string::LinearString < > > ( OracleMatcherConstruction::construct ); + +} /* namespace matching */ + +} /* namespace stringology */ diff --git a/alib2algo/src/stringology/matching/OracleMatcherConstruction.h b/alib2algo/src/stringology/matching/OracleMatcherConstruction.h new file mode 100644 index 0000000000000000000000000000000000000000..cfeb8e4de4b088caa77bf5b91fffd5e7bd8b18b8 --- /dev/null +++ b/alib2algo/src/stringology/matching/OracleMatcherConstruction.h @@ -0,0 +1,35 @@ +/* + * Author: Radovan Cerveny + */ + +#ifndef ORACLE_MATCHER_CONSTRUCTION_H_ +#define ORACLE_MATCHER_CONSTRUCTION_H_ + +#include <automaton/Automaton.h> +#include <automaton/FSM/DFA.h> +#include <automaton/FSM/EpsilonNFA.h> +#include <string/LinearString.h> +#include <string/String.h> +#include <core/multipleDispatch.hpp> + +namespace stringology { + +namespace matching { + +class OracleMatcherConstruction : public std::SingleDispatch < OracleMatcherConstruction, automaton::Automaton, const string::StringBase & > { +public: + /** + * Linear time on-line construction of minimal suffix automaton for given pattern. + * @return minimal suffix automaton for given pattern. + */ + static automaton::Automaton construct ( const string::String & pattern ); + + static automaton::DFA < > construct ( const string::LinearString < > & pattern ); + +}; + +} /* namespace matching */ + +} /* namespace stringology */ + +#endif /* ORACLE_MATCHER_CONSTRUCTION_H_ */ diff --git a/alib2algo/test-src/stringology/matching/ExactSuffixAutomatonTest.cpp b/alib2algo/test-src/stringology/indexing/ExactSuffixAutomatonTest.cpp similarity index 95% rename from alib2algo/test-src/stringology/matching/ExactSuffixAutomatonTest.cpp rename to alib2algo/test-src/stringology/indexing/ExactSuffixAutomatonTest.cpp index ea92de7003b296726fdcf2a628ae0c090243c2e8..3427482ec267531e99b92bd099d3e30da6c421f4 100644 --- a/alib2algo/test-src/stringology/matching/ExactSuffixAutomatonTest.cpp +++ b/alib2algo/test-src/stringology/indexing/ExactSuffixAutomatonTest.cpp @@ -3,9 +3,6 @@ #include "string/LinearString.h" #include "stringology/indexing/ExactSuffixAutomaton.h" -#include "string/generate/RandomStringFactory.h" -#include "string/generate/RandomSubstringFactory.h" - CPPUNIT_TEST_SUITE_NAMED_REGISTRATION ( ExactSuffixAutomatonTest, "stringology" ); CPPUNIT_TEST_SUITE_REGISTRATION ( ExactSuffixAutomatonTest ); diff --git a/alib2algo/test-src/stringology/matching/ExactSuffixAutomatonTest.h b/alib2algo/test-src/stringology/indexing/ExactSuffixAutomatonTest.h similarity index 100% rename from alib2algo/test-src/stringology/matching/ExactSuffixAutomatonTest.h rename to alib2algo/test-src/stringology/indexing/ExactSuffixAutomatonTest.h diff --git a/alib2algo/test-src/stringology/indexing/FactorOracleAutomatonTest.cpp b/alib2algo/test-src/stringology/indexing/FactorOracleAutomatonTest.cpp new file mode 100644 index 0000000000000000000000000000000000000000..168cea6598bdda01eb7bf6a6e7721cb613008859 --- /dev/null +++ b/alib2algo/test-src/stringology/indexing/FactorOracleAutomatonTest.cpp @@ -0,0 +1,43 @@ +#include "FactorOracleAutomatonTest.h" + +#include "string/LinearString.h" +#include "stringology/indexing/ExactFactorOracleAutomaton.h" + +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION ( FactorOracleAutomatonTest, "stringology" ); +CPPUNIT_TEST_SUITE_REGISTRATION ( FactorOracleAutomatonTest ); + +void FactorOracleAutomatonTest::setUp ( ) { +} + +void FactorOracleAutomatonTest::tearDown ( ) { +} + +void FactorOracleAutomatonTest::testFactorOracleConstruction ( ) { + string::LinearString < > pattern ( "atatac" ); + + automaton::DFA<> oracle = stringology::indexing::ExactFactorOracleAutomaton::construct ( pattern ); + + automaton::DFA<> refOracle ( DefaultStateType ( 0 ) ); + + refOracle.addFinalState ( DefaultStateType ( 0 ) ); + + refOracle.setInputAlphabet ( pattern.getAlphabet ( ) ); + + for ( int i = 1; i <= 6; ++i ) { + refOracle.addState ( DefaultStateType ( i ) ); + refOracle.addFinalState ( DefaultStateType ( i ) ); + } + + refOracle.addTransition ( DefaultStateType ( 0 ), DefaultSymbolType ( 'a' ), DefaultStateType ( 1 ) ); + refOracle.addTransition ( DefaultStateType ( 0 ), DefaultSymbolType ( 't' ), DefaultStateType ( 2 ) ); + refOracle.addTransition ( DefaultStateType ( 0 ), DefaultSymbolType ( 'c' ), DefaultStateType ( 6 ) ); + refOracle.addTransition ( DefaultStateType ( 1 ), DefaultSymbolType ( 't' ), DefaultStateType ( 2 ) ); + refOracle.addTransition ( DefaultStateType ( 1 ), DefaultSymbolType ( 'c' ), DefaultStateType ( 6 ) ); + refOracle.addTransition ( DefaultStateType ( 2 ), DefaultSymbolType ( 'a' ), DefaultStateType ( 3 ) ); + refOracle.addTransition ( DefaultStateType ( 3 ), DefaultSymbolType ( 't' ), DefaultStateType ( 4 ) ); + refOracle.addTransition ( DefaultStateType ( 3 ), DefaultSymbolType ( 'c' ), DefaultStateType ( 6 ) ); + refOracle.addTransition ( DefaultStateType ( 4 ), DefaultSymbolType ( 'a' ), DefaultStateType ( 5 ) ); + refOracle.addTransition ( DefaultStateType ( 5 ), DefaultSymbolType ( 'c' ), DefaultStateType ( 6 ) ); + + CPPUNIT_ASSERT ( oracle == refOracle ); +} diff --git a/alib2algo/test-src/stringology/indexing/FactorOracleAutomatonTest.h b/alib2algo/test-src/stringology/indexing/FactorOracleAutomatonTest.h new file mode 100644 index 0000000000000000000000000000000000000000..3252d2be457893c52dfa2562bb8e0d92a0a08726 --- /dev/null +++ b/alib2algo/test-src/stringology/indexing/FactorOracleAutomatonTest.h @@ -0,0 +1,18 @@ +#ifndef FACTOR_ORACLE_AUTOMATON_TEST_HPP_ +#define FACTOR_ORACLE_AUTOMATON_TEST_HPP_ + +#include <cppunit/extensions/HelperMacros.h> + +class FactorOracleAutomatonTest : public CppUnit::TestFixture { + CPPUNIT_TEST_SUITE ( FactorOracleAutomatonTest ); + CPPUNIT_TEST ( testFactorOracleConstruction ); + CPPUNIT_TEST_SUITE_END ( ); + +public: + void setUp ( ); + void tearDown ( ); + + void testFactorOracleConstruction ( ); +}; + +#endif // FACTOR_ORACLE_AUTOMATON_TEST_HPP_ diff --git a/alib2algo_experimental/src/stringology/exact/BackwardOracleMatching.cpp b/alib2algo_experimental/src/stringology/exact/BackwardOracleMatching.cpp index 7fdf0a981fb5a7f920ed0b923704b7bb0aab542b..7fdff5229889b37250481a84569b2292650d5bbd 100644 --- a/alib2algo_experimental/src/stringology/exact/BackwardOracleMatching.cpp +++ b/alib2algo_experimental/src/stringology/exact/BackwardOracleMatching.cpp @@ -3,7 +3,7 @@ */ #include "BackwardOracleMatching.h" -#include "FactorOracleAutomaton.h" +#include "stringology/matching/OracleMatcherConstruction.h" #include <string/LinearString.h> #include <alphabet/Symbol.h> @@ -26,13 +26,7 @@ std::set < unsigned > BackwardOracleMatching::match ( const string::LinearString measurements::start ( "Preprocess", measurements::Type::PREPROCESS ); - auto patternData = pattern.getContent ( ); - - reverse ( patternData.begin ( ), patternData.end ( ) ); - - const string::LinearString < > reversedPattern ( std::move ( patternData ) ); - - automaton::DFA<> factorOracle = FactorOracleAutomaton::construct ( reversedPattern ); + automaton::DFA<> factorOracle = stringology::matching::OracleMatcherConstruction::construct ( pattern ); measurements::end ( ); @@ -46,7 +40,7 @@ std::set < unsigned > BackwardOracleMatching::match ( const string::LinearString DefaultStateType currentState = factorOracle.getInitialState ( ); - size_t posInPattern = reversedPattern.getContent ( ).size ( ); + size_t posInPattern = pattern.getContent ( ).size ( ); while ( posInPattern > 0 && currentState != failState ) { auto transition = factorOracle.getTransitions ( ).find ( { currentState, subject.getContent ( ).at ( posInSubject + posInPattern - 1 ) } ); diff --git a/alib2algo_experimental/src/stringology/exact/FactorOracleAutomaton.cpp b/alib2algo_experimental/src/stringology/exact/FactorOracleAutomaton.cpp deleted file mode 100644 index 17283f481acc0c1286a1dfa6424010a3a90f2d04..0000000000000000000000000000000000000000 --- a/alib2algo_experimental/src/stringology/exact/FactorOracleAutomaton.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Author: Radovan Cerveny - */ - -#include "FactorOracleAutomaton.h" -#include <string/LinearString.h> - -namespace stringology { - -namespace exact { - -automaton::Automaton FactorOracleAutomaton::construct ( const string::String & pattern ) { - return dispatch ( pattern.getData ( ) ); -} - -automaton::DFA<> FactorOracleAutomaton::construct ( const string::LinearString < > & pattern ) { - automaton::DFA<> oracle ( DefaultStateType ( 0 ) ); - - oracle.addFinalState ( oracle.getInitialState ( ) ); - - std::map < DefaultStateType, DefaultStateType > supplyFunction { { DefaultStateType ( 0 ), DefaultStateType ( -1 ) } }; - - oracle.setInputAlphabet ( pattern.getAlphabet ( ) ); - - for ( const DefaultSymbolType & symbol : pattern.getContent ( ) ) - oracleAddLetter ( oracle, symbol, supplyFunction ); - - return oracle; -} - -void FactorOracleAutomaton::oracleAddLetter ( automaton::DFA<> & oracle, const DefaultSymbolType & symbol, std::map < DefaultStateType, DefaultStateType > & supplyFunction ) { - int m = ( int ) oracle.getStates ( ).size ( ) - 1; - - DefaultStateType lastState = DefaultStateType ( m ); - DefaultStateType newState = DefaultStateType ( m + 1 ); - - oracle.addState ( newState ); - oracle.addFinalState ( newState ); - - oracle.addTransition ( lastState, symbol, newState ); - DefaultStateType kState = supplyFunction.find( lastState ) -> second; - - while ( kState != DefaultStateType ( -1 ) && oracle.getTransitions ( ).find ( { kState, symbol } ) == oracle.getTransitions ( ).end ( ) ) { - oracle.addTransition ( kState, symbol, newState ); - kState = supplyFunction.find( kState ) -> second; - } - - DefaultStateType supplyState = DefaultStateType ( 0 ); - - if ( kState != DefaultStateType ( -1 ) ) - supplyState = oracle.getTransitions ( ).find( { kState, symbol } ) -> second; - - supplyFunction.insert( { newState, supplyState } ); -} - -auto FactorOracleAutomatonLinearString = FactorOracleAutomaton::RegistratorWrapper < automaton::DFA<>, string::LinearString < > > ( FactorOracleAutomaton::construct ); - -} /* namespace exact */ - -} /* namespace stringology */ diff --git a/alib2algo_experimental/src/stringology/exact/FactorOracleAutomaton.h b/alib2algo_experimental/src/stringology/exact/FactorOracleAutomaton.h deleted file mode 100644 index 62971aeef030e6b495f369b476f34dd49fb28569..0000000000000000000000000000000000000000 --- a/alib2algo_experimental/src/stringology/exact/FactorOracleAutomaton.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Author: Radovan Cerveny - */ - -#ifndef FACTOR_ORACLE_AUTOMATON_H__ -#define FACTOR_ORACLE_AUTOMATON_H__ - -#include <automaton/Automaton.h> -#include <automaton/FSM/DFA.h> -#include <string/LinearString.h> -#include <string/String.h> -#include <core/multipleDispatch.hpp> - -namespace stringology { - -namespace exact { - -class FactorOracleAutomaton : public std::SingleDispatch < FactorOracleAutomaton, automaton::Automaton, const string::StringBase & > { -private: - static void oracleAddLetter ( automaton::DFA<> & oracle, const DefaultSymbolType & symbol, std::map < DefaultStateType, DefaultStateType > & supplyFunction ); - -public: - /** - * Constructs factor oracle automaton for given pattern. - * @return factor oracle automaton for given pattern - */ - static automaton::Automaton construct ( const string::String & pattern ); - - static automaton::DFA<> construct ( const string::LinearString < > & pattern ); - -}; - -} /* namespace exact */ - -} /* namespace stringology */ - -#endif /* FACTOR_ORACLE_AUTOMATON_H__ */ diff --git a/alib2algo_experimental/test-src/stringology/exact/FactorOracleAutomatonTest.h b/alib2algo_experimental/test-src/stringology/exact/FactorOracleAutomatonTest.h deleted file mode 100644 index b3b4bb947fe0819897488c23b459e430449af3be..0000000000000000000000000000000000000000 --- a/alib2algo_experimental/test-src/stringology/exact/FactorOracleAutomatonTest.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef FACTOR_ORACLE_AUTOMATON_TEST_HPP_ -#define FACTOR_ORACLE_AUTOMATON_TEST_HPP_ - -#include <cppunit/extensions/HelperMacros.h> - -class FactorOracleAutomatonTest : public CppUnit::TestFixture { - CPPUNIT_TEST_SUITE ( FactorOracleAutomatonTest ); - CPPUNIT_TEST ( testFactorOracleConstruction ); - CPPUNIT_TEST ( testBackwardOracleMatching ); - CPPUNIT_TEST_SUITE_END ( ); - -public: - void setUp ( ); - void tearDown ( ); - - void testFactorOracleConstruction ( ); - void testBackwardOracleMatching ( ); -}; - -#endif // FACTOR_ORACLE_AUTOMATON_TEST_HPP_ diff --git a/alib2algo_experimental/test-src/stringology/exact/FactorOracleAutomatonTest.cpp b/alib2algo_experimental/test-src/stringology/exact/OracleMatcherTest.cpp similarity index 56% rename from alib2algo_experimental/test-src/stringology/exact/FactorOracleAutomatonTest.cpp rename to alib2algo_experimental/test-src/stringology/exact/OracleMatcherTest.cpp index e71878e082582419854a7be80eb86eb99fbbb613..b0c3a7d4e614abab98d427faa1e27720f30e094c 100644 --- a/alib2algo_experimental/test-src/stringology/exact/FactorOracleAutomatonTest.cpp +++ b/alib2algo_experimental/test-src/stringology/exact/OracleMatcherTest.cpp @@ -1,54 +1,22 @@ -#include "FactorOracleAutomatonTest.h" +#include "OracleMatcherTest.h" #include "string/LinearString.h" -#include "stringology/exact/FactorOracleAutomaton.h" #include "stringology/exact/BackwardOracleMatching.h" #include "stringology/exact/ExactFactorMatch.h" #include "string/generate/RandomStringFactory.h" #include "string/generate/RandomSubstringFactory.h" -CPPUNIT_TEST_SUITE_NAMED_REGISTRATION ( FactorOracleAutomatonTest, "stringology" ); -CPPUNIT_TEST_SUITE_REGISTRATION ( FactorOracleAutomatonTest ); +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION ( OracleMatcherTest, "stringology" ); +CPPUNIT_TEST_SUITE_REGISTRATION ( OracleMatcherTest ); -void FactorOracleAutomatonTest::setUp ( ) { +void OracleMatcherTest::setUp ( ) { } -void FactorOracleAutomatonTest::tearDown ( ) { +void OracleMatcherTest::tearDown ( ) { } -void FactorOracleAutomatonTest::testFactorOracleConstruction ( ) { - - string::LinearString < > pattern ( "atatac" ); - - automaton::DFA<> oracle = stringology::exact::FactorOracleAutomaton::construct ( pattern ); - - automaton::DFA<> refOracle ( DefaultStateType ( 0 ) ); - - refOracle.addFinalState ( DefaultStateType ( 0 ) ); - - refOracle.setInputAlphabet ( pattern.getAlphabet ( ) ); - - for ( int i = 1; i <= 6; ++i ) { - refOracle.addState ( DefaultStateType ( i ) ); - refOracle.addFinalState ( DefaultStateType ( i ) ); - } - - refOracle.addTransition ( DefaultStateType ( 0 ), DefaultSymbolType ( 'a' ), DefaultStateType ( 1 ) ); - refOracle.addTransition ( DefaultStateType ( 0 ), DefaultSymbolType ( 't' ), DefaultStateType ( 2 ) ); - refOracle.addTransition ( DefaultStateType ( 0 ), DefaultSymbolType ( 'c' ), DefaultStateType ( 6 ) ); - refOracle.addTransition ( DefaultStateType ( 1 ), DefaultSymbolType ( 't' ), DefaultStateType ( 2 ) ); - refOracle.addTransition ( DefaultStateType ( 1 ), DefaultSymbolType ( 'c' ), DefaultStateType ( 6 ) ); - refOracle.addTransition ( DefaultStateType ( 2 ), DefaultSymbolType ( 'a' ), DefaultStateType ( 3 ) ); - refOracle.addTransition ( DefaultStateType ( 3 ), DefaultSymbolType ( 't' ), DefaultStateType ( 4 ) ); - refOracle.addTransition ( DefaultStateType ( 3 ), DefaultSymbolType ( 'c' ), DefaultStateType ( 6 ) ); - refOracle.addTransition ( DefaultStateType ( 4 ), DefaultSymbolType ( 'a' ), DefaultStateType ( 5 ) ); - refOracle.addTransition ( DefaultStateType ( 5 ), DefaultSymbolType ( 'c' ), DefaultStateType ( 6 ) ); - - CPPUNIT_ASSERT ( oracle == refOracle ); -} - -void FactorOracleAutomatonTest::testBackwardOracleMatching ( ) { +void OracleMatcherTest::testBackwardOracleMatching ( ) { std::vector<std::string> subjects; std::vector<std::string> patterns; std::vector<std::set<unsigned>> expectedOccs; diff --git a/alib2algo_experimental/test-src/stringology/exact/OracleMatcherTest.h b/alib2algo_experimental/test-src/stringology/exact/OracleMatcherTest.h new file mode 100644 index 0000000000000000000000000000000000000000..f1d49809082866ccaea6362dc886920f9d1604cb --- /dev/null +++ b/alib2algo_experimental/test-src/stringology/exact/OracleMatcherTest.h @@ -0,0 +1,19 @@ +#ifndef ORACLE_MATCHER_TEST_H_ +#define ORACLE_MATCHER_TEST_H_ + +#include <cppunit/extensions/HelperMacros.h> + +class OracleMatcherTest : public CppUnit::TestFixture { + CPPUNIT_TEST_SUITE ( OracleMatcherTest ); + CPPUNIT_TEST ( testBackwardOracleMatching ); + CPPUNIT_TEST_SUITE_END ( ); + +public: + void setUp ( ); + void tearDown ( ); + + void testFactorOracleConstruction ( ); + void testBackwardOracleMatching ( ); +}; + +#endif // ORACLE_MATCHER_TEST_H_ diff --git a/astringology2/src/astringology.cpp b/astringology2/src/astringology.cpp index 2b585b858034be908bb89cbb4898e3a7c2094c61..3f3159f4fe50aa3d6d7e78b6356e32653a93a06b 100644 --- a/astringology2/src/astringology.cpp +++ b/astringology2/src/astringology.cpp @@ -32,7 +32,7 @@ #include <stringology/indexing/ExactSubsequenceAutomaton.h> #include <stringology/indexing/ExactNondeterministicSubsequenceAutomaton.h> #include <stringology/indexing/ExactMultiNondeterministicSubsequenceAutomaton.h> -#include <stringology/exact/FactorOracleAutomaton.h> +#include <stringology/indexing/ExactFactorOracleAutomaton.h> #include <stringology/indexing/NondeterministicExactSuffixAutomaton.h> #include <string/properties/BorderArray.h> #include <stringology/indexing/SuffixTrieNaive.h> @@ -55,7 +55,7 @@ int main ( int argc, char * argv[] ) { allowed.push_back ( "exactSubsequenceAutomaton" ); allowed.push_back ( "exactNondeterministicSubsequenceAutomaton" ); allowed.push_back ( "exactMultiNondeterministicSubsequenceAutomaton" ); - allowed.push_back ( "factorOracleAutomaton" ); + allowed.push_back ( "exactFactorOracleAutomaton" ); allowed.push_back ( "exactNondeterministicSuffixAutomaton" ); allowed.push_back ( "exactFactorMatch" ); allowed.push_back ( "boyerMooreHorspool" ); @@ -271,13 +271,13 @@ int main ( int argc, char * argv[] ) { measurements::start ( "Output write", measurements::Type::AUXILIARY ); alib::XmlDataFactory::toStdout ( automaton ); - } else if ( algorithm.getValue ( ) == "factorOracleAutomaton" ) { + } else if ( algorithm.getValue ( ) == "exactFactorOracleAutomaton" ) { string::String pattern = alib::XmlDataFactory::fromTokens ( std::move ( sax::FromXMLParserHelper::parseInput(true, patternInput).front ( ) ) ); measurements::end ( ); measurements::start ( "Algorithm", measurements::Type::MAIN ); - automaton::Automaton automaton = stringology::exact::FactorOracleAutomaton::construct ( pattern ); + automaton::Automaton automaton = stringology::indexing::ExactFactorOracleAutomaton::construct ( pattern ); measurements::end ( ); measurements::start ( "Output write", measurements::Type::AUXILIARY );