From f841f3e3ec97aacb478d86132e7daa59a02bb1dd Mon Sep 17 00:00:00 2001
From: Tomas Capek <tomas@capek.io>
Date: Thu, 3 May 2018 16:25:19 +0200
Subject: [PATCH] Rework simulation of Levenshtein searching automaton.

---
 .../LevenshteinDynamicProgramming.h           | 19 ++++++++++++++++---
 .../LevenshteinDynamicProgrammingTest.cpp     |  8 ++++++++
 .../LevenshteinDynamicProgrammingTest.h       |  2 ++
 3 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/alib2algo/src/stringology/simulations/LevenshteinDynamicProgramming.h b/alib2algo/src/stringology/simulations/LevenshteinDynamicProgramming.h
index 54a881e4c1..6584d91ce4 100644
--- a/alib2algo/src/stringology/simulations/LevenshteinDynamicProgramming.h
+++ b/alib2algo/src/stringology/simulations/LevenshteinDynamicProgramming.h
@@ -22,6 +22,8 @@ public:
     template <class SymbolType>
     static ext::vector<ext::vector<unsigned int>> compute_table(const string::LinearString<SymbolType> & text, const string::LinearString<SymbolType> & pattern);
 
+    template <class SymbolType>
+    static ext::set<unsigned int> search(const string::LinearString<SymbolType> & text, const string::LinearString<SymbolType> & pattern, unsigned int errors);
 };
 
 #include <iostream>
@@ -59,11 +61,22 @@ ext::vector<ext::vector<unsigned int>> LevenshteinDynamicProgramming::compute_ta
     }
   }
 
-  for(const auto & row : table) {
-    std::cout << row << std::endl;
+  return table;
+}
+
+template <class SymbolType>
+ext::set<unsigned int> LevenshteinDynamicProgramming::search(const string::LinearString<SymbolType> & text, const string::LinearString<SymbolType> & pattern, unsigned int errors) {
+  auto table = LevenshteinDynamicProgramming::compute_table(text, pattern);
+
+  ext::set<unsigned int> result;
+
+  for(unsigned int i = 0; i<= text.getContent().size(); i++) {
+    if(table[pattern.getContent().size()][i] <= errors) {
+      result.insert(i-1);
+    }
   }
 
-  return table;
+  return result;
 }
 
 
diff --git a/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.cpp b/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.cpp
index a87f8f14cc..378a4b41e0 100644
--- a/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.cpp
+++ b/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.cpp
@@ -23,6 +23,14 @@ void LevenshteinDynamicProgrammingTest::testTableConstruction() {
   CPPUNIT_ASSERT(expected_result == stringology::simulations::LevenshteinDynamicProgramming::compute_table(text, pattern));
 }
 
+void LevenshteinDynamicProgrammingTest::testSearch() {
+  auto text = string::LinearString<>("adcabcaabadbbca");
+  auto pattern = string::LinearString<>("adbbca");
+
+  ext::set<unsigned int> expected_result = {2, 3, 5, 6, 7, 9, 11, 12, 13, 14};
+  auto result = stringology::simulations::LevenshteinDynamicProgramming::search(text, pattern, 3);
+  CPPUNIT_ASSERT(expected_result == result);
+}
 
 void LevenshteinDynamicProgrammingTest::setUp() { }
 
diff --git a/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.h b/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.h
index 6dade7594b..2658bbafa6 100644
--- a/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.h
+++ b/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.h
@@ -6,6 +6,7 @@
 class LevenshteinDynamicProgrammingTest : public CppUnit::TestFixture {
 	CPPUNIT_TEST_SUITE(LevenshteinDynamicProgrammingTest);
     CPPUNIT_TEST(testTableConstruction);
+		CPPUNIT_TEST(testSearch);
   CPPUNIT_TEST_SUITE_END();
 
 public:
@@ -13,5 +14,6 @@ public:
     void tearDown ( );
 
     void testTableConstruction();
+		void testSearch();
 };
 #endif // LEVENSHTEIN_DYNAMIC_PROGRAMMING_TEST_H_
-- 
GitLab