stride-align 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +201 -0
- data/NOTICE +255 -0
- data/README.md +107 -0
- data/data/bmpm_data/gen_approx_any.txt +131 -0
- data/data/bmpm_data/gen_approx_arabic.txt +26 -0
- data/data/bmpm_data/gen_approx_common.txt +233 -0
- data/data/bmpm_data/gen_approx_cyrillic.txt +18 -0
- data/data/bmpm_data/gen_approx_czech.txt +18 -0
- data/data/bmpm_data/gen_approx_dutch.txt +18 -0
- data/data/bmpm_data/gen_approx_english.txt +47 -0
- data/data/bmpm_data/gen_approx_french.txt +25 -0
- data/data/bmpm_data/gen_approx_german.txt +73 -0
- data/data/bmpm_data/gen_approx_greek.txt +18 -0
- data/data/bmpm_data/gen_approx_greeklatin.txt +20 -0
- data/data/bmpm_data/gen_approx_hebrew.txt +18 -0
- data/data/bmpm_data/gen_approx_hungarian.txt +18 -0
- data/data/bmpm_data/gen_approx_italian.txt +18 -0
- data/data/bmpm_data/gen_approx_polish.txt +84 -0
- data/data/bmpm_data/gen_approx_portuguese.txt +18 -0
- data/data/bmpm_data/gen_approx_romanian.txt +18 -0
- data/data/bmpm_data/gen_approx_russian.txt +48 -0
- data/data/bmpm_data/gen_approx_spanish.txt +21 -0
- data/data/bmpm_data/gen_approx_turkish.txt +18 -0
- data/data/bmpm_data/gen_exact_any.txt +40 -0
- data/data/bmpm_data/gen_exact_approx_common.txt +79 -0
- data/data/bmpm_data/gen_exact_arabic.txt +18 -0
- data/data/bmpm_data/gen_exact_common.txt +32 -0
- data/data/bmpm_data/gen_exact_cyrillic.txt +18 -0
- data/data/bmpm_data/gen_exact_czech.txt +18 -0
- data/data/bmpm_data/gen_exact_dutch.txt +18 -0
- data/data/bmpm_data/gen_exact_english.txt +18 -0
- data/data/bmpm_data/gen_exact_french.txt +18 -0
- data/data/bmpm_data/gen_exact_german.txt +18 -0
- data/data/bmpm_data/gen_exact_greek.txt +18 -0
- data/data/bmpm_data/gen_exact_greeklatin.txt +18 -0
- data/data/bmpm_data/gen_exact_hebrew.txt +18 -0
- data/data/bmpm_data/gen_exact_hungarian.txt +18 -0
- data/data/bmpm_data/gen_exact_italian.txt +18 -0
- data/data/bmpm_data/gen_exact_polish.txt +23 -0
- data/data/bmpm_data/gen_exact_portuguese.txt +18 -0
- data/data/bmpm_data/gen_exact_romanian.txt +18 -0
- data/data/bmpm_data/gen_exact_russian.txt +19 -0
- data/data/bmpm_data/gen_exact_spanish.txt +19 -0
- data/data/bmpm_data/gen_exact_turkish.txt +18 -0
- data/data/bmpm_data/gen_hebrew_common.txt +113 -0
- data/data/bmpm_data/gen_lang.txt +295 -0
- data/data/bmpm_data/gen_languages.txt +36 -0
- data/data/bmpm_data/gen_rules_any.txt +367 -0
- data/data/bmpm_data/gen_rules_arabic.txt +76 -0
- data/data/bmpm_data/gen_rules_cyrillic.txt +99 -0
- data/data/bmpm_data/gen_rules_czech.txt +67 -0
- data/data/bmpm_data/gen_rules_dutch.txt +78 -0
- data/data/bmpm_data/gen_rules_english.txt +113 -0
- data/data/bmpm_data/gen_rules_french.txt +114 -0
- data/data/bmpm_data/gen_rules_german.txt +129 -0
- data/data/bmpm_data/gen_rules_greek.txt +97 -0
- data/data/bmpm_data/gen_rules_greeklatin.txt +118 -0
- data/data/bmpm_data/gen_rules_hebrew.txt +62 -0
- data/data/bmpm_data/gen_rules_hungarian.txt +83 -0
- data/data/bmpm_data/gen_rules_italian.txt +77 -0
- data/data/bmpm_data/gen_rules_polish.txt +185 -0
- data/data/bmpm_data/gen_rules_portuguese.txt +105 -0
- data/data/bmpm_data/gen_rules_romanian.txt +64 -0
- data/data/bmpm_data/gen_rules_russian.txt +142 -0
- data/data/bmpm_data/gen_rules_spanish.txt +85 -0
- data/data/bmpm_data/gen_rules_turkish.txt +50 -0
- data/data/keyboard_data/qwerty.npy +0 -0
- data/data/matrix_data/BLOSUM100 +31 -0
- data/data/matrix_data/BLOSUM30 +31 -0
- data/data/matrix_data/BLOSUM35 +31 -0
- data/data/matrix_data/BLOSUM40 +31 -0
- data/data/matrix_data/BLOSUM45 +25 -0
- data/data/matrix_data/BLOSUM50 +25 -0
- data/data/matrix_data/BLOSUM55 +31 -0
- data/data/matrix_data/BLOSUM60 +31 -0
- data/data/matrix_data/BLOSUM62 +25 -0
- data/data/matrix_data/BLOSUM65 +31 -0
- data/data/matrix_data/BLOSUM70 +31 -0
- data/data/matrix_data/BLOSUM75 +31 -0
- data/data/matrix_data/BLOSUM80 +25 -0
- data/data/matrix_data/BLOSUM85 +31 -0
- data/data/matrix_data/BLOSUM90 +25 -0
- data/data/matrix_data/NUC.4.4 +25 -0
- data/data/matrix_data/PAM10 +34 -0
- data/data/matrix_data/PAM100 +34 -0
- data/data/matrix_data/PAM110 +34 -0
- data/data/matrix_data/PAM120 +34 -0
- data/data/matrix_data/PAM130 +34 -0
- data/data/matrix_data/PAM140 +34 -0
- data/data/matrix_data/PAM150 +34 -0
- data/data/matrix_data/PAM160 +34 -0
- data/data/matrix_data/PAM170 +34 -0
- data/data/matrix_data/PAM180 +34 -0
- data/data/matrix_data/PAM190 +34 -0
- data/data/matrix_data/PAM20 +34 -0
- data/data/matrix_data/PAM200 +34 -0
- data/data/matrix_data/PAM210 +34 -0
- data/data/matrix_data/PAM220 +34 -0
- data/data/matrix_data/PAM230 +34 -0
- data/data/matrix_data/PAM240 +34 -0
- data/data/matrix_data/PAM250 +25 -0
- data/data/matrix_data/PAM260 +34 -0
- data/data/matrix_data/PAM270 +34 -0
- data/data/matrix_data/PAM280 +34 -0
- data/data/matrix_data/PAM290 +34 -0
- data/data/matrix_data/PAM30 +25 -0
- data/data/matrix_data/PAM300 +34 -0
- data/data/matrix_data/PAM310 +34 -0
- data/data/matrix_data/PAM320 +34 -0
- data/data/matrix_data/PAM330 +34 -0
- data/data/matrix_data/PAM340 +34 -0
- data/data/matrix_data/PAM350 +34 -0
- data/data/matrix_data/PAM360 +34 -0
- data/data/matrix_data/PAM370 +34 -0
- data/data/matrix_data/PAM380 +34 -0
- data/data/matrix_data/PAM390 +34 -0
- data/data/matrix_data/PAM40 +34 -0
- data/data/matrix_data/PAM400 +34 -0
- data/data/matrix_data/PAM410 +34 -0
- data/data/matrix_data/PAM420 +34 -0
- data/data/matrix_data/PAM430 +34 -0
- data/data/matrix_data/PAM440 +34 -0
- data/data/matrix_data/PAM450 +34 -0
- data/data/matrix_data/PAM460 +34 -0
- data/data/matrix_data/PAM470 +34 -0
- data/data/matrix_data/PAM480 +34 -0
- data/data/matrix_data/PAM490 +34 -0
- data/data/matrix_data/PAM50 +34 -0
- data/data/matrix_data/PAM500 +34 -0
- data/data/matrix_data/PAM60 +34 -0
- data/data/matrix_data/PAM70 +25 -0
- data/data/matrix_data/PAM80 +34 -0
- data/data/matrix_data/PAM90 +34 -0
- data/ext/stride_align/backend_avx2.cpp +2 -0
- data/ext/stride_align/backend_avx512bwvl.cpp +2 -0
- data/ext/stride_align/backend_generic.cpp +3 -0
- data/ext/stride_align/backend_impl.hpp +983 -0
- data/ext/stride_align/backend_lasx.cpp +2 -0
- data/ext/stride_align/backend_lsx.cpp +2 -0
- data/ext/stride_align/backend_neon.cpp +2 -0
- data/ext/stride_align/backend_rvv.cpp +2 -0
- data/ext/stride_align/backend_sse41.cpp +2 -0
- data/ext/stride_align/backend_sve.cpp +2 -0
- data/ext/stride_align/backend_sve2.cpp +2 -0
- data/ext/stride_align/backend_vsx.cpp +2 -0
- data/ext/stride_align/beider_morse_impl.cpp +5 -0
- data/ext/stride_align/cpu_detect.cpp +172 -0
- data/ext/stride_align/cpu_detect.hpp +6 -0
- data/ext/stride_align/extconf.rb +114 -0
- data/ext/stride_align/target_profile.hpp +82 -0
- data/ext/stride_align/vendor/beider_morse_impl.cpp +1467 -0
- data/ext/stride_align/vendor/stride_align/alignment.hpp +199 -0
- data/ext/stride_align/vendor/stride_align/batch.hpp +812 -0
- data/ext/stride_align/vendor/stride_align/beider_morse.hpp +121 -0
- data/ext/stride_align/vendor/stride_align/caverphone.hpp +222 -0
- data/ext/stride_align/vendor/stride_align/cologne_phonetic.hpp +202 -0
- data/ext/stride_align/vendor/stride_align/core.hpp +731 -0
- data/ext/stride_align/vendor/stride_align/daitch_mokotoff.hpp +631 -0
- data/ext/stride_align/vendor/stride_align/double_metaphone.hpp +796 -0
- data/ext/stride_align/vendor/stride_align/dtw.hpp +300 -0
- data/ext/stride_align/vendor/stride_align/encoded.hpp +235 -0
- data/ext/stride_align/vendor/stride_align/hamming.hpp +55 -0
- data/ext/stride_align/vendor/stride_align/indel.hpp +1200 -0
- data/ext/stride_align/vendor/stride_align/jaro.hpp +517 -0
- data/ext/stride_align/vendor/stride_align/lcs.hpp +159 -0
- data/ext/stride_align/vendor/stride_align/levenshtein.hpp +1247 -0
- data/ext/stride_align/vendor/stride_align/levenshtein_prepared.hpp +193 -0
- data/ext/stride_align/vendor/stride_align/match_rating.hpp +168 -0
- data/ext/stride_align/vendor/stride_align/metaphone.hpp +291 -0
- data/ext/stride_align/vendor/stride_align/ngram.hpp +176 -0
- data/ext/stride_align/vendor/stride_align/nysiis.hpp +199 -0
- data/ext/stride_align/vendor/stride_align/pairwise_alignment.hpp +465 -0
- data/ext/stride_align/vendor/stride_align/partial_ratio.hpp +486 -0
- data/ext/stride_align/vendor/stride_align/ratcliff_obershelp.hpp +101 -0
- data/ext/stride_align/vendor/stride_align/soundex.hpp +108 -0
- data/ext/stride_align/vendor/stride_align/token_ratios.hpp +445 -0
- data/ext/stride_align/vendor/stride_align/types.hpp +16 -0
- data/ext/stride_align/vendor/stride_align/utf8.hpp +512 -0
- data/ext/stride_align/vendor/stride_align/wratio.hpp +363 -0
- data/lib/stride_align/algorithms.rb +296 -0
- data/lib/stride_align/alignment_path.rb +217 -0
- data/lib/stride_align/backend.rb +47 -0
- data/lib/stride_align/batch.rb +705 -0
- data/lib/stride_align/core.rb +180 -0
- data/lib/stride_align/keyboard.rb +200 -0
- data/lib/stride_align/matrices.rb +403 -0
- data/lib/stride_align/version.rb +5 -0
- data/lib/stride_align.rb +87 -0
- metadata +231 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <charconv>
|
|
4
|
+
#include <cstddef>
|
|
5
|
+
#include <string>
|
|
6
|
+
#include <string_view>
|
|
7
|
+
#include <vector>
|
|
8
|
+
|
|
9
|
+
#include "stride_align/types.hpp"
|
|
10
|
+
|
|
11
|
+
namespace stride_align {
|
|
12
|
+
|
|
13
|
+
struct AlignmentPath {
|
|
14
|
+
Score score = 0;
|
|
15
|
+
std::size_t query_start = 0;
|
|
16
|
+
std::size_t query_end = 0;
|
|
17
|
+
std::size_t target_start = 0;
|
|
18
|
+
std::size_t target_end = 0;
|
|
19
|
+
std::string operations;
|
|
20
|
+
std::string cigar;
|
|
21
|
+
std::size_t matches = 0;
|
|
22
|
+
std::size_t mismatches = 0;
|
|
23
|
+
std::size_t insertions = 0;
|
|
24
|
+
std::size_t deletions = 0;
|
|
25
|
+
std::size_t aligned_length = 0;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
inline std::string build_cigar(std::string_view operations) {
|
|
29
|
+
std::string cigar;
|
|
30
|
+
if (operations.empty()) {
|
|
31
|
+
return cigar;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
cigar.reserve(operations.size());
|
|
35
|
+
|
|
36
|
+
char digits[20];
|
|
37
|
+
const auto emit_count = [&](std::size_t value) {
|
|
38
|
+
const auto end = std::to_chars(digits, digits + sizeof(digits), value).ptr;
|
|
39
|
+
cigar.append(digits, end);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
char current = operations.front();
|
|
43
|
+
std::size_t count = 0;
|
|
44
|
+
for (const char operation : operations) {
|
|
45
|
+
if (operation == current) {
|
|
46
|
+
++count;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
emit_count(count);
|
|
50
|
+
cigar.push_back(current);
|
|
51
|
+
current = operation;
|
|
52
|
+
count = 1;
|
|
53
|
+
}
|
|
54
|
+
emit_count(count);
|
|
55
|
+
cigar.push_back(current);
|
|
56
|
+
return cigar;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
inline std::string expand_cigar(std::string_view cigar) {
|
|
60
|
+
std::string operations;
|
|
61
|
+
std::size_t count = 0;
|
|
62
|
+
for (const char value : cigar) {
|
|
63
|
+
if (value >= '0' && value <= '9') {
|
|
64
|
+
count = count * 10U + static_cast<std::size_t>(value - '0');
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
operations.append(count, value);
|
|
68
|
+
count = 0;
|
|
69
|
+
}
|
|
70
|
+
return operations;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
class ReverseCigarBuilder {
|
|
74
|
+
public:
|
|
75
|
+
ReverseCigarBuilder() {
|
|
76
|
+
runs_.reserve(64U);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
void push(char operation) {
|
|
80
|
+
if (!runs_.empty() && runs_.back().operation == operation) {
|
|
81
|
+
++runs_.back().count;
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
runs_.push_back({operation, 1U});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
std::string str() const {
|
|
88
|
+
std::string cigar;
|
|
89
|
+
cigar.reserve(runs_.size() * 4U);
|
|
90
|
+
char digits[20];
|
|
91
|
+
for (auto it = runs_.rbegin(); it != runs_.rend(); ++it) {
|
|
92
|
+
const auto end = std::to_chars(digits, digits + sizeof(digits), it->count).ptr;
|
|
93
|
+
cigar.append(digits, end);
|
|
94
|
+
cigar.push_back(it->operation);
|
|
95
|
+
}
|
|
96
|
+
return cigar;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
private:
|
|
100
|
+
struct Run {
|
|
101
|
+
char operation;
|
|
102
|
+
std::size_t count;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
std::vector<Run> runs_;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
inline AlignmentPath make_alignment_path(
|
|
109
|
+
Score score,
|
|
110
|
+
std::size_t query_start,
|
|
111
|
+
std::size_t query_end,
|
|
112
|
+
std::size_t target_start,
|
|
113
|
+
std::size_t target_end,
|
|
114
|
+
std::string_view operations) {
|
|
115
|
+
AlignmentPath path;
|
|
116
|
+
path.score = score;
|
|
117
|
+
path.query_start = query_start;
|
|
118
|
+
path.query_end = query_end;
|
|
119
|
+
path.target_start = target_start;
|
|
120
|
+
path.target_end = target_end;
|
|
121
|
+
path.operations = std::string(operations);
|
|
122
|
+
path.cigar = build_cigar(operations);
|
|
123
|
+
path.aligned_length = operations.size();
|
|
124
|
+
|
|
125
|
+
for (const char operation : operations) {
|
|
126
|
+
switch (operation) {
|
|
127
|
+
case '=':
|
|
128
|
+
++path.matches;
|
|
129
|
+
break;
|
|
130
|
+
case 'X':
|
|
131
|
+
++path.mismatches;
|
|
132
|
+
break;
|
|
133
|
+
case 'I':
|
|
134
|
+
++path.insertions;
|
|
135
|
+
break;
|
|
136
|
+
case 'D':
|
|
137
|
+
++path.deletions;
|
|
138
|
+
break;
|
|
139
|
+
default:
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return path;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
inline AlignmentPath make_alignment_path_from_cigar(
|
|
148
|
+
Score score,
|
|
149
|
+
std::size_t query_start,
|
|
150
|
+
std::size_t query_end,
|
|
151
|
+
std::size_t target_start,
|
|
152
|
+
std::size_t target_end,
|
|
153
|
+
std::string_view cigar) {
|
|
154
|
+
AlignmentPath path;
|
|
155
|
+
path.score = score;
|
|
156
|
+
path.query_start = query_start;
|
|
157
|
+
path.query_end = query_end;
|
|
158
|
+
path.target_start = target_start;
|
|
159
|
+
path.target_end = target_end;
|
|
160
|
+
path.cigar = std::string(cigar);
|
|
161
|
+
|
|
162
|
+
std::size_t count = 0;
|
|
163
|
+
for (const char value : cigar) {
|
|
164
|
+
if (value >= '0' && value <= '9') {
|
|
165
|
+
count = count * 10U + static_cast<std::size_t>(value - '0');
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
path.operations.append(count, value);
|
|
169
|
+
path.aligned_length += count;
|
|
170
|
+
switch (value) {
|
|
171
|
+
case '=':
|
|
172
|
+
path.matches += count;
|
|
173
|
+
break;
|
|
174
|
+
case 'X':
|
|
175
|
+
path.mismatches += count;
|
|
176
|
+
break;
|
|
177
|
+
case 'I':
|
|
178
|
+
path.insertions += count;
|
|
179
|
+
break;
|
|
180
|
+
case 'D':
|
|
181
|
+
path.deletions += count;
|
|
182
|
+
break;
|
|
183
|
+
default:
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
count = 0;
|
|
187
|
+
}
|
|
188
|
+
return path;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
inline AlignmentPath make_global_alignment_path_from_cigar(
|
|
192
|
+
Score score,
|
|
193
|
+
std::size_t query_size,
|
|
194
|
+
std::size_t target_size,
|
|
195
|
+
std::string_view cigar) {
|
|
196
|
+
return make_alignment_path_from_cigar(score, 0U, query_size, 0U, target_size, cigar);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
} // namespace stride_align
|