simulation: extract pair picking strategies into their own functions

This commit is contained in:
2026-03-18 17:34:43 +00:00
parent f0d4657071
commit 6599bca3bf

View File

@@ -38,21 +38,23 @@ void simulation_mutate(simulation_t *sim)
#endif #endif
} }
static struct ProgramConcat *a_b_concat = NULL;
void simulation_iterate(simulation_t *sim)
{
u64 a = 0, b = 0;
// Strategy 1: Pick two random cells // Strategy 1: Pick two random cells
// while (a == b) void simulation_pick_rng_pair(u64 *a, u64 *b)
// { {
// a = rand() % NUM_PROGRAMS; while (*a == *b)
// b = rand() % NUM_PROGRAMS; {
// } *a = rand() % NUM_PROGRAMS;
*b = rand() % NUM_PROGRAMS;
}
}
// Strategy 2: Pick a random cell, then iterate on all neighbours // Strategy 2: Pick a random cell, then iterate on all neighbours
a = rand() % NUM_PROGRAMS; // Perform the reaction
u64 a_x = a % SIMULATION_ROW_SIZE; void simulation_pick_rng_neighbour(u64 *a, u64 *b)
u64 a_y = a / SIMULATION_ROW_SIZE; {
*a = rand() % NUM_PROGRAMS;
u64 a_x = *a % SIMULATION_ROW_SIZE;
u64 a_y = *a / SIMULATION_ROW_SIZE;
bool valid_dir[4] = { bool valid_dir[4] = {
a_x > 0, a_x > 0,
@@ -65,40 +67,47 @@ void simulation_iterate(simulation_t *sim)
u64 size = 0; u64 size = 0;
if (valid_dir[0]) if (valid_dir[0])
{ {
neighbours[size++] = a - 1; neighbours[size++] = *a - 1;
if (valid_dir[2]) if (valid_dir[2])
{ {
neighbours[size++] = a - SIMULATION_ROW_SIZE - 1; neighbours[size++] = *a - SIMULATION_ROW_SIZE - 1;
} }
if (valid_dir[3]) if (valid_dir[3])
{ {
neighbours[size++] = a + SIMULATION_ROW_SIZE - 1; neighbours[size++] = *a + SIMULATION_ROW_SIZE - 1;
} }
} }
if (valid_dir[1]) if (valid_dir[1])
{ {
neighbours[size++] = a + 1; neighbours[size++] = *a + 1;
if (valid_dir[2]) if (valid_dir[2])
{ {
neighbours[size++] = a - SIMULATION_ROW_SIZE + 1; neighbours[size++] = *a - SIMULATION_ROW_SIZE + 1;
} }
if (valid_dir[3]) if (valid_dir[3])
{ {
neighbours[size++] = a + SIMULATION_ROW_SIZE + 1; neighbours[size++] = *a + SIMULATION_ROW_SIZE + 1;
} }
} }
if (valid_dir[2]) if (valid_dir[2])
{ {
neighbours[size++] = a - SIMULATION_ROW_SIZE; neighbours[size++] = *a - SIMULATION_ROW_SIZE;
} }
if (valid_dir[3]) if (valid_dir[3])
{ {
neighbours[size++] = a + SIMULATION_ROW_SIZE; neighbours[size++] = *a + SIMULATION_ROW_SIZE;
} }
b = neighbours[rand() % size]; *b = neighbours[rand() % size];
}
static struct ProgramConcat *a_b_concat = NULL;
void simulation_iterate(simulation_t *sim)
{
u64 a = 0, b = 0;
simulation_pick_rng_neighbour(&a, &b);
// Perform the reaction
if (!a_b_concat) if (!a_b_concat)
{ {
a_b_concat = calloc(1, sizeof(*a_b_concat)); a_b_concat = calloc(1, sizeof(*a_b_concat));