11#include <unordered_map>
22 random_device rand_dev;
23 mt19937 generator(rand_dev());
24 uniform_int_distribution<T> distr(range_from, range_to);
25 return distr(generator);
28inline bool ends_with(
string const &value,
string const &ending) {
29 if (ending.size() > value.size())
31 return equal(ending.rbegin(), ending.rend(), value.rbegin());
34template <
typename FromKey,
typename ToKey,
typename Value>
36 unordered_map<FromKey, Value> orig_map,
37 std ::unordered_map<FromKey, ToKey> key_substitutions
39 unordered_map<ToKey, Value> new_map;
40 for (
auto entry : key_substitutions) {
41 new_map[entry.second] = orig_map[entry.first];
48template <
typename FromKey,
typename ToKey,
typename Value>
50 unordered_map<FromKey, Value> orig_map,
51 unordered_map<FromKey, ToKey> key_substitutions
53 unordered_map<ToKey, Value> new_map;
54 for (
auto entry : key_substitutions) {
55 new_map[entry.second] = orig_map[entry.first];
62template <
typename FromKey,
typename ToKey,
typename Value>
64 unordered_map<FromKey, Value> orig_map,
65 unordered_map<ToKey, FromKey> key_substitutions
67 unordered_map<ToKey, Value> new_map;
68 for (
auto entry : key_substitutions) {
69 new_map[entry.first] = orig_map[entry.second];
74template <
typename two_d_array_t>
76 auto flipped_array = orig_array;
77 reverse(flipped_array.begin(), flipped_array.end());
81template <
typename two_d_array_t>
83 two_d_array_t result{};
84 for (
auto row = 0; row < a.size(); row++) {
85 for (
auto col = 0; col < a[0].size(); col++) {
86 result[row][col] = a[row][col] + b[row][col];
92template <
typename two_d_array_t,
typename array_element_t>
94 two_d_array_t result{};
95 for (
auto row = 0; row < array.size(); row++) {
96 for (
auto col = 0; col < array[0].size(); col++) {
97 result[row][col] = array[row][col] + offset;
103template <
typename two_d_array_t,
typename array_element_t>
105 bool are_equal =
true;
107 for (
auto rank = 0; rank < a.size(); rank++) {
108 for (
auto file = 0; file < a[0].size(); file++) {
109 if (a[rank][file] != b[rank][file]) {
120 const std::vector<T> &vec,
126 if (lookback_length % period != 0 || vec.size() < lookback_length) {
131 int repetitions = lookback_length / period;
135 for (
int i = 0; i < period; ++i) {
136 T patternElement = vec[vec.size() - lookback_length + i];
137 for (
int j = 1; j < repetitions; ++j) {
138 if (vec[vec.size() - lookback_length + i + j * period] !=
148template <
typename T,
typename M>
150 const std::vector<T> &vec,
154 return std::find_if(vec.begin(), vec.end(), [member, &value](
const T &item) {
155 return item.*member == value;
Free functions that don't clearly belong in any other namespace.
unordered_map< ToKey, Value > replace_keys_reverse(unordered_map< FromKey, Value > orig_map, unordered_map< ToKey, FromKey > key_substitutions)
bool operator==(two_d_array_t &a, two_d_array_t &b)
T random(T range_from, T range_to)
bool ends_with(string const &value, string const &ending)
const string get_data_file_abs_path(const std::string data_file)
unordered_map< ToKey, Value > replace_keys(unordered_map< FromKey, Value > orig_map, std ::unordered_map< FromKey, ToKey > key_substitutions)
two_d_array_t array_plus_const(two_d_array_t array, array_element_t offset)
unordered_map< ToKey, Value > replace_keys_forward(unordered_map< FromKey, Value > orig_map, unordered_map< FromKey, ToKey > key_substitutions)
two_d_array_t two_array_sum(two_d_array_t a, two_d_array_t b)
bool hasRepeatingPattern(const std::vector< T > &vec, int lookback_length, int period)
std::vector< T >::const_iterator find_by_member(const std::vector< T > &vec, M T::*member, const M &value)
two_d_array_t vertical_flip_array(two_d_array_t orig_array)