cMHN 1.0
C++ library for learning MHNs with pRC
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,
37 auto const &pointwiseDSDP, 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 : pRC::zero<T>();
172 },
173 "KL-epsilon")
174 , mEpsilon(epsilon)
175 {
176 }
177
178 auto &threshold()
179 {
180 return mEpsilon;
181 }
182
183 auto const epsilon() const
184 {
185 return mEpsilon;
186 }
187
188 private:
189 T mEpsilon;
190 };
191
203 template<class T>
204 class KLScore : public Score<T>
205 {
206 public:
207 ~KLScore() = default;
208 KLScore(KLScore const &) = default;
209 KLScore(KLScore &&) = default;
210 KLScore &operator=(KLScore const &) & = default;
211 KLScore &operator=(KLScore &&) & = default;
212
213 explicit KLScore()
214 : Score<T>(
215 [](T const &pDE, T const &pThetaE)
216 {
217 return pDE * log(pThetaE);
218 },
219 [](T const &pDE, T const &pThetaE)
220 {
221 return pDE / pThetaE;
222 },
223 "KL")
224 {
225 }
226 };
227}
228
229#endif // cMHN_COMMON_SCORE_H
Class storing a KL Score, specializes the Score class.
Definition: score.hpp:205
KLScore(KLScore &&)=default
KLScore(KLScore const &)=default
KLScore & operator=(KLScore const &) &=default
KLScore & operator=(KLScore &&) &=default
KLScore()
Definition: score.hpp:213
~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:183
auto & threshold()
Definition: score.hpp:178
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
pRC::Float<> T
Definition: externs_nonTT.hpp:1
Definition: calculate_pTheta.hpp:15