From ed7162bde6ec3367a12287d85b41f02b441f6a00 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Fri, 12 May 2017 14:23:05 +0200 Subject: [PATCH] move oracle matcher construction to algo --- .../indexing/ExactFactorOracleAutomaton.cpp | 60 +++++++++++++++++++ .../indexing/ExactFactorOracleAutomaton.h | 37 ++++++++++++ .../matching/DAWGMatcherConstruction.cpp | 2 +- .../matching/NaiveDAWGMatcherConstruction.cpp | 2 +- .../matching/OracleMatcherConstruction.cpp | 28 +++++++++ .../matching/OracleMatcherConstruction.h | 35 +++++++++++ .../ExactSuffixAutomatonTest.cpp | 3 - .../ExactSuffixAutomatonTest.h | 0 .../indexing/FactorOracleAutomatonTest.cpp | 43 +++++++++++++ .../indexing/FactorOracleAutomatonTest.h | 18 ++++++ .../exact/BackwardOracleMatching.cpp | 12 +--- .../exact/FactorOracleAutomaton.cpp | 60 ------------------- .../stringology/exact/FactorOracleAutomaton.h | 37 ------------ .../exact/FactorOracleAutomatonTest.h | 20 ------- ...utomatonTest.cpp => OracleMatcherTest.cpp} | 44 ++------------ .../stringology/exact/OracleMatcherTest.h | 19 ++++++ astringology2/src/astringology.cpp | 8 +-- 17 files changed, 255 insertions(+), 173 deletions(-) create mode 100644 alib2algo/src/stringology/indexing/ExactFactorOracleAutomaton.cpp create mode 100644 alib2algo/src/stringology/indexing/ExactFactorOracleAutomaton.h create mode 100644 alib2algo/src/stringology/matching/OracleMatcherConstruction.cpp create mode 100644 alib2algo/src/stringology/matching/OracleMatcherConstruction.h rename alib2algo/test-src/stringology/{matching => indexing}/ExactSuffixAutomatonTest.cpp (95%) rename alib2algo/test-src/stringology/{matching => indexing}/ExactSuffixAutomatonTest.h (100%) create mode 100644 alib2algo/test-src/stringology/indexing/FactorOracleAutomatonTest.cpp create mode 100644 alib2algo/test-src/stringology/indexing/FactorOracleAutomatonTest.h delete mode 100644 alib2algo_experimental/src/stringology/exact/FactorOracleAutomaton.cpp delete mode 100644 alib2algo_experimental/src/stringology/exact/FactorOracleAutomaton.h delete mode 100644 alib2algo_experimental/test-src/stringology/exact/FactorOracleAutomatonTest.h rename alib2algo_experimental/test-src/stringology/exact/{FactorOracleAutomatonTest.cpp => OracleMatcherTest.cpp} (56%) create mode 100644 alib2algo_experimental/test-src/stringology/exact/OracleMatcherTest.h diff --git a/alib2algo/src/stringology/indexing/ExactFactorOracleAutomaton.cpp b/alib2algo/src/stringology/indexing/ExactFactorOracleAutomaton.cpp new file mode 100644 index 0000000000..459e1325d7 --- /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 0000000000..8bb6bbc7ae --- /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 2ccae37ac0..1a5268690e 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 bf55f3ce2c..c9f139a742 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 0000000000..aa9b1f24dd --- /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 0000000000..cfeb8e4de4 --- /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 ea92de7003..3427482ec2 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 0000000000..168cea6598 --- /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 0000000000..3252d2be45 --- /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 7fdf0a981f..7fdff52298 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 17283f481a..0000000000 --- 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 62971aeef0..0000000000 --- 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 b3b4bb947f..0000000000 --- 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 e71878e082..b0c3a7d4e6 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 0000000000..f1d4980908 --- /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 2b585b8580..3f3159f4fe 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 ); -- GitLab