Add NetUnit save Gen

This commit is contained in:
Nikola Petrov 2025-01-22 02:27:00 +01:00
parent 5342f1b928
commit e50acd9cc5
5 changed files with 54 additions and 27 deletions

View File

@ -34,7 +34,7 @@ private:
Rectangle likeBox; Rectangle likeBox;
Rectangle disLikeBox; Rectangle disLikeBox;
std::array<Unit, 2> unit = {0}; std::array<UiUnit, 2> unit = {0};
DnaManager manager; DnaManager manager;

View File

@ -12,25 +12,35 @@ enum Liked
no no
}; };
struct Unit struct UiUnit
{ {
Dna *dna; Dna *dna;
Liked liked; Liked liked;
int index; int index;
}; };
struct NetUnit
{
uint128 hash;
uint32_t index;
Liked liked;
};
static_assert(24 == sizeof(NetUnit));
class DnaManager class DnaManager
{ {
public: public:
void init(); void init();
void deinit(); void deinit();
Unit next(); UiUnit next();
void like(Unit unit); void like(UiUnit unit);
int generation; int generation;
private: private:
void saveData(); void saveData();
void saveVec(); void saveVec();
void saveGen();
uint128 randSeed; uint128 randSeed;
uint128 id; uint128 id;
int queued; int queued;

View File

@ -72,13 +72,7 @@ int sendFile()
serv_addr.sin_family = AF_INET; serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT); serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr = ipAddr;
// Convert IPv4 and IPv6 addresses from text to binary form
if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0)
{
TraceLog(LOG_ERROR, "Invalid address/ Address not supported");
return 1;
}
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{ {
@ -119,13 +113,6 @@ int sendBuffer()
serv_addr.sin_port = htons(PORT); serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr = ipAddr; serv_addr.sin_addr = ipAddr;
// Convert IPv4 and IPv6 addresses from text to binary form
// if (inet_pton(AF_INET, "192.168.0.31", &serv_addr.sin_addr) <= 0)
// {
// TraceLog(LOG_ERROR, "Invalid address/ Address not supported");
// return 1;
// }
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{ {
TraceLog(LOG_ERROR, "Connection Failed"); TraceLog(LOG_ERROR, "Connection Failed");

View File

@ -18,8 +18,6 @@ constexpr float textMargin = 0.02f;
void App::init(int screenWidth, int screenHeight) void App::init(int screenWidth, int screenHeight)
{ {
SetTextLineSpacing(0);
this->screenWidth = screenWidth; this->screenWidth = screenWidth;
this->screenHeight = screenHeight; this->screenHeight = screenHeight;
this->canvas.init(screenWidth); this->canvas.init(screenWidth);

View File

@ -41,6 +41,8 @@ void DnaManager::init()
for (int i = 0; i < size; i++) for (int i = 0; i < size; i++)
{ {
fread(&tmp, sizeof(tmp), 1, file); fread(&tmp, sizeof(tmp), 1, file);
if (tmp >= NUM_PER_GEN) // out of bounds error prevention if buffer was in the past biiger then its now
continue;
liked.push_back(tmp); liked.push_back(tmp);
} }
@ -48,6 +50,8 @@ void DnaManager::init()
for (int i = 0; i < size; i++) for (int i = 0; i < size; i++)
{ {
fread(&tmp, sizeof(tmp), 1, file); fread(&tmp, sizeof(tmp), 1, file);
if (tmp >= NUM_PER_GEN) // out of bounds error prevention if buffer was in the past biiger then its now
continue;
disliked.push_back(tmp); disliked.push_back(tmp);
} }
fclose(file); fclose(file);
@ -71,6 +75,7 @@ void DnaManager::init()
{ {
DNA::newDna(&vector[i], &randSeed); DNA::newDna(&vector[i], &randSeed);
} }
saveVec();
} }
} }
@ -112,7 +117,7 @@ void DnaManager::saveVec()
fclose(file); fclose(file);
} }
Unit DnaManager::next() UiUnit DnaManager::next()
{ {
if (queued >= NUM_PER_GEN) if (queued >= NUM_PER_GEN)
{ {
@ -124,7 +129,7 @@ Unit DnaManager::next()
return {ret, Liked::tbd, index}; return {ret, Liked::tbd, index};
} }
void DnaManager::like(Unit unit) void DnaManager::like(UiUnit unit)
{ {
int found = -1; int found = -1;
if (unit.index == showed) if (unit.index == showed)
@ -155,6 +160,7 @@ void DnaManager::like(Unit unit)
if (showed >= NUM_PER_GEN && queued >= NUM_PER_GEN) // if buffer was biger in the past showed could be more then NUM_PER_GEN so its changed to >= insted of == if (showed >= NUM_PER_GEN && queued >= NUM_PER_GEN) // if buffer was biger in the past showed could be more then NUM_PER_GEN so its changed to >= insted of ==
{ {
saveGen();
newGen(); newGen();
queued = 0; queued = 0;
showed = 0; showed = 0;
@ -164,6 +170,37 @@ void DnaManager::like(Unit unit)
saveData(); saveData();
} }
void DnaManager::saveGen()
{
std::vector<NetUnit> gen;
gen.resize(NUM_PER_GEN);
for (std::size_t i = 0; i < NUM_PER_GEN; i++)
{
unsigned int *hash = ComputeMD5((unsigned char *)&vector[i], sizeof(Dna));
gen[i].hash.a = hash[0];
gen[i].hash.b = hash[1];
gen[i].hash.c = hash[2];
gen[i].hash.d = hash[3];
gen[i].liked = Liked::tbd;
gen[i].index = i;
}
for (auto &&i : liked)
{
gen[i].liked = Liked::yes;
}
for (auto &&i : disliked)
{
gen[i].liked = Liked::no;
}
const char *fileName = TextFormat("gen%04d.bin", generation);
sys::saveDataToFile(fileName, gen.data(), sizeof(NetUnit) * NUM_PER_GEN);
}
void DnaManager::newGen() void DnaManager::newGen()
{ {
if (liked.size() == 0) if (liked.size() == 0)
@ -193,8 +230,6 @@ void DnaManager::newGen()
{ {
for (auto &&i : disliked) for (auto &&i : disliked)
{ {
if (i >= NUM_PER_GEN) // out of bounds error prevention if buffer was in the past biiger then its now
continue;
size_t p1 = mrand::getValue(0, liked.size() - 1, &randSeed); size_t p1 = mrand::getValue(0, liked.size() - 1, &randSeed);
size_t p2 = mrand::getValue(0, liked.size() - 1, &randSeed); size_t p2 = mrand::getValue(0, liked.size() - 1, &randSeed);
@ -203,9 +238,6 @@ void DnaManager::newGen()
p2 = mrand::getValue(0, liked.size(), &randSeed); p2 = mrand::getValue(0, liked.size(), &randSeed);
} }
if (p1 >= NUM_PER_GEN || p2 >= NUM_PER_GEN) // out of bounds error prevention if buffer was in the past biiger then its now
continue;
p1 = liked[p1]; p1 = liked[p1];
p2 = liked[p2]; p2 = liked[p2];
Dna *p1p = &vector[p1]; Dna *p1p = &vector[p1];