examples/fitness/avida-population-detail.h
author Dmitriy Morozov <dmitriy@mrzv.org>
Tue, 23 Dec 2008 11:02:08 -0800
branchdev
changeset 98 d81e460e267a
parent 95 3f94bf5ba989
permissions -rw-r--r--
Closed #8a1 and #96b, added #de6 and #f64

/**
 * 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__