xrpld
Toggle main menu visibility
Loading...
Searching...
No Matches
tests
libxrpl
csf
src/tests/libxrpl/csf/random.h
1
#pragma once
2
3
#include <
algorithm
>
4
#include <
cstddef
>
5
#include <
iterator
>
6
#include <
random
>
7
#include <
vector
>
8
9
namespace
xrpl::test::csf
{
10
21
template
<
class
T,
class
G>
22
std::vector<T>
23
randomWeightedShuffle
(
std::vector<T>
v,
std::vector<double>
w, G& g)
24
{
25
using
std::swap
;
26
27
for
(
auto
i = 0uz; i + 1 < v.
size
(); ++i)
28
{
29
// Pick a random item from the unplaced tail, weighted by w.
30
// NOLINTNEXTLINE(misc-const-correctness)
31
std::discrete_distribution<std::size_t>
dd(w.
begin
() + i, w.
end
());
32
auto
const
idx = i + dd(g);
33
std::swap
(v[i], v[idx]);
34
std::swap
(w[i], w[idx]);
35
}
36
return
v;
37
}
38
48
template
<
class
RandomNumberDistribution,
class
Generator>
49
std::vector<typename RandomNumberDistribution::result_type>
50
sample
(
std::size_t
size, RandomNumberDistribution dist,
Generator
& g)
51
{
52
std::vector<typename RandomNumberDistribution::result_type>
res(size);
53
std::ranges::generate
(res, [&dist, &g]() {
return
dist(g); });
54
return
res;
55
}
56
65
template
<
class
RAIter,
class
Generator>
66
class
Selector
67
{
68
RAIter
first_
,
last_
;
69
std::discrete_distribution<>
dd_
;
70
Generator
g_
;
71
72
public
:
80
Selector
(RAIter first, RAIter
last
,
std::vector<double>
const
& w,
Generator
& g)
81
:
first_
{first},
last_
{
last
},
dd_
{w.begin(), w.end()},
g_
{g}
82
{
83
using
Tag =
std::iterator_traits<RAIter>::iterator_category
;
84
static_assert
(
85
std::is_same_v<Tag, std::random_access_iterator_tag>
,
86
"Selector only supports random access iterators."
);
87
// TODO: Allow for forward iterators
88
}
89
90
std::iterator_traits<RAIter>::value_type
91
operator()
()
92
{
93
auto
idx =
dd_
(
g_
);
94
return
*(
first_
+ idx);
95
}
96
};
97
98
template
<
typename
Iter,
typename
Generator>
99
Selector<Iter, Generator>
100
makeSelector
(Iter first, Iter
last
,
std::vector<double>
const
& w,
Generator
& g)
101
{
102
return
Selector<Iter, Generator>
(first,
last
, w, g);
103
}
104
105
//------------------------------------------------------------------------------
106
// Additional distributions of interest not defined in <random>
107
111
class
ConstantDistribution
112
{
113
double
t_
;
114
115
public
:
116
ConstantDistribution
(
double
const
& t) :
t_
{t}
117
{
118
}
119
120
template
<
class
Generator>
121
double
122
operator()
(
Generator
&)
123
{
124
return
t_
;
125
}
126
};
127
135
class
PowerLawDistribution
136
{
137
double
xmin_
;
138
double
a_
;
139
double
inv_
{1.0 / (1.0 -
a_
)};
140
std::uniform_real_distribution<double>
uf_
{0, 1};
141
142
public
:
143
using
result_type
= double;
144
145
PowerLawDistribution
(
double
xmin,
double
a) :
xmin_
{xmin},
a_
{a}
146
{
147
}
148
149
template
<
class
Generator>
150
double
151
operator()
(
Generator
& g)
152
{
153
// use inverse transform of CDF to sample
154
// CDF is P(X <= x): 1 - (x/xmin)^(1-a)
155
return
xmin_
*
std::pow
(1 -
uf_
(g),
inv_
);
156
}
157
};
158
159
}
// namespace xrpl::test::csf
algorithm
std::vector::begin
T begin(T... args)
xrpl::test::csf::ConstantDistribution::t_
double t_
Definition
src/tests/libxrpl/csf/random.h:113
xrpl::test::csf::ConstantDistribution::ConstantDistribution
ConstantDistribution(double const &t)
Definition
src/tests/libxrpl/csf/random.h:116
xrpl::test::csf::ConstantDistribution::operator()
double operator()(Generator &)
Definition
src/tests/libxrpl/csf/random.h:122
xrpl::test::csf::PowerLawDistribution::xmin_
double xmin_
Definition
src/tests/libxrpl/csf/random.h:137
xrpl::test::csf::PowerLawDistribution::result_type
double result_type
Definition
src/tests/libxrpl/csf/random.h:143
xrpl::test::csf::PowerLawDistribution::PowerLawDistribution
PowerLawDistribution(double xmin, double a)
Definition
src/tests/libxrpl/csf/random.h:145
xrpl::test::csf::PowerLawDistribution::inv_
double inv_
Definition
src/tests/libxrpl/csf/random.h:139
xrpl::test::csf::PowerLawDistribution::a_
double a_
Definition
src/tests/libxrpl/csf/random.h:138
xrpl::test::csf::PowerLawDistribution::operator()
double operator()(Generator &g)
Definition
src/tests/libxrpl/csf/random.h:151
xrpl::test::csf::PowerLawDistribution::uf_
std::uniform_real_distribution< double > uf_
Definition
src/tests/libxrpl/csf/random.h:140
xrpl::test::csf::Selector
Invocable that returns random samples from a range according to a discrete distribution.
Definition
src/tests/libxrpl/csf/random.h:67
xrpl::test::csf::Selector::last_
RAIter last_
Definition
src/tests/libxrpl/csf/random.h:68
xrpl::test::csf::Selector::g_
Generator g_
Definition
src/tests/libxrpl/csf/random.h:70
xrpl::test::csf::Selector::first_
RAIter first_
Definition
src/tests/libxrpl/csf/random.h:68
xrpl::test::csf::Selector::dd_
std::discrete_distribution dd_
Definition
src/tests/libxrpl/csf/random.h:69
xrpl::test::csf::Selector::operator()
std::iterator_traits< RAIter >::value_type operator()()
Definition
src/tests/libxrpl/csf/random.h:91
xrpl::test::csf::Selector::Selector
Selector(RAIter first, RAIter last, std::vector< double > const &w, Generator &g)
Constructor.
Definition
src/tests/libxrpl/csf/random.h:80
cstddef
std::discrete_distribution
std::vector::end
T end(T... args)
std::ranges::generate
T generate(T... args)
std::is_same_v
T is_same_v
iterator
std::iterator_traits
std::chrono::last
xrpl::test::csf
Definition
Validations.cpp:23
xrpl::test::csf::makeSelector
Selector< Iter, Generator > makeSelector(Iter first, Iter last, std::vector< double > const &w, Generator &g)
Definition
src/tests/libxrpl/csf/random.h:100
xrpl::test::csf::sample
std::vector< typename RandomNumberDistribution::result_type > sample(std::size_t size, RandomNumberDistribution dist, Generator &g)
Generate a vector of random samples.
Definition
src/tests/libxrpl/csf/random.h:50
xrpl::test::csf::randomWeightedShuffle
std::vector< T > randomWeightedShuffle(std::vector< T > v, std::vector< double > w, G &g)
Return a randomly shuffled copy of vector based on weights w.
Definition
src/tests/libxrpl/csf/random.h:23
xrpl::LedgerNameSpace::Generator
@ Generator
Definition
Indexes.cpp:111
std::pow
T pow(T... args)
random
std::vector::size
T size(T... args)
std::size_t
std::swap
T swap(T... args)
std::uniform_real_distribution
vector
Generated by
1.17.0