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