Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
vector.hpp
Go to the documentation of this file.
1
7
8#pragma once
9
10#include <algorithm>
11#include <random>
12#include <vector>
13
15
18 template <typename T, typename GenerateFn>
19 static void mutate(std::mt19937_64& rng, std::vector<T>& vec, GenerateFn&& generate_random_element_function)
20 {
21 T element = generate_random_element_function(rng);
22 if (!vec.empty()) {
23 std::uniform_int_distribution<size_t> dist(0, vec.size());
24 size_t index = dist(rng);
25 vec.insert(vec.begin() + static_cast<std::ptrdiff_t>(index), element);
26 } else {
27 vec.push_back(element);
28 }
29 }
30};
31
34 template <typename T> static void mutate(std::mt19937_64& rng, std::vector<T>& vec)
35 {
36 if (vec.size() >= 1) {
37 std::uniform_int_distribution<size_t> dist(0, vec.size() - 1);
38 size_t index = dist(rng);
39 vec.erase(vec.begin() + static_cast<std::ptrdiff_t>(index));
40 }
41 }
42};
43
45struct RandomSwap {
46 template <typename T> static void mutate(std::mt19937_64& rng, std::vector<T>& vec)
47 {
48 if (!vec.empty()) {
49 std::uniform_int_distribution<size_t> dist(0, vec.size() - 1);
50 size_t index1 = dist(rng);
51 size_t index2 = dist(rng);
52 std::swap(vec[index1], vec[index2]);
53 }
54 }
55};
56
59 template <typename T, typename MutateFn>
60 static void mutate(std::mt19937_64& rng, std::vector<T>& vec, MutateFn&& mutate_element_function)
61 {
62 if (!vec.empty()) {
63 std::uniform_int_distribution<size_t> dist(0, vec.size() - 1);
64 size_t index = dist(rng);
65 mutate_element_function(vec[index], rng);
66 }
67 }
68};
69
70template <typename T, typename MutateFn, typename GenerateFn>
72 std::mt19937_64& rng,
73 MutateFn&& mutate_element_function,
74 GenerateFn&& generate_random_element_function,
75 const VecMutationConfig& config)
76{
77 // If vector is empty, force insertion (other mutations do nothing on empty vectors)
78 if (vec.empty()) {
79 RandomInsertion::mutate(rng, vec, std::forward<GenerateFn>(generate_random_element_function));
80 return;
81 }
82
83 VecMutationOptions option = config.select(rng);
84 switch (option) {
86 RandomInsertion::mutate(rng, vec, std::forward<GenerateFn>(generate_random_element_function));
87 break;
89 RandomDeletion::mutate(rng, vec);
90 break;
92 RandomSwap::mutate(rng, vec);
93 break;
95 RandomElementMutation::mutate(rng, vec, std::forward<MutateFn>(mutate_element_function));
96 break;
97 }
98}
T select(std::mt19937_64 &rng) const
VecMutationOptions
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Delete a random element at a random index.
Definition vector.hpp:33
static void mutate(std::mt19937_64 &rng, std::vector< T > &vec)
Definition vector.hpp:34
Mutate a random element at a random index.
Definition vector.hpp:58
static void mutate(std::mt19937_64 &rng, std::vector< T > &vec, MutateFn &&mutate_element_function)
Definition vector.hpp:60
Insert a random element at a random index.
Definition vector.hpp:17
static void mutate(std::mt19937_64 &rng, std::vector< T > &vec, GenerateFn &&generate_random_element_function)
Definition vector.hpp:19
Swap two random elements at random indices.
Definition vector.hpp:45
static void mutate(std::mt19937_64 &rng, std::vector< T > &vec)
Definition vector.hpp:46
void mutate_vec(std::vector< T > &vec, std::mt19937_64 &rng, MutateFn &&mutate_element_function, GenerateFn &&generate_random_element_function, const VecMutationConfig &config)
Definition vector.hpp:71