summaryrefslogtreecommitdiffstats
path: root/ml/SamplesBuffer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ml/SamplesBuffer.cc')
-rw-r--r--ml/SamplesBuffer.cc63
1 files changed, 48 insertions, 15 deletions
diff --git a/ml/SamplesBuffer.cc b/ml/SamplesBuffer.cc
index d276c6e09..359b60c23 100644
--- a/ml/SamplesBuffer.cc
+++ b/ml/SamplesBuffer.cc
@@ -54,12 +54,12 @@ void SamplesBuffer::diffSamples() {
void SamplesBuffer::smoothSamples() {
// Holds the mean value of each window
- CalculatedNumber *AccCNs = new CalculatedNumber[NumDimsPerSample]();
- Sample Acc(AccCNs, NumDimsPerSample);
+ CalculatedNumber AccCNs[1] = { 0 };
+ Sample Acc(AccCNs, 1);
// Used to avoid clobbering the accumulator when moving the window
- CalculatedNumber *TmpCNs = new CalculatedNumber[NumDimsPerSample]();
- Sample Tmp(TmpCNs, NumDimsPerSample);
+ CalculatedNumber TmpCNs[1] = { 0 };
+ Sample Tmp(TmpCNs, 1);
CalculatedNumber Factor = (CalculatedNumber) 1 / SmoothN;
@@ -88,9 +88,6 @@ void SamplesBuffer::smoothSamples() {
Acc.copy(Tmp);
Acc.scale(Factor);
}
-
- delete[] AccCNs;
- delete[] TmpCNs;
}
void SamplesBuffer::lagSamples() {
@@ -103,31 +100,30 @@ void SamplesBuffer::lagSamples() {
}
}
-std::vector<DSample> SamplesBuffer::preprocess() {
+void SamplesBuffer::preprocess(std::vector<DSample> &Samples) {
assert(Preprocessed == false);
- std::vector<DSample> DSamples;
size_t OutN = NumSamples;
// Diff
if (DiffN >= OutN)
- return DSamples;
+ return;
OutN -= DiffN;
diffSamples();
// Smooth
if (SmoothN == 0 || SmoothN > OutN)
- return DSamples;
+ return;
OutN -= (SmoothN - 1);
smoothSamples();
// Lag
if (LagN >= OutN)
- return DSamples;
+ return;
OutN -= LagN;
lagSamples();
- DSamples.reserve(OutN);
+ Samples.reserve(OutN);
Preprocessed = true;
uint32_t MaxMT = std::numeric_limits<uint32_t>::max();
@@ -143,8 +139,45 @@ std::vector<DSample> SamplesBuffer::preprocess() {
const Sample PS = getPreprocessedSample(Idx);
PS.initDSample(DS);
- DSamples.push_back(DS);
+ Samples.push_back(std::move(DS));
}
+}
+
+void SamplesBuffer::preprocess(DSample &Feature) {
+ assert(Preprocessed == false);
+
+ size_t OutN = NumSamples;
+
+ // Diff
+ if (DiffN >= OutN)
+ return;
+ OutN -= DiffN;
+ diffSamples();
- return DSamples;
+ // Smooth
+ if (SmoothN == 0 || SmoothN > OutN)
+ return;
+ OutN -= (SmoothN - 1);
+ smoothSamples();
+
+ // Lag
+ if (LagN >= OutN)
+ return;
+ OutN -= LagN;
+ lagSamples();
+
+ Preprocessed = true;
+
+ uint32_t MaxMT = std::numeric_limits<uint32_t>::max();
+ uint32_t CutOff = static_cast<double>(MaxMT) * SamplingRatio;
+
+ for (size_t Idx = NumSamples - OutN; Idx != NumSamples; Idx++) {
+ if (RandNums[Idx] > CutOff)
+ continue;
+
+ Feature.set_size(NumDimsPerSample * (LagN + 1));
+
+ const Sample PS = getPreprocessedSample(Idx);
+ PS.initDSample(Feature);
+ }
}