File: SubsetMinimizerFinder.cc

package info (click to toggle)
last-align 963-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 3,380 kB
  • sloc: cpp: 41,136; python: 2,744; ansic: 1,240; makefile: 383; sh: 255
file content (49 lines) | stat: -rw-r--r-- 1,335 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// Copyright 2016 Martin C. Frith

#include "SubsetMinimizerFinder.hh"
#include "CyclicSubsetSeed.hh"

namespace cbrc {

void SubsetMinimizerFinder::init(const CyclicSubsetSeed &seed,
				 const uchar *text,
				 size_t beg,
				 size_t end) {
  const uchar *m = seed.firstMap();
  while (beg < end && m[text[beg]] == CyclicSubsetSeed::DELIMITER) ++beg;
  minima.assign(1, beg);
}

bool SubsetMinimizerFinder::isMinimizer(const CyclicSubsetSeed &seed,
					const uchar *text,
					size_t pos,
					size_t end,
					size_t window) {
  const uchar *subsetMap = seed.firstMap();

  while (true) {
    size_t currentMinimum = minima[0];
    if (currentMinimum > pos) return false;
    if (currentMinimum == pos) return true;
    size_t newPos = minima.back() + 1;
    if (newPos == end) return false;
    const uchar *newText = text + newPos;
    if (subsetMap[*newText] == CyclicSubsetSeed::DELIMITER) {
      init(seed, text, newPos + 1, end);
      continue;
    }
    size_t stop = (newPos - currentMinimum >= window);
    size_t i = minima.size();
    while (i > stop) {
      size_t oldPos = minima[i - 1];
      const uchar *oldText = text + oldPos;
      if (!seed.isLess(newText, oldText, subsetMap)) break;
      --i;
    }
    minima.resize(i);
    if (stop) minima.erase(minima.begin());
    minima.push_back(newPos);
  }
}

}