26template <
typename RealType>
41 throw std::invalid_argument(
"Exponential distribution: scale should be positive");
44 [[nodiscard]] std::string
Name()
const override;
55 [[nodiscard]]
double f(
const RealType &x)
const override;
56 [[nodiscard]]
double logf(
const RealType &x)
const override;
57 [[nodiscard]]
double F(
const RealType &x)
const override;
58 [[nodiscard]]
double S(
const RealType &x)
const override;
59 template <std::uniform_random_bit_generator G>
62 template <std::uniform_random_bit_generator G>
66 std::complex<double> CFImpl(
double t)
const override;
69 [[nodiscard]]
long double Entropy()
const;
70 [[nodiscard]]
long double Moment(
int n)
const;
82template <
typename RealType>
85 return "Exponential(" + this->toStringWithPrecision(this->GetRate()) +
")";
88template <
typename RealType>
94template <
typename RealType>
100template <
typename RealType>
106template <
typename RealType>
109 return -std::log(-thetaP);
112template <
typename RealType>
115 return -1.0 / thetaP;
118template <
typename RealType>
124template <
typename RealType>
127 return rate * this->theta - std::log(rate);
130template <
typename RealType>
133 return 1.0 - this->logBeta;
136template <
typename RealType>
139 return (x < 0.0) ? 0.0 : this->beta * std::exp(-this->beta * x);
142template <
typename RealType>
145 return (x < 0.0) ? -INFINITY : this->logBeta - this->beta * x;
148template <
typename RealType>
151 return (x > 0.0) ? -std::expm1l(-this->beta * x) : 0.0;
154template <
typename RealType>
157 return (x > 0.0) ? std::exp(-this->beta * x) : 1.0;
160template <
typename RealType>
161template <std::uniform_random_bit_generator G>
164 return this->theta * StandardVariate(g);
167template <
typename RealType>
168template <std::uniform_random_bit_generator G>
174template <
typename RealType>
177 return 1.0 / std::complex<double>(1.0, -this->theta * t);
180template <
typename RealType>
183 return this->EntropyAdjusted();
186template <
typename RealType>
193 return std::exp(
math::lfact(n) - n * this->logBeta);
Definition exponential_family.hpp:14
The ExponentialRand class Exponential distribution.
Definition exponential.hpp:28
double EntropyAdjusted() const override
Definition exponential.hpp:131
double SourceParameters() const override
Definition exponential.hpp:95
static RealType StandardVariate(G &g)
Definition exponential.hpp:169
double logf(const RealType &x) const override
Definition exponential.hpp:143
long double FourthMoment() const override
Definition exponential.hpp:72
double SufficientStatistic(RealType x) const override
Definition exponential.hpp:89
std::string Name() const override
Definition exponential.hpp:83
double SourceToNatural(double rate) const override
Definition exponential.hpp:101
static ExponentialRand FromScale(double scale)
Definition exponential.hpp:38
ExponentialRand(double rate=1)
Definition exponential.hpp:32
double CrossEntropyAdjusted(double rate) const override
Definition exponential.hpp:125
static ExponentialRand FromRate(double rate)
Definition exponential.hpp:35
double LogNormalizer(double theta) const override
Definition exponential.hpp:107
long double Moment(int n) const
Definition exponential.hpp:187
RealType operator()(G &g) const
Definition exponential.hpp:162
double CarrierMeasure(RealType) const override
Definition exponential.hpp:119
double F(const RealType &x) const override
Definition exponential.hpp:149
double S(const RealType &x) const override
Definition exponential.hpp:155
double f(const RealType &x) const override
Definition exponential.hpp:137
long double Entropy() const
Definition exponential.hpp:181
long double ThirdMoment() const override
Definition exponential.hpp:71
double LogNormalizerGradient(double theta) const override
Definition exponential.hpp:113
The FreeRateGammaDistribution class Abstract class for Gamma distribution with arbitrary scale/rate...
Definition continuous/gamma.hpp:252
double theta
scale θ = 1/β
Definition continuous/gamma.hpp:38
The EngineRef class Non-owning, type-erased reference to any uniform random bit generator.
Definition engine/uniform.hpp:116
Real standardNormal(G &g)
Ziggurat algorithm of Marsaglia and Tsang with 256 layers and an explicit sign bit.
Definition variates.hpp:45
Real lfact(size_t n)
Calculate log(n!) using table values for small n <= 255 and built-in lgamma function for large n > 25...
Definition math/gamma.hpp:591
Definition bivariate_normal.hpp:10