RandLib 2.0.0
Probability distributions, fitting, and heavy-tail tools for C++20
Loading...
Searching...
No Matches
exponential_family.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <type_traits>
4
8
9namespace randlib
10{
11
12template <typename T, typename P>
14{
15public:
17 virtual ~ExponentialFamily() {}
18
19 virtual P SufficientStatistic(T x) const = 0;
20 virtual P SourceParameters() const = 0;
21 virtual P SourceToNatural(P sourceParameters) const = 0;
22 virtual P NaturalParameters() const;
23
24 virtual double LogNormalizer(P theta) const = 0;
25 virtual P LogNormalizerGradient(P theta) const = 0;
26 virtual double CarrierMeasure(T x) const = 0;
27
28 double ProbabilityMeasure(T x) const;
29 double LogProbabilityMeasure(T x) const;
30
31 double KullbackLeiblerDivergence(P parameters) const;
32 virtual double CrossEntropyAdjusted(P parameters) const;
33 virtual double EntropyAdjusted() const;
34
35private:
36 static double InnerProduct(const P &left, const P &right);
37};
38
39} // namespace randlib
40
42
43namespace randlib
44{
45
46template <typename T, typename P>
48{
49 P sourceParameters = SourceParameters();
50 return SourceToNatural(sourceParameters);
51}
52
53template <typename T, typename P>
55{
56 return std::exp(LogProbabilityMeasure(x));
57}
58
59template <typename T, typename P>
61{
62 P theta = this->NaturalParameters();
63 P t = this->SufficientStatistic(x);
64 double y = InnerProduct(t, theta);
65 y -= this->LogNormalizer(theta);
66 y += this->CarrierMeasure(x);
67 return y;
68}
69
70template <typename T, typename P>
72{
73 double KL = this->CrossEntropyAdjusted(parameters);
74 KL -= this->EntropyAdjusted();
75 return KL;
76}
77
78template <typename T, typename P>
80{
81 P theta_p = this->NaturalParameters();
82 P theta_q = this->SourceToNatural(parameters);
83 double H = this->LogNormalizer(theta_q);
84 P grad = this->LogNormalizerGradient(theta_p);
85 H -= InnerProduct(theta_q, grad);
86 return H;
87}
88
89template <typename T, typename P>
91{
92 P sourceParameters = this->SourceParameters();
93 return CrossEntropyAdjusted(sourceParameters);
94}
95
96template <typename T, typename P>
97double ExponentialFamily<T, P>::InnerProduct(const P &left, const P &right)
98{
99 if constexpr (std::is_arithmetic_v<P>)
100 return left * right;
101 else
102 return left.first * right.first + left.second * right.second;
103}
104
105} // namespace randlib
Definition exponential_family.hpp:14
double KullbackLeiblerDivergence(P parameters) const
Definition exponential_family.hpp:71
virtual double LogNormalizer(P theta) const =0
virtual P LogNormalizerGradient(P theta) const =0
virtual ~ExponentialFamily()
Definition exponential_family.hpp:17
virtual P SourceToNatural(P sourceParameters) const =0
double LogProbabilityMeasure(T x) const
Definition exponential_family.hpp:60
virtual double EntropyAdjusted() const
Definition exponential_family.hpp:90
virtual P NaturalParameters() const
Definition exponential_family.hpp:47
ExponentialFamily()
Definition exponential_family.hpp:16
virtual double CrossEntropyAdjusted(P parameters) const
Definition exponential_family.hpp:79
double ProbabilityMeasure(T x) const
Definition exponential_family.hpp:54
virtual P SufficientStatistic(T x) const =0
virtual double CarrierMeasure(T x) const =0
virtual P SourceParameters() const =0
Definition bivariate_normal.hpp:10