Electroneum
Loading...
Searching...
No Matches
rolling_median.cpp File Reference
#include <random>
#include "gtest/gtest.h"
#include "misc_language.h"
#include "rolling_median.h"
#include "crypto/crypto.h"
Include dependency graph for rolling_median.cpp:

Go to the source code of this file.

Functions

 TEST (rolling_median, one)
 TEST (rolling_median, two)
 TEST (rolling_median, series)
 TEST (rolling_median, clear_whole)
 TEST (rolling_median, clear_partway)
 TEST (rolling_median, order)
 TEST (rolling_median, history_blind)
 TEST (rolling_median, size)

Function Documentation

◆ TEST() [1/8]

TEST ( rolling_median ,
clear_partway  )

Definition at line 102 of file rolling_median.cpp.

103{
105 std::vector<uint64_t> random, median;
106 random.reserve(10000);
107 median.reserve(10000);
108 for (int i = 0; i < 10000; ++i)
109 {
110 random.push_back(rand());
111 m.insert(random.back());
112 median.push_back(m.median());
113 }
114 m.clear();
115 for (int i = 10000 - 100; i < 10000; ++i)
116 {
117 m.insert(random[i]);
118 }
119 ASSERT_EQ(median[10000-1], m.median());
120}
#define ASSERT_EQ(val1, val2)
Definition gtest.h:1956
void rand(size_t N, uint8_t *bytes)
Definition crypto.h:209
type_vec_type median(std::vector< type_vec_type > &v)
uint64_t random(const uint64_t max_value)
Here is the call graph for this function:

◆ TEST() [2/8]

TEST ( rolling_median ,
clear_whole  )

Definition at line 82 of file rolling_median.cpp.

83{
85 std::vector<uint64_t> random, median;
86 random.reserve(10000);
87 median.reserve(10000);
88 for (int i = 0; i < 10000; ++i)
89 {
90 random.push_back(rand());
91 m.insert(random.back());
92 median.push_back(m.median());
93 }
94 m.clear();
95 for (int i = 0; i < 10000; ++i)
96 {
97 m.insert(random[i]);
98 ASSERT_EQ(median[i], m.median());
99 }
100}
Here is the call graph for this function:

◆ TEST() [3/8]

TEST ( rolling_median ,
history_blind  )

Definition at line 153 of file rolling_median.cpp.

154{
156
157 uint64_t median = 0;
158 for (int i = 0; i < 1000; ++i)
159 {
160 m.clear();
161 int history_length = 743723 % (i+1);
162 while (history_length--)
163 m.insert(743284 % (i+1));
164 for (int j = 0; j < 10; ++j)
165 m.insert(8924829384 % (j+1));
166 if (i == 0)
167 median = m.median();
168 else
169 ASSERT_EQ(median, m.median());
170 }
171}
unsigned __int64 uint64_t
Definition stdint.h:136
Here is the call graph for this function:

◆ TEST() [4/8]

TEST ( rolling_median ,
one  )

Definition at line 35 of file rolling_median.cpp.

36{
38 m.insert(42);
39 ASSERT_EQ(m.median(), 42);
40 m.insert(18);
41 ASSERT_EQ(m.median(), 18);
42 m.insert(7483);
43 ASSERT_EQ(m.median(), 7483);
44}
Here is the call graph for this function:

◆ TEST() [5/8]

TEST ( rolling_median ,
order  )

Definition at line 122 of file rolling_median.cpp.

123{
125 std::vector<uint64_t> random;
126 random.reserve(1000);
127 for (int i = 0; i < 1000; ++i)
128 {
129 random.push_back(rand());
130 m.insert(random.back());
131 }
132 const uint64_t med = m.median();
133
134 std::sort(random.begin(), random.end(), [](uint64_t a, uint64_t b) { return a < b; });
135 m.clear();
136 for (int i = 0; i < 1000; ++i)
137 m.insert(random[i]);
138 ASSERT_EQ(med, m.median());
139
140 std::sort(random.begin(), random.end(), [](uint64_t a, uint64_t b) { return a > b; });
141 m.clear();
142 for (int i = 0; i < 1000; ++i)
143 m.insert(random[i]);
144 ASSERT_EQ(med, m.median());
145
146 std::shuffle(random.begin(), random.end(), std::default_random_engine(crypto::rand<unsigned>()));
147 m.clear();
148 for (int i = 0; i < 1000; ++i)
149 m.insert(random[i]);
150 ASSERT_EQ(med, m.median());
151}
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
Definition pointer.h:1124
Here is the call graph for this function:

◆ TEST() [6/8]

TEST ( rolling_median ,
series  )

Definition at line 65 of file rolling_median.cpp.

66{
68 std::vector<uint64_t> v;
69 v.reserve(100);
70 for (int i = 0; i < 10000; ++i)
71 {
72 uint64_t r = rand();
73 v.push_back(r);
74 if (v.size() > 100)
75 v.erase(v.begin());
76 m.insert(r);
77 std::vector<uint64_t> vcopy = v;
78 ASSERT_EQ(m.median(), epee::misc_utils::median(vcopy));
79 }
80}
Here is the call graph for this function:

◆ TEST() [7/8]

TEST ( rolling_median ,
size  )

Definition at line 173 of file rolling_median.cpp.

174{
176
177 ASSERT_EQ(m.size(), 0);
178 m.insert(1);
179 ASSERT_EQ(m.size(), 1);
180 m.insert(2);
181 ASSERT_EQ(m.size(), 2);
182 m.clear();
183 ASSERT_EQ(m.size(), 0);
184 for (int i = 0; i < 10; ++i)
185 {
186 m.insert(80 % (i + 1));
187 ASSERT_EQ(m.size(), i + 1);
188 }
189 m.insert(1);
190 ASSERT_EQ(m.size(), 10);
191 m.insert(2);
192 ASSERT_EQ(m.size(), 10);
193 m.clear();
194 ASSERT_EQ(m.size(), 0);
195 m.insert(4);
196 ASSERT_EQ(m.size(), 1);
197 for (int i = 0; i < 1000; ++i)
198 {
199 m.insert(80 % (i + 1));
200 ASSERT_EQ(m.size(), std::min<int>(10, i + 2));
201 }
202}
Here is the call graph for this function:

◆ TEST() [8/8]

TEST ( rolling_median ,
two  )

Definition at line 46 of file rolling_median.cpp.

47{
49 m.insert(42);
50 ASSERT_EQ(m.median(), 42);
51 m.insert(45);
52 ASSERT_EQ(m.median(), 43);
53 m.insert(49);
54 ASSERT_EQ(m.median(), 47);
55 m.insert(41);
56 ASSERT_EQ(m.median(), 45);
57 m.insert(43);
58 ASSERT_EQ(m.median(), 42);
59 m.insert(40);
60 ASSERT_EQ(m.median(), 41);
61 m.insert(41);
62 ASSERT_EQ(m.median(), 40);
63}
Here is the call graph for this function: