123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- // SPDX-License-Identifier: GPL-3.0-or-later
- #ifndef SAMPLES_BUFFER_H
- #define SAMPLES_BUFFER_H
- #include <iostream>
- #include <vector>
- #include <cassert>
- #include <cstdlib>
- #include <cstring>
- #include <dlib/matrix.h>
- typedef double CalculatedNumber;
- typedef dlib::matrix<CalculatedNumber, 0, 1> DSample;
- class Sample {
- public:
- Sample(CalculatedNumber *Buf, size_t N) : CNs(Buf), NumDims(N) {}
- void initDSample(DSample &DS) const {
- for (size_t Idx = 0; Idx != NumDims; Idx++) {
- DS(Idx) = std::abs(CNs[Idx]);
- }
- }
- void add(const Sample &RHS) const {
- assert(NumDims == RHS.NumDims);
- for (size_t Idx = 0; Idx != NumDims; Idx++)
- CNs[Idx] += RHS.CNs[Idx];
- };
- void diff(const Sample &RHS) const {
- assert(NumDims == RHS.NumDims);
- for (size_t Idx = 0; Idx != NumDims; Idx++)
- CNs[Idx] -= RHS.CNs[Idx];
- };
- void copy(const Sample &RHS) const {
- assert(NumDims == RHS.NumDims);
- std::memcpy(CNs, RHS.CNs, NumDims * sizeof(CalculatedNumber));
- }
- void scale(CalculatedNumber Factor) {
- for (size_t Idx = 0; Idx != NumDims; Idx++)
- CNs[Idx] *= Factor;
- }
- void lag(const Sample &S, size_t LagN) {
- size_t N = S.NumDims;
- for (size_t Idx = 0; Idx != (LagN + 1); Idx++) {
- Sample Src(S.CNs - (Idx * N), N);
- Sample Dst(CNs + (Idx * N), N);
- Dst.copy(Src);
- }
- }
- const CalculatedNumber *getCalculatedNumbers() const {
- return CNs;
- };
- void print(std::ostream &OS) const;
- private:
- CalculatedNumber *CNs;
- size_t NumDims;
- };
- inline std::ostream& operator<<(std::ostream &OS, const Sample &S) {
- S.print(OS);
- return OS;
- }
- class SamplesBuffer {
- public:
- SamplesBuffer(CalculatedNumber *CNs,
- size_t NumSamples, size_t NumDimsPerSample,
- size_t DiffN, size_t SmoothN, size_t LagN,
- double SamplingRatio, std::vector<uint32_t> &RandNums) :
- CNs(CNs), NumSamples(NumSamples), NumDimsPerSample(NumDimsPerSample),
- DiffN(DiffN), SmoothN(SmoothN), LagN(LagN),
- SamplingRatio(SamplingRatio), RandNums(RandNums),
- BytesPerSample(NumDimsPerSample * sizeof(CalculatedNumber)),
- Preprocessed(false) {};
- std::vector<DSample> preprocess();
- std::vector<Sample> getPreprocessedSamples() const;
- size_t capacity() const { return NumSamples; }
- void print(std::ostream &OS) const;
- private:
- size_t getSampleOffset(size_t Index) const {
- assert(Index < NumSamples);
- return Index * NumDimsPerSample;
- }
- size_t getPreprocessedSampleOffset(size_t Index) const {
- assert(Index < NumSamples);
- return getSampleOffset(Index) * (LagN + 1);
- }
- void setSample(size_t Index, const Sample &S) const {
- size_t Offset = getSampleOffset(Index);
- std::memcpy(&CNs[Offset], S.getCalculatedNumbers(), BytesPerSample);
- }
- const Sample getSample(size_t Index) const {
- size_t Offset = getSampleOffset(Index);
- return Sample(&CNs[Offset], NumDimsPerSample);
- };
- const Sample getPreprocessedSample(size_t Index) const {
- size_t Offset = getPreprocessedSampleOffset(Index);
- return Sample(&CNs[Offset], NumDimsPerSample * (LagN + 1));
- };
- void diffSamples();
- void smoothSamples();
- void lagSamples();
- private:
- CalculatedNumber *CNs;
- size_t NumSamples;
- size_t NumDimsPerSample;
- size_t DiffN;
- size_t SmoothN;
- size_t LagN;
- double SamplingRatio;
- std::vector<uint32_t> &RandNums;
- size_t BytesPerSample;
- bool Preprocessed;
- };
- inline std::ostream& operator<<(std::ostream& OS, const SamplesBuffer &SB) {
- SB.print(OS);
- return OS;
- }
- #endif /* SAMPLES_BUFFER_H */
|