Project
Loading...
Searching...
No Matches
test_ransHistogramView.cxx
Go to the documentation of this file.
1// Copyright 2019-2023 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
15
16#define BOOST_TEST_MODULE Utility test
17#define BOOST_TEST_MAIN
18#define BOOST_TEST_DYN_LINK
19
20#include <vector>
21#include <algorithm>
22
23#include <boost/test/unit_test.hpp>
24#include <boost/mpl/vector.hpp>
25
27
28using namespace o2::rans;
29
31 ReferenceState(std::vector<int32_t> v) : mV{std::move(v)} {};
32
33 int32_t getMin() { return *std::min_element(mV.begin(), mV.end()); };
34 int32_t getMax() { return *std::max_element(mV.begin(), mV.end()); };
35 size_t size() { return mV.size(); };
36 int32_t getOffset() { return this->getMin(); };
37 auto begin() { return mV.begin(); };
38 auto end() { return mV.end(); };
39
40 std::vector<int32_t> mV{};
41};
42
43BOOST_AUTO_TEST_CASE(test_emptyHistogramView)
44{
45 std::vector<int32_t> a{};
46 const auto v = makeHistogramView(a, 0);
47
48 BOOST_CHECK_EQUAL(v.size(), 0);
49 BOOST_CHECK_EQUAL(v.getOffset(), 0);
50 BOOST_CHECK_EQUAL(v.getMin(), 0);
51 BOOST_CHECK_EQUAL(v.getMax(), 0);
52 BOOST_CHECK((v.begin() == a.begin()));
53 BOOST_CHECK((v.end() == a.end()));
54 BOOST_CHECK((v.rbegin().base() == a.end()));
55 BOOST_CHECK((v.rend().base() == a.begin()));
56};
57
62
67
72
74 ReferenceState expected{{-3, -2, -1, 0, 1, 2, 3, 4, 5}};
76};
77
82
84{
85 fixture f;
86
87 ReferenceState& expected = f.expected;
88 auto& view = f.view;
89
90 BOOST_CHECK_EQUAL(view.size(), expected.size());
91 BOOST_CHECK_EQUAL(view.getOffset(), expected.getOffset());
92 BOOST_CHECK_EQUAL(view.getMin(), expected.getMin());
93 BOOST_CHECK_EQUAL(view.getMax(), expected.getMax());
94 BOOST_CHECK((view.begin() == expected.begin()));
95 BOOST_CHECK((view.end() == expected.end()));
96 BOOST_CHECK((view.rbegin().base() == expected.end()));
97 BOOST_CHECK((view.rend().base() == expected.begin()));
98};
99
100BOOST_AUTO_TEST_CASE(test_trimEmpty)
101{
102 std::vector<int32_t> a{};
103 const auto v = trim(makeHistogramView(a, 0));
104
105 BOOST_CHECK_EQUAL(v.size(), 0);
106 BOOST_CHECK_EQUAL(v.getOffset(), 0);
107 BOOST_CHECK_EQUAL(v.getMin(), 0);
108 BOOST_CHECK_EQUAL(v.getMax(), 0);
109 BOOST_CHECK((v.begin() == a.begin()));
110 BOOST_CHECK((v.end() == a.end()));
111 BOOST_CHECK((v.rbegin().base() == a.end()));
112 BOOST_CHECK((v.rend().base() == a.begin()));
113};
114
116{
117 std::vector<int32_t> a{0, 0, 0, 0, 0};
118 const auto v = trim(makeHistogramView(a, 0));
119
120 BOOST_CHECK_EQUAL(v.size(), 0);
121 BOOST_CHECK_EQUAL(v.getOffset(), 0);
122 BOOST_CHECK_EQUAL(v.getMin(), 0);
123 BOOST_CHECK_EQUAL(v.getMax(), 0);
124 BOOST_CHECK((v.begin() == a.end()));
125 BOOST_CHECK((v.end() == a.end()));
126 BOOST_CHECK((v.rbegin().base() == a.end()));
127 BOOST_CHECK((v.rend().base() == a.end()));
128};
129
131 ReferenceState initial{{0, -3, -2, -1, 0, 1, 2, 3, 4, 5}};
132 ReferenceState expected{{-3, -2, -1, 0, 1, 2, 3, 4, 5}};
133 decltype(initial.begin()) begin = ++initial.begin();
134 decltype(initial.end()) end = initial.end();
136};
137
139 ReferenceState initial{{-3, -2, -1, 0, 1, 2, 3, 4, 5, 0}};
140 ReferenceState expected{{-3, -2, -1, 0, 1, 2, 3, 4, 5}};
141 decltype(initial.begin()) begin = initial.begin();
142 decltype(initial.end()) end = --initial.end();
144};
145
147 ReferenceState initial{{0, -3, -2, -1, 0, 1, 2, 3, 4, 5, 0}};
148 ReferenceState expected{{-3, -2, -1, 0, 1, 2, 3, 4, 5}};
149 decltype(initial.begin()) begin = ++initial.begin();
150 decltype(initial.end()) end = --initial.end();
152};
153
155 ReferenceState expected{{-3, -2, -1, 0, 1, 2, 3, 4, 5}};
157 decltype(expected.end()) end = expected.end();
159};
160
161using trimFixture_t = boost::mpl::vector<trimFixture_left,
165
167{
168 fixture f;
169
170 ReferenceState& expected = f.expected;
171 f.view = trim(f.view);
172 auto& view = f.view;
173
174 BOOST_CHECK_EQUAL(view.size(), expected.size());
175 BOOST_CHECK_EQUAL(view.getOffset(), expected.getOffset());
176 BOOST_CHECK_EQUAL(view.getMin(), expected.getMin());
177 BOOST_CHECK_EQUAL(view.getMax(), expected.getMax());
178 BOOST_CHECK((view.begin() == f.begin));
179 BOOST_CHECK((view.end() == f.end));
180 BOOST_CHECK((view.rbegin().base() == f.end));
181 BOOST_CHECK((view.rend().base() == f.begin));
182};
183
184BOOST_AUTO_TEST_CASE(intersection_disjointLeft)
185{
186 std::vector<int32_t> a{-3, -2, -1, 0, 1, 2, 3, 4, 5};
187 std::vector<int32_t> b{-10, -9};
188 auto av = makeHistogramView(a, -3);
189 const auto bv = makeHistogramView(b, -10);
190
191 av = getIntersection(av, bv);
192
193 BOOST_CHECK_EQUAL(av.size(), 0);
194 BOOST_CHECK_EQUAL(av.getOffset(), 0);
195 BOOST_CHECK_EQUAL(av.getMin(), 0);
196 BOOST_CHECK_EQUAL(av.getMax(), 0);
197 BOOST_CHECK((av.begin() == a.end()));
198 BOOST_CHECK((av.end() == a.end()));
199 BOOST_CHECK((av.rbegin().base() == a.end()));
200 BOOST_CHECK((av.rend().base() == a.end()));
201}
202
203BOOST_AUTO_TEST_CASE(intersection_disjointRight)
204{
205 std::vector<int32_t> a{-3, -2, -1, 0, 1, 2, 3, 4, 5};
206 std::vector<int32_t> b{9, 10};
207 auto av = makeHistogramView(a, -3);
208 const auto bv = makeHistogramView(b, 9);
209
210 av = getIntersection(av, bv);
211
212 BOOST_CHECK_EQUAL(av.size(), 0);
213 BOOST_CHECK_EQUAL(av.getOffset(), 0);
214 BOOST_CHECK_EQUAL(av.getMin(), 0);
215 BOOST_CHECK_EQUAL(av.getMax(), 0);
216 BOOST_CHECK((av.begin() == a.end()));
217 BOOST_CHECK((av.end() == a.end()));
218 BOOST_CHECK((av.rbegin().base() == a.end()));
219 BOOST_CHECK((av.rend().base() == a.end()));
220}
221
222BOOST_AUTO_TEST_CASE(intersection_leftOverlap)
223{
224 std::vector<int32_t> a{-3, -2, -1, 0, 1, 2, 3, 4, 5};
225 std::vector<int32_t> b{-5, -4, -3, -2, -1};
226 auto av = makeHistogramView(a, -3);
227 const auto bv = makeHistogramView(b, -5);
228
229 av = getIntersection(av, bv);
230
231 BOOST_CHECK_EQUAL(av.size(), 3);
232 BOOST_CHECK_EQUAL(av.getOffset(), -3);
233 BOOST_CHECK_EQUAL(av.getMin(), -3);
234 BOOST_CHECK_EQUAL(av.getMax(), -1);
235 BOOST_CHECK((av.begin() == a.begin()));
236 BOOST_CHECK((av.end() == a.begin() + 3));
237 BOOST_CHECK((av.rbegin().base() == a.begin() + 3));
238 BOOST_CHECK((av.rend() == a.rend()));
239}
240
241BOOST_AUTO_TEST_CASE(intersection_rightOverlap)
242{
243 std::vector<int32_t> a{-3, -2, -1, 0, 1, 2, 3, 4, 5};
244 std::vector<int32_t> b{4, 5, 6, 7, 8};
245 auto av = makeHistogramView(a, -3);
246 const auto bv = makeHistogramView(b, 4);
247
248 av = getIntersection(av, bv);
249
250 BOOST_CHECK_EQUAL(av.size(), 2);
251 BOOST_CHECK_EQUAL(av.getOffset(), 4);
252 BOOST_CHECK_EQUAL(av.getMin(), 4);
253 BOOST_CHECK_EQUAL(av.getMax(), 5);
254 BOOST_CHECK((av.begin() == a.end()) - 2);
255 BOOST_CHECK((av.end() == a.end()));
256 BOOST_CHECK((av.rbegin().base() == a.end()));
257 BOOST_CHECK((av.rend().base() == a.end() - 2));
258}
259
260BOOST_AUTO_TEST_CASE(intersection_fullOverlap)
261{
262 std::vector<int32_t> a{-3, -2, -1, 0, 1, 2, 3, 4, 5};
263 std::vector<int32_t> b{-1, 0, 1, 2};
264 auto av = makeHistogramView(a, -3);
265 const auto bv = makeHistogramView(b, -1);
266
267 av = getIntersection(av, bv);
268
269 BOOST_CHECK_EQUAL(av.size(), 4);
270 BOOST_CHECK_EQUAL(av.getOffset(), -1);
271 BOOST_CHECK_EQUAL(av.getMin(), -1);
272 BOOST_CHECK_EQUAL(av.getMax(), 2);
273 BOOST_CHECK((av.begin() == a.begin() + 2));
274 BOOST_CHECK((av.end() == a.end() - 3));
275 BOOST_CHECK((av.rbegin().base() == a.end() - 3));
276 BOOST_CHECK((av.rend().base() == a.begin() + 2));
277}
278
279BOOST_AUTO_TEST_CASE(intersection_emptyB)
280{
281 std::vector<int32_t> a{-3, -2, -1, 0, 1, 2, 3, 4, 5};
282 std::vector<int32_t> b{};
283 auto av = makeHistogramView(a, -3);
284 const auto bv = makeHistogramView(b, 0);
285
286 av = getIntersection(av, bv);
287
288 BOOST_CHECK_EQUAL(av.size(), 0);
289 BOOST_CHECK_EQUAL(av.getOffset(), 0);
290 BOOST_CHECK_EQUAL(av.getMin(), 0);
291 BOOST_CHECK_EQUAL(av.getMax(), 0);
292 BOOST_CHECK((av.begin() == a.end()));
293 BOOST_CHECK((av.end() == a.end()));
294 BOOST_CHECK((av.rbegin().base() == a.end()));
295 BOOST_CHECK((av.rend().base() == a.end()));
296}
297
298BOOST_AUTO_TEST_CASE(intersection_emptyA)
299{
300 std::vector<int32_t> a{};
301 std::vector<int32_t> b{-10, -9};
302 auto av = makeHistogramView(a, 0);
303 const auto bv = makeHistogramView(b, -10);
304
305 av = getIntersection(av, bv);
306
307 BOOST_CHECK_EQUAL(av.size(), 0);
308 BOOST_CHECK_EQUAL(av.getOffset(), 0);
309 BOOST_CHECK_EQUAL(av.getMin(), 0);
310 BOOST_CHECK_EQUAL(av.getMax(), 0);
311 BOOST_CHECK((av.begin() == a.end()));
312 BOOST_CHECK((av.end() == a.end()));
313 BOOST_CHECK((av.rbegin().base() == a.end()));
314 BOOST_CHECK((av.rend().base() == a.end()));
315}
316
317BOOST_AUTO_TEST_CASE(intersection_empty)
318{
319 std::vector<int32_t> a{};
320 std::vector<int32_t> b{};
321 auto av = makeHistogramView(a, 0);
322 const auto bv = makeHistogramView(b, 0);
323
324 av = getIntersection(av, bv);
325
326 BOOST_CHECK_EQUAL(av.size(), 0);
327 BOOST_CHECK_EQUAL(av.getOffset(), 0);
328 BOOST_CHECK_EQUAL(av.getMin(), 0);
329 BOOST_CHECK_EQUAL(av.getMax(), 0);
330 BOOST_CHECK((av.begin() == a.end()));
331 BOOST_CHECK((av.end() == a.end()));
332 BOOST_CHECK((av.rbegin().base() == a.end()));
333 BOOST_CHECK((av.rend().base() == a.end()));
334}
335
337{
338 std::vector<int32_t> a{};
339 std::vector<int32_t> b{};
340 const auto av = makeHistogramView(a, 0);
341 const auto bv = makeHistogramView(b, 0);
342
343 auto v = getLeftTail(av, bv);
344 BOOST_CHECK_EQUAL(v.size(), 0);
345 BOOST_CHECK_EQUAL(v.getOffset(), 0);
346 BOOST_CHECK_EQUAL(v.getMin(), 0);
347 BOOST_CHECK_EQUAL(v.getMax(), 0);
348 BOOST_CHECK((v.begin() == a.end()));
349 BOOST_CHECK((v.end() == a.end()));
350 BOOST_CHECK((v.rbegin().base() == a.end()));
351 BOOST_CHECK((v.rend().base() == a.end()));
352
353 v = getRightTail(av, bv);
354 BOOST_CHECK_EQUAL(v.size(), 0);
355 BOOST_CHECK_EQUAL(v.getOffset(), 0);
356 BOOST_CHECK_EQUAL(v.getMin(), 0);
357 BOOST_CHECK_EQUAL(v.getMax(), 0);
358 BOOST_CHECK((v.begin() == a.end()));
359 BOOST_CHECK((v.end() == a.end()));
360 BOOST_CHECK((v.rbegin().base() == a.end()));
361 BOOST_CHECK((v.rend().base() == a.end()));
362};
363
365{
366 std::vector<int32_t> a{};
367 std::vector<int32_t> b{-10, -9};
368 const auto av = makeHistogramView(a, 0);
369 const auto bv = makeHistogramView(b, -10);
370
371 auto v = getLeftTail(av, bv);
372 BOOST_CHECK_EQUAL(v.size(), av.size());
373 BOOST_CHECK_EQUAL(v.getOffset(), av.getOffset());
374 BOOST_CHECK_EQUAL(v.getMin(), av.getMin());
375 BOOST_CHECK_EQUAL(v.getMax(), av.getMax());
376 BOOST_CHECK((v.begin() == av.begin()));
377 BOOST_CHECK((v.end() == av.end()));
378 BOOST_CHECK((v.rbegin().base() == av.rend().base()));
379 BOOST_CHECK((v.rend().base() == av.rend().base()));
380
381 v = getRightTail(av, bv);
382 BOOST_CHECK_EQUAL(v.size(), av.size());
383 BOOST_CHECK_EQUAL(v.getOffset(), av.getOffset());
384 BOOST_CHECK_EQUAL(v.getMin(), av.getMin());
385 BOOST_CHECK_EQUAL(v.getMax(), av.getMax());
386 BOOST_CHECK((v.begin() == av.begin()));
387 BOOST_CHECK((v.end() == av.end()));
388 BOOST_CHECK((v.rbegin().base() == av.rbegin().base()));
389 BOOST_CHECK((v.rend().base() == av.rend().base()));
390};
391
393{
394 std::vector<int32_t> a{-3, -2, -1, 0, 1, 2, 3, 4, 5};
395 std::vector<int32_t> b{};
396 const auto av = makeHistogramView(a, -3);
397 const auto bv = makeHistogramView(b, 0);
398
399 auto v = getLeftTail(av, bv);
400 BOOST_CHECK_EQUAL(v.size(), av.size());
401 BOOST_CHECK_EQUAL(v.getOffset(), av.getOffset());
402 BOOST_CHECK_EQUAL(v.getMin(), av.getMin());
403 BOOST_CHECK_EQUAL(v.getMax(), av.getMax());
404 BOOST_CHECK((v.begin() == av.begin()));
405 BOOST_CHECK((v.end() == av.end()));
406 BOOST_CHECK((v.rbegin().base() == av.rbegin().base()));
407 BOOST_CHECK((v.rend().base() == av.rend().base()));
408
409 v = getRightTail(av, bv);
410 BOOST_CHECK_EQUAL(v.size(), av.size());
411 BOOST_CHECK_EQUAL(v.getOffset(), av.getOffset());
412 BOOST_CHECK_EQUAL(v.getMin(), av.getMin());
413 BOOST_CHECK_EQUAL(v.getMax(), av.getMax());
414 BOOST_CHECK((v.begin() == av.begin()));
415 BOOST_CHECK((v.end() == av.end()));
416 BOOST_CHECK((v.rbegin().base() == av.rbegin().base()));
417 BOOST_CHECK((v.rend().base() == av.rend().base()));
418};
419
420BOOST_AUTO_TEST_CASE(tails_leftTail)
421{
422 std::vector<int32_t> a{-3, -2, -1, 0, 1, 2, 3, 4, 5};
423 std::vector<int32_t> b{4, 5, 6, 7, 8};
424 const auto av = makeHistogramView(a, -3);
425 const auto bv = makeHistogramView(b, 4);
426
427 auto v = getLeftTail(av, bv);
428 BOOST_CHECK_EQUAL(v.size(), 7);
429 BOOST_CHECK_EQUAL(v.getOffset(), -3);
430 BOOST_CHECK_EQUAL(v.getMin(), -3);
431 BOOST_CHECK_EQUAL(v.getMax(), 3);
432 BOOST_CHECK((v.begin() == a.begin()));
433 BOOST_CHECK((v.end() == a.begin() + 7));
434 BOOST_CHECK((v.rbegin().base() == a.begin() + 7));
435 BOOST_CHECK((v.rend().base() == a.begin()));
436
437 v = getRightTail(av, bv);
438 BOOST_CHECK_EQUAL(v.size(), 0);
439 BOOST_CHECK_EQUAL(v.getOffset(), 0);
440 BOOST_CHECK_EQUAL(v.getMin(), 0);
441 BOOST_CHECK_EQUAL(v.getMax(), 0);
442 BOOST_CHECK((v.begin() == a.end()));
443 BOOST_CHECK((v.end() == a.end()));
444 BOOST_CHECK((v.rbegin().base() == a.end()));
445 BOOST_CHECK((v.rend().base() == a.end()));
446};
447
448BOOST_AUTO_TEST_CASE(tails_rightTail)
449{
450 std::vector<int32_t> a{-3, -2, -1, 0, 1, 2, 3, 4, 5};
451 std::vector<int32_t> b{-4, -3, -2, -1, 0};
452 const auto av = makeHistogramView(a, -3);
453 const auto bv = makeHistogramView(b, -4);
454
455 auto v = getLeftTail(av, bv);
456 BOOST_CHECK_EQUAL(v.size(), 0);
457 BOOST_CHECK_EQUAL(v.getOffset(), 0);
458 BOOST_CHECK_EQUAL(v.getMin(), 0);
459 BOOST_CHECK_EQUAL(v.getMax(), 0);
460 BOOST_CHECK((v.begin() == a.end()));
461 BOOST_CHECK((v.end() == a.end()));
462 BOOST_CHECK((v.rbegin().base() == a.end()));
463 BOOST_CHECK((v.rend().base() == a.end()));
464
465 v = getRightTail(av, bv);
466 BOOST_CHECK_EQUAL(v.size(), 5);
467 BOOST_CHECK_EQUAL(v.getOffset(), 1);
468 BOOST_CHECK_EQUAL(v.getMin(), 1);
469 BOOST_CHECK_EQUAL(v.getMax(), 5);
470 BOOST_CHECK((v.begin() == a.end() - 5));
471 BOOST_CHECK((v.end() == a.end()));
472 BOOST_CHECK((v.rbegin().base() == a.end()));
473 BOOST_CHECK((v.rend().base() == a.end() - 5));
474};
475
476BOOST_AUTO_TEST_CASE(tails_bothTail)
477{
478 std::vector<int32_t> a{-3, -2, -1, 0, 1, 2, 3, 4, 5};
479 std::vector<int32_t> b{-1, 0, 1, 2};
480 const auto av = makeHistogramView(a, -3);
481 const auto bv = makeHistogramView(b, -1);
482
483 auto v = getLeftTail(av, bv);
484 BOOST_CHECK_EQUAL(v.size(), 2);
485 BOOST_CHECK_EQUAL(v.getOffset(), -3);
486 BOOST_CHECK_EQUAL(v.getMin(), -3);
487 BOOST_CHECK_EQUAL(v.getMax(), -2);
488 BOOST_CHECK((v.begin() == a.begin()));
489 BOOST_CHECK((v.end() == a.begin() + 2));
490 BOOST_CHECK((v.rbegin().base() == a.begin() + 2));
491 BOOST_CHECK((v.rend().base() == a.begin()));
492
493 v = getRightTail(av, bv);
494 BOOST_CHECK_EQUAL(v.size(), 3);
495 BOOST_CHECK_EQUAL(v.getOffset(), 3);
496 BOOST_CHECK_EQUAL(v.getMin(), 3);
497 BOOST_CHECK_EQUAL(v.getMax(), 5);
498 BOOST_CHECK((v.begin() == a.end() - 3));
499 BOOST_CHECK((v.end() == a.end()));
500 BOOST_CHECK((v.rbegin().base() == a.end()));
501 BOOST_CHECK((v.rend().base() == a.end() - 3));
502};
Non-owning, lightweight structure for histogram manipulation.
GLuint GLuint end
Definition glcorearb.h:469
const GLdouble * v
Definition glcorearb.h:832
GLdouble f
Definition glcorearb.h:310
GLboolean GLboolean GLboolean b
Definition glcorearb.h:1233
GLboolean GLboolean GLboolean GLboolean a
Definition glcorearb.h:1233
HistogramView< HistA_IT > getIntersection(const HistogramView< HistA_IT > &histA, const HistogramView< HistB_IT > &histB)
auto makeHistogramView(container_T &container, std::ptrdiff_t offset) noexcept -> HistogramView< decltype(std::begin(container))>
HistogramView< Hist_IT > trim(const HistogramView< Hist_IT > &buffer)
HistogramView< HistA_IT > getRightTail(const HistogramView< HistA_IT > &histA, const HistogramView< HistB_IT > &histB)
HistogramView< HistA_IT > getLeftTail(const HistogramView< HistA_IT > &histA, const HistogramView< HistB_IT > &histB)
Defining DataPointCompositeObject explicitly as copiable.
HistogramView< decltype(expected.begin())> view
HistogramView< decltype(expected.begin())> view
HistogramView< decltype(expected.begin())> view
HistogramView< decltype(expected.begin())> view
std::vector< int32_t > mV
ReferenceState(std::vector< int32_t > v)
decltype(initial.begin()) begin
HistogramView< decltype(initial.begin())> view
decltype(initial.begin()) begin
HistogramView< decltype(initial.begin())> view
decltype(expected.begin()) begin
HistogramView< decltype(expected.begin())> view
HistogramView< decltype(initial.begin())> view
decltype(initial.begin()) begin
std::map< std::string, ID > expected
BOOST_CHECK(tree)
BOOST_CHECK_EQUAL(triggersD.size(), triggers.size())
BOOST_AUTO_TEST_CASE_TEMPLATE(test_histogramView, fixture, histogramViewFixtures_t)
boost::mpl::vector< trimFixture_left, trimFixture_right, trimFixture_both, trimFixture_none > trimFixture_t
boost::mpl::vector< HistogramViewFixture_one, HistogramViewFixture_plus, HistogramViewFixture_minus, HistogramViewFixture_plusminus > histogramViewFixtures_t
BOOST_AUTO_TEST_CASE(test_emptyHistogramView)