yat/statistics/Smoother.cc

Code
Comments
Other
Rev Date Author Line
1310 15 May 08 peter 1 // $Id$
1310 15 May 08 peter 2
1310 15 May 08 peter 3 /*
2119 12 Dec 09 peter 4   Copyright (C) 2008 Jari Häkkinen, Peter Johansson
2919 19 Dec 12 peter 5   Copyright (C) 2009, 2010, 2012 Peter Johansson
1310 15 May 08 peter 6
1469 02 Sep 08 peter 7   This file is part of the yat library, http://dev.thep.lu.se/yat
1310 15 May 08 peter 8
1310 15 May 08 peter 9   The yat library is free software; you can redistribute it and/or
1310 15 May 08 peter 10   modify it under the terms of the GNU General Public License as
1486 09 Sep 08 jari 11   published by the Free Software Foundation; either version 3 of the
1310 15 May 08 peter 12   License, or (at your option) any later version.
1310 15 May 08 peter 13
1310 15 May 08 peter 14   The yat library is distributed in the hope that it will be useful,
1310 15 May 08 peter 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
1310 15 May 08 peter 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1310 15 May 08 peter 17   General Public License for more details.
1310 15 May 08 peter 18
1310 15 May 08 peter 19   You should have received a copy of the GNU General Public License
1487 10 Sep 08 jari 20   along with yat. If not, see <http://www.gnu.org/licenses/>.
1310 15 May 08 peter 21 */
1310 15 May 08 peter 22
2881 18 Nov 12 peter 23 #include <config.h>
2881 18 Nov 12 peter 24
1310 15 May 08 peter 25 #include "Smoother.h"
1310 15 May 08 peter 26 #include "yat/regression/Kernel.h"
1310 15 May 08 peter 27
1310 15 May 08 peter 28 #include <algorithm>
1310 15 May 08 peter 29 #include <cassert>
1310 15 May 08 peter 30 #include <ostream>
1310 15 May 08 peter 31
1310 15 May 08 peter 32 namespace theplu {
1310 15 May 08 peter 33 namespace yat {
1310 15 May 08 peter 34 namespace statistics {
1310 15 May 08 peter 35
1310 15 May 08 peter 36   Smoother::Smoother(const regression::Kernel& kernel, double width,
1310 15 May 08 peter 37                      const std::vector<double>& values)
1310 15 May 08 peter 38     : kernel_(kernel), width_(width), x_(values)
1310 15 May 08 peter 39   {
1310 15 May 08 peter 40     density_.resize(values.size(), 0.0);
1310 15 May 08 peter 41     assert(density_.size()==x_.size());
1310 15 May 08 peter 42   }
1310 15 May 08 peter 43
1310 15 May 08 peter 44   Smoother::Smoother(const regression::Kernel& kernel, double width,
1310 15 May 08 peter 45                      double min, double max, size_t n)
1310 15 May 08 peter 46     : density_(std::vector<double>(n)), kernel_(kernel), width_(width)
1310 15 May 08 peter 47   {
2202 21 Feb 10 peter 48     assert(n>1);
1310 15 May 08 peter 49     x_.reserve(n);
2202 21 Feb 10 peter 50     double step_size = (max-min)/static_cast<double>(n-1);
1310 15 May 08 peter 51     for (double x=min; x_.size()<n; x+=step_size)
1310 15 May 08 peter 52       x_.push_back(x);
1310 15 May 08 peter 53     assert(x_.back()==max);
1310 15 May 08 peter 54     assert(density_.size()==x_.size());
1310 15 May 08 peter 55   }
1310 15 May 08 peter 56
1310 15 May 08 peter 57
1310 15 May 08 peter 58   void Smoother::add(const double x, const double w)
1310 15 May 08 peter 59   {
1310 15 May 08 peter 60     if (w==0)
1310 15 May 08 peter 61       return;
1310 15 May 08 peter 62     // Peter, we should probably do something clever here to avoid x+=0
1310 15 May 08 peter 63     for (size_t i=0; i<x_.size(); ++i)
1310 15 May 08 peter 64       density_[i] += w*kernel_( (x-x_[i])/width_);
1310 15 May 08 peter 65   }
1310 15 May 08 peter 66
4200 19 Aug 22 peter 67
1310 15 May 08 peter 68   const std::vector<double>& Smoother::density(void) const
1310 15 May 08 peter 69   {
1310 15 May 08 peter 70     return density_;
1310 15 May 08 peter 71   }
1310 15 May 08 peter 72
1310 15 May 08 peter 73
2039 26 Aug 09 peter 74   void Smoother::rescale(double factor)
2039 26 Aug 09 peter 75   {
2039 26 Aug 09 peter 76     for (size_t i=0; i<x_.size(); ++i)
2039 26 Aug 09 peter 77       x_[i] *= factor;
2039 26 Aug 09 peter 78   }
2039 26 Aug 09 peter 79
2039 26 Aug 09 peter 80
1310 15 May 08 peter 81   void Smoother::reset(void)
1310 15 May 08 peter 82   {
1310 15 May 08 peter 83     std::fill(density_.begin(), density_.end(), 0.0);
1310 15 May 08 peter 84   }
1310 15 May 08 peter 85
1310 15 May 08 peter 86
1310 15 May 08 peter 87   const std::vector<double>& Smoother::value(void) const
1310 15 May 08 peter 88   {
1310 15 May 08 peter 89     return x_;
1310 15 May 08 peter 90   }
1310 15 May 08 peter 91
1310 15 May 08 peter 92
1310 15 May 08 peter 93   std::ostream& operator<<(std::ostream& os,const Smoother& smoother)
1310 15 May 08 peter 94   {
1310 15 May 08 peter 95     os << "# column 1: x\n"
1310 15 May 08 peter 96        << "# column 2: estimated density\n";
1310 15 May 08 peter 97
1310 15 May 08 peter 98     for (size_t i=0; i<smoother.value().size(); ++i) {
1310 15 May 08 peter 99       os << smoother.value()[i] << "\t";
1310 15 May 08 peter 100       os << smoother.density()[i] << "\n";
1310 15 May 08 peter 101     }
1310 15 May 08 peter 102
1310 15 May 08 peter 103     return os;
1310 15 May 08 peter 104   }
1310 15 May 08 peter 105
1310 15 May 08 peter 106 }}} // of namespace statistics, yat, and theplu