From 539bfae71b972ae314fffcc55481a519f06c9c52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20=C4=8Capek?= <tomas@capek.io> Date: Sun, 29 Apr 2018 19:13:50 +0200 Subject: [PATCH] Implements simulation for exact string matching using bit paralelism. --- .../stringology/simulations/BitParalelism.h | 47 ++++++++++++++++ .../simulations/ExactBitParalelism.h | 56 +++++++++++++++++++ .../simulations/ExactBitParalelismTest.cpp | 20 +++++++ .../simulations/ExactBitParalelismTest.h | 17 ++++++ 4 files changed, 140 insertions(+) create mode 100644 alib2algo/src/stringology/simulations/BitParalelism.h create mode 100644 alib2algo/src/stringology/simulations/ExactBitParalelism.h create mode 100644 alib2algo/test-src/stringology/simulations/ExactBitParalelismTest.cpp create mode 100644 alib2algo/test-src/stringology/simulations/ExactBitParalelismTest.h diff --git a/alib2algo/src/stringology/simulations/BitParalelism.h b/alib2algo/src/stringology/simulations/BitParalelism.h new file mode 100644 index 0000000000..1346caf946 --- /dev/null +++ b/alib2algo/src/stringology/simulations/BitParalelism.h @@ -0,0 +1,47 @@ +/* + * BitParalelism.h + * + * Created on: 29.4.2018 + * Author: Tomas Capek + */ + +#ifndef _BIT_PARALELISM_H__ +#define _BIT_PARALELISM_H__ + +#include <string/LinearString.h> + + +namespace stringology { + +namespace simulations { + +class BitParalelism { +public: + template <class SymbolType> + static ext::map<SymbolType, ext::vector<bool> > constructDVectors(const ext::set<SymbolType> & alphabet, const string::LinearString<SymbolType> & pattern); +}; + +template <class SymbolType> +ext::map<SymbolType, ext::vector<bool> > BitParalelism::constructDVectors(const ext::set<SymbolType> & alphabet, const string::LinearString<SymbolType> & pattern) { + ext::map<SymbolType, ext::vector<bool> > D_vectors; + + for(const SymbolType & symbol : alphabet) { + D_vectors[symbol] = ext::vector<bool>(pattern.getContent().size()); + + for(unsigned int i = 0; i<pattern.getContent().size(); i++) { + if(pattern.getContent()[i] != symbol) { + D_vectors[symbol][i] = 1; + } else { + D_vectors[symbol][i] = 0; + } + } + } + + return D_vectors; +} + +} + +} + +#endif /* _BIT_PARALELISM_H__ */ diff --git a/alib2algo/src/stringology/simulations/ExactBitParalelism.h b/alib2algo/src/stringology/simulations/ExactBitParalelism.h new file mode 100644 index 0000000000..f57c4def54 --- /dev/null +++ b/alib2algo/src/stringology/simulations/ExactBitParalelism.h @@ -0,0 +1,56 @@ +/* + * HammingBitParalelism.h + * + * Created on: 28.4.2018 + * Author: Tomas Capek + */ + +#ifndef _EXACT_BIT_PARALELISM_H__ +#define _EXACT_BIT_PARALELISM_H__ + +#include <exception> +#include <string/LinearString.h> + +#include "BitParalelism.h" + +namespace stringology { + +namespace simulations { + +class ExactBitParalelism { +public: + template <class SymbolType> + static ext::vector<unsigned int> search(const string::LinearString<SymbolType> & text, const string::LinearString<SymbolType> & pattern); +}; + + +template <class SymbolType> +ext::vector<unsigned int> ExactBitParalelism::search(const string::LinearString<SymbolType> & text, const string::LinearString<SymbolType> & pattern) { + + // preparation stage + ext::set<SymbolType> common_alphabet = text.getAlphabet(); + common_alphabet.insert(pattern.getAlphabet().begin(), pattern.getAlphabet().end()); + + ext::map<SymbolType, ext::vector<bool> > D_vectors = BitParalelism::constructDVectors(common_alphabet, pattern); + + // computation part + ext::vector<unsigned int> result; + + auto B_vector = ext::vector<bool>(pattern.getContent().size(), 1); + + for(unsigned int i = 0; i<text.getContent().size(); i++) { + B_vector = (B_vector << 1) | D_vectors[text.getContent()[i]]; + + if (B_vector[pattern.getContent().size() - 1] == false) { + result.push_back(i - pattern.getContent().size() + 1); + } + } + + return result; +} + +} // namespace simulations + +} // namespace stringology + +#endif /* _EXACT_BIT_PARALELISM_H__ */ diff --git a/alib2algo/test-src/stringology/simulations/ExactBitParalelismTest.cpp b/alib2algo/test-src/stringology/simulations/ExactBitParalelismTest.cpp new file mode 100644 index 0000000000..d0268f8de5 --- /dev/null +++ b/alib2algo/test-src/stringology/simulations/ExactBitParalelismTest.cpp @@ -0,0 +1,20 @@ +#include "ExactBitParalelismTest.h" + +#include <string/LinearString.h> +#include <stringology/simulations/ExactBitParalelism.h> + +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION ( ExactBitParalelismTest, "bit paralelism" ); +CPPUNIT_TEST_SUITE_REGISTRATION ( ExactBitParalelismTest ); + +void ExactBitParalelismTest::testSimple() { + auto text = string::LinearString<>("adcabcaabadbbca"); + auto pattern = string::LinearString<>("adbbca"); + + ext::vector<unsigned int> expected_result = {9}; + + CPPUNIT_ASSERT(expected_result == stringology::simulations::ExactBitParalelism::search(text, pattern)); +} + +void ExactBitParalelismTest::setUp() { } + +void ExactBitParalelismTest::tearDown() { } diff --git a/alib2algo/test-src/stringology/simulations/ExactBitParalelismTest.h b/alib2algo/test-src/stringology/simulations/ExactBitParalelismTest.h new file mode 100644 index 0000000000..43c1d62322 --- /dev/null +++ b/alib2algo/test-src/stringology/simulations/ExactBitParalelismTest.h @@ -0,0 +1,17 @@ +#ifndef EXACT_BIT_PARALELISM_TEST_H_ +#define EXACT_BIT_PARALELISM_TEST_H_ + +#include <cppunit/extensions/HelperMacros.h> + +class ExactBitParalelismTest : public CppUnit::TestFixture { + CPPUNIT_TEST_SUITE(ExactBitParalelismTest); + CPPUNIT_TEST(testSimple); + CPPUNIT_TEST_SUITE_END(); + +public: + void setUp ( ); + void tearDown ( ); + + void testSimple(); +}; +#endif // EXACT_BIT_PARALELISM_TEST_H_ -- GitLab