#include #include #include #include #include #include using std::vector; using std::min; using std::max; static inline double PROB(vector const ¶meters) { return *parameters[0]->value(); } DBern::DBern() : DistDiscrete("dbern", 1, DIST_PROPORTION, false) {} DBern::~DBern() {} bool DBern::checkParameterDim (vector const ¶meters) const { return (parameters[0]->length() == 1); } bool DBern::checkParameterValue(vector const ¶meters) const { return (PROB(parameters) >= 0.0 && PROB(parameters) <= 1.0); } double DBern::d(double x, vector const ¶meters, bool give_log) const { double d = 0; if (x == 1) d = PROB(parameters); else if (x == 0) d = 1 - PROB(parameters); if (give_log) { return d == 0 ? -DBL_MAX : log(d); } else { return d; } } double DBern::p(double x, vector const ¶meters, bool lower, bool give_log) const { return pbinom(x, 1, PROB(parameters), lower, give_log); } double DBern::q(double p, std::vector const ¶meters, bool lower, bool log_p) const { return qbinom(p, 1, PROB(parameters), lower, log_p); } double DBern::r(std::vector const ¶meters) const { return runif(0, 1) < PROB(parameters) ? 1 : 0; } double DBern::mean(std::vector const ¶meters) const { return PROB(parameters); } double DBern::var(std::vector const ¶meters) const { return PROB(parameters) * (1 - PROB(parameters)); }