4325 |
08 Mar 23 |
peter |
1 |
#ifndef _theplu_yat_statistics_likelihhod_ |
4325 |
08 Mar 23 |
peter |
2 |
#define _theplu_yat_statistics_likelihhod_ |
4289 |
02 Feb 23 |
peter |
3 |
|
4289 |
02 Feb 23 |
peter |
// $Id$ |
4289 |
02 Feb 23 |
peter |
5 |
|
4289 |
02 Feb 23 |
peter |
6 |
/* |
4289 |
02 Feb 23 |
peter |
Copyright (C) 2023 Peter Johansson |
4289 |
02 Feb 23 |
peter |
8 |
|
4289 |
02 Feb 23 |
peter |
This file is part of the yat library, https://dev.thep.lu.se/trac/yat |
4289 |
02 Feb 23 |
peter |
10 |
|
4289 |
02 Feb 23 |
peter |
The yat library is free software; you can redistribute it and/or |
4289 |
02 Feb 23 |
peter |
modify it under the terms of the GNU General Public License as |
4289 |
02 Feb 23 |
peter |
published by the Free Software Foundation; either version 3 of the |
4289 |
02 Feb 23 |
peter |
License, or (at your option) any later version. |
4289 |
02 Feb 23 |
peter |
15 |
|
4289 |
02 Feb 23 |
peter |
The yat library is distributed in the hope that it will be useful, |
4289 |
02 Feb 23 |
peter |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
4289 |
02 Feb 23 |
peter |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
4289 |
02 Feb 23 |
peter |
General Public License for more details. |
4289 |
02 Feb 23 |
peter |
20 |
|
4289 |
02 Feb 23 |
peter |
You should have received a copy of the GNU General Public License |
4289 |
02 Feb 23 |
peter |
along with yat. If not, see <https://www.gnu.org/licenses/>. |
4289 |
02 Feb 23 |
peter |
23 |
*/ |
4289 |
02 Feb 23 |
peter |
24 |
|
4289 |
02 Feb 23 |
peter |
25 |
#include <boost/operators.hpp> |
4289 |
02 Feb 23 |
peter |
26 |
|
4289 |
02 Feb 23 |
peter |
27 |
namespace theplu { |
4289 |
02 Feb 23 |
peter |
28 |
namespace yat { |
4289 |
02 Feb 23 |
peter |
29 |
namespace statistics { |
4289 |
02 Feb 23 |
peter |
30 |
|
4289 |
02 Feb 23 |
peter |
31 |
/** |
4289 |
02 Feb 23 |
peter |
This class is designed for calculation of likelihoods, but can be |
4289 |
02 Feb 23 |
peter |
used for other similar situations where values are non-negative |
4289 |
02 Feb 23 |
peter |
and risk going out of range. When calculating likelihoods it is |
4289 |
02 Feb 23 |
peter |
often more practical to calculate log L, as it avoids going out |
4289 |
02 Feb 23 |
peter |
of range. Multiplication simply becomes addition, but when the |
4289 |
02 Feb 23 |
peter |
calculation involved addition of likelihoods, the calculation log |
4289 |
02 Feb 23 |
peter |
L space becomes more complicated. This class is designed to |
4289 |
02 Feb 23 |
peter |
handle this case by storing log L internally and implementing |
4289 |
02 Feb 23 |
peter |
multiplication and addition operators. |
4289 |
02 Feb 23 |
peter |
41 |
|
4289 |
02 Feb 23 |
peter |
\since New in yat 0.21 |
4289 |
02 Feb 23 |
peter |
43 |
*/ |
4289 |
02 Feb 23 |
peter |
44 |
class Likelihood : boost::operators<Likelihood> |
4289 |
02 Feb 23 |
peter |
45 |
{ |
4289 |
02 Feb 23 |
peter |
46 |
public: |
4289 |
02 Feb 23 |
peter |
47 |
/** |
4289 |
02 Feb 23 |
peter |
Constrctor |
4289 |
02 Feb 23 |
peter |
49 |
*/ |
4289 |
02 Feb 23 |
peter |
50 |
explicit Likelihood(long double x=0.0); |
4289 |
02 Feb 23 |
peter |
51 |
|
4289 |
02 Feb 23 |
peter |
52 |
/** |
4289 |
02 Feb 23 |
peter |
Convert to a long double. |
4289 |
02 Feb 23 |
peter |
54 |
*/ |
4289 |
02 Feb 23 |
peter |
55 |
double get(void) const; |
4289 |
02 Feb 23 |
peter |
56 |
|
4289 |
02 Feb 23 |
peter |
57 |
/** |
4289 |
02 Feb 23 |
peter |
return reference to stored log L value |
4289 |
02 Feb 23 |
peter |
59 |
*/ |
4289 |
02 Feb 23 |
peter |
60 |
long double& log(void); |
4289 |
02 Feb 23 |
peter |
61 |
|
4289 |
02 Feb 23 |
peter |
62 |
/** |
4289 |
02 Feb 23 |
peter |
return reference to stored log L value |
4289 |
02 Feb 23 |
peter |
64 |
*/ |
4289 |
02 Feb 23 |
peter |
65 |
const long double& log(void) const; |
4289 |
02 Feb 23 |
peter |
66 |
|
4289 |
02 Feb 23 |
peter |
67 |
/** |
4289 |
02 Feb 23 |
peter |
\brief less than operator |
4289 |
02 Feb 23 |
peter |
69 |
|
4289 |
02 Feb 23 |
peter |
Other operators such as <= are implemented as combinations of |
4289 |
02 Feb 23 |
peter |
operator< and operator== via boost::operators. |
4289 |
02 Feb 23 |
peter |
72 |
*/ |
4289 |
02 Feb 23 |
peter |
73 |
bool operator<(const Likelihood& rhs) const; |
4289 |
02 Feb 23 |
peter |
74 |
|
4289 |
02 Feb 23 |
peter |
75 |
/** |
4289 |
02 Feb 23 |
peter |
\return true if lhs and rhs are equal |
4289 |
02 Feb 23 |
peter |
77 |
*/ |
4289 |
02 Feb 23 |
peter |
78 |
bool operator==(const Likelihood& rhs) const; |
4289 |
02 Feb 23 |
peter |
79 |
|
4289 |
02 Feb 23 |
peter |
80 |
/** |
4289 |
02 Feb 23 |
peter |
\brief addition and assign operator |
4289 |
02 Feb 23 |
peter |
82 |
*/ |
4289 |
02 Feb 23 |
peter |
83 |
Likelihood& operator+=(const Likelihood& rhs); |
4289 |
02 Feb 23 |
peter |
84 |
|
4289 |
02 Feb 23 |
peter |
85 |
/** |
4289 |
02 Feb 23 |
peter |
\brief multiplication and assign operator |
4289 |
02 Feb 23 |
peter |
87 |
*/ |
4289 |
02 Feb 23 |
peter |
88 |
Likelihood& operator*=(const Likelihood& rhs); |
4289 |
02 Feb 23 |
peter |
89 |
|
4289 |
02 Feb 23 |
peter |
90 |
/** |
4289 |
02 Feb 23 |
peter |
\brief multiplication and assign operator |
4289 |
02 Feb 23 |
peter |
92 |
*/ |
4289 |
02 Feb 23 |
peter |
93 |
Likelihood& operator*=(double rhs); |
4289 |
02 Feb 23 |
peter |
94 |
|
4289 |
02 Feb 23 |
peter |
95 |
/** |
4289 |
02 Feb 23 |
peter |
\brief division and assign operator |
4289 |
02 Feb 23 |
peter |
97 |
*/ |
4335 |
13 Apr 23 |
peter |
98 |
Likelihood& operator/=(const Likelihood& rhs); |
4335 |
13 Apr 23 |
peter |
99 |
|
4335 |
13 Apr 23 |
peter |
100 |
/** |
4335 |
13 Apr 23 |
peter |
\brief division and assign operator |
4335 |
13 Apr 23 |
peter |
102 |
*/ |
4289 |
02 Feb 23 |
peter |
103 |
Likelihood& operator/=(double rhs); |
4289 |
02 Feb 23 |
peter |
104 |
private: |
4289 |
02 Feb 23 |
peter |
105 |
bool zero(void) const; |
4289 |
02 Feb 23 |
peter |
106 |
long double ln_x_; |
4289 |
02 Feb 23 |
peter |
107 |
}; |
4289 |
02 Feb 23 |
peter |
108 |
|
4289 |
02 Feb 23 |
peter |
109 |
/** |
4289 |
02 Feb 23 |
peter |
\brief exp function |
4289 |
02 Feb 23 |
peter |
111 |
|
4289 |
02 Feb 23 |
peter |
\relates Likelihood |
4289 |
02 Feb 23 |
peter |
113 |
*/ |
4289 |
02 Feb 23 |
peter |
114 |
Likelihood exp(double x); |
4289 |
02 Feb 23 |
peter |
115 |
|
4289 |
02 Feb 23 |
peter |
116 |
/** |
4289 |
02 Feb 23 |
peter |
\return natural logarithm |
4289 |
02 Feb 23 |
peter |
118 |
|
4289 |
02 Feb 23 |
peter |
\relates Likelihood |
4289 |
02 Feb 23 |
peter |
120 |
*/ |
4289 |
02 Feb 23 |
peter |
121 |
double log(const Likelihood& L); |
4289 |
02 Feb 23 |
peter |
122 |
|
4289 |
02 Feb 23 |
peter |
123 |
/** |
4289 |
02 Feb 23 |
peter |
\brief multiplication operator |
4289 |
02 Feb 23 |
peter |
125 |
|
4289 |
02 Feb 23 |
peter |
\relates Likelihood |
4289 |
02 Feb 23 |
peter |
127 |
*/ |
4289 |
02 Feb 23 |
peter |
128 |
Likelihood operator*(double x, const Likelihood& L); |
4289 |
02 Feb 23 |
peter |
129 |
|
4289 |
02 Feb 23 |
peter |
130 |
/** |
4289 |
02 Feb 23 |
peter |
\brief multiplication operator |
4289 |
02 Feb 23 |
peter |
132 |
|
4289 |
02 Feb 23 |
peter |
\relates Likelihood |
4289 |
02 Feb 23 |
peter |
134 |
*/ |
4289 |
02 Feb 23 |
peter |
135 |
Likelihood operator*(const Likelihood& L, double x); |
4289 |
02 Feb 23 |
peter |
136 |
|
4289 |
02 Feb 23 |
peter |
137 |
/** |
4289 |
02 Feb 23 |
peter |
\brief division operator |
4289 |
02 Feb 23 |
peter |
139 |
|
4289 |
02 Feb 23 |
peter |
\relates Likelihood |
4289 |
02 Feb 23 |
peter |
141 |
*/ |
4335 |
13 Apr 23 |
peter |
142 |
Likelihood operator/(const Likelihood& num, const Likelihood& den); |
4335 |
13 Apr 23 |
peter |
143 |
|
4335 |
13 Apr 23 |
peter |
144 |
/** |
4335 |
13 Apr 23 |
peter |
\brief division operator |
4335 |
13 Apr 23 |
peter |
146 |
|
4335 |
13 Apr 23 |
peter |
\relates Likelihood |
4335 |
13 Apr 23 |
peter |
148 |
*/ |
4289 |
02 Feb 23 |
peter |
149 |
Likelihood operator/(const Likelihood& L, double x); |
4289 |
02 Feb 23 |
peter |
150 |
|
4289 |
02 Feb 23 |
peter |
151 |
}}} // of namespace statistics, yat, and theplu |
4289 |
02 Feb 23 |
peter |
152 |
|
4289 |
02 Feb 23 |
peter |
153 |
#endif |