Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
vector.cpp
Go to the documentation of this file.
1
7
9
10#include <algorithm>
11#include <array>
12#include <functional>
13#include <random>
14#include <vector>
15
18
21 template <typename T>
22 static void mutate(std::mt19937_64& rng,
23 std::vector<T>& vec,
24 std::function<T(std::mt19937_64&)> generate_random_element_function)
25 {
26 T element = generate_random_element_function(rng);
27 if (!vec.empty()) {
28 std::uniform_int_distribution<size_t> dist(0, vec.size());
29 size_t index = dist(rng);
30 vec.insert(vec.begin() + static_cast<std::ptrdiff_t>(index), element);
31 } else {
32 vec.push_back(element);
33 }
34 }
35};
36
39 template <typename T> static void mutate(std::mt19937_64& rng, std::vector<T>& vec)
40 {
41 if (vec.size() >= 1) {
42 std::uniform_int_distribution<size_t> dist(0, vec.size() - 1);
43 size_t index = dist(rng);
44 vec.erase(vec.begin() + static_cast<std::ptrdiff_t>(index));
45 }
46 }
47};
48
50struct RandomSwap {
51 template <typename T> static void mutate(std::mt19937_64& rng, std::vector<T>& vec)
52 {
53 if (!vec.empty()) {
54 std::uniform_int_distribution<size_t> dist(0, vec.size() - 1);
55 size_t index1 = dist(rng);
56 size_t index2 = dist(rng);
57 std::swap(vec[index1], vec[index2]);
58 }
59 }
60};
61
64 template <typename T>
65 static void mutate(std::mt19937_64& rng,
66 std::vector<T>& vec,
67 std::function<void(T&, std::mt19937_64&)> mutate_element_function)
68 {
69 if (!vec.empty()) {
70 std::uniform_int_distribution<size_t> dist(0, vec.size() - 1);
71 size_t index = dist(rng);
72 mutate_element_function(vec[index], rng);
73 }
74 }
75};
76
77template <typename T>
79 std::mt19937_64& rng,
80 std::function<void(T&, std::mt19937_64&)> mutate_element_function,
81 std::function<T(std::mt19937_64&)> generate_random_element_function,
82 const VecMutationConfig& config)
83{
84 VecMutationOptions option = config.select(rng);
85 switch (option) {
87 RandomInsertion::mutate(rng, vec, generate_random_element_function);
88 break;
90 RandomDeletion::mutate(rng, vec);
91 break;
93 RandomSwap::mutate(rng, vec);
94 break;
96 RandomElementMutation::mutate(rng, vec, mutate_element_function);
97 break;
98 }
99}
100
104
106 std::vector<CFGInstruction>& vec,
107 std::mt19937_64& rng,
108 std::function<void(CFGInstruction&, std::mt19937_64&)> mutate_element_function,
109 std::function<CFGInstruction(std::mt19937_64&)> generate_random_element_function,
110 const VecMutationConfig& config);
111
114 std::mt19937_64& rng,
115 std::function<void(FuzzInstruction&, std::mt19937_64&)> mutate_element_function,
116 std::function<FuzzInstruction(std::mt19937_64&)> generate_random_element_function,
117 const VecMutationConfig& config);
118
119template void mutate_vec<std::vector<FuzzInstruction>>(
121 std::mt19937_64& rng,
122 std::function<void(std::vector<FuzzInstruction>&, std::mt19937_64&)> mutate_element_function,
123 std::function<std::vector<FuzzInstruction>(std::mt19937_64&)> generate_random_element_function,
124 const VecMutationConfig& config);
125
126template void mutate_vec<bb::avm2::FF>(std::vector<bb::avm2::FF>& vec,
127 std::mt19937_64& rng,
128 std::function<void(bb::avm2::FF&, std::mt19937_64&)> mutate_element_function,
129 std::function<bb::avm2::FF(std::mt19937_64&)> generate_random_element_function,
130 const VecMutationConfig& config);
::FuzzInstruction FuzzInstruction
T select(std::mt19937_64 &rng) const
VecMutationOptions
std::variant< InsertSimpleInstructionBlock, JumpToNewBlock, JumpIfToNewBlock, JumpToBlock, JumpIfToBlock, FinalizeWithReturn, SwitchToNonTerminatedBlock, InsertInternalCall > CFGInstruction
AvmFlavorSettings::FF FF
Definition field.hpp:10
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Delete a random element at a random index.
Definition vector.cpp:38
static void mutate(std::mt19937_64 &rng, std::vector< T > &vec)
Definition vector.cpp:39
Mutate a random element at a random index.
Definition vector.cpp:63
static void mutate(std::mt19937_64 &rng, std::vector< T > &vec, std::function< void(T &, std::mt19937_64 &)> mutate_element_function)
Definition vector.cpp:65
Insert a random element at a random index.
Definition vector.cpp:20
static void mutate(std::mt19937_64 &rng, std::vector< T > &vec, std::function< T(std::mt19937_64 &)> generate_random_element_function)
Definition vector.cpp:22
Swap two random elements at random indices.
Definition vector.cpp:50
static void mutate(std::mt19937_64 &rng, std::vector< T > &vec)
Definition vector.cpp:51
template void mutate_vec< bb::avm2::FF >(std::vector< bb::avm2::FF > &vec, std::mt19937_64 &rng, std::function< void(bb::avm2::FF &, std::mt19937_64 &)> mutate_element_function, std::function< bb::avm2::FF(std::mt19937_64 &)> generate_random_element_function, const VecMutationConfig &config)
template void mutate_vec< CFGInstruction >(std::vector< CFGInstruction > &vec, std::mt19937_64 &rng, std::function< void(CFGInstruction &, std::mt19937_64 &)> mutate_element_function, std::function< CFGInstruction(std::mt19937_64 &)> generate_random_element_function, const VecMutationConfig &config)
void mutate_vec(std::vector< T > &vec, std::mt19937_64 &rng, std::function< void(T &, std::mt19937_64 &)> mutate_element_function, std::function< T(std::mt19937_64 &)> generate_random_element_function, const VecMutationConfig &config)
Definition vector.cpp:78
template void mutate_vec< FuzzInstruction >(std::vector< FuzzInstruction > &vec, std::mt19937_64 &rng, std::function< void(FuzzInstruction &, std::mt19937_64 &)> mutate_element_function, std::function< FuzzInstruction(std::mt19937_64 &)> generate_random_element_function, const VecMutationConfig &config)