KIDS  ver-0.0.1
KIDS : Kernel Integrated Dynamics Simulator
Loading...
Searching...
No Matches
Kernel_Random.cpp
Go to the documentation of this file.
2
3#include "kids/hash_fnv1a.h"
4#include "kids/macro_utils.h"
5
6namespace PROJECT_NS {
7
9std::uniform_int_distribution<int> Kernel_Random::rand_uid{0, 1};
10std::uniform_real_distribution<kids_real> Kernel_Random::rand_udd{0, 1};
11std::normal_distribution<kids_real> Kernel_Random::rand_nd{0.0, 1.0};
12std::poisson_distribution<int> Kernel_Random::rand_pd{1.0};
13
14const std::string Kernel_Random::getName() { return "Kernel_Random"; }
15
17
18int Kernel_Random::rand_catalog(int* res_arr, int N, bool reset, int begin, int end) {
19 if (reset) rand_uid.param(uid_range{begin, end});
20 for (int i = 0; i < N; ++i) { res_arr[i] = rand_uid(rand_rng); }
21 return 0;
22}
23
24int Kernel_Random::rand_uniform(kids_real* res_arr, int N, kids_real sigma) {
25 for (int i = 0; i < N; ++i) { res_arr[i] = sigma * rand_udd(rand_rng); }
26 return 0;
27}
28
30 kids_real mu) { // parse mu after sigma !!!
31 for (int i = 0; i < N; ++i) { res_arr[i] = mu + sigma * rand_nd(rand_rng); }
32 return 0;
33}
34
36 kids_real randu;
37 for (int i = 0; i < N; ++i) {
38 rand_uniform(&randu);
39 res_arr[i] = -std::log(1.0 - randu);
40 }
41 return 0;
42}
43
44int Kernel_Random::rand_poisson(int* res_arr, int N, kids_real lambda) {
45 // when lambda > 10, it can be approximated by rand_gaussian(res_arr, N, sqrt(lambda), lambda);
46 rand_pd.param(pd_range{lambda});
47 for (int i = 0; i < N; ++i) res_arr[i] = rand_pd(rand_rng);
48 return 0;
49}
50
51int Kernel_Random::rand_simplex(kids_real* res_arr, int N, kids_real constr) {
52 for (int i = 1; i < N; ++i) res_arr[i] = rand_udd(rand_rng);
53 res_arr[0] = 0;
54 std::qsort(res_arr, N, sizeof(*res_arr), [](const void* a, const void* b) {
55 kids_real arg1 = *static_cast<const kids_real*>(a);
56 kids_real arg2 = *static_cast<const kids_real*>(b);
57
58 if (arg1 < arg2) return -1;
59 if (arg1 > arg2) return 1;
60 return 0;
61 });
62 for (int i = 0; i < N - 1; ++i) { res_arr[i] = res_arr[i + 1] - res_arr[i]; }
63 res_arr[N - 1] = 1.0f - res_arr[N - 1];
64
65 if (constr != 1.0f)
66 for (int i = 1; i < N; ++i) res_arr[i] *= constr;
67 return 0;
68}
69
70int Kernel_Random::rand_sphere(kids_real* res_arr, int N, kids_real constr) {
71 kids_real norm = 0.0f;
72 for (int i = 0; i < N; ++i) {
73 res_arr[i] = rand_nd(rand_rng);
74 norm += res_arr[i] * res_arr[i];
75 }
76 norm = std::sqrt(norm);
77 for (int i = 0; i < N; ++i) { res_arr[i] /= norm; }
78
79 if (constr != 1.0f)
80 for (int i = 0; i < N; ++i) res_arr[i] *= constr;
81 return 0;
82}
83
84void Kernel_Random::setInputDataSet_impl(std::shared_ptr<DataSet>& DS) {
85 seed = DS->def_int("random.seed", rng_t::state_size); //
86}
87
89 if (count_calc == 0) {
90 std::random_device source;
91
92 if (!restart) {
93 for (int i = 0; i < rng_t::state_size; ++i) seed[i] = source();
94 }
95 std::seed_seq sseq(seed, seed + rng_t::state_size);
96 rand_rng = rng_t(sseq);
97 }
98 return stat;
99}
100
101}; // namespace PROJECT_NS
static int rand_simplex(kids_real *res_arr, int N=1, kids_real constr=1.0f)
static std::normal_distribution< kids_real > rand_nd
normal distribution
static int rand_uniform(kids_real *res_arr, int N=1, kids_real sigma=1.0)
static int rand_gaussian(kids_real *res_arr, int N=1, kids_real sigma=1.0, kids_real mu=0.0)
static int rand_catalog(int *res_arr, int N=1, bool reset=false, int begin=0, int end=1)
std::poisson_distribution< int >::param_type pd_range
static std::poisson_distribution< int > rand_pd
possion distribution
static std::uniform_int_distribution< int > rand_uid
catalog distribution
static int rand_exponent(kids_real *res_arr, int N=1)
virtual void setInputDataSet_impl(std::shared_ptr< DataSet > &DS)
Virtual function to set input data set for the kernel implementation.
virtual int getType() const
Get the type of the kernel.
static std::uniform_real_distribution< kids_real > rand_udd
uniform distribution
virtual const std::string getName()
Get the name of the kernel.
std::uniform_int_distribution< int >::param_type uid_range
virtual Status & initializeKernel_impl(Status &stat)
Virtual function to initialize the kernel implementation.
std::mt19937 rng_t
random number generator type
static int rand_poisson(int *res_arr, int N=1, kids_real lambda=1.0f)
static int rand_sphere(kids_real *res_arr, int N=1, kids_real constr=1.0f)
int count_calc
Counter for the number of calculations performed by this kernel.
Definition Kernel.h:257
#define FUNCTION_NAME
Definition macro_utils.h:9
< http://warp.povusers.org/FunctionParser/fparser.html
Definition Context.h:39
double kids_real
Alias for real number type.
Definition Types.h:59
constexpr uint32_t hash(const char *str)
Definition hash_fnv1a.h:12