Put DNa functions in DNA namespace

This commit is contained in:
Nikola Petrov 2025-01-04 13:13:15 +01:00
parent 3122817eee
commit ca01498cb2
4 changed files with 58 additions and 53 deletions

View File

@ -53,8 +53,11 @@ struct Dna
uint8_t colorSet; uint8_t colorSet;
Branch branches[MAX_DEPTH]; Branch branches[MAX_DEPTH];
}; };
void newDna(Dna *dna, uint128 *state); namespace DNA
void makeChild(Dna *p1, Dna *p2, Dna *c, uint128 *state); {
void clone(Dna *p1, Dna *c, uint128 *state); void newDna(Dna *dna, uint128 *state);
void mutate(Dna *dna, uint32_t num, uint128 *state); void makeChild(Dna *p1, Dna *p2, Dna *c, uint128 *state);
void clone(Dna *p1, Dna *c, uint128 *state);
void mutate(Dna *dna, uint32_t num, uint128 *state);
}
#endif /* DNA_H */ #endif /* DNA_H */

View File

@ -5,9 +5,7 @@ struct uint128;
namespace mrand namespace mrand
{ {
void setSeed(unsigned long long seed); void setSeed(unsigned long long seed);
// int getValue(int min, int max);
float getFloat(uint128 *state); float getFloat(uint128 *state);
// float getFloat();
int getValue(int min, int max, uint128 *state); int getValue(int min, int max, uint128 *state);
uint32_t getInt(); uint32_t getInt();
} }

View File

@ -6,59 +6,63 @@
#include <raymath.h> #include <raymath.h>
void newDna(Dna *dna, uint128 *state) namespace DNA
{ {
uint8_t *array = (uint8_t *)dna;
for (size_t i = 0; i < sizeof(Dna); i++)
{
array[i] = mrand::getValue(0, 255, state);
}
return;
}
void makeChild(Dna *p1, Dna *p2, Dna *c, uint128 *state) void newDna(Dna *dna, uint128 *state)
{
uint8_t *p1a = (uint8_t *)p1;
uint8_t *p2a = (uint8_t *)p2;
uint8_t *ca = (uint8_t *)c;
for (size_t i = 0; i < sizeof(Dna); i++)
{ {
int val = mrand::getValue(0, 1, state); uint8_t *array = (uint8_t *)dna;
if (val == 0) for (size_t i = 0; i < sizeof(Dna); i++)
{ {
ca[i] = p1a[i]; array[i] = mrand::getValue(0, 255, state);
}
else
{
ca[i] = p2a[i];
} }
return;
} }
}
void clone(Dna *p1, Dna *c, uint128 *state) void makeChild(Dna *p1, Dna *p2, Dna *c, uint128 *state)
{ {
uint8_t *p1a = (uint8_t *)p1; uint8_t *p1a = (uint8_t *)p1;
uint8_t *p2a = (uint8_t *)p2;
uint8_t *ca = (uint8_t *)c;
for (size_t i = 0; i < sizeof(Dna); i++)
{
int val = mrand::getValue(0, 1, state);
if (val == 0)
{
ca[i] = p1a[i];
}
else
{
ca[i] = p2a[i];
}
}
}
uint8_t *ca = (uint8_t *)c; void clone(Dna *p1, Dna *c, uint128 *state)
for (size_t i = 0; i < sizeof(Dna); i++)
{ {
int val = mrand::getValue(0, 1, state); uint8_t *p1a = (uint8_t *)p1;
if (val == 0)
uint8_t *ca = (uint8_t *)c;
for (size_t i = 0; i < sizeof(Dna); i++)
{ {
ca[i] = p1a[i]; int val = mrand::getValue(0, 1, state);
} if (val == 0)
else {
{ ca[i] = p1a[i];
ca[i] = mrand::getValue(0, 255, state); }
else
{
ca[i] = mrand::getValue(0, 255, state);
}
} }
} }
} void mutate(Dna *dna, uint32_t num, uint128 *state)
void mutate(Dna *dna, uint32_t num, uint128 *state)
{
uint8_t *array = (uint8_t *)dna;
for (size_t i = 0; i < num; i++)
{ {
int pos = mrand::getValue(0, sizeof(Dna), state); uint8_t *array = (uint8_t *)dna;
array[pos] = mrand::getValue(0, 255, state); for (size_t i = 0; i < num; i++)
{
int pos = mrand::getValue(0, sizeof(Dna), state);
array[pos] = mrand::getValue(0, 255, state);
}
} }
} }

View File

@ -11,7 +11,7 @@ void DnaManager::init()
vector.resize(NUM_PER_GEN); vector.resize(NUM_PER_GEN);
for (std::size_t i = 0; i < NUM_PER_GEN; i++) for (std::size_t i = 0; i < NUM_PER_GEN; i++)
{ {
newDna(&vector[i], &randSeed); DNA::newDna(&vector[i], &randSeed);
queued.push_back(&vector[i]); queued.push_back(&vector[i]);
} }
} }
@ -75,7 +75,7 @@ void DnaManager::newGen()
{ {
for (std::size_t i = 0; i < NUM_PER_GEN; i++) for (std::size_t i = 0; i < NUM_PER_GEN; i++)
{ {
newDna(&vector[i], &randSeed); DNA::newDna(&vector[i], &randSeed);
queued.push_back(&vector[i]); queued.push_back(&vector[i]);
} }
disliked.clear(); disliked.clear();
@ -93,7 +93,7 @@ void DnaManager::newGen()
for (auto &&i : disliked) for (auto &&i : disliked)
{ {
clone(front, i, &randSeed); DNA::clone(front, i, &randSeed);
queued.push_back(i); queued.push_back(i);
} }
@ -115,7 +115,7 @@ void DnaManager::newGen()
Dna *p1p = liked[p1]; Dna *p1p = liked[p1];
Dna *p2p = liked[p2]; Dna *p2p = liked[p2];
makeChild(p1p, p2p, i, &randSeed); DNA::makeChild(p1p, p2p, i, &randSeed);
queued.push_back(i); queued.push_back(i);
} }
} }
@ -124,7 +124,7 @@ void DnaManager::newGen()
{ {
for (auto &&i : queued) for (auto &&i : queued)
{ {
mutate(i, NUM_OF_MUT, &randSeed); DNA::mutate(i, NUM_OF_MUT, &randSeed);
} }
return; return;
} }