Loading...
Searching...
No Matches
random.h
Go to the documentation of this file.
1#ifndef _BBM_DRJIT_RANDOM_H_
2#define _BBM_DRJIT_RANDOM_H_
3
4#include <limits>
5#include <cfloat>
6#include "drjit/random.h"
7
8#include "backbone/type_traits.h"
9
10/************************************************************************/
11/*! \filename random.h
12
13 \brief Random number generator; built on top of Drjit
14
15*************************************************************************/
16
17namespace backbone {
18
19 /**********************************************************************/
20 /*! \brief seed type
21 **********************************************************************/
22 using seed_t = uint64_t;
23
24 /**********************************************************************/
25 /*! \bref Default seed
26 ***********************************************************************/
27 static constexpr seed_t default_seed = PCG32_DEFAULT_STATE;
28
29 /**********************************************************************/
30 /*! \brief Random generator wrapper around Drjit's PCG32
31 ***********************************************************************/
32 template<typename T>
33 struct rng
34 {
35 using type = T;
36
37 //! @{ Constructors
38 inline rng(void)
39 {
41 _lower = 0;
42 if constexpr (std::integral<scalar_t<T>>) _upper = std::numeric_limits<T>::max();
43 else _upper = 1;
44 }
45
46 inline rng(seed_t seed) : rng()
47 {
48 _rng.seed(seed);
49 }
50
51 inline rng(type lower, type upper) : _lower(lower), _upper(upper), _rng(default_seed) {}
52 inline rng(seed_t seed, type lower, type upper) : _lower(lower), _upper(upper), _rng(seed) {}
53 //! @}
54
55 //! \brief set the seed
56 inline void seed(auto seed)
57 {
58 _rng.seed(seed);
59 }
60
61 //!\ brief get next number
62 inline type operator()(void)
63 {
64 // float
65 if constexpr (std::floating_point<scalar_t<T>>)
66 {
67 if constexpr (std::numeric_limits<scalar_t<T>>::digits > FLT_MANT_DIG) return _rng.next_float64() * (_upper - _lower) + _lower;
68 else return _rng.next_float32() * (_upper - _lower) + _lower;
69 }
70
71 // integral
72 else //if constexpr (std::integral<scalar_t<T>>)
73 {
74 if constexpr (std::numeric_limits<scalar_t<T>>::digits > 32) return _rng.next_uint64_bounded((_upper - _lower)) + _lower;
75 else return _rng.next_uint32_bounded((_upper - _lower)) + _lower;
76 }
77
78 }
79
80 private:
81 drjit::PCG32<T> _rng;
83 };
84
85} // end backbone namespace
86
87#endif /* _BBM_DRJIT_RANDOM_H_ */
88
Random number generator; built on top of Drjit.
Definition: backbone.h:53
uint64_t seed_t
seed type
Definition: random.h:22
static constexpr seed_t default_seed
Definition: random.h:27
Random generator wrapper around Drjit's PCG32.
Definition: random.h:34
rng(seed_t seed)
Definition: random.h:46
rng(void)
Constructors.
Definition: random.h:38
type _lower
Definition: random.h:82
T type
Definition: random.h:35
void seed(auto seed)
set the seed
Definition: random.h:56
rng(seed_t seed, type lower, type upper)
Definition: random.h:52
type _upper
Definition: random.h:82
rng(type lower, type upper)
Definition: random.h:51
type operator()(void)
\ brief get next number
Definition: random.h:62
drjit::PCG32< T > _rng
Definition: random.h:81