Loading [MathJax]/extensions/tex2jax.js
Radium Engine  1.5.29
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
random.cpp
1#include <catch2/catch_test_macros.hpp>
2#include <unittestUtils.hpp>
3
4#include <Core/Random/RandomPointSet.hpp>
5using namespace Ra::Core::Random;
6
7#define CHECK_SEQ1 \
8 for ( size_t i = 0; i < 5; ++i ) { \
9 REQUIRE( isApprox( seq( i ), seq_verif[i] ) ); \
10 }
11
12#define CHECK_SEQ2 \
13 for ( size_t i = 0; i < 5; ++i ) { \
14 auto v = seq( i ); \
15 REQUIRE( isApprox( v[0], seq_verif[i].first ) ); \
16 REQUIRE( isApprox( v[1], seq_verif[i].second ) ); \
17 }
18
19TEST_CASE( "Core/Random/RandomPointSet", "[unittests][Core][Core/Random][PointSet]" ) {
20 SECTION( "Fibonacci sequence" ) {
21 std::array<Scalar, 5> seq_verif { 0_ra,
22 0.61803398874989479150343640867504_ra,
23 1.2360679774997895830068728173501_ra,
24 1.8541019662496844855326116885408_ra,
25 2.4721359549995791660137456347002_ra };
26 FibonacciSequence seq { 2 };
27 // Our fibonacci sequence is only defined for more than 5 points
28 REQUIRE( seq.range() == 5 );
29 CHECK_SEQ1
30 }
31
32 SECTION( "VanDerCorput sequence" ) {
33 std::array<Scalar, 5> seq_verif { 0_ra, 0.5_ra, 0.25_ra, 0.75_ra, 0.125_ra };
35 CHECK_SEQ1
36 }
37
38 SECTION( "Fibonacci point set" ) {
40 std::pair<Scalar, Scalar> { 0_ra, 0_ra / 5_ra },
41 { 0.61803398874989479150343640867504_ra, 1_ra / 5_ra },
42 { 1.2360679774997895830068728173501_ra, 2_ra / 5_ra },
43 { 1.8541019662496844855326116885408_ra, 3_ra / 5_ra },
44 { 2.4721359549995791660137456347002_ra, 4_ra / 5_ra } };
45 FibonacciPointSet seq { 5 };
46 CHECK_SEQ2
47 }
48
49 SECTION( "Hammersley point set" ) {
51 std::pair<Scalar, Scalar> { 0_ra, 0_ra / 5_ra },
52 { 1_ra / 5_ra, 0.5_ra },
53 { 2_ra / 5_ra, 0.25_ra },
54 { 3_ra / 5_ra, 0.75_ra },
55 { 4_ra / 5_ra, 0.125_ra } };
56 HammersleyPointSet seq { 5 };
57 CHECK_SEQ2
58 }
59
60 // todo, verify if the sequence is always the same (it should) on any systems/run
61 SECTION( "MersenneTwister point set" ) {
62#ifdef CORE_USE_DOUBLE
63 // Sequence valid only when Scalar == double
65 std::pair<Scalar, Scalar> { 0.59284461651668263204584263803554_ra,
66 0.84426574425659828282419994138763_ra },
67 { 0.85794561998982987738315841852454_ra, 0.84725173738433123826752080276492_ra },
68 { 0.62356369649610832173181051985011_ra, 0.38438170837375662536317122430773_ra },
69 { 0.29753460535723419422282631785492_ra, 0.056712975933163663200264892338964_ra },
70 { 0.27265629474158931122573790162278_ra, 0.47766511174464632016878340436961_ra } };
71#else
72 // Sequence valid only when Scalar == float
74 std::pair<Scalar, Scalar> { 0.548813521862030029296875_ra,
75 0.59284460544586181640625_ra },
76 { 0.71518933773040771484375_ra, 0.844265758991241455078125_ra },
77 { 0.602763354778289794921875_ra, 0.857945621013641357421875_ra },
78 { 0.544883191585540771484375_ra, 0.847251713275909423828125_ra },
79 { 0.4236547946929931640625_ra, 0.623563706874847412109375_ra } };
80#endif
82 CHECK_SEQ2
83 }
84
85 SECTION( "SphericalPointSet point set (Hammersley)" ) {
87 std::pair<Scalar, Scalar> { 1.2246467991473532071737640294584e-16_ra, 0_ra },
88 { 0.30901699437494745126286943559535_ra, 0.95105651629515353118193843329209_ra },
89 { -0.70062926922203661028731858095853_ra, 0.50903696045512725198989301134134_ra },
90 { -0.70062926922203672130962104347418_ra, -0.50903696045512702994528808631003_ra },
91 { 0.20439552950218897731105016646325_ra, -0.62906475622110624712490789534058_ra } };
93 CHECK_SEQ2
94 }
95}
Implements the 2D fibonacci Point set points follow the FibonacciSequence (i, N) => [i / phi,...
Implements the fibonacci sequence i --> i/phi where phi = (1 + sqrt(5)) / 2.
Map a [0, 1)^2 point set on the unit sphere.
Random point set utilities.
1D Van der Corput sequence only implemented for 32bits floats (converted out to Scalar)