#include #include #include #include #include #include using std::vector; static inline double SHAPE (vector const &par) { return *par[0]->value(); } static inline double SCALE (vector const &par) { return pow(*par[1]->value(), -1/(*par[0]->value())); } DWeib::DWeib() : DistReal("dweib", 2, DIST_POSITIVE, true) {} DWeib::~DWeib() {} bool DWeib::checkParameterValue (vector const &par) const { return (*par[0]->value() > 0 && *par[1]->value() > 0); } double DWeib::d(double x, vector const &par, bool give_log) const { return dweibull(x, SHAPE(par), SCALE(par), give_log); } double DWeib::p(double q, vector const &par, bool lower, bool give_log) const { return pweibull(q, SHAPE(par), SCALE(par), lower, give_log); } double DWeib::q(double p, vector const &par, bool lower, bool log_p) const { return qweibull(p, SHAPE(par), SCALE(par), lower, log_p); } double DWeib::r(vector const &par) const { return rweibull(SHAPE(par), SCALE(par)); } double DWeib::mean(std::vector const &par) const { return SCALE(par) * gammafn(1 + 1/SHAPE(par)); } double DWeib::var(std::vector const &par) const { double scale = SCALE(par); double mean = scale * gammafn(1 + 1/SHAPE(par)); return (scale * scale * gammafn(1 + 2/SHAPE(par)) - mean*mean); }