examples/fitness/avida-landscape.cpp
author Dmitriy Morozov <morozov@cs.duke.edu>
Sun, 17 Feb 2008 09:16:30 -0500
changeset 45 7c15f27bfa1b
parent 44 0bf12743641f
child 46 6fbe003aad9d
permissions -rw-r--r--
Merged the branch resulting from the upstream pull

#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
}