Started examples/fitness/avida-landscape
authorDmitriy Morozov <morozov@cs.duke.edu>
Sun, 17 Feb 2008 09:16:00 -0500
changeset 44 0bf12743641f
parent 43 0f970f454094
child 45 7c15f27bfa1b
Started examples/fitness/avida-landscape
examples/fitness/CMakeLists.txt
examples/fitness/avida-landscape.cpp
examples/fitness/avida-population-detail.h
--- 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_; }