SamplesBuffer.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #ifndef SAMPLES_BUFFER_H
  3. #define SAMPLES_BUFFER_H
  4. #include <iostream>
  5. #include <vector>
  6. #include <cassert>
  7. #include <cstdlib>
  8. #include <cstring>
  9. #include <dlib/matrix.h>
  10. typedef double CalculatedNumber;
  11. typedef dlib::matrix<CalculatedNumber, 0, 1> DSample;
  12. class Sample {
  13. public:
  14. Sample(CalculatedNumber *Buf, size_t N) : CNs(Buf), NumDims(N) {}
  15. void initDSample(DSample &DS) const {
  16. for (size_t Idx = 0; Idx != NumDims; Idx++) {
  17. DS(Idx) = std::abs(CNs[Idx]);
  18. }
  19. }
  20. void add(const Sample &RHS) const {
  21. assert(NumDims == RHS.NumDims);
  22. for (size_t Idx = 0; Idx != NumDims; Idx++)
  23. CNs[Idx] += RHS.CNs[Idx];
  24. };
  25. void diff(const Sample &RHS) const {
  26. assert(NumDims == RHS.NumDims);
  27. for (size_t Idx = 0; Idx != NumDims; Idx++)
  28. CNs[Idx] -= RHS.CNs[Idx];
  29. };
  30. void copy(const Sample &RHS) const {
  31. assert(NumDims == RHS.NumDims);
  32. std::memcpy(CNs, RHS.CNs, NumDims * sizeof(CalculatedNumber));
  33. }
  34. void scale(CalculatedNumber Factor) {
  35. for (size_t Idx = 0; Idx != NumDims; Idx++)
  36. CNs[Idx] *= Factor;
  37. }
  38. void lag(const Sample &S, size_t LagN) {
  39. size_t N = S.NumDims;
  40. for (size_t Idx = 0; Idx != (LagN + 1); Idx++) {
  41. Sample Src(S.CNs - (Idx * N), N);
  42. Sample Dst(CNs + (Idx * N), N);
  43. Dst.copy(Src);
  44. }
  45. }
  46. const CalculatedNumber *getCalculatedNumbers() const {
  47. return CNs;
  48. };
  49. void print(std::ostream &OS) const;
  50. private:
  51. CalculatedNumber *CNs;
  52. size_t NumDims;
  53. };
  54. inline std::ostream& operator<<(std::ostream &OS, const Sample &S) {
  55. S.print(OS);
  56. return OS;
  57. }
  58. class SamplesBuffer {
  59. public:
  60. SamplesBuffer(CalculatedNumber *CNs,
  61. size_t NumSamples, size_t NumDimsPerSample,
  62. size_t DiffN, size_t SmoothN, size_t LagN,
  63. double SamplingRatio, std::vector<uint32_t> &RandNums) :
  64. CNs(CNs), NumSamples(NumSamples), NumDimsPerSample(NumDimsPerSample),
  65. DiffN(DiffN), SmoothN(SmoothN), LagN(LagN),
  66. SamplingRatio(SamplingRatio), RandNums(RandNums),
  67. BytesPerSample(NumDimsPerSample * sizeof(CalculatedNumber)),
  68. Preprocessed(false) {
  69. assert(NumDimsPerSample == 1 && "SamplesBuffer supports only one dimension per sample");
  70. };
  71. void preprocess(std::vector<DSample> &Samples);
  72. void preprocess(DSample &Feature);
  73. std::vector<Sample> getPreprocessedSamples() const;
  74. size_t capacity() const { return NumSamples; }
  75. void print(std::ostream &OS) const;
  76. private:
  77. size_t getSampleOffset(size_t Index) const {
  78. assert(Index < NumSamples);
  79. return Index * NumDimsPerSample;
  80. }
  81. size_t getPreprocessedSampleOffset(size_t Index) const {
  82. assert(Index < NumSamples);
  83. return getSampleOffset(Index) * (LagN + 1);
  84. }
  85. void setSample(size_t Index, const Sample &S) const {
  86. size_t Offset = getSampleOffset(Index);
  87. std::memcpy(&CNs[Offset], S.getCalculatedNumbers(), BytesPerSample);
  88. }
  89. const Sample getSample(size_t Index) const {
  90. size_t Offset = getSampleOffset(Index);
  91. return Sample(&CNs[Offset], NumDimsPerSample);
  92. };
  93. const Sample getPreprocessedSample(size_t Index) const {
  94. size_t Offset = getPreprocessedSampleOffset(Index);
  95. return Sample(&CNs[Offset], NumDimsPerSample * (LagN + 1));
  96. };
  97. void diffSamples();
  98. void smoothSamples();
  99. void lagSamples();
  100. private:
  101. CalculatedNumber *CNs;
  102. size_t NumSamples;
  103. size_t NumDimsPerSample;
  104. size_t DiffN;
  105. size_t SmoothN;
  106. size_t LagN;
  107. double SamplingRatio;
  108. std::vector<uint32_t> &RandNums;
  109. size_t BytesPerSample;
  110. bool Preprocessed;
  111. };
  112. inline std::ostream& operator<<(std::ostream& OS, const SamplesBuffer &SB) {
  113. SB.print(OS);
  114. return OS;
  115. }
  116. #endif /* SAMPLES_BUFFER_H */