9 Eigen::VectorXd
const& betaIn) :
Distribution(alphaIn.size()),
12 logConst(ComputeConstant(alphaIn, betaIn))
16 double betaIn) :
Gamma(alphaIn*Eigen::VectorXd::Ones(1),
17 betaIn*Eigen::VectorXd::Ones(1)){};
20 Eigen::VectorXd
const& betaIn)
23 for(
int i=0; i<alphaIn.size(); ++i)
24 logConst += alphaIn(i)*std::log(betaIn(i)) - std::lgamma(alphaIn(i));
31 Eigen::VectorXd
const& x = inputs.at(0).get();
33 if(x.minCoeff()<std::numeric_limits<double>::epsilon())
34 return -1.0*std::numeric_limits<double>::infinity();
36 return logConst + ((
alpha.array()-1.0)*x.array().log() -
beta.array()*x.array()).sum();
42 Eigen::VectorXd output(
alpha.size());
43 for(
int i=0; i<
alpha.size(); ++i)
44 output(i) = RandomGenerator::GetGamma(
alpha(i),1.0/
beta(i));
52 Eigen::VectorXd
const& x = inputs.at(0).get();
54 Eigen::VectorXd grad(x.size());
55 for(
int i=0; i<x.size(); ++i){
56 if(x(i)<std::numeric_limits<double>::epsilon()){
67 unsigned int const inWrt2,
69 Eigen::VectorXd
const& vec)
71 Eigen::VectorXd
const& x = inputs.at(0).get();
73 Eigen::VectorXd hessAct(x.size());
75 for(
int i=0; i<x.size(); ++i){
76 if(x(i)<std::numeric_limits<double>::epsilon()){
79 hessAct(i) = -1.0 * vec(i) * (
alpha(i)-1.0)/(x(i)*x(i));
88 Eigen::VectorXd
const& var)
90 Eigen::VectorXd
beta = mean.array() / var.array();
91 Eigen::VectorXd
alpha = mean.array()*
beta.array();
92 return std::make_shared<Gamma>(
alpha,
beta);
const Eigen::VectorXd beta
virtual Eigen::VectorXd SampleImpl(ref_vector< Eigen::VectorXd > const &inputs) override
Sample the distribution.
virtual double LogDensityImpl(ref_vector< Eigen::VectorXd > const &inputs) override
Implement the log-density.
virtual Eigen::VectorXd ApplyLogDensityHessian(unsigned int const inWrt1, unsigned int const inWrt2, ref_vector< Eigen::VectorXd > const &input, Eigen::VectorXd const &vec) override
const Eigen::VectorXd alpha
static double ComputeConstant(Eigen::VectorXd const &alphaIn, Eigen::VectorXd const &betaIn)
virtual Eigen::VectorXd GradLogDensity(unsigned int wrt, ref_vector< Eigen::VectorXd > const &inputs) override
static std::shared_ptr< Gamma > FromMoments(Eigen::VectorXd const &mean, Eigen::VectorXd const &var)
Gamma(double alphaIn, double betaIn)
std::vector< std::reference_wrapper< const T > > ref_vector
A vector of references to something ...