37 const char *what()
const throw() {
38 return "k must be greater than 3, start must be less than len, \
39 and num threads must be greater or equal to the number of kmers/large windows \
40 large_wind_kmer_am can't be 0";
47template <digest::BadCharPolicy P>
48std::vector<uint32_t> thread_mod_roll1(
const char *seq,
size_t ind,
unsigned k,
49 uint32_t mod, uint32_t congruence,
51 unsigned assigned_kmer_am) {
52 std::vector<uint32_t> out;
54 congruence, ind, minimized_h);
55 dig.roll_minimizer(assigned_kmer_am, out);
59template <digest::BadCharPolicy P>
60std::vector<std::pair<uint32_t, uint32_t>>
61thread_mod_roll2(
const char *seq,
size_t ind,
unsigned k, uint32_t mod,
63 unsigned assigned_kmer_am) {
64 std::vector<std::pair<uint32_t, uint32_t>> out;
66 congruence, ind, minimized_h);
67 dig.roll_minimizer(assigned_kmer_am, out);
72template <digest::BadCharPolicy P,
class T>
73std::vector<uint32_t> thread_wind_roll1(
const char *seq,
size_t ind,
unsigned k,
74 uint32_t large_wind_kmer_am,
76 unsigned assigned_lwind_am) {
77 std::vector<uint32_t> out;
79 seq, ind + assigned_lwind_am + k + large_wind_kmer_am - 1 - 1, k,
80 large_wind_kmer_am, ind, minimized_h);
81 dig.roll_minimizer(assigned_lwind_am, out);
85template <digest::BadCharPolicy P,
class T>
86std::vector<std::pair<uint32_t, uint32_t>> thread_wind_roll2(
87 const char *seq,
size_t ind,
unsigned k, uint32_t large_wind_kmer_am,
89 std::vector<std::pair<uint32_t, uint32_t>> out;
91 seq, ind + assigned_lwind_am + k + large_wind_kmer_am - 1 - 1, k,
92 large_wind_kmer_am, ind, minimized_h);
93 dig.roll_minimizer(assigned_lwind_am, out);
98template <digest::BadCharPolicy P,
class T>
99std::vector<uint32_t> thread_sync_roll1(
const char *seq,
size_t ind,
unsigned k,
100 uint32_t large_wind_kmer_am,
102 unsigned assigned_lwind_am) {
103 std::vector<uint32_t> out;
105 seq, ind + assigned_lwind_am + k + large_wind_kmer_am - 1 - 1, k,
106 large_wind_kmer_am, ind, minimized_h);
107 dig.roll_minimizer(assigned_lwind_am, out);
111template <digest::BadCharPolicy P,
class T>
112std::vector<std::pair<uint32_t, uint32_t>> thread_sync_roll2(
113 const char *seq,
size_t ind,
unsigned k, uint32_t large_wind_kmer_am,
115 std::vector<std::pair<uint32_t, uint32_t>> out;
117 seq, ind + assigned_lwind_am + k + large_wind_kmer_am - 1 - 1, k,
118 large_wind_kmer_am, ind, minimized_h);
119 dig.roll_minimizer(assigned_lwind_am, out);
143template <digest::BadCharPolicy P>
145 unsigned thread_count, std::vector<std::vector<uint32_t>> &vec,
146 const char *seq,
size_t len,
unsigned k, uint32_t mod,
147 uint32_t congruence = 0,
size_t start = 0,
149 int num_kmers = (int)len - (
int)start - (int)k + 1;
150 if (k < 4 || start >= len || num_kmers < 0 ||
151 (
unsigned)num_kmers < thread_count) {
154 unsigned kmers_per_thread = num_kmers / thread_count;
155 unsigned extras = num_kmers % thread_count;
156 vec.reserve(thread_count);
157 std::vector<std::future<std::vector<uint32_t>>> thread_vector;
160 for (
unsigned i = 0; i < thread_count; i++) {
163 unsigned assigned_kmer_am = kmers_per_thread;
165 ++(assigned_kmer_am);
169 thread_vector.emplace_back(std::async(thread_mod_roll1<P>, seq, ind, k,
170 mod, congruence, minimized_h,
173 ind += assigned_kmer_am;
175 for (
auto &t : thread_vector) {
176 vec.emplace_back(t.get());
186template <digest::BadCharPolicy P>
188 unsigned thread_count, std::vector<std::vector<uint32_t>> &vec,
189 const std::string &seq,
unsigned k, uint32_t mod, uint32_t congruence = 0,
192 thread_mod<P>(thread_count, vec, seq.c_str(), seq.size(), k, mod,
193 congruence, start, minimized_h);
203template <digest::BadCharPolicy P>
205 unsigned thread_count,
206 std::vector<std::vector<std::pair<uint32_t, uint32_t>>> &vec,
207 const char *seq,
size_t len,
unsigned k, uint32_t mod,
208 uint32_t congruence = 0,
size_t start = 0,
210 int num_kmers = (int)len - (
int)start - (int)k + 1;
211 if (k < 4 || start >= len || num_kmers < 0 ||
212 (
unsigned)num_kmers < thread_count) {
215 unsigned kmers_per_thread = num_kmers / thread_count;
216 unsigned extras = num_kmers % thread_count;
217 vec.reserve(thread_count);
218 std::vector<std::future<std::vector<std::pair<uint32_t, uint32_t>>>>
222 for (
unsigned i = 0; i < thread_count; i++) {
225 unsigned assigned_kmer_am = kmers_per_thread;
227 ++(assigned_kmer_am);
231 thread_vector.emplace_back(std::async(thread_mod_roll2<P>, seq, ind, k,
232 mod, congruence, minimized_h,
235 ind += assigned_kmer_am;
237 for (
auto &t : thread_vector) {
238 vec.emplace_back(t.get());
249template <digest::BadCharPolicy P>
251 unsigned thread_count,
252 std::vector<std::vector<std::pair<uint32_t, uint32_t>>> &vec,
253 const std::string &seq,
unsigned k, uint32_t mod, uint32_t congruence = 0,
256 thread_mod<P>(thread_count, vec, seq.c_str(), seq.size(), k, mod,
257 congruence, start, minimized_h);
282template <digest::BadCharPolicy P,
class T>
284 unsigned thread_count, std::vector<std::vector<uint32_t>> &vec,
285 const char *seq,
size_t len,
unsigned k, uint32_t large_wind_kmer_am,
288 int num_lwinds = (int)len - (
int)start - (int)(k + large_wind_kmer_am) + 2;
289 if (large_wind_kmer_am == 0 || k < 4 || start >= len || num_lwinds < 0 ||
290 (
unsigned)num_lwinds < thread_count) {
293 unsigned lwinds_per_thread = num_lwinds / thread_count;
294 unsigned extras = num_lwinds % thread_count;
295 vec.reserve(thread_count);
296 std::vector<std::future<std::vector<uint32_t>>> thread_vector;
299 for (
unsigned i = 0; i < thread_count; i++) {
302 unsigned assigned_lwind_am = lwinds_per_thread;
304 ++(assigned_lwind_am);
308 thread_vector.emplace_back(std::async(thread_wind_roll1<P, T>, seq, ind,
309 k, large_wind_kmer_am,
310 minimized_h, assigned_lwind_am));
312 ind += assigned_lwind_am;
314 for (
auto &t : thread_vector) {
315 vec.emplace_back(t.get());
322 for (
unsigned i = 0; i < thread_count - 1; i++) {
323 int last = (int)vec[i].size() - 1;
324 if (vec[i][last] == vec[i + 1][0]) {
336template <digest::BadCharPolicy P,
class T>
338 unsigned thread_count, std::vector<std::vector<uint32_t>> &vec,
339 const std::string &seq,
unsigned k, uint32_t large_wind_kmer_am,
342 thread_wind<P, T>(thread_count, vec, seq.c_str(), seq.size(), k,
343 large_wind_kmer_am, start, minimized_h);
353template <digest::BadCharPolicy P,
class T>
355 unsigned thread_count,
356 std::vector<std::vector<std::pair<uint32_t, uint32_t>>> &vec,
357 const char *seq,
size_t len,
unsigned k, uint32_t large_wind_kmer_am,
360 int num_lwinds = (int)len - (
int)start - (int)(k + large_wind_kmer_am) + 2;
361 if (large_wind_kmer_am == 0 || k < 4 || start >= len || num_lwinds < 0 ||
362 (
unsigned)num_lwinds < thread_count) {
365 unsigned lwinds_per_thread = num_lwinds / thread_count;
366 unsigned extras = num_lwinds % thread_count;
367 vec.reserve(thread_count);
368 std::vector<std::future<std::pair<uint32_t, uint32_t>>> thread_vector;
371 for (
unsigned i = 0; i < thread_count; i++) {
374 unsigned assigned_lwind_am = lwinds_per_thread;
376 ++(assigned_lwind_am);
380 thread_vector.emplace_back(std::async(thread_wind_roll2<P, T>, seq, ind,
381 k, large_wind_kmer_am,
382 minimized_h, assigned_lwind_am));
384 ind += assigned_lwind_am;
386 for (
auto &t : thread_vector) {
387 vec.emplace_back(t.get());
394 for (
unsigned i = 0; i < thread_count - 1; i++) {
395 int last = (int)vec[i].size() - 1;
396 if (vec[i][last] == vec[i + 1][0]) {
409template <digest::BadCharPolicy P,
class T>
411 unsigned thread_count,
412 std::vector<std::vector<std::pair<uint32_t, uint32_t>>> &vec,
413 const std::string &seq,
unsigned k, uint32_t large_wind_kmer_am,
416 thread_wind<P, T>(thread_count, vec, seq.c_str(), seq.size(), k,
417 large_wind_kmer_am, start, minimized_h);
442template <digest::BadCharPolicy P,
class T>
444 unsigned thread_count, std::vector<std::vector<uint32_t>> &vec,
445 const char *seq,
size_t len,
unsigned k, uint32_t large_wind_kmer_am,
448 int num_lwinds = (int)len - (
int)start - (int)(k + large_wind_kmer_am) + 2;
449 if (large_wind_kmer_am == 0 || k < 4 || start >= len || num_lwinds < 0 ||
450 (
unsigned)num_lwinds < thread_count) {
453 unsigned lwinds_per_thread = num_lwinds / thread_count;
454 unsigned extras = num_lwinds % thread_count;
455 vec.reserve(thread_count);
456 std::vector<std::future<std::vector<uint32_t>>> thread_vector;
459 for (
unsigned i = 0; i < thread_count; i++) {
462 unsigned assigned_lwind_am = lwinds_per_thread;
464 ++(assigned_lwind_am);
468 thread_vector.emplace_back(std::async(thread_sync_roll1<P, T>, seq, ind,
469 k, large_wind_kmer_am,
470 minimized_h, assigned_lwind_am));
472 ind += assigned_lwind_am;
474 for (
auto &t : thread_vector) {
476 vec.emplace_back(t.get());
486template <digest::BadCharPolicy P,
class T>
488 unsigned thread_count, std::vector<std::vector<uint32_t>> &vec,
489 const std::string &seq,
unsigned k, uint32_t large_wind_kmer_am,
492 thread_sync<P, T>(thread_count, vec, seq.c_str(), seq.size(), k,
493 large_wind_kmer_am, start, minimized_h);
503template <digest::BadCharPolicy P,
class T>
505 unsigned thread_count,
506 std::vector<std::vector<std::pair<uint32_t, uint32_t>>> &vec,
507 const char *seq,
size_t len,
unsigned k, uint32_t large_wind_kmer_am,
510 int num_lwinds = (int)len - (
int)start - (int)(k + large_wind_kmer_am) + 2;
511 if (large_wind_kmer_am == 0 || k < 4 || start >= len || num_lwinds < 0 ||
512 (
unsigned)num_lwinds < thread_count) {
515 unsigned lwinds_per_thread = num_lwinds / thread_count;
516 unsigned extras = num_lwinds % thread_count;
517 vec.reserve(thread_count);
518 std::vector<std::future<std::vector<std::pair<uint32_t, uint32_t>>>>
522 for (
unsigned i = 0; i < thread_count; i++) {
525 unsigned assigned_lwind_am = lwinds_per_thread;
527 ++(assigned_lwind_am);
531 thread_vector.emplace_back(std::async(thread_sync_roll2<P, T>, seq, ind,
532 k, large_wind_kmer_am,
533 minimized_h, assigned_lwind_am));
535 ind += assigned_lwind_am;
537 for (
auto &t : thread_vector) {
538 vec.emplace_back(t.get());
549template <digest::BadCharPolicy P,
class T>
551 unsigned thread_count,
552 std::vector<std::vector<std::pair<uint32_t, uint32_t>>> &vec,
553 const std::string &seq,
unsigned k, uint32_t large_wind_kmer_am,
556 thread_sync<P, T>(thread_count, vec, seq.c_str(), seq.size(), k,
557 large_wind_kmer_am, start, minimized_h);