yat/statistics/Likelihood.h

Code
Comments
Other
Rev Date Author Line
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 4 // $Id$
4289 02 Feb 23 peter 5
4289 02 Feb 23 peter 6 /*
4289 02 Feb 23 peter 7   Copyright (C) 2023 Peter Johansson
4289 02 Feb 23 peter 8
4289 02 Feb 23 peter 9   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 11   The yat library is free software; you can redistribute it and/or
4289 02 Feb 23 peter 12   modify it under the terms of the GNU General Public License as
4289 02 Feb 23 peter 13   published by the Free Software Foundation; either version 3 of the
4289 02 Feb 23 peter 14   License, or (at your option) any later version.
4289 02 Feb 23 peter 15
4289 02 Feb 23 peter 16   The yat library is distributed in the hope that it will be useful,
4289 02 Feb 23 peter 17   but WITHOUT ANY WARRANTY; without even the implied warranty of
4289 02 Feb 23 peter 18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4289 02 Feb 23 peter 19   General Public License for more details.
4289 02 Feb 23 peter 20
4289 02 Feb 23 peter 21   You should have received a copy of the GNU General Public License
4289 02 Feb 23 peter 22   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 32      This class is designed for calculation of likelihoods, but can be
4289 02 Feb 23 peter 33      used for other similar situations where values are non-negative
4289 02 Feb 23 peter 34      and risk going out of range. When calculating likelihoods it is
4289 02 Feb 23 peter 35      often more practical to calculate log L, as it avoids going out
4289 02 Feb 23 peter 36      of range. Multiplication simply becomes addition, but when the
4289 02 Feb 23 peter 37      calculation involved addition of likelihoods, the calculation log
4289 02 Feb 23 peter 38      L space becomes more complicated. This class is designed to
4289 02 Feb 23 peter 39      handle this case by storing log L internally and implementing
4289 02 Feb 23 peter 40      multiplication and addition operators.
4289 02 Feb 23 peter 41
4289 02 Feb 23 peter 42      \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 48        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 53        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 58        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 63        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 68        \brief less than operator
4289 02 Feb 23 peter 69
4289 02 Feb 23 peter 70        Other operators such as <= are implemented as combinations of
4289 02 Feb 23 peter 71        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 76        \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 81        \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 86        \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 91        \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 96        \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 101        \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 110      \brief exp function
4289 02 Feb 23 peter 111
4289 02 Feb 23 peter 112      \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 117      \return natural logarithm
4289 02 Feb 23 peter 118
4289 02 Feb 23 peter 119      \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 124      \brief multiplication operator
4289 02 Feb 23 peter 125
4289 02 Feb 23 peter 126      \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 131      \brief multiplication operator
4289 02 Feb 23 peter 132
4289 02 Feb 23 peter 133      \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 138      \brief division operator
4289 02 Feb 23 peter 139
4289 02 Feb 23 peter 140      \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 145      \brief division operator
4335 13 Apr 23 peter 146
4335 13 Apr 23 peter 147      \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