add in xorshift rand function. begin reworking job queue to use cell entry pointers instead of just cells so results can be posted directly to the relevant entry

This commit is contained in:
2025-08-16 00:41:28 -05:00
parent edda3761d1
commit 3265f045d1
3 changed files with 52 additions and 27 deletions

View File

@@ -30,12 +30,15 @@ template <class T> struct Strategy {
bool enable_mutation; // Cells may be mutated
// before fitness evaluation
float mutation_chance; // Chance to mutate cells before fitness evaluation
uint64_t rand_seed;
bool higher_fitness_is_better; // Sets whether or not to consider higher
// fitness values better or worse. Set this to
// false if fitness is an error function.
// User defined functions
T (*make_default_cell)();
void (*mutate)(T &cell_to_modify);
void (*crossover)(const ReadonlySpan<T> &parents,
const Span<T> &out_children);
void (*crossover)(const Span<T *> parents, const Span<T *> out_children);
float (*fitness)(const T &cell);
};
@@ -44,13 +47,6 @@ template <class T> struct Stats {
std::vector<float> average_fitness;
};
template <class T> struct ReadonlySpan {
T *_data;
int len;
const T &operator[](int i);
};
template <class T> struct Span {
T *_data;
int len;

18
inc/rand.h Normal file
View File

@@ -0,0 +1,18 @@
// TODO: This file needs a serious audit
#include <cstdint>
constexpr uint64_t half_max = UINT64_MAX / 2;
// From https://en.wikipedia.org/wiki/Xorshift
inline void xorshift64(uint64_t &state) {
state ^= state << 13;
state ^= state >> 7;
state ^= state << 17;
}
// returns a random value between -1 and 1. modifies seed
inline float norm_rand(uint64_t &state) {
xorshift64(state);
return (state - half_max) / half_max;
}