BIE |
/home/weinberg/src/BIE/include/GelmanRubinConverge.h00001 // This is really -*- C++ -*- 00002 00003 00004 #ifndef GelmanRubinConverge_h 00005 #define GelmanRubinConverge_h 00006 00007 #include <mpi.h> 00008 00009 #include <deque> 00010 00011 #include <Ensemble.h> 00012 #include <Converge.h> 00013 00014 extern double inv_student_t_1sided(double alpha, double df); 00015 00016 #include "Serializable.h" 00017 00018 00019 namespace BIE { 00020 00021 //+ CLICLASS GelmanRubinConverge SUPER Converge 00079 class GelmanRubinConverge : public Converge 00080 { 00081 private: 00082 int count; 00083 int next; 00084 int maxit; 00085 int nconv; 00086 int nburn; 00087 Ensemble* _dist; 00088 string _id; 00089 // For notational convenience 00090 typedef vector<double> dvec; 00091 // Double-ended queue of vectors for parameters 00092 deque< vector<State> > data; 00093 // Double-ended queue for posterior probability 00094 deque< vector<double> > prob; 00095 // Currently valid chains 00096 vector<unsigned char> chain_mask; 00097 00098 // Looks for abberant chains using Grubbs' test 00099 int ComputeMask(); 00100 00101 // Keep count of instances for debugging 00102 static unsigned ninstance; 00103 00104 public: 00107 00108 static unsigned ngood; 00109 00111 static unsigned nskip; 00112 00114 static double alpha; 00115 00117 static int maxoutlier; 00118 00120 static int noutlier; 00121 00123 static double rtol; 00124 00126 static bool verbose; 00127 00129 static double poffset; 00130 00132 static bool debug; 00133 00135 static int maxkp; 00136 00138 00139 //+ CLICONSTR int Ensemble* string 00155 GelmanRubinConverge(int m, Ensemble* d, string id); 00156 00158 virtual GelmanRubinConverge* New(int m, Ensemble* d, string id); 00159 00161 virtual bool Converged(); 00162 00164 virtual bool IsParallel() { return true; } 00165 00166 //+ CLIMETHOD void setNskip int 00168 void setNskip(int n) { nskip = n; next = count + nskip; } 00169 00170 //+ CLIMETHOD void setNoutlier int 00172 void setNoutlier(int n) { noutlier = n; } 00173 00174 //+ CLIMETHOD void setMaxout int 00176 void setMaxout(int n) { maxoutlier = n; } 00177 00178 //+ CLIMETHOD void setNgood int 00180 void setNgood(int n) { ngood = n; nburn = -1; next = count + nskip; } 00181 00182 //+ CLIMETHOD void Quiet 00184 void Quiet() { verbose = false; } 00185 00186 //+ CLIMETHOD void setPoffset double 00195 void setPoffset(double z) { poffset = z; } 00196 00198 int ConvergedIndex() { return nconv; } 00199 00200 //+ CLIMETHOD int BurnIn 00202 int BurnIn() { 00203 MPI_Bcast(&nconv, 1, MPI_INT, 0, MPI_COMM_WORLD); 00204 return nconv; 00205 } 00206 00207 //+ CLIMETHOD void setRhatMax double 00209 void setRhatMax(double r) { rtol = r; } 00210 00211 //+ CLIMETHOD void setAlpha double 00213 void setAlpha(double a) { alpha = a; } 00214 00215 //+ CLIMETHOD void setMaxK int32 00217 static void setMaxK(int n) { maxkp = n; } 00218 00220 virtual bool AccumData(vector<double>& values, vector<State>& states); 00221 00223 virtual bool GetLast(vector<double>& values, vector<State>& states) 00224 { 00225 if (prob.size()>0) { 00226 values = prob.back(); 00227 states = data.back(); 00228 return true; 00229 } else { 00230 return false; 00231 } 00232 } 00233 00236 void ComputeDistribution() { 00237 _dist->ComputeDistribution(); 00238 } 00239 00242 double PDF(State& x) {return _dist->PDF(x);} 00243 double logPDF(State& x) {return _dist->logPDF(x);} 00244 vector<double> lower(void) {return _dist->lower();} 00245 vector<double> upper(void) {return _dist->upper();} 00246 vector<double> Mean() {return _dist->Mean();} 00247 vector<double> StdDev() {return _dist->StdDev();} 00248 vector<double> Moments(int m) {return _dist->Moments(m);} 00249 vector<double> Sample() {return _dist->Sample();} 00251 00253 GelmanRubinConverge* New() { 00254 GelmanRubinConverge *p = new GelmanRubinConverge(maxit, _dist, _id); 00255 return p; 00256 } 00257 00258 // AUTO GENERATED BY ../persistence/autopersist.py 00259 protected: 00260 GelmanRubinConverge() {} 00261 private: 00262 friend class boost::serialization::access; 00263 template<class Archive> 00264 void serialize(Archive & ar, const unsigned int version) { 00265 this->pre_serialize(ar, version); 00266 try { 00267 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Converge); 00268 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00269 } 00270 try { 00271 ar & BOOST_SERIALIZATION_NVP(count); 00272 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00273 } 00274 try { 00275 ar & BOOST_SERIALIZATION_NVP(next); 00276 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00277 } 00278 try { 00279 ar & BOOST_SERIALIZATION_NVP(maxit); 00280 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00281 } 00282 try { 00283 ar & BOOST_SERIALIZATION_NVP(nconv); 00284 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00285 } 00286 try { 00287 ar & BOOST_SERIALIZATION_NVP(nburn); 00288 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00289 } 00290 try { 00291 ar & BOOST_SERIALIZATION_NVP(_dist); 00292 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00293 } 00294 try { 00295 ar & BOOST_SERIALIZATION_NVP(_id); 00296 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00297 } 00298 try { 00299 ar & BOOST_SERIALIZATION_NVP(data); 00300 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00301 } 00302 try { 00303 ar & BOOST_SERIALIZATION_NVP(prob); 00304 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00305 } 00306 try { 00307 ar & BOOST_SERIALIZATION_NVP(chain_mask); 00308 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00309 } 00310 try { 00311 ar & BOOST_SERIALIZATION_NVP(ninstance); 00312 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00313 } 00314 try { 00315 ar & BOOST_SERIALIZATION_NVP(ngood); 00316 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00317 } 00318 try { 00319 ar & BOOST_SERIALIZATION_NVP(nskip); 00320 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00321 } 00322 try { 00323 ar & BOOST_SERIALIZATION_NVP(alpha); 00324 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00325 } 00326 try { 00327 ar & BOOST_SERIALIZATION_NVP(maxoutlier); 00328 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00329 } 00330 try { 00331 ar & BOOST_SERIALIZATION_NVP(noutlier); 00332 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00333 } 00334 try { 00335 ar & BOOST_SERIALIZATION_NVP(rtol); 00336 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00337 } 00338 try { 00339 ar & BOOST_SERIALIZATION_NVP(verbose); 00340 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00341 } 00342 try { 00343 ar & BOOST_SERIALIZATION_NVP(poffset); 00344 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00345 } 00346 try { 00347 ar & BOOST_SERIALIZATION_NVP(debug); 00348 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00349 } 00350 try { 00351 ar & BOOST_SERIALIZATION_NVP(maxkp); 00352 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00353 } 00354 this->post_serialize(ar, version); 00355 } 00356 00357 00358 }; 00359 } 00360 00361 BIE_CLASS_TYPE_INFO(BIE::GelmanRubinConverge) 00362 BIE_CLASS_EXPORT_KEY(BIE::GelmanRubinConverge) 00363 #endif Send suggestions, questions, and feedback to WEINBERG at ASTRO dot UMASS dot EDU. Documentation generated at Fri Mar 26 00:35:10 2010 by
|