1#ifndef DISTRIBUTION_HPP
2#define DISTRIBUTION_HPP
25 double tt1, tt2, lnx, sgn;
26 sgn = (x < 0) ? -1.0f : 1.0f;
29 tt1 = 2 / (M_PI * 0.147) + 0.5f * lnx;
30 tt2 = 1 / (0.147) * lnx;
31 return (sgn * std::sqrt(-tt1 + std::sqrt(tt1 * tt1 - tt2)));
35 return 0.5 * (1 + std::erf(x / std::sqrt(2)));
38inline double sech(
const double &x) {
39 return 1.0 / std::cosh(x);
61template <
typename Derived>
70 double logPDF(
const double &x)
const {
71 return static_cast<const Derived*
>(
this)->
logPDF(x);
81 return static_cast<const Derived*
>(
this)->
dLogPDF(x);
91 return static_cast<const Derived*
>(
this)->
ddLogPDF(x);
100 double CDF(
const double &x)
const {
101 return static_cast<const Derived*
>(
this)->
CDF(x);
111 return static_cast<const Derived*
>(
this)->
quantile(p);
120 double sample(std::default_random_engine &rng) {
121 return static_cast<Derived*
>(
this)->
sample(rng);
138template <
typename Derived>
147 double logPDF(
const Eigen::Ref<const Eigen::VectorXd> &x)
const {
148 return static_cast<const Derived*
>(
this)->
logPDF(x);
157 Eigen::VectorXd
sample(std::default_random_engine &rng) {
158 return static_cast<Derived*
>(
this)->
sample(rng);
168 return static_cast<const Derived*
>(
this)->
toCanonical(x);
185 return static_cast<const Derived*
>(
this)->
dimension();
189template <
typename Derived>
192 double logJumpPDF(
const Eigen::Ref<const Eigen::VectorXd> &jump) {
193 return static_cast<Derived*
>(
this)->
logJumpPDF(jump);
195 Eigen::VectorXd
sample(std::default_random_engine &rng,
const double &gamma) {
196 return static_cast<Derived*
>(
this)->
sample(rng, gamma);
201 Eigen::VectorXd
sample(std::default_random_engine &rng) {
202 return static_cast<Derived*
>(
this)->
sample(rng, 1.0);
204 Eigen::VectorXd
get()
const {
205 return static_cast<Derived*
>(
this)->
get();
207 void set(
const Eigen::Ref<const Eigen::VectorXd> &x) {
208 static_cast<Derived*
>(
this)->
set(x);
225 static double logPDF(
const double &res,
const double &
std) {
226 return -0.5 * std::log(2 * M_PI) - std::log(
std) - 0.5 * std::pow(res /
std, 2);
236 return -1 / std::pow(
std_, 2);
238 double CDF(
const double &x)
const {
239 return 0.5 * (1 + std::erf((x -
mean_) / (
std_ * std::sqrt(2))));
244 double sample(std::default_random_engine &rng) {
267 std::uniform_real_distribution<double>
distU_{0., 1.};
273 if(x < lowerBound_ || x >
upperBound_)
return -std::numeric_limits<double>::infinity();
282 double CDF(
const double &x)
const {
290 double sample(std::default_random_engine &rng) {
315 return (
beta_ - (
alpha_ + 1) * x) / std::pow(x, 2);
318 return (-2 *
beta_ + x + x *
alpha_) / std::pow(x, 3);
320 double CDF(
const double &x)
const {
326 double sample(std::default_random_engine &rng) {
348 throw std::invalid_argument(
"Gamma parameters alpha and beta must be strictly positive.");
355 if(x <= 0.0)
return -std::numeric_limits<double>::infinity();
362 if(x <= 0.0)
return 0.0;
367 if(x <= 0.0)
return 0.0;
368 return -(
alpha_ - 1.0) / std::pow(x, 2);
371 double CDF(
const double &x)
const {
379 double sample(std::default_random_engine &rng) {
416 throw std::invalid_argument(
"Beta parameters alpha and beta must be strictly positive.");
424 if(x <= 0.0 || x >= 1.0)
return -std::numeric_limits<double>::infinity();
429 return (
alpha_ - 1.0) * std::log(x) + (
beta_ - 1.0) * std::log(1.0 - x) - logBetaFunc;
433 if(x <= 0.0 || x >= 1.0)
return 0.0;
434 return (
alpha_ - 1.0) / x - (
beta_ - 1.0) / (1.0 - x);
438 if(x <= 0.0 || x >= 1.0)
return 0.0;
439 return -(
alpha_ - 1.0) / std::pow(x, 2) - (
beta_ - 1.0) / std::pow(1.0 - x, 2);
442 double CDF(
const double &x)
const {
450 double sample(std::default_random_engine &rng) {
455 if(x + y == 0.0)
return 0.5;
462 if(alpha <= 0.0)
throw std::invalid_argument(
"Alpha must be > 0");
468 if(beta <= 0.0)
throw std::invalid_argument(
"Beta must be > 0");
492 return -0.5 * std::pow((std::log(x) -
mean_) /
std_, 2) - 0.5 * std::log(2 * M_PI);
495 return (
mean_ - std::log(x)) / (x * std::pow(
std_, 2));
498 return (-1 -
mean_ + std::log(x)) / std::pow(x *
std_, 2);
500 double CDF(
const double &x)
const {
501 return 0.5 * (1 + std::erf((std::log(x) -
mean_) / (
std_ * std::sqrt(2))));
506 double sample(std::default_random_engine &rng) {
523 std::student_t_distribution<double>
distN_;
530 return std::log(std::tgammal(0.5 * (
dofs_ + 1)) - std::log(std::tgammal(0.5 *
dofs_)) - 0.5 * std::log(M_PI *
dofs_)) -
std_ - 0.5 * (
dofs_ + 1) * std::log(1 + std::pow(x -
mean_, 2) / (
dofs_ *
std_ *
std_));
538 double CDF(
const double &x)
const {
544 double sample(std::default_random_engine &rng) {
547 for(
size_t j = 0; j <
dofs_; j++) {
568 std::uniform_real_distribution<double>
distU_;
580 return degree_ / std::pow(x, 2);
582 double CDF(
const double &t)
const {
588 double sample(std::default_random_engine &rng) {
602 std::uniform_real_distribution<double>
distU_;
619 double CDF(
const double &t)
const {
621 std::pow(M_E, -std::pow(
upperBound_ - t, 2) / (2.*std::pow(
std_, 2)))) *
626 if(p < 0 || p > 1)
return std::numeric_limits<double>::quiet_NaN();
628 for(
size_t i = 0; i < 5; i++) {
629 double f =
CDF(x) - p;
630 double df = std::exp(
logPDF(x));
635 double sample(std::default_random_engine &rng) {
665 template<
typename MatrixType>
673 return -0.5 * res.dot(alpha) - 0.5 * (
ldltDecomposition.vectorD().array().abs().log()).sum() - 0.5 * res.size() * std::log(2 * M_PI);
675 static double dLogPDF(
const Eigen::Ref<const Eigen::VectorXd> &res,
const Eigen::LDLT<Eigen::MatrixXd> &
ldltDecomposition,
const Eigen::Ref<const Eigen::MatrixXd> &cov_gradient,
const Eigen::Ref<const Eigen::VectorXd> &mean_gradient) {
677 Eigen::MatrixXd alpha_alpha_t = alpha * alpha.transpose();
680 static double ddLogPDF(
const Eigen::Ref<const Eigen::VectorXd> &res,
const Eigen::LDLT<Eigen::MatrixXd> &
ldltDecomposition,
const Eigen::Ref<const Eigen::MatrixXd> &cov_gradient_l,
const Eigen::Ref<const Eigen::MatrixXd> &cov_gradient_k,
const Eigen::Ref<const Eigen::MatrixXd> &cov_hessian) {
682 Eigen::MatrixXd alpha_alpha_t = alpha * alpha.transpose();
685 auto sym_tens = 0.5 * ((a_l * alpha_alpha_t) + (a_l * alpha_alpha_t).transpose());
686 double H1 = (alpha_alpha_t*cov_hessian).trace();
688 double H3 = (sym_tens * cov_gradient_k).trace();
689 double H4 = (a_l * a_k).trace();
690 return 0.5 * H1 - 0.5 * H2 - H3 + 0.5 * H4;
693 double logPDF(
const Eigen::Ref<const Eigen::VectorXd> &x)
const {
696 double logJumpPDF(
const Eigen::Ref<const Eigen::VectorXd> &jump) {
703 Eigen::VectorXd
sample(std::default_random_engine &rng,
const double &gamma = 1.0) {
704 Eigen::VectorXd z = Eigen::VectorXd::Zero(
mean_.size());
705 for(
size_t i = 0; i <
mean_.size(); i++) {
711 Eigen::VectorXd
get()
const {
714 void set(
const Eigen::Ref<const Eigen::VectorXd> &x) {
717 void setMean(
const Eigen::Ref<const Eigen::VectorXd> &mean) {
726 Eigen::MatrixXd centered = x.colwise() -
mean_;
734 original.colwise() +=
mean_;
743 Eigen::VectorXd mean = Eigen::VectorXd::Zero(dim);
744 Eigen::MatrixXd cov = Eigen::MatrixXd::Identity(dim, dim);
752 std::vector<std::shared_ptr<MultivariateNormalDistribution>>
components_;
756 const std::vector<std::shared_ptr<MultivariateNormalDistribution>>& components,
757 const std::vector<double>& weights)
760 Eigen::VectorXd
sample(std::default_random_engine &rng) {
761 std::discrete_distribution<size_t> dist_weights(
weights_.begin(),
weights_.end());
762 size_t idx = dist_weights(rng);
766 double logPDF(
const Eigen::Ref<const Eigen::VectorXd> &x)
const {
771 return std::log(pdf);
788 template <
typename LDLTDerived>
792 Eigen::MatrixXd D = d.asDiagonal();
794 Eigen::MatrixXd cov = L * D * L.transpose();
803 static double logPDF(
const Eigen::Ref<const Eigen::VectorXd> &res,
const Eigen::LDLT<Eigen::MatrixXd> &
ldltDecomposition,
const double &nu) {
804 size_t dim = res.size();
806 double quad = res.dot(alpha);
808 double logGammaTerm = std::lgamma(0.5 * (nu + dim)) - std::lgamma(0.5 * nu);
809 double logNormTerm = -0.5 * dim * std::log(nu * M_PI);
810 double logDetTerm = -0.5 * logDet;
811 double logQuadTerm = -0.5 * (nu + dim) * std::log(1 + quad / nu);
812 return logGammaTerm + logNormTerm + logDetTerm + logQuadTerm;
815 double logPDF(
const Eigen::Ref<const Eigen::VectorXd> &x)
const {
818 double logJumpPDF(
const Eigen::Ref<const Eigen::VectorXd> &jump) {
825 Eigen::VectorXd
sample(std::default_random_engine &rng,
const double &gamma = 1.0) {
826 Eigen::VectorXd z = Eigen::VectorXd::Zero(
mean_.size());
827 for(
size_t i = 0; i <
mean_.size(); i++) {
830 for(
size_t j = 0; j <
dofs_; j++) {
831 chi += std::pow(
distN_(rng), 2);
838 Eigen::VectorXd
get()
const {
841 void set(
const Eigen::Ref<const Eigen::VectorXd> &x) {
844 void setMean(
const Eigen::Ref<const Eigen::VectorXd> &mean) {
855 Eigen::MatrixXd centered = x.colwise() -
mean_;
863 original.colwise() +=
mean_;
872 Eigen::VectorXd mean = Eigen::VectorXd::Zero(dim);
873 Eigen::MatrixXd cov = Eigen::MatrixXd::Identity(dim, dim);
883 std::uniform_real_distribution<double>
distU_;
887 const Eigen::Ref<const Eigen::VectorXd> &upperBound)
892 Eigen::VectorXd
sample(std::default_random_engine &rng,
const double &gamma = 1.0) {
906 Eigen::MatrixXd scaled = (x.rowwise() - a).array().rowwise() / (b - a).array();
909 return (2.0 * scaled.array() - 1.0).matrix();
917 Eigen::MatrixXd original = (z.array() + 1.0) / 2.0;
918 original = original.array().rowwise() * (b - a).array();
919 original.rowwise() += a;
929 Eigen::VectorXd lowerBound = -Eigen::VectorXd::Ones(dim);
930 Eigen::VectorXd upperBound = Eigen::VectorXd::Ones(dim);
938 std::normal_distribution<double>
distN_{0., 1.};
945 double logPDF(
const Eigen::Ref<const Eigen::VectorXd> &x)
const {
948 Eigen::VectorXd
sample(std::default_random_engine &rng) {
949 Eigen::VectorXd x(
dim_);
950 for(
size_t i = 0; i <
dim_; i++) {
958 Eigen::MatrixXd canonical = x.normalized();
963 Eigen::MatrixXd original = z.normalized();
981 std::normal_distribution<double>
distN_{0., 1.};
986 const Eigen::Ref<const Eigen::VectorXd> &
mean,
988 const Eigen::Ref<const Eigen::MatrixXd> &psi
990 if(psi.rows() != psi.cols() || psi.rows() !=
dim_)
throw std::invalid_argument(
"Scale matrix Ψ must be square and match the dimensionality of the mean");
991 if(
kappa_ <= 0)
throw std::invalid_argument(
"κ must be positive");
992 if(
nu <=
dim_ - 1)
throw std::invalid_argument(
"ν must be greater than dimension - 1");
995 Eigen::MatrixXd scaledPsi = scaling * psi;
997 if(
covLDLT_.info() != Eigen::Success)
throw std::invalid_argument(
"Scaled covariance matrix must be positive definite");
1002 double logPDF(
const Eigen::Ref<const Eigen::VectorXd> &x)
const {
1003 Eigen::VectorXd res = x -
mean_;
1007 Eigen::VectorXd
sample(std::default_random_engine &rng) {
1008 const auto &L =
covLDLT_.matrixL();
1009 const auto &P =
covLDLT_.transpositionsP();
1010 const Eigen::VectorXd D =
covLDLT_.vectorD();
1012 Eigen::VectorXd z = Eigen::VectorXd::Zero(
dim_);
1013 for(
size_t i = 0; i <
dim_; ++i) {
1014 z(i) =
distN_(rng) * std::sqrt(std::abs(D(i)));
1016 Eigen::VectorXd y = P.transpose() * (L * z);
1018 std::chi_squared_distribution<double> distChi(
nu_);
1019 double s = distChi(rng);
1020 return mean_ + y / std::sqrt(s /
nu_);
1023 const Eigen::VectorXd &
mean()
const {
1029 const double &
nu()
const {
1033 return covLDLT_.reconstructedMatrix();
1037 Eigen::MatrixXd centered = x.colwise() -
mean_;
1043 Eigen::MatrixXd original =
covLDLT_.matrixL() * z;
1044 original =
covLDLT_.transpositionsP().transpose() * original;
1045 original.colwise() +=
mean_;
1054 Eigen::VectorXd
mean = Eigen::VectorXd::Zero(dim);
1055 Eigen::MatrixXd psi = Eigen::MatrixXd::Identity(dim, dim);
1068 int D =
static_cast<int>(data.cols());
1069 double N =
static_cast<double>(data.rows());
1072 Eigen::VectorXd mu0 = data.colwise().
mean().transpose();
1075 double nu0 = D + 2.0;
1079 Eigen::MatrixXd centered = data.rowwise() - data.colwise().mean();
1082 Eigen::MatrixXd global_cov = (centered.transpose() * centered) / (N - 1.0);
1087 double scale_factor = (nu0 -
static_cast<double>(D) - 1.0) / expected_clusters;
1088 Eigen::MatrixXd Psi0 = global_cov * scale_factor;
1091 Psi0.diagonal().array() += 1e-6;
Definition distribution.h:403
double quantile(const double &p) const
Definition distribution.h:446
double getBeta() const
Definition distribution.h:476
void setAlpha(double alpha)
Definition distribution.h:461
std::gamma_distribution< double > distGammaBeta_
Gamma distribution shape-beta helper.
Definition distribution.h:408
BetaDistribution()=default
double ddLogPDF(const double &x) const
Definition distribution.h:437
double sample(std::default_random_engine &rng)
Definition distribution.h:450
double beta_
Scale parameter beta.
Definition distribution.h:406
double dLogPDF(const double &x) const
Definition distribution.h:432
double alpha_
Shape parameter alpha.
Definition distribution.h:405
std::gamma_distribution< double > distGammaAlpha_
Gamma distribution shape-alpha helper.
Definition distribution.h:407
double logPDF(const double &x) const
Definition distribution.h:422
void setBeta(double beta)
Definition distribution.h:467
double getAlpha() const
Definition distribution.h:473
double CDF(const double &x) const
Definition distribution.h:442
BetaDistribution(double alpha, double beta)
Definition distribution.h:411
Definition distribution.h:337
double beta_
Rate parameter (often denoted as theta = 1/beta).
Definition distribution.h:340
double dLogPDF(const double &x) const
Definition distribution.h:361
GammaDistribution()=default
double ddLogPDF(const double &x) const
Definition distribution.h:366
void setBeta(double beta)
Definition distribution.h:389
std::gamma_distribution< double > distGamma_
Gamma distribution helper for sampling.
Definition distribution.h:341
GammaDistribution(double alpha, double beta)
Definition distribution.h:345
double getBeta() const
Definition distribution.h:398
double sample(std::default_random_engine &rng)
Definition distribution.h:379
double logPDF(const double &x) const
Definition distribution.h:354
double CDF(const double &x) const
Definition distribution.h:371
double alpha_
Shape parameter (often denoted as k).
Definition distribution.h:339
void setAlpha(double alpha)
Definition distribution.h:384
double quantile(const double &p) const
Definition distribution.h:375
double getAlpha() const
Definition distribution.h:395
Definition distribution.h:302
double dLogPDF(const double &x) const
Definition distribution.h:314
double ddLogPDF(const double &x) const
Definition distribution.h:317
double alpha_
Shape parameter alpha.
Definition distribution.h:304
std::gamma_distribution< double > distGamma_
Gamma distribution helper for sampling.
Definition distribution.h:306
double quantile(const double &p) const
Definition distribution.h:323
void setAlpha(double alpha)
Definition distribution.h:329
double CDF(const double &x) const
Definition distribution.h:320
InverseGammaDistribution(double alpha, double beta)
Definition distribution.h:308
double logPDF(const double &x) const
Definition distribution.h:311
void setBeta(double beta)
Definition distribution.h:332
double sample(std::default_random_engine &rng)
Definition distribution.h:326
double beta_
Scale parameter beta.
Definition distribution.h:305
InverseGammaDistribution()=default
Definition distribution.h:482
double ddLogPDF(const double &x) const
Definition distribution.h:497
double std_
Log-standard deviation parameter.
Definition distribution.h:485
LogNormalDistribution(double mu, double sigma)
Definition distribution.h:488
double quantile(const double &p) const
Definition distribution.h:503
void setMean(double mu)
Definition distribution.h:509
std::normal_distribution< double > distN_
Normal distribution generator helper.
Definition distribution.h:486
double sample(std::default_random_engine &rng)
Definition distribution.h:506
LogNormalDistribution()=default
double logPDF(const double &x) const
Definition distribution.h:491
double CDF(const double &x) const
Definition distribution.h:500
void setStd(double sigma)
Definition distribution.h:512
double dLogPDF(const double &x) const
Definition distribution.h:494
double mean_
Log-mean parameter.
Definition distribution.h:484
CRTP base class for all multivariate probability distributions.
Definition distribution.h:139
Eigen::VectorXd sample(std::default_random_engine &rng)
Draws a single vector sample from the joint distribution.
Definition distribution.h:157
Eigen::MatrixXd toCanonical(const Eigen::MatrixXd &x) const
Transforms physical samples to standard canonical space.
Definition distribution.h:167
Eigen::MatrixXd fromCanonical(const Eigen::MatrixXd &x) const
Transforms standard canonical samples back to physical space.
Definition distribution.h:177
double logPDF(const Eigen::Ref< const Eigen::VectorXd > &x) const
Computes the joint log probability density function (log-PDF) of the distribution.
Definition distribution.h:147
size_t dimension() const
Returns the dimensionality of the multivariate space.
Definition distribution.h:184
Definition distribution.h:750
double logPDF(const Eigen::Ref< const Eigen::VectorXd > &x) const
Definition distribution.h:766
std::vector< double > weights_
Mixing weights for each component.
Definition distribution.h:753
MultivariateMixtureDistribution(const std::vector< std::shared_ptr< MultivariateNormalDistribution > > &components, const std::vector< double > &weights)
Definition distribution.h:755
std::vector< std::shared_ptr< MultivariateNormalDistribution > > components_
Gaussian components of the mixture.
Definition distribution.h:752
size_t dimension() const
Definition distribution.h:774
Eigen::VectorXd sample(std::default_random_engine &rng)
Definition distribution.h:760
Definition distribution.h:654
static double ddLogPDF(const Eigen::Ref< const Eigen::VectorXd > &res, const Eigen::LDLT< Eigen::MatrixXd > &ldltDecomposition, const Eigen::Ref< const Eigen::MatrixXd > &cov_gradient_l, const Eigen::Ref< const Eigen::MatrixXd > &cov_gradient_k, const Eigen::Ref< const Eigen::MatrixXd > &cov_hessian)
Definition distribution.h:680
double logPDF(const Eigen::Ref< const Eigen::VectorXd > &x) const
Definition distribution.h:693
double logJumpPDF(const Eigen::Ref< const Eigen::VectorXd > &jump)
Definition distribution.h:696
void setLdltDecomposition(const Eigen::LDLT< Eigen::MatrixXd > &ldltDecomposition)
Definition distribution.h:720
Eigen::VectorXd sample(std::default_random_engine &rng, const double &gamma=1.0)
Definition distribution.h:703
void setMean(const Eigen::Ref< const Eigen::VectorXd > &mean)
Definition distribution.h:717
MultivariateNormalDistribution(const Eigen::Ref< const Eigen::VectorXd > &mean, const Eigen::Ref< const Eigen::MatrixXd > &cov)
Definition distribution.h:661
static double dLogPDF(const Eigen::Ref< const Eigen::VectorXd > &res, const Eigen::LDLT< Eigen::MatrixXd > &ldltDecomposition, const Eigen::Ref< const Eigen::MatrixXd > &cov_gradient, const Eigen::Ref< const Eigen::VectorXd > &mean_gradient)
Definition distribution.h:675
MultivariateNormalDistribution()=default
Eigen::LDLT< Eigen::MatrixXd > ldltDecomposition_
LDLT decomposition of the covariance matrix.
Definition distribution.h:657
std::normal_distribution< double > distN_
Univariate normal helper for coordinate-wise sampling.
Definition distribution.h:658
Eigen::VectorXd get() const
Definition distribution.h:711
Eigen::VectorXd mean_
Mean vector.
Definition distribution.h:656
size_t dimension() const
Definition distribution.h:738
static MultivariateNormalDistribution canonical(const size_t dim)
Definition distribution.h:742
double squaredMahalanobis(const Eigen::Ref< const Eigen::VectorXd > &jump) const
Definition distribution.h:699
void set(const Eigen::Ref< const Eigen::VectorXd > &x)
Definition distribution.h:714
Eigen::MatrixXd toPhysical(const Eigen::MatrixXd &z) const
Definition distribution.h:731
static double logPDF(const Eigen::Ref< const Eigen::VectorXd > &res, const Eigen::LDLT< Eigen::MatrixXd > &ldltDecomposition)
Definition distribution.h:671
MultivariateNormalDistribution(const Eigen::Ref< const Eigen::VectorXd > &mean, const Eigen::LDLT< MatrixType > &ldltDecomposition)
Definition distribution.h:666
Eigen::MatrixXd toCanonical(const Eigen::MatrixXd &x) const
Definition distribution.h:725
Definition distribution.h:780
Eigen::MatrixXd toPhysical(const Eigen::MatrixXd &z) const
Definition distribution.h:860
Eigen::VectorXd mean_
Mean vector.
Definition distribution.h:782
Eigen::MatrixXd toCanonical(const Eigen::MatrixXd &x) const
Definition distribution.h:854
std::normal_distribution< double > distN_
Normal distribution helper for coordinate sampling.
Definition distribution.h:785
MultivariateStudentDistribution()=default
static MultivariateStudentDistribution canonical(const size_t dim, const double nu)
Definition distribution.h:871
Eigen::VectorXd sample(std::default_random_engine &rng, const double &gamma=1.0)
Definition distribution.h:825
Eigen::VectorXd get() const
Definition distribution.h:838
void setMean(const Eigen::Ref< const Eigen::VectorXd > &mean)
Definition distribution.h:844
void setLdltDecomposition(const Eigen::LDLT< Eigen::MatrixXd > &ldltDecomposition)
Definition distribution.h:847
MultivariateStudentDistribution(const Eigen::Ref< const Eigen::VectorXd > &mean, const Eigen::LDLT< LDLTDerived > &ldltDecomposition, double nu)
Definition distribution.h:789
Eigen::LDLT< Eigen::MatrixXd > ldltDecomposition_
LDLT decomposition of the covariance scale matrix.
Definition distribution.h:783
double squaredMahalanobis(const Eigen::Ref< const Eigen::VectorXd > &jump) const
Definition distribution.h:821
double logPDF(const Eigen::Ref< const Eigen::VectorXd > &x) const
Definition distribution.h:815
MultivariateStudentDistribution(const Eigen::Ref< const Eigen::VectorXd > &mean, const Eigen::Ref< const Eigen::MatrixXd > &cov, double nu)
Definition distribution.h:797
double logJumpPDF(const Eigen::Ref< const Eigen::VectorXd > &jump)
Definition distribution.h:818
void setDoFs(double nu)
Definition distribution.h:850
void set(const Eigen::Ref< const Eigen::VectorXd > &x)
Definition distribution.h:841
static double logPDF(const Eigen::Ref< const Eigen::VectorXd > &res, const Eigen::LDLT< Eigen::MatrixXd > &ldltDecomposition, const double &nu)
Definition distribution.h:803
double dofs_
Degrees of freedom parameter (nu).
Definition distribution.h:784
size_t dimension() const
Definition distribution.h:867
Definition distribution.h:216
double mean_
Mean parameter.
Definition distribution.h:218
void setMean(double mean)
Definition distribution.h:248
std::normal_distribution< double > distN_
Normal distribution generator helper.
Definition distribution.h:220
NormalDistribution()=default
double quantile(const double &p) const
Definition distribution.h:241
double ddLogPDF(const double &x) const
Definition distribution.h:235
double std_
Standard deviation parameter.
Definition distribution.h:219
double std() const
Definition distribution.h:257
double sample(std::default_random_engine &rng)
Definition distribution.h:244
double logPDF(const double &x) const
Definition distribution.h:229
static double logPDF(const double &res, const double &std)
Definition distribution.h:225
NormalDistribution(double mean, double sd)
Definition distribution.h:222
double CDF(const double &x) const
Definition distribution.h:238
double dLogPDF(const double &x) const
Definition distribution.h:232
void setStd(double std)
Definition distribution.h:251
double mean() const
Definition distribution.h:254
Definition distribution.h:973
double logPDF(const Eigen::Ref< const Eigen::VectorXd > &x) const
Definition distribution.h:1002
static NormalInverseWishartDistribution canonical(const size_t dim, double kappa, double nu)
Definition distribution.h:1053
const double & kappa() const
Definition distribution.h:1026
const Eigen::VectorXd & mean() const
Definition distribution.h:1023
double logDeterminant_
Log-determinant of the scale covariance matrix.
Definition distribution.h:980
Eigen::VectorXd sample(std::default_random_engine &rng)
Definition distribution.h:1007
Eigen::MatrixXd toCanonical(const Eigen::MatrixXd &x) const
Definition distribution.h:1036
static NormalInverseWishartDistribution empiricalPrior(const Eigen::MatrixXd &data, double expected_clusters, double kappa0)
Computes an empirical Normal-Inverse-Wishart prior from the provided dataset. Useful for initializing...
Definition distribution.h:1066
const double & nu() const
Definition distribution.h:1029
size_t dimension() const
Definition distribution.h:1049
Eigen::LDLT< Eigen::MatrixXd > covLDLT_
LDLT decomposition of the scaling matrix.
Definition distribution.h:979
NormalInverseWishartDistribution(const Eigen::Ref< const Eigen::VectorXd > &mean, double kappa, double nu, const Eigen::Ref< const Eigen::MatrixXd > &psi)
Definition distribution.h:985
std::normal_distribution< double > distN_
Normal distribution helper for coordinate sampling.
Definition distribution.h:981
double nu_
Degrees of freedom parameter nu.
Definition distribution.h:977
Eigen::VectorXd mean_
Mean parameter vector.
Definition distribution.h:975
NormalInverseWishartDistribution()=default
const Eigen::MatrixXd covariance() const
Definition distribution.h:1032
Eigen::MatrixXd toPhysical(const Eigen::MatrixXd &z) const
Definition distribution.h:1042
size_t dim_
Dimensionality of the parameter space.
Definition distribution.h:978
double kappa_
Degrees of freedom scaling parameter kappa.
Definition distribution.h:976
Definition distribution.h:564
double CDF(const double &t) const
Definition distribution.h:582
double ddLogPDF(const double &x) const
Definition distribution.h:579
double quantile(const double &q) const
Definition distribution.h:585
PowerLawDistribution(double alpha, double lowerBound=1.0)
Definition distribution.h:570
double lowerBound_
Lower bound parameter.
Definition distribution.h:567
double degree_
Power law degree parameter (exponent).
Definition distribution.h:566
void setDegree(double degree)
Definition distribution.h:591
double logPDF(const double &x) const
Definition distribution.h:573
double sample(std::default_random_engine &rng)
Definition distribution.h:588
std::uniform_real_distribution< double > distU_
Uniform distribution helper for sampling.
Definition distribution.h:568
PowerLawDistribution()=default
double dLogPDF(const double &x) const
Definition distribution.h:576
Definition distribution.h:190
Eigen::VectorXd get() const
Definition distribution.h:204
double squaredMahalanobis(const Eigen::Ref< const Eigen::VectorXd > &jump) const
Definition distribution.h:198
double logJumpPDF(const Eigen::Ref< const Eigen::VectorXd > &jump)
Definition distribution.h:192
Eigen::VectorXd sample(std::default_random_engine &rng, const double &gamma)
Definition distribution.h:195
void set(const Eigen::Ref< const Eigen::VectorXd > &x)
Definition distribution.h:207
Eigen::VectorXd sample(std::default_random_engine &rng)
Definition distribution.h:201
Definition distribution.h:518
double mean_
Mean parameter.
Definition distribution.h:521
double std_
Scale standard deviation parameter.
Definition distribution.h:522
double quantile(const double &p) const
Definition distribution.h:541
StudentDistribution()=default
double dLogPDF(const double &x) const
Definition distribution.h:532
void setDoFs(double dofs)
Definition distribution.h:552
double sample(std::default_random_engine &rng)
Definition distribution.h:544
double dofs_
Degrees of freedom parameter.
Definition distribution.h:520
double ddLogPDF(const double &x) const
Definition distribution.h:535
std::normal_distribution< double > normDist_
Normal distribution helper for sampling.
Definition distribution.h:524
std::student_t_distribution< double > distN_
Student-t distribution helper.
Definition distribution.h:523
double CDF(const double &x) const
Definition distribution.h:538
double logPDF(const double &x) const
Definition distribution.h:529
void setMean(double mu)
Definition distribution.h:555
void setStd(double sigma)
Definition distribution.h:558
StudentDistribution(double nu, double mu, double sigma)
Definition distribution.h:526
CRTP base class for all univariate probability distributions.
Definition distribution.h:62
double quantile(const double &p) const
Computes the quantile function (inverse CDF).
Definition distribution.h:110
double dLogPDF(const double &x) const
Computes the first derivative of the log-PDF.
Definition distribution.h:80
double sample(std::default_random_engine &rng)
Draws a single pseudo-random sample from the distribution.
Definition distribution.h:120
double CDF(const double &x) const
Computes the cumulative distribution function (CDF).
Definition distribution.h:100
double ddLogPDF(const double &x) const
Computes the second derivative of the log-PDF.
Definition distribution.h:90
double logPDF(const double &x) const
Computes the log probability density function (log-PDF) of the distribution.
Definition distribution.h:70
Definition distribution.h:17
double erfinv(float x)
Definition distribution.h:24
double CDF_normal(const double &x)
Definition distribution.h:34
double sech(const double &x)
Definition distribution.h:38
Eigen::LDLT< Eigen::MatrixXd > ldltDecomposition(const Eigen::Ref< const Eigen::MatrixXd > &cov)
Computes the LDLT decomposition of a symmetric matrix.
Definition cmp_defines.h:99