--- a/examples/fitness/CMakeLists.txt Thu Dec 27 00:00:00 2007 -0500
+++ b/examples/fitness/CMakeLists.txt Sun Feb 17 09:16:00 2008 -0500
@@ -1,5 +1,6 @@
set (targets
- avida)
+ avida-distance
+ avida-landscape)
foreach (t ${targets})
add_executable (${t} ${t}.cpp)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/fitness/avida-landscape.cpp Sun Feb 17 09:16:00 2008 -0500
@@ -0,0 +1,113 @@
+#include <iostream>
+#include <vector>
+#include <algorithm>
+#include <sstream>
+#include "avida-population-detail.h"
+
+#include <topology/lowerstarfiltration.h>
+
+
+typedef AvidaPopulationDetail::OrganismIndex OrganismIndex;
+struct OrganismVertexType;
+typedef std::vector<OrganismVertexType> VertexVector;
+typedef VertexVector::iterator VertexIndex;
+typedef LowerStarFiltration<VertexIndex> LSFiltration;
+struct OrganismVertexType: public LSFiltration::VertexType<OrganismIndex> {};
+
+struct OrganismVertexComparison
+{
+ public:
+ bool operator()(VertexIndex i, VertexIndex j) const
+ { return i->index()->fitness() < j->index()->fitness(); }
+};
+
+
+int main(int argc, char** argv)
+{
+#ifdef LOGGING
+ rlog::RLogInit(argc, argv);
+ //stdoutLog.subscribeTo(RLOG_CHANNEL("info"));
+#endif
+
+ if (argc < 3)
+ {
+ std::cout << "USAGE: avida FILENAME DISTANCE" << std::endl;
+ return 0;
+ }
+
+ AvidaPopulationDetail population(argv[1]);
+ AvidaPopulationDetail::DistanceType connected_distance;
+ std::istringstream(argv[2]) >> connected_distance;
+ const AvidaPopulationDetail::OrganismVector& organisms = population.get_organisms();
+
+ rInfo("Number of organisms: %d", organisms.size());
+ for (int i = 0; i < population.get_organisms().size(); ++i)
+ rInfo("%d (%s) %f %d %d", organisms[i].id(),
+ organisms[i].genome().c_str(),
+ organisms[i].fitness(),
+ organisms[i].length(),
+ organisms[i].genome().size());
+
+ // Order vertices
+ VertexVector vertices(organisms.begin(), organisms.end());
+ LSFiltration fitness_filtration(vertices.begin(), vertices.end(), OrganismVertexComparison());
+
+#if 0
+ //
+ for (AvidaOrganismDetail::CountType i = 0; i < organisms.size(); ++i)
+ {
+ Simplex s(2, v);
+
+ filtration.append(s);
+
+ simplices.push_back(organisms[i].fitness());
+ simplices.back().add(organisms[i].id());
+
+ for (AvidaOrganismDetail::CountType j = i+1; j < organisms.size(); ++j)
+ {
+ avg_distance += organisms[i].genome_distance(organisms[j]);
+ simplices.push_back(Simplex(organisms[i].genome_distance(organisms[j])));
+ simplices.back().add(organisms[i].id());
+ simplices.back().add(organisms[j].id());
+ }
+ }
+ std::sort(simplices.begin(), simplices.end(), DimensionValueComparison<Simplex>());
+ rInfo("Average distance: %f", float(avg_distance)/
+ ((organisms.size()*organisms.size() - organisms.size())/2));
+
+ SimplexFiltration filtration;
+ for (SimplexVector::const_iterator cur = simplices.begin(); cur != simplices.end(); ++cur)
+ {
+ rInfo("Simplex: %s", tostring(*cur).c_str());
+ filtration.append(*cur);
+ }
+
+ filtration.fill_simplex_index_map();
+ filtration.pair_simplices(false); // pair simplices without storing trails
+
+ std::cout << "Outputting histogram of death values" << std::endl;
+ typedef std::vector<RealType> DeathVector;
+ DeathVector deaths;
+ for (SimplexFiltration::Index i = filtration.begin(); i != filtration.end(); ++i)
+ {
+ if (i->is_paired())
+ if (i->sign())
+ {
+ AssertMsg(i->dimension() == 0, "Expecting only 0-dimensional diagram");
+ AssertMsg(i->get_value() == 0, "Expecting only 0 birth values in 0-D diagram ");
+ deaths.push_back(i->pair()->get_value());
+ }
+ }
+
+ // Produce histogram
+ std::sort(deaths.begin(), deaths.end());
+ for (DeathVector::iterator cur = deaths.begin(); cur != deaths.end(); )
+ {
+ DeathVector::iterator nw = std::find_if(cur, deaths.end(),
+ std::bind2nd(std::greater<RealType>(), *cur));
+ std::cout << *cur << "\t" << (nw - cur) << std::endl;
+ cur = nw;
+ }
+ std::cout << "Total: " << deaths.size() + 1; // +1 for the unpaired
+#endif
+}
--- a/examples/fitness/avida-population-detail.h Thu Dec 27 00:00:00 2007 -0500
+++ b/examples/fitness/avida-population-detail.h Sun Feb 17 09:16:00 2008 -0500
@@ -17,6 +17,7 @@
{
public:
typedef int IDType;
+ /// Distance between two genomes
typedef unsigned int DistanceType;
typedef unsigned int CountType;
@@ -48,6 +49,8 @@
{
public:
typedef std::vector<AvidaOrganismDetail> OrganismVector;
+ typedef OrganismVector::const_iterator OrganismIndex;
+
AvidaPopulationDetail(std::string filename);
const OrganismVector& get_organisms() const { return organisms_; }