MeanWalker
|
00001 /* 00002 00003 This file is a part of MeanWalker, a library which provides utilities to 00004 sample from probability distributions using methods like the 00005 Metropilis-Hastings algorithm and Goodman-Weare algorithm. 00006 00007 Copyright (C) 2012 Jori Liesenborgs 00008 00009 Contact: jori.liesenborgs@gmail.com 00010 00011 This program is free software; you can redistribute it and/or modify 00012 it under the terms of the GNU General Public License as published by 00013 the Free Software Foundation; either version 2 of the License, or 00014 (at your option) any later version. 00015 00016 This program is distributed in the hope that it will be useful, 00017 but WITHOUT ANY WARRANTY; without even the implied warranty of 00018 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00019 GNU General Public License for more details. 00020 00021 You should have received a copy of the GNU General Public License 00022 along with this program; if not, write to the Free Software 00023 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 00024 00025 */ 00026 00031 #ifndef MEANWALKER_METROPOLISWALKER_H 00032 00033 #define MEANWALKER_METROPOLISWALKER_H 00034 00035 #include "meanwalkerconfig.h" 00036 #include "walker.h" 00037 #include <errut/errorbase.h> 00038 #include <vector> 00039 00040 namespace meanwalker 00041 { 00042 00043 class RandomNumberGenerator; 00044 00055 class MEANWALKER_IMPORTEXPORT MetropolisWalker : public Walker 00056 { 00057 public: 00059 MetropolisWalker(RandomNumberGenerator *pRndGen); 00060 ~MetropolisWalker(); 00061 00075 bool init(Function *pProbFunction, const double *pMinCoords, const double *pMaxCoords, const double *pStartCoords, 00076 bool keepInside = true); 00077 00079 void setNewStartCoordinates(double *pStartCoords); 00080 00081 void walk(size_t numSteps); 00082 const double *getBestCoordinates() const { return &(m_bestCoords[0]); } 00083 protected: 00087 virtual void stepToNewCoords(const double *pCurCoords, double *pNewCoords); 00088 private: 00089 std::vector<double> m_minCoords, m_maxCoords; 00090 std::vector<double> m_coords, m_tryCoords; 00091 std::vector<double> m_stepScale; 00092 std::vector<double> m_bestCoords; 00093 bool m_keepInside; 00094 }; 00095 00096 } // end namespace 00097 00098 #endif // MEANWALKER_METROPOLISWALKER_H