base/baseHamiltonian.h
00001 #ifndef _BETA_BASEHAMILTONIAN_
00002 
00003 #include <Eigen/Core>
00004 #include <RandomLib/Random.hpp>
00005 
00006 // Disable Eigen runtime checks
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         //                   Accessors                  //
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         //                   Mutators                   //
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         //              Auxiliary Functions             //
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         // Metropolis parameters
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
 All Classes Functions Variables