SamplesBuffer.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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. std::vector<DSample> preprocess();
  70. std::vector<Sample> getPreprocessedSamples() const;
  71. size_t capacity() const { return NumSamples; }
  72. void print(std::ostream &OS) const;
  73. private:
  74. size_t getSampleOffset(size_t Index) const {
  75. assert(Index < NumSamples);
  76. return Index * NumDimsPerSample;
  77. }
  78. size_t getPreprocessedSampleOffset(size_t Index) const {
  79. assert(Index < NumSamples);
  80. return getSampleOffset(Index) * (LagN + 1);
  81. }
  82. void setSample(size_t Index, const Sample &S) const {
  83. size_t Offset = getSampleOffset(Index);
  84. std::memcpy(&CNs[Offset], S.getCalculatedNumbers(), BytesPerSample);
  85. }
  86. const Sample getSample(size_t Index) const {
  87. size_t Offset = getSampleOffset(Index);
  88. return Sample(&CNs[Offset], NumDimsPerSample);
  89. };
  90. const Sample getPreprocessedSample(size_t Index) const {
  91. size_t Offset = getPreprocessedSampleOffset(Index);
  92. return Sample(&CNs[Offset], NumDimsPerSample * (LagN + 1));
  93. };
  94. void diffSamples();
  95. void smoothSamples();
  96. void lagSamples();
  97. private:
  98. CalculatedNumber *CNs;
  99. size_t NumSamples;
  100. size_t NumDimsPerSample;
  101. size_t DiffN;
  102. size_t SmoothN;
  103. size_t LagN;
  104. double SamplingRatio;
  105. std::vector<uint32_t> &RandNums;
  106. size_t BytesPerSample;
  107. bool Preprocessed;
  108. };
  109. inline std::ostream& operator<<(std::ostream& OS, const SamplesBuffer &SB) {
  110. SB.print(OS);
  111. return OS;
  112. }
  113. #endif /* SAMPLES_BUFFER_H */