Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
LevenshteinBitParalelism.h
Go to the documentation of this file.
1
6#pragma once
7
8#include <exception>
9#include <string/LinearString.h>
10
11#include "BitParalelism.h"
12
13namespace stringology {
14
15namespace simulations {
16
18public:
19 template <class SymbolType>
20 static ext::set<unsigned int> search(const string::LinearString<SymbolType> & text, const string::LinearString<SymbolType> & pattern, unsigned int errors);
21};
22
23
24template <class SymbolType>
26 // preparation stage
27 ext::set<SymbolType> common_alphabet = text.getAlphabet();
28 common_alphabet.insert(pattern.getAlphabet().begin(), pattern.getAlphabet().end());
29
31
32 ext::vector<bool> V_vector (pattern.getContent().size(), false);
33 V_vector[pattern.getContent().size() - 1] = true;
34
35 // computation part
37
39 for(unsigned int i=0; i<=errors; i++) {
40 B_vectors.push_back(ext::vector<bool>(pattern.getContent().size(), false));
41 }
42
43 for(unsigned int l = 0; l <= errors; l++) {
44 for(unsigned int j = l; j <= pattern.getContent().size(); j++) {
45 B_vectors[l][j] = true;
46 }
47 }
48
49 // 0-th column
50 ext::vector<bool> b0 = ext::vector < bool > ( pattern.getContent().size(), true );
51 for(unsigned int j=1; j<=errors; j++) {
52 b0 <<= 1;
53 if ( ! b0 [ pattern.getContent ( ).size ( ) - 1 ] ) {
54 result.insert(0);
55 break;
56 }
57 }
58
59
60 for(unsigned int i=0; i<text.getContent().size(); i++) {
61 ext::vector< ext::vector<bool> > previous_B_vectors = B_vectors;
62
63 B_vectors[0] = (B_vectors[0] << 1) | D_vectors[text.getContent()[i]];
64
65 for(unsigned int j=1; j<=errors; j++) {
66 B_vectors[j] = ((previous_B_vectors[j] << 1) | D_vectors[text.getContent()[i]]) &
67 ( (previous_B_vectors[j-1] & B_vectors[j-1]) << 1) &
68 ( previous_B_vectors[j-1] | V_vector );
69 }
70
71 for (const auto & data : B_vectors) {
72 if ( ! data [ pattern.getContent ( ).size ( ) - 1 ] ) {
73 result.insert(i+1);
74 break;
75 }
76 }
77 }
78
79 return result;
80}
81
82} // namespace simulations
83
84} // namespace stringology
85
Class extending the map class from the standard library. Original reason is to allow printing of the ...
Definition: map.hpp:48
Definition: set.hpp:44
Class extending the vector class from the standard library. Original reason is to allow printing of t...
Definition: vector.hpp:45
Linear string.
Definition: LinearString.h:57
const ext::set< SymbolType > & getAlphabet() const &
Definition: LinearString.h:103
const ext::vector< SymbolType > & getContent() const &
Definition: LinearString.h:238
static ext::map< SymbolType, ext::vector< bool > > constructDVectors(const ext::set< SymbolType > &alphabet, const string::LinearString< SymbolType > &pattern)
Definition: BitParalelism.h:22
Definition: LevenshteinBitParalelism.h:17
static ext::set< unsigned int > search(const string::LinearString< SymbolType > &text, const string::LinearString< SymbolType > &pattern, unsigned int errors)
Definition: LevenshteinBitParalelism.h:25
int i
Definition: AllEpsilonClosure.h:118
for(const StateType &state :fsm.getStates()) renamingData.insert(std Rename::RenamedAutomaton< T > result(renamingData.at(fsm.getInitialState()))
Definition: Rename.h:253
Definition: ArithmeticCompression.h:18