12 #include <gtest/gtest.h>
14 #include <tracking/spacePointCreation/MapHelperFunctions.h>
15 #include <framework/logging/Logger.h>
17 #include <unordered_map>
31 typedef std::unordered_map<int, double>
i2dMap;
38 template<
typename Functor>
42 for (
int i = 0; i < nEntries; ++i) {
43 map.insert(std::make_pair((i % 6), funct.operator()(i)));
53 template<
typename Functor>
57 for (
int i = 0; i < nEntries; ++i) {
58 map.insert(std::make_pair(i, funct.operator()(i)));
68 double operator()(
int i)
70 return std::tan(i) / std::sin(i);
76 double operator()(
int i)
78 return std::sin(i * .5);
107 unsigned int N = _nEntries;
108 EXPECT_EQ(N, _nanMultiMap.size());
109 EXPECT_EQ(N, _nanMap.size());
110 EXPECT_EQ(N, _multimap.size());
111 EXPECT_EQ(N, _map.size());
113 ASSERT_TRUE(std::isnan(
secans.operator()(0))) <<
"For the following tests to work properly this is expected to return a NaN (-nan)";
121 std::vector<int> possibleKeys = { 0, 1, 2, 3, 4, 5 };
122 for (
int key : possibleKeys) {
123 std::vector<double> nanPossibleValues, possibleValues;
124 for (
int arg = key; arg < _nEntries; arg += 6) {
125 nanPossibleValues.push_back(
secans.operator()(arg));
126 possibleValues.push_back(
sinHalf.operator()(arg));
129 auto keyRange = _nanMultiMap.equal_range(key);
131 EXPECT_EQ(nanPossibleValues.size(), std::distance(keyRange.first, keyRange.second));
132 i2dMultiMap::iterator multiMapIt = keyRange.first;
133 for (
int i = 0; i < std::distance(keyRange.first, keyRange.second); ++i) {
134 if (!std::isnan(multiMapIt->second)) {
135 auto findIt = std::find(nanPossibleValues.begin(), nanPossibleValues.end(), multiMapIt->second);
136 EXPECT_FALSE(findIt == nanPossibleValues.end());
138 EXPECT_TRUE(std::count_if(nanPossibleValues.begin(), nanPossibleValues.end(),
139 [](
const double & val) { return std::isnan(val); }) > 0);
143 keyRange = _multimap.equal_range(key);
144 EXPECT_EQ(possibleValues.size(), std::distance(keyRange.first, keyRange.second));
145 multiMapIt = keyRange.first;
146 for (
int i = 0; i < std::distance(keyRange.first, keyRange.second); ++i) {
147 auto findIt = std::find(possibleValues.begin(), possibleValues.end(), multiMapIt->second);
148 EXPECT_FALSE(findIt == possibleValues.end());
153 for (
unsigned int i = 0; i < N; ++i) {
154 auto range = _nanMap.equal_range(i);
155 i2dMap::iterator mapIt = range.first;
156 for (
int j = 0; j < std::distance(range.first, range.second); ++j) {
157 if (std::isnan(mapIt->second)) {
158 B2INFO(
"Not Comparing value to key " << i <<
" because value is NaN, checking if the functor returns NaN for this key");
159 EXPECT_TRUE(std::isnan(
secans.operator()(i)));
162 EXPECT_DOUBLE_EQ(mapIt->second,
secans.operator()(i));
166 range = _map.equal_range(i);
168 for (
int j = 0; j < std::distance(range.first, range.second); ++j) {
169 EXPECT_DOUBLE_EQ(mapIt->second,
sinHalf.operator()(i));
179 EXPECT_EQ(uniqueKeys.size(), _map.size());
180 for (
size_t i = 0; i < uniqueKeys.size(); ++i) {
182 auto findIt = std::find(uniqueKeys.begin(), uniqueKeys.end(), i);
183 EXPECT_FALSE(findIt == uniqueKeys.end());
188 unsigned int expectedSize = _multimap.size() > 6 ? 6 : _multimap.size();
189 EXPECT_EQ(expectedSize, uniqueMultiKeys.size());
190 for (
size_t i = 0; i < uniqueMultiKeys.size(); ++i) {
192 auto findIt = std::find(uniqueMultiKeys.begin(), uniqueMultiKeys.end(), i);
193 EXPECT_FALSE(findIt == uniqueMultiKeys.end());
201 std::vector<int> possibleKeys = { 0, 1, 2, 3, 4, 5 };
202 for (
int key : possibleKeys) {
203 std::vector<double> expectedValues;
204 for (
int arg = key; arg < _nEntries; arg += 6) { expectedValues.push_back(
sinHalf.operator()(arg)); }
205 std::vector<double> actualValues =
getValuesToKey(_multimap, key);
206 EXPECT_EQ(expectedValues.size(), actualValues.size());
209 for (
const double& d : actualValues) {
210 EXPECT_FALSE(std::find(expectedValues.begin(), expectedValues.end(), d) == expectedValues.end());
212 expectedValues.clear();
213 for (
int arg = key; arg < _nEntries; arg += 6) {
214 expectedValues.push_back(
secans.operator()(arg));
217 EXPECT_EQ(expectedValues.size(), actualValues.size());
220 for (
const double& d : actualValues) {
222 B2INFO(
"Not comparing NaN value!");
225 EXPECT_FALSE(std::find(expectedValues.begin(), expectedValues.end(), d) == expectedValues.end());
230 for (
int i = 0; i < _nEntries; ++i) {
232 EXPECT_EQ(values.size(), 1);
233 EXPECT_DOUBLE_EQ(values[0],
sinHalf.operator()(i));
236 EXPECT_EQ(values.size(), 1);
237 if (!std::isnan(values[0])) {
238 EXPECT_DOUBLE_EQ(values[0],
secans.operator()(i));
246 std::vector<std::pair<int, unsigned int> > mapKeys =
getNValuesPerKey(_map);
247 unsigned int oneKey2Value = std::count_if(mapKeys.begin(), mapKeys.end(),
248 [](
const std::pair<int, unsigned int>& pair) { return pair.second == 1; });
249 EXPECT_EQ(_map.size(), oneKey2Value);
252 oneKey2Value = std::count_if(mapKeys.begin(), mapKeys.end(),
253 [](
const std::pair<int, unsigned int>& pair) { return pair.second == 1; });
254 EXPECT_EQ(_nanMap.size(), oneKey2Value);
258 EXPECT_EQ(mapKeys.size(), 6);
259 for (
const auto& key : mapKeys) {
260 EXPECT_EQ(key.second, key.first < 2 ? 4 : 3);
264 EXPECT_EQ(mapKeys.size(), 6);
265 for (
const auto& key : mapKeys) {
266 EXPECT_EQ(key.second, key.first < 2 ? 4 : 3);
274 std::vector<int> possibleKeys = { 0, 1, 2, 3, 4, 5 };
275 std::vector<double> summedValues;
276 std::vector<double> summedNanValues;
277 for (
int key : possibleKeys) {
278 std::vector<double> possibleValues;
279 std::vector<double> possibleNanValues;
280 for (
int arg = key; arg < _nEntries; arg += 6) {
281 possibleValues.push_back(
sinHalf.operator()(arg));
282 possibleNanValues.push_back(
secans.operator()(arg));
284 summedNanValues.push_back(std::accumulate(possibleNanValues.begin(), possibleNanValues.end(), 0.0));
285 summedValues.push_back(std::accumulate(possibleValues.begin(), possibleValues.end(), 0.0));
290 EXPECT_EQ(keyValPairs.size(), 6);
292 EXPECT_EQ(get<0>(keyValPairs[0]), 0);
293 EXPECT_TRUE(std::isnan(get<1>(keyValPairs[0])));
294 EXPECT_EQ(get<2>(keyValPairs[0]), 4);
298 EXPECT_EQ(keyValPairs.size(), 6);
300 EXPECT_EQ(get<0>(keyValPairs[0]), 0);
301 EXPECT_DOUBLE_EQ(get<1>(keyValPairs[0]), summedValues[0]);
302 EXPECT_EQ(get<2>(keyValPairs[0]), 4);
304 EXPECT_EQ(get<0>(keyValPairs[2]), 3);
305 EXPECT_DOUBLE_EQ(get<1>(keyValPairs[2]), summedValues[3]);
306 EXPECT_EQ(get<2>(keyValPairs[2]), 3);
309 EXPECT_EQ(get<0>(keyValPairs[0]), 3);
310 EXPECT_DOUBLE_EQ(get<1>(keyValPairs[0]),
sinHalf.operator()(3));
312 EXPECT_EQ(get<0>(keyValPairs[19]), 9);
313 EXPECT_DOUBLE_EQ(get<1>(keyValPairs[19]),
sinHalf.operator()(9));
320 std::vector<double> possibleValues, nanPossibleValues;
321 for (
int i = 0; i < _nEntries; ++i) {
322 possibleValues.push_back(
sinHalf.operator()(i));
323 nanPossibleValues.push_back(
secans.operator()(i));
326 std::sort(possibleValues.begin(), possibleValues.end());
327 std::sort(nanPossibleValues.begin(), nanPossibleValues.end());
331 EXPECT_EQ(allValues.size(), _nEntries);
332 std::sort(allValues.begin(), allValues.end());
333 for (
int i = 0; i < _nEntries; ++i) {
334 EXPECT_DOUBLE_EQ(allValues[i], possibleValues[i]);
339 EXPECT_EQ(allValues.size(), _nEntries);
340 std::sort(allValues.begin(), allValues.end());
341 for (
int i = 0; i < _nEntries; ++i) {
342 EXPECT_DOUBLE_EQ(allValues[i], possibleValues[i]);