#include #include "values/DnaManager.hpp" UiUnit DnaManager::next(DnaManagerData *data) { if (data->queued >= NUM_PER_GEN) { return {nullptr, Liked::tbd, -1}; } Dna *ret = &data->vector[data->queued]; int index = data->queued++; return {ret, Liked::tbd, index}; } bool DnaManager::like(UiUnit unit, DnaManagerData *data) { int found = -1; if (unit.index == data->showed) { found = data->showed; } if (found == -1) { // RUN OUT OF GEN WAITING FOR NEW GEN return false; } if (unit.liked == Liked::yes) { data->liked.push_back(found); } else if (unit.liked == Liked::no) { data->disliked.push_back(found); } else { // could be infinite loop if something went wrong and user lost UiUnit and next is returning null thinking that it queued everiting // maybe return true to move on and maybe tread Liked::tbd as Liked::no return false; } data->showed++; if (data->showed >= NUM_PER_GEN && data->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 == { return true; } return false; } void DnaManager::newGen(DnaManagerData *data) { data->queued = 0; data->showed = 0; data->generation += 1; if (data->liked.size() == 0) { for (std::size_t i = 0; i < NUM_PER_GEN; i++) { DNA::newDna(&data->vector[i], &data->randSeed); } data->disliked.clear(); return; } if (data->liked.size() == 1) { int front = data->liked.front(); for (auto &&i : data->disliked) { DNA::clone(&data->vector[front], &data->vector[i], &data->randSeed); } data->disliked.clear(); data->liked.clear(); } if (data->liked.size() >= 2) { for (auto &&i : data->disliked) { size_t p1 = mrand::getValue(0, data->liked.size() - 1, &data->randSeed); size_t p2 = mrand::getValue(0, data->liked.size() - 1, &data->randSeed); while (p1 == p2) { p2 = mrand::getValue(0, data->liked.size(), &data->randSeed); } p1 = data->liked[p1]; p2 = data->liked[p2]; Dna *p1p = &data->vector[p1]; Dna *p2p = &data->vector[p2]; Dna *c = &data->vector[i]; DNA::makeChild(p1p, p2p, c, &data->randSeed); } } for (size_t i = 0; i < NUM_PER_GEN; i++) { DNA::mutate(&data->vector[i], NUM_OF_MUT, &data->randSeed); } data->disliked.clear(); data->liked.clear(); }