Tests.cc 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #include "ml/ml-private.h"
  3. #include <gtest/gtest.h>
  4. /*
  5. * The SamplesBuffer class implements the functionality of the following python
  6. * code:
  7. * >> df = pd.DataFrame(data=samples)
  8. * >> df = df.diff(diff_n).dropna()
  9. * >> df = df.rolling(smooth_n).mean().dropna()
  10. * >> df = pd.concat([df.shift(n) for n in range(lag_n + 1)], axis=1).dropna()
  11. *
  12. * Its correctness has been verified by automatically generating random
  13. * data frames in Python and comparing them with the correspondent preprocessed
  14. * SampleBuffers.
  15. *
  16. * The following tests are meant to catch unintended changes in the SamplesBuffer
  17. * implementation. For development purposes, one should compare changes against
  18. * the aforementioned python code.
  19. */
  20. TEST(SamplesBufferTest, NS_8_NDPS_1_DN_1_SN_3_LN_1) {
  21. size_t NumSamples = 8, NumDimsPerSample = 1;
  22. size_t DiffN = 1, SmoothN = 3, LagN = 3;
  23. size_t N = NumSamples * NumDimsPerSample * (LagN + 1);
  24. CalculatedNumber *CNs = new CalculatedNumber[N]();
  25. CNs[0] = 0.7568336679490107;
  26. CNs[1] = 0.4814406581763254;
  27. CNs[2] = 0.40073555156221874;
  28. CNs[3] = 0.5973257298194408;
  29. CNs[4] = 0.5334727814345868;
  30. CNs[5] = 0.2632477193454843;
  31. CNs[6] = 0.2684839023122384;
  32. CNs[7] = 0.851332948637479;
  33. SamplesBuffer SB(CNs, NumSamples, NumDimsPerSample, DiffN, SmoothN, LagN);
  34. SB.preprocess();
  35. std::vector<Sample> Samples = SB.getPreprocessedSamples();
  36. EXPECT_EQ(Samples.size(), 2);
  37. Sample S0 = Samples[0];
  38. const CalculatedNumber *S0_CNs = S0.getCalculatedNumbers();
  39. Sample S1 = Samples[1];
  40. const CalculatedNumber *S1_CNs = S1.getCalculatedNumbers();
  41. EXPECT_NEAR(S0_CNs[0], -0.109614, 0.001);
  42. EXPECT_NEAR(S0_CNs[1], -0.0458293, 0.001);
  43. EXPECT_NEAR(S0_CNs[2], 0.017344, 0.001);
  44. EXPECT_NEAR(S0_CNs[3], -0.0531693, 0.001);
  45. EXPECT_NEAR(S1_CNs[0], 0.105953, 0.001);
  46. EXPECT_NEAR(S1_CNs[1], -0.109614, 0.001);
  47. EXPECT_NEAR(S1_CNs[2], -0.0458293, 0.001);
  48. EXPECT_NEAR(S1_CNs[3], 0.017344, 0.001);
  49. delete[] CNs;
  50. }
  51. TEST(SamplesBufferTest, NS_8_NDPS_1_DN_2_SN_3_LN_2) {
  52. size_t NumSamples = 8, NumDimsPerSample = 1;
  53. size_t DiffN = 2, SmoothN = 3, LagN = 2;
  54. size_t N = NumSamples * NumDimsPerSample * (LagN + 1);
  55. CalculatedNumber *CNs = new CalculatedNumber[N]();
  56. CNs[0] = 0.20511885291342846;
  57. CNs[1] = 0.13151717360306558;
  58. CNs[2] = 0.6017085062423134;
  59. CNs[3] = 0.46256882933941545;
  60. CNs[4] = 0.7887758447877941;
  61. CNs[5] = 0.9237989080034406;
  62. CNs[6] = 0.15552559051428083;
  63. CNs[7] = 0.6309750314597955;
  64. SamplesBuffer SB(CNs, NumSamples, NumDimsPerSample, DiffN, SmoothN, LagN);
  65. SB.preprocess();
  66. std::vector<Sample> Samples = SB.getPreprocessedSamples();
  67. EXPECT_EQ(Samples.size(), 2);
  68. Sample S0 = Samples[0];
  69. const CalculatedNumber *S0_CNs = S0.getCalculatedNumbers();
  70. Sample S1 = Samples[1];
  71. const CalculatedNumber *S1_CNs = S1.getCalculatedNumbers();
  72. EXPECT_NEAR(S0_CNs[0], 0.005016, 0.001);
  73. EXPECT_NEAR(S0_CNs[1], 0.326450, 0.001);
  74. EXPECT_NEAR(S0_CNs[2], 0.304903, 0.001);
  75. EXPECT_NEAR(S1_CNs[0], -0.154948, 0.001);
  76. EXPECT_NEAR(S1_CNs[1], 0.005016, 0.001);
  77. EXPECT_NEAR(S1_CNs[2], 0.326450, 0.001);
  78. delete[] CNs;
  79. }
  80. TEST(SamplesBufferTest, NS_8_NDPS_3_DN_2_SN_4_LN_1) {
  81. size_t NumSamples = 8, NumDimsPerSample = 3;
  82. size_t DiffN = 2, SmoothN = 4, LagN = 1;
  83. size_t N = NumSamples * NumDimsPerSample * (LagN + 1);
  84. CalculatedNumber *CNs = new CalculatedNumber[N]();
  85. CNs[0] = 0.34310900399667765; CNs[1] = 0.14694315994488194; CNs[2] = 0.8246677800938796;
  86. CNs[3] = 0.48249504592307835; CNs[4] = 0.23241087965531182; CNs[5] = 0.9595348555892567;
  87. CNs[6] = 0.44281094035598334; CNs[7] = 0.5143142171362715; CNs[8] = 0.06391303014242555;
  88. CNs[9] = 0.7460491027783901; CNs[10] = 0.43887217459032923; CNs[11] = 0.2814395025355999;
  89. CNs[12] = 0.9231114281214198; CNs[13] = 0.326882401786898; CNs[14] = 0.26747939220376216;
  90. CNs[15] = 0.7787571209969636; CNs[16] =0.5851700001235088; CNs[17] = 0.34410728945321567;
  91. CNs[18] = 0.9394494507088997; CNs[19] =0.17567223681734334; CNs[20] = 0.42732886195446984;
  92. CNs[21] = 0.9460522396152958; CNs[22] =0.23462747016780894; CNs[23] = 0.35983249900892145;
  93. SamplesBuffer SB(CNs, NumSamples, NumDimsPerSample, DiffN, SmoothN, LagN);
  94. SB.preprocess();
  95. std::vector<Sample> Samples = SB.getPreprocessedSamples();
  96. EXPECT_EQ(Samples.size(), 2);
  97. Sample S0 = Samples[0];
  98. const CalculatedNumber *S0_CNs = S0.getCalculatedNumbers();
  99. Sample S1 = Samples[1];
  100. const CalculatedNumber *S1_CNs = S1.getCalculatedNumbers();
  101. EXPECT_NEAR(S0_CNs[0], 0.198225, 0.001);
  102. EXPECT_NEAR(S0_CNs[1], 0.003529, 0.001);
  103. EXPECT_NEAR(S0_CNs[2], -0.063003, 0.001);
  104. EXPECT_NEAR(S0_CNs[3], 0.219066, 0.001);
  105. EXPECT_NEAR(S0_CNs[4], 0.133175, 0.001);
  106. EXPECT_NEAR(S0_CNs[5], -0.293154, 0.001);
  107. EXPECT_NEAR(S1_CNs[0], 0.174160, 0.001);
  108. EXPECT_NEAR(S1_CNs[1], -0.135722, 0.001);
  109. EXPECT_NEAR(S1_CNs[2], 0.110452, 0.001);
  110. EXPECT_NEAR(S1_CNs[3], 0.198225, 0.001);
  111. EXPECT_NEAR(S1_CNs[4], 0.003529, 0.001);
  112. EXPECT_NEAR(S1_CNs[5], -0.063003, 0.001);
  113. delete[] CNs;
  114. }