Skip to content

Commit

Permalink
Adding negative binomial and geometric distribution rng
Browse files Browse the repository at this point in the history
  • Loading branch information
gvegayon committed Feb 20, 2025
1 parent ad24de1 commit 277db63
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 0 deletions.
46 changes: 46 additions & 0 deletions epiworld.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6629,6 +6629,8 @@ class Model {
void set_rand_gamma(epiworld_double alpha, epiworld_double beta);
void set_rand_lognormal(epiworld_double mean, epiworld_double shape);
void set_rand_binom(int n, epiworld_double p);
void set_rand_nbinom(int n, epiworld_double p);
void set_rand_geom(epiworld_double p);
epiworld_double runif();
epiworld_double runif(epiworld_double a, epiworld_double b);
epiworld_double rnorm();
Expand All @@ -6641,6 +6643,10 @@ class Model {
epiworld_double rlognormal(epiworld_double mean, epiworld_double shape);
int rbinom();
int rbinom(int n, epiworld_double p);
int rnbinom();
int rnbinom(int n, epiworld_double p);
int rgeom();
int rgeom(epiworld_double p);
///@}

/**
Expand Down Expand Up @@ -7786,6 +7792,18 @@ inline void Model<TSeq>::set_rand_binom(int n, epiworld_double p)
rbinomd = std::binomial_distribution<>(n, p);
}

template<typename TSeq>
inline void Model<TSeq>::set_rand_nbinom(int n, epiworld_double p)
{
rnbinomd = std::negative_binomial_distribution<>(n, p);
}

template<typename TSeq>
inline void Model<TSeq>::set_rand_geom(epiworld_double p)
{
rgeomd = std::geometric_distribution<>(p);
}

template<typename TSeq>
inline epiworld_double & Model<TSeq>::operator()(std::string pname) {

Expand Down Expand Up @@ -7975,6 +7993,34 @@ inline int Model<TSeq>::rbinom(int n, epiworld_double p) {
return ans;
}

template<typename TSeq>
inline int Model<TSeq>::rnbinom() {
return rnbinomd(*engine);
}

template<typename TSeq>
inline int Model<TSeq>::rnbinom(int n, epiworld_double p) {
auto old_param = rnbinomd.param();
rnbinomd.param(std::negative_binomial_distribution<>::param_type(n, p));
int ans = rnbinomd(*engine);
rnbinomd.param(old_param);
return ans;
}

template<typename TSeq>
inline int Model<TSeq>::rgeom() {
return rgeomd(*engine);
}

template<typename TSeq>
inline int Model<TSeq>::rgeom(epiworld_double p) {
auto old_param = rgeomd.param();
rgeomd.param(std::geometric_distribution<>::param_type(p));
int ans = rgeomd(*engine);
rgeomd.param(old_param);
return ans;
}

template<typename TSeq>
inline void Model<TSeq>::seed(size_t s) {
this->engine->seed(s);
Expand Down
6 changes: 6 additions & 0 deletions include/epiworld/model-bones.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,8 @@ class Model {
void set_rand_gamma(epiworld_double alpha, epiworld_double beta);
void set_rand_lognormal(epiworld_double mean, epiworld_double shape);
void set_rand_binom(int n, epiworld_double p);
void set_rand_nbinom(int n, epiworld_double p);
void set_rand_geom(epiworld_double p);
epiworld_double runif();
epiworld_double runif(epiworld_double a, epiworld_double b);
epiworld_double rnorm();
Expand All @@ -307,6 +309,10 @@ class Model {
epiworld_double rlognormal(epiworld_double mean, epiworld_double shape);
int rbinom();
int rbinom(int n, epiworld_double p);
int rnbinom();
int rnbinom(int n, epiworld_double p);
int rgeom();
int rgeom(epiworld_double p);
///@}

/**
Expand Down
40 changes: 40 additions & 0 deletions include/epiworld/model-meat.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -710,6 +710,18 @@ inline void Model<TSeq>::set_rand_binom(int n, epiworld_double p)
rbinomd = std::binomial_distribution<>(n, p);
}

template<typename TSeq>
inline void Model<TSeq>::set_rand_nbinom(int n, epiworld_double p)
{
rnbinomd = std::negative_binomial_distribution<>(n, p);
}

template<typename TSeq>
inline void Model<TSeq>::set_rand_geom(epiworld_double p)
{
rgeomd = std::geometric_distribution<>(p);
}

template<typename TSeq>
inline epiworld_double & Model<TSeq>::operator()(std::string pname) {

Expand Down Expand Up @@ -899,6 +911,34 @@ inline int Model<TSeq>::rbinom(int n, epiworld_double p) {
return ans;
}

template<typename TSeq>
inline int Model<TSeq>::rnbinom() {
return rnbinomd(*engine);
}

template<typename TSeq>
inline int Model<TSeq>::rnbinom(int n, epiworld_double p) {
auto old_param = rnbinomd.param();
rnbinomd.param(std::negative_binomial_distribution<>::param_type(n, p));
int ans = rnbinomd(*engine);
rnbinomd.param(old_param);
return ans;
}

template<typename TSeq>
inline int Model<TSeq>::rgeom() {
return rgeomd(*engine);
}

template<typename TSeq>
inline int Model<TSeq>::rgeom(epiworld_double p) {
auto old_param = rgeomd.param();
rgeomd.param(std::geometric_distribution<>::param_type(p));
int ans = rgeomd(*engine);
rgeomd.param(old_param);
return ans;
}

template<typename TSeq>
inline void Model<TSeq>::seed(size_t s) {
this->engine->seed(s);
Expand Down

0 comments on commit 277db63

Please sign in to comment.