yat/statistics/Smoother.h

Code
Comments
Other
Rev Date Author Line
1310 15 May 08 peter 1 #ifndef _theplu_yat_statistics_smoother_
1310 15 May 08 peter 2 #define _theplu_yat_statistics_smoother_
1310 15 May 08 peter 3
1310 15 May 08 peter 4 // $Id$
1310 15 May 08 peter 5
1310 15 May 08 peter 6 /*
2119 12 Dec 09 peter 7   Copyright (C) 2008 Jari Häkkinen, Peter Johansson
3550 03 Jan 17 peter 8   Copyright (C) 2009, 2010, 2016 Peter Johansson
1310 15 May 08 peter 9
1469 02 Sep 08 peter 10   This file is part of the yat library, http://dev.thep.lu.se/yat
1310 15 May 08 peter 11
1310 15 May 08 peter 12   The yat library is free software; you can redistribute it and/or
1310 15 May 08 peter 13   modify it under the terms of the GNU General Public License as
1486 09 Sep 08 jari 14   published by the Free Software Foundation; either version 3 of the
1310 15 May 08 peter 15   License, or (at your option) any later version.
1310 15 May 08 peter 16
1310 15 May 08 peter 17   The yat library is distributed in the hope that it will be useful,
1310 15 May 08 peter 18   but WITHOUT ANY WARRANTY; without even the implied warranty of
1310 15 May 08 peter 19   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1310 15 May 08 peter 20   General Public License for more details.
1310 15 May 08 peter 21
1310 15 May 08 peter 22   You should have received a copy of the GNU General Public License
1487 10 Sep 08 jari 23   along with yat. If not, see <http://www.gnu.org/licenses/>.
1310 15 May 08 peter 24 */
1310 15 May 08 peter 25
1310 15 May 08 peter 26
3514 22 Jul 16 peter 27 #include "yat/utility/concept_check.h"
1310 15 May 08 peter 28 #include "yat/utility/iterator_traits.h"
1310 15 May 08 peter 29
2202 21 Feb 10 peter 30 #include <boost/concept_check.hpp>
3514 22 Jul 16 peter 31 #include <boost/iterator/iterator_concepts.hpp>
2202 21 Feb 10 peter 32
1310 15 May 08 peter 33 #include <vector>
1310 15 May 08 peter 34
1310 15 May 08 peter 35 namespace theplu {
1310 15 May 08 peter 36 namespace yat {
3513 22 Jul 16 peter 37   namespace regression {
3513 22 Jul 16 peter 38     class Kernel;
1310 15 May 08 peter 39   }
1310 15 May 08 peter 40 namespace statistics {
1310 15 May 08 peter 41
1310 15 May 08 peter 42   /**
1310 15 May 08 peter 43      @brief Estimating a distribution in a smooth fashion
1339 06 Jun 08 peter 44
1339 06 Jun 08 peter 45      \since New in yat 0.5
1310 15 May 08 peter 46   */
1310 15 May 08 peter 47   class Smoother
1310 15 May 08 peter 48   {
1310 15 May 08 peter 49   public:
1310 15 May 08 peter 50     /**
1310 15 May 08 peter 51        Constructor taking vector describing for which values
1310 15 May 08 peter 52        distribution should be estimated.
1310 15 May 08 peter 53
1310 15 May 08 peter 54        \note if \a values are not sorted the behavior is undefined
1310 15 May 08 peter 55      */
3513 22 Jul 16 peter 56     Smoother(const regression::Kernel&, double width,
1310 15 May 08 peter 57              const std::vector<double>& values);
1310 15 May 08 peter 58
1310 15 May 08 peter 59     /**
1310 15 May 08 peter 60        Constructor creating observation points equally distributed
1310 15 May 08 peter 61        between \a xmin and \a xmax.
1310 15 May 08 peter 62
1310 15 May 08 peter 63        \param kernel doing the smoothing
1310 15 May 08 peter 64        \param width
1310 15 May 08 peter 65        \param xmin smallest observation point
1310 15 May 08 peter 66        \param xmax largest observation point
1310 15 May 08 peter 67        \param n number of observation points
1310 15 May 08 peter 68      */
3513 22 Jul 16 peter 69     Smoother(const regression::Kernel& kernel, double width,
1310 15 May 08 peter 70              double xmin, double xmax, size_t n);
1310 15 May 08 peter 71
1310 15 May 08 peter 72     /**
1310 15 May 08 peter 73        \brief Add a data point.
1310 15 May 08 peter 74     */
1310 15 May 08 peter 75     void add(double x, double weight=1.0);
1310 15 May 08 peter 76
1310 15 May 08 peter 77     /**
1311 16 May 08 peter 78        \brief estimated values
1310 15 May 08 peter 79      */
1310 15 May 08 peter 80     const std::vector<double>& density(void) const;
1310 15 May 08 peter 81
1310 15 May 08 peter 82     /**
2039 26 Aug 09 peter 83        multiply each value with \a factor
3513 22 Jul 16 peter 84
2039 26 Aug 09 peter 85        \since New in yat 0.6
2039 26 Aug 09 peter 86      */
2039 26 Aug 09 peter 87     void rescale(double factor);
2039 26 Aug 09 peter 88
2039 26 Aug 09 peter 89     /**
1311 16 May 08 peter 90        \brief reset density to zero
1310 15 May 08 peter 91      */
1310 15 May 08 peter 92     void reset(void);
1310 15 May 08 peter 93
1310 15 May 08 peter 94     /**
1311 16 May 08 peter 95        \brief values in which distribution is estimated
1310 15 May 08 peter 96      */
1310 15 May 08 peter 97     const std::vector<double>& value(void) const;
1310 15 May 08 peter 98
1310 15 May 08 peter 99   private:
1310 15 May 08 peter 100     std::vector<double> density_;
1310 15 May 08 peter 101     const regression::Kernel& kernel_;
1310 15 May 08 peter 102     double width_;
1310 15 May 08 peter 103     std::vector<double> x_;
1310 15 May 08 peter 104   };
1310 15 May 08 peter 105
1310 15 May 08 peter 106   /**
1310 15 May 08 peter 107      Add a range [first, last) of values to Smoother.
1886 31 Mar 09 peter 108
3514 22 Jul 16 peter 109      Type Requirements:
3514 22 Jul 16 peter 110      - \c Iterator must be a \ref concept_data_iterator
3514 22 Jul 16 peter 111      - \c Iterator must be a \single_pass_iterator
3514 22 Jul 16 peter 112
1886 31 Mar 09 peter 113      \relates Smoother
1310 15 May 08 peter 114    */
3514 22 Jul 16 peter 115   template<typename Iterator>
3514 22 Jul 16 peter 116   void add(Smoother& h, Iterator first, Iterator last)
1310 15 May 08 peter 117   {
3514 22 Jul 16 peter 118     BOOST_CONCEPT_ASSERT((utility::DataIteratorConcept<Iterator>));
3514 22 Jul 16 peter 119     BOOST_CONCEPT_ASSERT((boost_concepts::SinglePassIterator<Iterator>));
3514 22 Jul 16 peter 120     utility::iterator_traits<Iterator> traits;
1310 15 May 08 peter 121     while (first!=last) {
2202 21 Feb 10 peter 122       h.add(traits.data(first), traits.weight(first));
1310 15 May 08 peter 123       ++first;
1310 15 May 08 peter 124     }
1310 15 May 08 peter 125   }
1310 15 May 08 peter 126
1310 15 May 08 peter 127   /**
1310 15 May 08 peter 128      The Smoother output operator
1886 31 Mar 09 peter 129
1886 31 Mar 09 peter 130      \relates Smoother
1310 15 May 08 peter 131   */
1310 15 May 08 peter 132   std::ostream& operator<<(std::ostream& s,const Smoother&);
1310 15 May 08 peter 133
1310 15 May 08 peter 134 }}} // of namespace statistics, yat, and theplu
1310 15 May 08 peter 135
1310 15 May 08 peter 136 #endif