Program Listing for File TreeNode.h¶
↰ Return to documentation for file (necsim/TreeNode.h
)
//This file is part of necsim project which is released under MIT license.
//See file **LICENSE.txt** or visit https://opensource.org/licenses/MIT) for full license details.
#ifndef TREENODE
#define TREENODE
#include <cstdio>
#include <iostream>
#include <iomanip>
#include "Logging.h"
using namespace std;
namespace necsim
{
class TreeNode
{
private:
// 0 means that this node is just here to mark a coalescense
// and therefore this node of no real other relevance
// 1 means that this node is a leaf node and counts towards diversity
bool tip;
// this stores the parent of the individual
// 0 means there is no parent - we are at the end of the tree
// (as far as has been calculated)
unsigned long parent;
// true if this lineage has speciated in which case it should not have a parent
// because under the present implementation lineages are not traced beyond speciation
// boolean for checking whether the lineage actually exists at the end. If all children of the lineages have
// speciated, then the lineage no longer exists.
bool speciated;
// the species identity of the node
bool does_exist;
// the following 4 variables describe the position of the lineage in the present day.
unsigned long species_id;
// x position
unsigned long xpos;
// y position
unsigned long ypos;
// number of wraps of x around the torus
long xwrap;
// number of wraps of y around the torus
long ywrap;
// the speciation probability. This needs to be multiplied by the number of generations in order to generate the
// actual probability.
long double speciation_probability;
// Number of generations this lineage has existed since coalescence (or tracking began).
unsigned long generations_existed;
// Simulation generation timer that the lineage was created at
long double generation_added;
public:
TreeNode() : tip(false), parent(0), speciated(false), does_exist(false), species_id(0), xpos(0), ypos(0),
xwrap(0), ywrap(0), speciation_probability(0.0), generations_existed(0), generation_added(0.0)
{
}
~TreeNode() = default;
void setup(bool z, unsigned long xp, unsigned long yp, long xi, long yi);
void setup(bool z);
void setup(const bool &is_tip, const long &xp, const long &yp, const long &xi, const long &yi,
const long double &generation);
void setExistence(bool b);
void setParent(unsigned long x);
void qReset();
void setPosition(long x, long y, long xw, long yw);
void setSpec(long double d);
void setGenerationRate(unsigned long g);
void setGeneration(long double d);
void setSpeciation(bool s);
void burnSpecies(unsigned long idin);
void setTip(bool b);
void resetSpecies();
void increaseGen();
// we don't allow the other variables to be changed
// because they only need to be set once at the start of the coalescence
// it's actually safer to leave out setters.
// similarly we don't allow speciation to be changed once it has been set.
// standard getters
bool exists() const;
bool isTip() const;
unsigned long getParent() const;
unsigned long getXpos() const;
unsigned long getYpos() const;
long getXwrap() const;
long getYwrap() const;
bool hasSpeciated() const;
unsigned long getSpeciesID() const;
long double getSpecRate() const;
unsigned long getGenerationRate() const;
long double getGeneration() const;
void speciate();
friend ostream &operator<<(ostream &os, const TreeNode &t);
friend istream &operator>>(istream &is, TreeNode &t);
TreeNode &operator=(const TreeNode &t);
#ifdef DEBUG
void logLineageInformation(const int &level);
#endif // DEBUG
};
}
#endif