Parallel PopGen Package
Sim_Model::demography_piecewise< Functor_d1, Functor_d2 > Struct Template Reference

functor: demography function changes from d1 to d2 at generation inflection_point More...

Public Member Functions

 demography_piecewise ()
 default constructor More...
 
 demography_piecewise (Functor_d1 d1_in, Functor_d2 d2_in, int inflection_point, int generation_shift=0)
 constructor More...
 
__host__ __device__ __forceinline__ int operator() (const int population, const int generation) const
 Demographic operator, returns population size (individuals), N, for a given population, generation More...
 

Public Attributes

int inflection_point
 generation in which the Demographic function switches from d1 to d2 More...
 
int generation_shift
 number of generations to shift function backwards More...
 
Functor_d1 d1
 first demographic function More...
 
Functor_d2 d2
 second demographic function More...
 

Detailed Description

template<typename Functor_d1, typename Functor_d2>
struct Sim_Model::demography_piecewise< Functor_d1, Functor_d2 >

functor: demography function changes from d1 to d2 at generation inflection_point

Takes in two template types: the function to be returned before the inflection_point and the function for after the inflection_point.
Piecewise demographic functors can be nested within each other and with population specific demographic functors for multiple populations and multiple time functions, e.g.:

Using both demographic and migration functors, population 0 splits in two, forming population 1 in the first generation. Population 1's size increases exponentially afterwards with no further migration between the groups

typedef Sim_Model::demography_constant dem_constant;
dem_constant d_pop0(100000), d_pop1(0);
dem_pop_constant_constant d_generation_0(d_pop0,d_pop1,1); //at the start of the simulation, the first population pop0 starts out at 100,000 individuals, pop1 doesn't exist yet
dem_constant d_pop0_1(90000); dem_exponential d_pop1_1(0.01, 10000, 1); //shifts exponential back one generation so it starts at 10,000
dem_pop_constant_exponential d_remaining_generations(d_pop0_1,d_pop1_1,1); //in the first generation, 10,000 individuals from pop0 move to start pop1, which grows exponentially afterwards at a rate of 1%
Sim_Model::demography_piecewise<dem_pop_constant_constant,dem_pop_constant_exponential> demography_model(d_generation_0,d_remaining_generations,1);
typedef Sim_Model::migration_constant_equal mig_const_equal;
mig_const_equal m0; //no migration
mig_const_equal_const_dir m_pop0_pop1(1.f,0,1,m0); //pop1 made up entirely of individuals from pop0, no other population contributing to pop0
mig_const_equal_const_dir_const_dir m_pop1_pop1(0.f,1,1,m_pop0_pop1); //pop1 made up entirely of individuals from pop0 (since pop1 previously did not exist, no migration from previous pop1 generation!)
split_pop0_gen1 m_generation_1(m0,m_pop1_pop1,1); //no migration in generation 0, splits pop1 off from pop0 in generation 1
Sim_Model::migration_piecewise<split_pop0_gen1,mig_const_equal> migration_model(m_generation_1,m0,2); //no further migration between groups

The modularity of these functor templates allow parameter models to be extended to any number of populations and piecewise parameter functions (including user defined functions).

Examples:
Example2-DaDi.

Definition at line 216 of file go_fish.cuh.

Constructor & Destructor Documentation

§ demography_piecewise() [1/2]

template<typename Functor_d1 , typename Functor_d2 >
Sim_Model::demography_piecewise< Functor_d1, Functor_d2 >::demography_piecewise ( )
inline

default constructor

inflection_point = 0
generation_shift = 0
Function d1 assigned default constructor of Functor_d1
Function d2 assigned default constructor of Functor_d2

Definition at line 390 of file template_inline_simulation_functors.cuh.

§ demography_piecewise() [2/2]

template<typename Functor_d1 , typename Functor_d2 >
Sim_Model::demography_piecewise< Functor_d1, Functor_d2 >::demography_piecewise ( Functor_d1  d1_in,
Functor_d2  d2_in,
int  inflection_point,
int  generation_shift = 0 
)
inline

constructor

Parameters
generation_shift(optional input) default 0

Definition at line 393 of file template_inline_simulation_functors.cuh.

Member Function Documentation

§ operator()()

template<typename Functor_d1 , typename Functor_d2 >
__host__ __device__ __forceinline__ int Sim_Model::demography_piecewise< Functor_d1, Functor_d2 >::operator() ( const int  population,
const int  generation 
) const

Demographic operator, returns population size (individuals), N, for a given population, generation

if(generation >= inflection_point+generation_shift) N = d2(population, generation-generation_shift)
else N = d1(population, generation-generation_shift)

Definition at line 397 of file template_inline_simulation_functors.cuh.

Member Data Documentation

§ inflection_point

template<typename Functor_d1, typename Functor_d2>
int Sim_Model::demography_piecewise< Functor_d1, Functor_d2 >::inflection_point

generation in which the Demographic function switches from d1 to d2

Definition at line 218 of file go_fish.cuh.

§ generation_shift

template<typename Functor_d1, typename Functor_d2>
int Sim_Model::demography_piecewise< Functor_d1, Functor_d2 >::generation_shift

number of generations to shift function backwards

useful if you are starting the simulation from a previous simulation state and this function is expecting to start at 0 or any scenario where you want to shift the generation of the function relative to the simulation generation

Definition at line 219 of file go_fish.cuh.

§ d1

template<typename Functor_d1, typename Functor_d2>
Functor_d1 Sim_Model::demography_piecewise< Functor_d1, Functor_d2 >::d1

first demographic function

Definition at line 220 of file go_fish.cuh.

§ d2

template<typename Functor_d1, typename Functor_d2>
Functor_d2 Sim_Model::demography_piecewise< Functor_d1, Functor_d2 >::d2

second demographic function

Definition at line 221 of file go_fish.cuh.


The documentation for this struct was generated from the following files: