examples/fitness/avida-population-detail.h
author Christos Mantoulidis <cmad@stanford.edu>
Tue, 04 Aug 2009 13:23:16 -0700
branchdev
changeset 156 f75fb57d2831
parent 95 3f94bf5ba989
permissions -rw-r--r--
Changed implementation of WeightedRips to store simplex values (max distance between simplices' vertices) as an invisible layer on top of each simplex object, so that the data() field of WeightedRips has been freed for use by the users again.

/**
 * Author: Dmitriy Morozov
 * Department of Computer Science, Duke University, 2007
 */

#ifndef __AVIDA_POPULATION_DETAIL_H__
#define __AVIDA_POPULATION_DETAIL_H__

#include <string>
#include <vector>

/**
 * Stores organism details stored in a single line of a population detail file in data/ 
 * directory of Avida's output.
 */
class AvidaOrganismDetail
{
	public:
		typedef			int							IDType;
		/// Distance between two genomes
		typedef			unsigned int				DistanceType;
		typedef			unsigned int				CountType;

						AvidaOrganismDetail(std::string line);

		DistanceType 	genome_distance(const AvidaOrganismDetail& other) const;
		
		IDType			id() const									{ return id_; }
		float			fitness() const								{ return fitness_; }
		CountType		length() const								{ return genome_length_; }
		std::string		genome() const								{ return genome_; }

	private:
		IDType			id_, parent_id_;
		int				parent_distance_;
		CountType		num_organisms_alive_, num_organisms_ever_;
		CountType		genome_length_;
		float 			merit_, gestation_time_;
		float 			fitness_;
		int 			update_born_, update_deactivated_, depth_phylogenetic_tree_;
		std::string 	genome_;
};

/**
 * Stores entire population details (all organisms in a given time step), i.e., stores
 * an entire population detail file in data/ directory of Avida's ouptut.
 */
class AvidaPopulationDetail
{
	public:
		typedef			std::vector<AvidaOrganismDetail>				OrganismVector;
        typedef         OrganismVector::const_iterator                  OrganismIndex;

						AvidaPopulationDetail(std::string filename);

		const OrganismVector& 
                        get_organisms() const						    { return organisms_; }

        /// \name Rips
        /// @{
        typedef         int                                             IndexType;
        typedef         double                                          DistanceType;

        DistanceType    operator()(IndexType a, IndexType b) const      { return organisms_[a].genome_distance(organisms_[b]); }

        size_t          size() const                                    { return organisms_.size(); }
        IndexType       begin() const                                   { return 0; }
        IndexType       end() const                                     { return size(); }
        /// @}

	private:
		OrganismVector	organisms_;
};

std::ostream& operator<<(std::ostream& out, AvidaPopulationDetail::OrganismIndex i)
{ return (out << (i->id())); }


#include "avida-population-detail.hpp"

#endif //__AVIDA_POPULATION_DETAIL_H__