-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathquality_model.h
More file actions
48 lines (38 loc) · 1.08 KB
/
Copy pathquality_model.h
File metadata and controls
48 lines (38 loc) · 1.08 KB
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
#pragma once
#include "adaptive_model.h"
#include <cstdint>
#include <vector>
class QualityModel {
public:
explicit QualityModel(size_t alphabet_size)
: default_(alphabet_size)
, models_(1, default_)
, model_ptr_(&models_[0])
, position_(0)
{ }
void Update(unsigned char symbol)
{
model_ptr_->Update<14>(symbol);
if (symbol) {
const size_t index = (++position_ << 8) | symbol;
if (index >= models_.size()) {
models_.resize(index + 1);
}
model_ptr_ = &models_[index];
if (model_ptr_->cdf().empty()) {
*model_ptr_ = default_;
}
} else {
model_ptr_ = &models_[0];
position_ = 0;
}
}
const std::vector<uint32_t>& cdf() const { return model_ptr_->cdf(); }
private:
AdaptiveModel default_;
std::vector<AdaptiveModel> models_;
AdaptiveModel* model_ptr_;
size_t position_;
QualityModel(const QualityModel&) = delete;
QualityModel& operator= (const QualityModel&) = delete;
};