Skip to content

Commit

Permalink
Statistics for each gene
Browse files Browse the repository at this point in the history
  • Loading branch information
FLAK-ZOSO committed Nov 2, 2023
1 parent 88bad22 commit 9814ea8
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 1 deletion.
16 changes: 16 additions & 0 deletions dna.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,22 @@ std::vector<Gene> genes = {
SPEED, STRENGTH, FERTILITY, NATURE,
LIFESPAN, ATTACK, DEFENSE, VISION
};
std::unordered_map<Gene, std::string> gene_to_string = {
{Gene::SPEED, "speed"}, {Gene::STRENGTH, "strength"},
{Gene::FERTILITY, "fertility"}, {Gene::NATURE, "nature"},
{Gene::LIFESPAN, "lifespan"}, {Gene::ATTACK, "attack"},
{Gene::DEFENSE, "defense"}, {Gene::VISION, "vision"}
};
std::unordered_map<Gene, std::unordered_map<int, std::string>> allele_to_string = {
{Gene::SPEED, {{Speed::SLOW, "slow"}, {Speed::MEDIUM, "medium"}, {Speed::FAST, "fast"}}},
{Gene::STRENGTH, {{Strength::WEAK, "weak"}, {Strength::MODERATE, "moderate"}, {Strength::STRONG, "strong"}}},
{Gene::FERTILITY, {{Fertility::LOW, "low"}, {Fertility::MEDIAN, "median"}, {Fertility::HIGH, "high"}}},
{Gene::NATURE, {{Nature::AGGRESSIVE, "aggressive"}, {Nature::PASSIVE, "passive"}, {Nature::NEUTRAL, "neutral"}}},
{Gene::LIFESPAN, {{LifeSpan::SHORT_, "short"}, {LifeSpan::AVERAGE, "average"}, {LifeSpan::LONG_, "long"}}},
{Gene::ATTACK, {{1, "weak"}, {2, "moderate"}, {3, "strong"}}},
{Gene::DEFENSE, {{1, "weak"}, {2, "moderate"}, {3, "strong"}}},
{Gene::VISION, {{Vision::NEAR, "near"}, {Vision::CLEAR, "clear"}, {Vision::FAR, "far"}}}
};


Allele::Allele(Gene name_, int value_): name(name_), value(value_) {}
Expand Down
Binary file modified starklag
Binary file not shown.
68 changes: 67 additions & 1 deletion starklag.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "organism.cpp"
#include <set>
#ifdef _WIN32
#include <windows.h>
#endif
Expand Down Expand Up @@ -45,6 +46,25 @@
}
#endif

std::ofstream speed_stats("speed-stats.txt");
std::ofstream strength_stats("strength-stats.txt");
std::ofstream fertility_stats("fertility-stats.txt");
std::ofstream nature_stats("nature-stats.txt");
std::ofstream lifespan_stats("lifespan-stats.txt");
std::ofstream attack_stats("attack-stats.txt");
std::ofstream defense_stats("defense-stats.txt");
std::ofstream vision_stats("vision-stats.txt");
std::unordered_map<Gene, std::ofstream*> gene_stats = {
{Gene::SPEED, &speed_stats},
{Gene::STRENGTH, &strength_stats},
{Gene::FERTILITY, &fertility_stats},
{Gene::NATURE, &nature_stats},
{Gene::LIFESPAN, &lifespan_stats},
{Gene::ATTACK, &attack_stats},
{Gene::DEFENSE, &defense_stats},
{Gene::VISION, &vision_stats}
};


bool isDead(Organism* organism) {
for (std::vector<Organism*>::iterator it = Organism::dead_organisms.begin(); it != Organism::dead_organisms.end(); it++) {
Expand Down Expand Up @@ -209,7 +229,53 @@ int main() {
}
}
});
while (!quit) {
std::ofstream dna_stats("dna-stats.txt");
std::ofstream organisms_count("organisms-count.txt");
for (int _ = 0; !quit; _++) {
organisms_count << Organism::organisms.size() << std::endl;
if (_ % 5 == 0) { // Every 50 frames, we dump DNA stats
// I use map<Gene, ...> and not vector<...> just for the purpose of being explicit
std::unordered_map<Gene, int> sum;
std::unordered_map<Gene, std::vector<int>> values_found; // values_found[gene] = all values found for that gene
std::unordered_map<Gene, std::unordered_map<int, int>> values; // values[gene][allele] = counter of that allele
for (Gene gene : genes) {
sum.insert({gene, 0});
values_found.insert({gene, std::vector<int>()});
values.insert({gene, std::unordered_map<int, int>()});
}
for (Organism* organism : Organism::organisms) {
DNA* dna = organism->dna;
for (Allele* allele : dna->alleles) {
if (std::find(values_found[allele->name].begin(), values_found[allele->name].end(), allele->value) == values_found[allele->name].end()) {
values[allele->name][allele->value] = 1;
values_found[allele->name].push_back(allele->value);
} else {
values[allele->name][allele->value]++;
}
sum[allele->name] += allele->value;
}
}
std::unordered_map<Gene, float> averages;
for (Gene gene : genes) {
averages.insert({gene, (float)sum[gene]/(float)Organism::organisms.size()});
}
// Output the statistics to dna-stats.txt
dna_stats << "== DNA stats at " << _ << " decaframes from start ==\n\n";
dna_stats << "Allele's distribution:\n";
for (Gene gene : genes) {
dna_stats << "- " << gene_to_string[gene] << " (average: " << averages[gene] << ")\n";
*gene_stats[gene] << averages[gene] << std::endl;
std::sort(values_found[gene].begin(), values_found[gene].end());
for (int value : values_found[gene]) {
if (std::find(possible_random_allele_values[gene].begin(), possible_random_allele_values[gene].end(), value) != possible_random_allele_values[gene].end()) {
dna_stats << "\t" << allele_to_string[gene][value] << " : " << values[gene][value] << "\n";
} else {
dna_stats << "\t" << value << " : " << values[gene][value] << "\n";
}
}
}
dna_stats << std::endl;
}
for (int i = 0; i < 10; i++) {
while (paused) {
std::this_thread::sleep_for(std::chrono::milliseconds(10));
Expand Down

0 comments on commit 9814ea8

Please sign in to comment.