cMHN 1.2
C++ library for learning MHNs with pRC
Loading...
Searching...
No Matches
score.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef cMHN_COMMON_SCORE_H
4#define cMHN_COMMON_SCORE_H
5
6#include <functional>
7#include <string>
8
9#include <prc.hpp>
10
11namespace cMHN
12{
26 template<class T>
27 class Score
28 {
29 public:
30 ~Score() = default;
31 Score(Score const &) = default;
32 Score(Score &&) = default;
33 Score &operator=(Score const &) & = default;
34 Score &operator=(Score &&) & = default;
35 Score() = delete;
36
37 explicit Score(auto const &pointwiseScore, auto const &pointwiseDSDP,
38 auto const &name)
39 : mPointwiseScore(pointwiseScore)
40 , mPointwiseDSDP(pointwiseDSDP)
41 , mName(name)
42 {
43 }
44
45 auto pointwiseScore(T const &pDE, T const &pThetaE) const
46 {
47 return mPointwiseScore(pDE, pThetaE);
48 }
49
50 auto pointwiseDSDP(T const &pDE, T const &pThetaE) const
51 {
52 return mPointwiseDSDP(pDE, pThetaE);
53 }
54
55 auto name() const
56 {
57 return mName;
58 }
59
60 private:
61 std::function<T(T, T)> mPointwiseScore;
62 std::function<T(T, T)> mPointwiseDSDP;
63 std::string mName;
64 };
65
80 template<class T>
81 class sKLdynScore : public Score<T>
82 {
83 public:
84 ~sKLdynScore() = default;
85 sKLdynScore(sKLdynScore const &) = default;
86 sKLdynScore(sKLdynScore &&) = default;
87 sKLdynScore &operator=(sKLdynScore const &) & = default;
89
90 explicit sKLdynScore(T const &delta)
91 : Score<T>(
92 [this](T const &pDE, T const &pThetaE)
93 {
94 T eps = pRC::zero();
95 if(pThetaE < pRC::zero<T>())
96 {
97 eps = -(pRC::unit<T>() + mDelta) * pThetaE;
98 }
99 return (pDE + eps) * log((pDE + eps) / (pThetaE + eps));
100 },
101 [this](T const &pDE, T const &pThetaE)
102 {
103 T eps = pRC::zero();
104 if(pThetaE < pRC::zero<T>())
105 {
106 eps = -(pRC::unit<T>() + mDelta) * pThetaE;
107 }
108 return -(pDE + eps) / (pThetaE + eps);
109 },
110 "dynamic sKL divergence")
111 , mDelta(delta)
112 {
113 }
114
115 auto &delta()
116 {
117 return mDelta;
118 }
119
120 auto const delta() const
121 {
122 return mDelta;
123 }
124
125 private:
126 T mDelta;
127 };
128
142 template<class T>
143 class sKLScore : public Score<T>
144 {
145 public:
146 ~sKLScore() = default;
147 sKLScore(sKLScore const &) = default;
148 sKLScore(sKLScore &&) = default;
149 sKLScore &operator=(sKLScore const &) & = default;
150 sKLScore &operator=(sKLScore &&) & = default;
151
152 explicit sKLScore(T const &epsilon)
153 : Score<T>(
154 [this](T const &pDE, T const &pThetaE)
155 {
156 return (pDE + mEpsilon) *
157 log((pDE + mEpsilon) / (pThetaE + mEpsilon));
158 },
159 [this](T const &pDE, T const &pThetaE)
160 {
161 return -(pDE + mEpsilon) / (pThetaE + mEpsilon);
162 },
163 "static sKL divergence")
164 , mEpsilon(epsilon)
165 {
166 }
167
168 auto &epsilon()
169 {
170 return mEpsilon;
171 }
172
173 auto const epsilon() const
174 {
175 return mEpsilon;
176 }
177
178 private:
179 T mEpsilon;
180 };
181
193 template<class T>
194 class KLScore : public Score<T>
195 {
196 public:
197 ~KLScore() = default;
198 KLScore(KLScore const &) = default;
199 KLScore(KLScore &&) = default;
200 KLScore &operator=(KLScore const &) & = default;
201 KLScore &operator=(KLScore &&) & = default;
202
203 explicit KLScore()
204 : Score<T>(
205 [](T const &pDE, T const &pThetaE)
206 {
207 return pDE * log(pDE / pThetaE);
208 },
209 [](T const &pDE, T const &pThetaE)
210 {
211 return -pDE / pThetaE;
212 },
213 "KL divergence")
214 {
215 }
216 };
217}
218
219#endif // cMHN_COMMON_SCORE_H
Class storing a KL Score, specializes the Score class.
Definition score.hpp:195
KLScore(KLScore &&)=default
KLScore(KLScore const &)=default
KLScore & operator=(KLScore const &) &=default
KLScore & operator=(KLScore &&) &=default
KLScore()
Definition score.hpp:203
~KLScore()=default
Class storing all relevant information for a score.
Definition score.hpp:28
auto pointwiseScore(T const &pDE, T const &pThetaE) const
Definition score.hpp:45
Score(Score const &)=default
Score(auto const &pointwiseScore, auto const &pointwiseDSDP, auto const &name)
Definition score.hpp:37
Score(Score &&)=default
Score & operator=(Score const &) &=default
~Score()=default
auto name() const
Definition score.hpp:55
Score & operator=(Score &&) &=default
auto pointwiseDSDP(T const &pDE, T const &pThetaE) const
Definition score.hpp:50
Score()=delete
Class storing a static sKL-Divergence Score, specializes the Score class.
Definition score.hpp:144
sKLScore(T const &epsilon)
Definition score.hpp:152
sKLScore & operator=(sKLScore const &) &=default
sKLScore(sKLScore &&)=default
auto const epsilon() const
Definition score.hpp:173
~sKLScore()=default
sKLScore & operator=(sKLScore &&) &=default
sKLScore(sKLScore const &)=default
auto & epsilon()
Definition score.hpp:168
Class storing a dynamic sKL-Divergence Score, specializes the Score class.
Definition score.hpp:82
sKLdynScore & operator=(sKLdynScore &&) &=default
sKLdynScore(sKLdynScore const &)=default
sKLdynScore(sKLdynScore &&)=default
auto const delta() const
Definition score.hpp:120
sKLdynScore & operator=(sKLdynScore const &) &=default
auto & delta()
Definition score.hpp:115
~sKLdynScore()=default
sKLdynScore(T const &delta)
Definition score.hpp:90
Definition value.hpp:12
pRC::Float<> T
Definition externs_nonTT.hpp:1
Definition calculate_pTheta.hpp:20
static constexpr auto unit()
Definition unit.hpp:13
static constexpr auto zero()
Definition zero.hpp:12