Done load and save state
This commit is contained in:
@@ -11,12 +11,12 @@ void DnaManager::init()
|
||||
{
|
||||
if (sys::fileExists("id"))
|
||||
{
|
||||
sys::loadDataFromFile("id", (char *)&id, sizeof(uint128));
|
||||
sys::loadDataFromFile("id", &id, sizeof(uint128));
|
||||
}
|
||||
else
|
||||
{
|
||||
id = mrand::getState(time(nullptr));
|
||||
sys::saveDataToFile("id", (const char *)&id, sizeof(uint128));
|
||||
sys::saveDataToFile("id", &id, sizeof(uint128));
|
||||
}
|
||||
|
||||
if (sys::fileExists("data"))
|
||||
@@ -28,17 +28,45 @@ void DnaManager::init()
|
||||
return;
|
||||
|
||||
fread(&randSeed, 1, sizeof(uint128), file);
|
||||
fread(&generation, 1, sizeof(int), file);
|
||||
fread(&showed, 1, sizeof(showed), file);
|
||||
queued = showed;
|
||||
int size, tmp;
|
||||
|
||||
fread(&size, sizeof(size), 1, file);
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
fread(&tmp, sizeof(tmp), 1, file);
|
||||
liked.push_back(tmp);
|
||||
}
|
||||
|
||||
fread(&size, sizeof(size), 1, file);
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
fread(&tmp, sizeof(tmp), 1, file);
|
||||
disliked.push_back(tmp);
|
||||
}
|
||||
fclose(file);
|
||||
}
|
||||
else
|
||||
{
|
||||
randSeed = id;
|
||||
queued = 0;
|
||||
showed = 0;
|
||||
generation = 0;
|
||||
}
|
||||
|
||||
vector.resize(NUM_PER_GEN);
|
||||
for (std::size_t i = 0; i < NUM_PER_GEN; i++)
|
||||
if (sys::fileExists("array"))
|
||||
{
|
||||
DNA::newDna(&vector[i], &randSeed);
|
||||
queued.push_back(i);
|
||||
sys::loadDataFromFile("array", vector.data(), sizeof(Dna) * NUM_PER_GEN);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (std::size_t i = 0; i < NUM_PER_GEN; i++)
|
||||
{
|
||||
DNA::newDna(&vector[i], &randSeed);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,25 +78,42 @@ void DnaManager::deinit()
|
||||
if (file == NULL)
|
||||
return;
|
||||
fwrite(&randSeed, 1, sizeof(uint128), file);
|
||||
fwrite(&generation, 1, sizeof(int), file);
|
||||
fwrite(&showed, 1, sizeof(showed), file);
|
||||
|
||||
int tmp;
|
||||
tmp = liked.size();
|
||||
fwrite(&tmp, sizeof(tmp), 1, file);
|
||||
fwrite(liked.data(), sizeof(int) * tmp, 1, file);
|
||||
|
||||
tmp = disliked.size();
|
||||
|
||||
fwrite(&tmp, sizeof(tmp), 1, file);
|
||||
fwrite(disliked.data(), sizeof(tmp) * tmp, 1, file);
|
||||
|
||||
fclose(file);
|
||||
|
||||
filename = sys::transformFilePath("array");
|
||||
file = fopen(filename, "wb");
|
||||
if (file == NULL)
|
||||
return;
|
||||
fwrite(vector.data(), sizeof(Dna) * NUM_PER_GEN, 1, file);
|
||||
fclose(file);
|
||||
}
|
||||
|
||||
Unit DnaManager::next()
|
||||
{
|
||||
int index = queued.front();
|
||||
queued.pop_front();
|
||||
showed.push_back(index);
|
||||
Dna *ret = &vector[index];
|
||||
return {ret, Liked::tbd};
|
||||
Dna *ret = &vector[queued];
|
||||
int index = queued++;
|
||||
return {ret, Liked::tbd, index};
|
||||
}
|
||||
|
||||
void DnaManager::like(Unit unit)
|
||||
{
|
||||
int found = -1;
|
||||
for (auto &&i : showed)
|
||||
if (unit.index == showed)
|
||||
{
|
||||
if (&vector[i] == unit.dna)
|
||||
found = i;
|
||||
found = showed;
|
||||
}
|
||||
|
||||
if (found == -1)
|
||||
@@ -90,11 +135,14 @@ void DnaManager::like(Unit unit)
|
||||
return;
|
||||
}
|
||||
|
||||
showed.remove(found);
|
||||
showed++;
|
||||
|
||||
if (showed.size() == 0 && queued.size() == 0)
|
||||
if (showed == NUM_PER_GEN && queued == NUM_PER_GEN)
|
||||
{
|
||||
newGen();
|
||||
queued = 0;
|
||||
showed = 0;
|
||||
generation += 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -105,7 +153,6 @@ void DnaManager::newGen()
|
||||
for (std::size_t i = 0; i < NUM_PER_GEN; i++)
|
||||
{
|
||||
DNA::newDna(&vector[i], &randSeed);
|
||||
queued.push_back(i);
|
||||
}
|
||||
disliked.clear();
|
||||
return;
|
||||
@@ -148,6 +195,5 @@ void DnaManager::newGen()
|
||||
for (size_t i = 0; i < NUM_PER_GEN; i++)
|
||||
{
|
||||
DNA::mutate(&vector[i], NUM_OF_MUT, &randSeed);
|
||||
queued.push_back(i);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user