#include <config.h>
#include <distributions/DBeta.h>
#include <sarray/SArray.h>

#include <Rmath.h>

using std::vector;

static inline double A(vector<SArray const *> const &parameters)
{
  return *parameters[0]->value();
}

static inline double B(vector<SArray const *> const &parameters)
{
  return *parameters[1]->value();
}

DBeta::DBeta()
  : DistReal("dbeta", 2, DIST_PROPORTION, true)
{}

DBeta::~DBeta()
{}

bool DBeta::checkParameterValue(vector<SArray const *> const &par) const
{
    return (A(par) > 0.0 && B(par) > 0.0);
}

double 
DBeta::d(double x, vector<SArray const *> const &par, bool give_log) const
{
    return dbeta(x, A(par), B(par), give_log);
}

double 
DBeta::p(double q, vector<SArray const *> const &par, bool lower, bool log_p) 
  const
{
    return pbeta(q, A(par), B(par), lower, log_p);
}

double 
DBeta::q(double p, vector<SArray const *> const &par, bool lower, bool log_p) 
  const
{
    return qbeta(p, A(par), B(par), lower, log_p);
}

double DBeta::r(vector<SArray const *> const &par) const
{
    return rbeta(A(par), B(par));
}

double DBeta::mean(vector<SArray const *> const &par) const
{
    return A(par)/(A(par) + B(par));
}

double DBeta::var(vector<SArray const *> const &par) const
{
    double a = A(par);
    double b = B(par);

    double mu = a/(a + b);
    double phi = (a + b + 1);

    return mu * (1 - mu)/ phi;
}


syntax highlighted by Code2HTML, v. 0.9.1