cMHN 1.1
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{
25 template<class T>
26 class Score
27 {
28 public:
29 ~Score() = default;
30 Score(Score const &) = default;
31 Score(Score &&) = default;
32 Score &operator=(Score const &) & = default;
33 Score &operator=(Score &&) & = default;
34 Score() = delete;
35
36 explicit Score(auto const &pointwiseScore, auto const &pointwiseDSDP,
37 auto const &name)
38 : mPointwiseScore(pointwiseScore)
39 , mPointwiseDSDP(pointwiseDSDP)
40 , mName(name)
41 {
42 }
43
44 auto pointwiseScore(T const &pDE, T const &pThetaE) const
45 {
46 return mPointwiseScore(pDE, pThetaE);
47 }
48
49 auto pointwiseDSDP(T const &pDE, T const &pThetaE) const
50 {
51 return mPointwiseDSDP(pDE, pThetaE);
52 }
53
54 auto name() const
55 {
56 return mName;
57 }
58
59 private:
60 std::function<T(T, T)> mPointwiseScore;
61 std::function<T(T, T)> mPointwiseDSDP;
62 std::string mName;
63 };
64
81 template<class T>
82 class KLTHScore : public Score<T>
83 {
84 public:
85 ~KLTHScore() = default;
86 KLTHScore(KLTHScore const &) = default;
87 KLTHScore(KLTHScore &&) = default;
88 KLTHScore &operator=(KLTHScore const &) & = default;
89 KLTHScore &operator=(KLTHScore &&) & = default;
90
91 explicit KLTHScore(T const &threshold)
92 : Score<T>(
93 [this](T const &pDE, T const &pThetaE)
94 {
95 if(pThetaE > mThreshold)
96 {
97 return pDE * log(pThetaE);
98 }
99 else
100 {
101 T deltaPThetaE = pThetaE - mThreshold;
102 return pDE * log(mThreshold) +
103 pDE *
104 (deltaPThetaE / mThreshold -
105 deltaPThetaE * deltaPThetaE /
106 (T(2) * mThreshold * mThreshold));
107 }
108 },
109 [this](T const &pDE, T const &pThetaE)
110 {
111 if(pThetaE > mThreshold)
112 {
113 return pDE / pThetaE;
114 }
115 else
116 {
117 return -pDE * (pThetaE - T(2) * mThreshold) /
118 (mThreshold * mThreshold);
119 }
120 },
121 "KL-Taylor-Hybrid")
122 , mThreshold(threshold)
123 {
124 }
125
126 auto &threshold()
127 {
128 return mThreshold;
129 }
130
131 auto const threshold() const
132 {
133 return mThreshold;
134 }
135
136 private:
137 T mThreshold;
138 };
139
153 template<class T>
154 class KLepsScore : public Score<T>
155 {
156 public:
157 ~KLepsScore() = default;
158 KLepsScore(KLepsScore const &) = default;
159 KLepsScore(KLepsScore &&) = default;
160 KLepsScore &operator=(KLepsScore const &) & = default;
162
163 explicit KLepsScore(T const &epsilon)
164 : Score<T>(
165 [this](T const &pDE, T const &pThetaE)
166 {
167 return pDE * log(max(pThetaE, mEpsilon));
168 },
169 [this](T const &pDE, T const &pThetaE)
170 {
171 return pThetaE > mEpsilon ? pDE / pThetaE
172 : pRC::zero<T>();
173 },
174 "KL-epsilon")
175 , mEpsilon(epsilon)
176 {
177 }
178
179 auto &threshold()
180 {
181 return mEpsilon;
182 }
183
184 auto const epsilon() const
185 {
186 return mEpsilon;
187 }
188
189 private:
190 T mEpsilon;
191 };
192
206 template<class T>
207 class sKLdynScore : public Score<T>
208 {
209 public:
210 ~sKLdynScore() = default;
211 sKLdynScore(sKLdynScore const &) = default;
213 sKLdynScore &operator=(sKLdynScore const &) & = default;
215
216 explicit sKLdynScore(T const &delta)
217 : Score<T>(
218 [this](T const &pDE, T const &pThetaE)
219 {
220 T eps = pRC::zero();
221 if(pThetaE < pRC::zero<T>())
222 {
223 eps = -(pRC::unit<T>() + mDelta) * pThetaE;
224 }
225 return (pDE + eps) * log(pThetaE + eps);
226 },
227 [this](T const &pDE, T const &pThetaE)
228 {
229 T eps = pRC::zero();
230 if(pThetaE < pRC::zero<T>())
231 {
232 eps = -(pRC::unit<T>() + mDelta) * pThetaE;
233 }
234 return (pDE + eps) / (pThetaE + eps);
235 },
236 "dynamic sKL")
237 , mDelta(delta)
238 {
239 }
240
241 auto &delta()
242 {
243 return mDelta;
244 }
245
246 auto const delta() const
247 {
248 return mDelta;
249 }
250
251 private:
252 T mDelta;
253 };
254
267 template<class T>
268 class sKLScore : public Score<T>
269 {
270 public:
271 ~sKLScore() = default;
272 sKLScore(sKLScore const &) = default;
273 sKLScore(sKLScore &&) = default;
274 sKLScore &operator=(sKLScore const &) & = default;
275 sKLScore &operator=(sKLScore &&) & = default;
276
277 explicit sKLScore(T const &epsilon)
278 : Score<T>(
279 [this](T const &pDE, T const &pThetaE)
280 {
281 return (pDE + mEpsilon) * log(pThetaE + mEpsilon);
282 },
283 [this](T const &pDE, T const &pThetaE)
284 {
285 return (pDE + mEpsilon) / (pThetaE + mEpsilon);
286 },
287 "sKL")
288 , mEpsilon(epsilon)
289 {
290 }
291
292 auto &epsilon()
293 {
294 return mEpsilon;
295 }
296
297 auto const epsilon() const
298 {
299 return mEpsilon;
300 }
301
302 private:
303 T mEpsilon;
304 };
305
317 template<class T>
318 class KLScore : public Score<T>
319 {
320 public:
321 ~KLScore() = default;
322 KLScore(KLScore const &) = default;
323 KLScore(KLScore &&) = default;
324 KLScore &operator=(KLScore const &) & = default;
325 KLScore &operator=(KLScore &&) & = default;
326
327 explicit KLScore()
328 : Score<T>(
329 [](T const &pDE, T const &pThetaE)
330 {
331 return pDE * log(pThetaE);
332 },
333 [](T const &pDE, T const &pThetaE)
334 {
335 return pDE / pThetaE;
336 },
337 "KL")
338 {
339 }
340 };
341}
342
343#endif // cMHN_COMMON_SCORE_H
Class storing a KL Score, specializes the Score class.
Definition score.hpp:319
KLScore(KLScore &&)=default
KLScore(KLScore const &)=default
KLScore & operator=(KLScore const &) &=default
KLScore & operator=(KLScore &&) &=default
KLScore()
Definition score.hpp:327
~KLScore()=default
Class storing a KL-Taylor-Hybrid Score, specializes the Score class.
Definition score.hpp:83
auto & threshold()
Definition score.hpp:126
KLTHScore & operator=(KLTHScore const &) &=default
KLTHScore(KLTHScore const &)=default
KLTHScore(KLTHScore &&)=default
auto const threshold() const
Definition score.hpp:131
KLTHScore(T const &threshold)
Definition score.hpp:91
KLTHScore & operator=(KLTHScore &&) &=default
~KLTHScore()=default
Class storing a KL-epsilon Score, specializes the Score class.
Definition score.hpp:155
KLepsScore & operator=(KLepsScore &&) &=default
KLepsScore(KLepsScore const &)=default
KLepsScore & operator=(KLepsScore const &) &=default
KLepsScore(T const &epsilon)
Definition score.hpp:163
KLepsScore(KLepsScore &&)=default
~KLepsScore()=default
auto const epsilon() const
Definition score.hpp:184
auto & threshold()
Definition score.hpp:179
Class storing all relevant information for a score.
Definition score.hpp:27
auto pointwiseScore(T const &pDE, T const &pThetaE) const
Definition score.hpp:44
Score(Score const &)=default
Score(auto const &pointwiseScore, auto const &pointwiseDSDP, auto const &name)
Definition score.hpp:36
Score(Score &&)=default
Score & operator=(Score const &) &=default
~Score()=default
auto name() const
Definition score.hpp:54
Score & operator=(Score &&) &=default
auto pointwiseDSDP(T const &pDE, T const &pThetaE) const
Definition score.hpp:49
Score()=delete
Class storing an sKL Score, specializes the Score class.
Definition score.hpp:269
sKLScore(T const &epsilon)
Definition score.hpp:277
sKLScore & operator=(sKLScore const &) &=default
sKLScore(sKLScore &&)=default
auto const epsilon() const
Definition score.hpp:297
~sKLScore()=default
sKLScore & operator=(sKLScore &&) &=default
sKLScore(sKLScore const &)=default
auto & epsilon()
Definition score.hpp:292
Class storing a dynamic sKL Score, specializes the Score class.
Definition score.hpp:208
sKLdynScore & operator=(sKLdynScore &&) &=default
sKLdynScore(sKLdynScore const &)=default
sKLdynScore(sKLdynScore &&)=default
auto const delta() const
Definition score.hpp:246
sKLdynScore & operator=(sKLdynScore const &) &=default
auto & delta()
Definition score.hpp:241
~sKLdynScore()=default
sKLdynScore(T const &delta)
Definition score.hpp:216
pRC::Float<> T
Definition externs_nonTT.hpp:1
Definition calculate_pTheta.hpp:16
static constexpr auto makeConstantSequence()
Definition sequence.hpp:402
static constexpr auto zero()
Definition zero.hpp:12