00001 #ifndef _BETA_BASEHAMILTONIAN_
00002
00003 #include <Eigen/Core>
00004 #include <RandomLib/Random.hpp>
00005
00006
00007 #define NDEBUG
00008
00009 using namespace Eigen;
00010 using RandomLib::Random;
00011
00080
00083
00091
00092 class baseHamiltonian
00093 {
00094
00095 public:
00096
00097 explicit baseHamiltonian(int dim);
00098 virtual ~baseHamiltonian() {};
00099
00101
00103
00104 double dim() { return mDim; }
00105
00106 virtual double T() = 0;
00107 virtual double V() = 0;
00108 virtual const VectorXd& gradV() = 0;
00109
00110 double H() { return T() + V(); }
00111
00112 VectorXd& q() { return mQ; }
00113 double q(int i) { return mQ(i); }
00114 VectorXd& p() { return mP; }
00115 double p(int i) { return mP(i); }
00116
00117 VectorXd& acceptQ() { return mAcceptQ; }
00118 VectorXd& rejectQ() { return mRejectQ; }
00119
00120 virtual void evolveQ(const double epsilon) = 0;
00121
00123
00125
00128 virtual void prepareEvolution() {};
00129
00131 virtual void beginEvolveP(const double epsilon) = 0;
00132
00134 virtual void finishEvolveP(const double epsilon) = 0;
00135
00138 virtual void bounceP(const VectorXd& normal) = 0;
00139
00143 virtual void sampleP(Random& random) = 0;
00144
00146 void saveCurrentPoint() { mStoreQ = mQ, mStoreP = mP; }
00147
00149 void restoreStoredPoint() { mQ = mStoreQ, mP = mStoreP; }
00150
00152 void saveAsRejectSample() { mRejectQ = mQ; }
00153
00155 void saveAsAcceptSample() { mAcceptQ = mQ; }
00156
00158 void sampleWindows(const bool accept) { accept ? mQ = mAcceptQ : mQ = mRejectQ; }
00159
00161 void setAverageDecay(const double alpha) { mMovingAlpha = alpha; }
00162
00163 void updateMetroStats(const bool b, const double a);
00164
00165 void clearHistory();
00166
00168
00170
00171 bool isNaN();
00172
00174 virtual bool supportViolated() { return false; }
00175
00177 virtual VectorXd& supportNormal() { return mN; }
00178
00180 virtual void checkEvolution(const double epsilon = 1e-6);
00181
00183 double acceptRate() { return mNumAccept / (mNumAccept + mNumReject); }
00184
00186 double movingAcceptRate() { return mAcceptRateBar; }
00187
00189 virtual void displayState();
00190
00191 protected:
00192
00193 const int mDim;
00194
00195 VectorXd mQ;
00196 VectorXd mStoreQ;
00197 VectorXd mRejectQ;
00198 VectorXd mAcceptQ;
00199
00200 VectorXd mP;
00201 VectorXd mStoreP;
00202
00203 VectorXd mN;
00204
00205 VectorXd mGradV;
00206
00207
00208 double mNumAccept;
00209 double mNumReject;
00210
00211 double mAcceptRateBar;
00212 double mEffN;
00213 double mMovingAlpha;
00214
00215 };
00216
00217 #define _BETA_BASEHAMILTONIAN_
00218 #endif