BIE |
/home/weinberg/src/BIE/include/DifferentialEvolution.h00001 // This is really -*- C++ -*- 00002 00003 00004 #ifndef DifferentialEvolution_h 00005 #define DifferentialEvolution_h 00006 00007 #include "Serializable.h" 00008 00009 00010 #include <LikelihoodComputation.h> 00011 #include <MHWidth.h> 00012 #include <MHWidthOne.h> 00013 #include <Simulation.h> 00014 #include <Chain.h> 00015 00016 namespace BIE { 00017 00018 class MixturePrior; 00019 00020 //+ CLICLASS DifferentialEvolution SUPER Simulation 00096 class DifferentialEvolution : public Simulation 00097 { 00098 00099 public: 00100 00103 00105 enum Control { 00106 parallel, 00107 serial 00108 }; 00109 00111 enum Distrib { 00112 uniform, 00113 gaussian, 00114 cauchy, 00115 }; 00116 00117 00119 static Control cntrl; 00120 00122 static int minmc; 00123 00125 static int state_iter; 00126 00128 static double tiny; 00129 00131 static unsigned jfreq; 00132 00134 static bool linear; 00135 00137 static unsigned nfifo; 00138 00140 00141 //+ CLICONSTR int int int string BaseDataTree* Model* Integration* Converge* MixturePrior* LikelihoodComputation* MCAlgorithm* 00143 //+ CLICONSTR int int int string BaseDataTree* Model* Integration* Converge* MixturePrior* LikelihoodComputation* MCAlgorithm* Simulation* 00145 DifferentialEvolution(int max, int ndim, int number, string deinit, 00146 BaseDataTree* d, 00147 Model* m, 00148 Integration* i, 00149 Converge* c, 00150 MixturePrior* mp, 00151 LikelihoodComputation* l, 00152 MCAlgorithm* mca, 00153 Simulation *last=0); 00154 00156 virtual ~DifferentialEvolution(); 00157 00159 00160 00161 void NewState(int Mcur, vector<double>& w, vector< vector<double> >& p); 00163 void NewState(Chain& ch); 00165 void NewState(State& s); 00167 00169 virtual void Initialize(); 00170 00172 virtual void Reinitialize(MHWidth* width, MixturePrior *mp); 00173 00175 00176 //+ CLIMETHOD void SetControl int 00181 void SetControl(int); 00183 00186 00188 double GetValue(); 00189 00191 double GetPrior(); 00192 00194 double GetLikelihood(); 00195 00197 State GetState(); 00198 00200 virtual void ReportState(); 00201 00203 00204 virtual void LogState(string& logfile); 00205 virtual void LogState(int level, int iterno, string& outfile); 00207 00208 00210 void PrintState() { chains[0].PrintState(); } 00211 00212 00215 virtual void PrintStepDiagnostic(); 00216 00219 virtual void PrintStateDiagnostic(); 00220 00222 vector<double> GetStat(void); 00223 00224 //+ CLIMETHOD void NewNumber int 00226 void NewNumber(int); 00227 00228 //+ CLIMETHOD void NewGamma double 00230 void NewGamma(double p) { gamma0 = p; } 00231 00232 //+ CLIMETHOD void EnableLogging 00234 void EnableLogging() { caching = true; CreateChains(); } 00235 00236 //+ CLIMETHOD void SetLinearMapping bool 00238 void SetLinearMapping(bool b) { linear = b; } 00239 00240 //+ CLIMETHOD void SetJumpFreq int 00242 void SetJumpFreq(int n) { jfreq = n; } 00243 00245 void AdditionalInfo(); 00246 00248 00249 protected: 00250 00252 virtual void MCMethod(); 00253 00255 MHWidth * width; 00256 00259 double gamma0; 00260 00262 double gamma; 00263 00265 unsigned ncount; 00266 00268 bool caching; 00269 00271 vector<Random *> distrib; 00272 00274 00275 00276 unsigned int R0; 00278 vector<unsigned char> update_flag; 00280 vector<unsigned char> update_flag1; 00282 vector<unsigned long> nstat0; 00284 vector<unsigned long> nstat1; 00286 deque< vector<unsigned char> > arate; 00287 00289 int Ntot; 00291 vector<double> philower; 00293 vector<double> phiupper; 00295 00297 void CreateChains(); 00298 00300 void SampleNewState(int k); 00301 00303 void SampleNewStateParallel(int k); 00304 00306 void NewStateSerialInit(); 00307 00309 vector<unsigned short> fail; 00310 00312 void SampleNewStateSerial(int k); 00313 00315 void NewStateSerialStatus(); 00316 00318 Chain chainT; 00319 00321 void TrialState(int zero, int one, int two); 00322 00325 void InitializeSampler(string epsfile); 00326 00328 00329 int totalnum; 00330 int totaltry; 00332 00334 Uniform * unit; 00335 00337 00338 void ResetChainStats(); 00340 00342 bool chains_initialized; 00343 00345 double Logit(double x) { 00346 x = max<double>(tiny, min<double>(1.0-tiny, x)); 00347 return log(x/(1.0 - x)); 00348 } 00349 00351 double InverseLogit(double q) { return 1.0/(1.0+exp(-q)); } 00352 00354 double Map(double x, double a, double b) { 00355 x = (max<double>(a, min<double>(x, b)) - a)/(b - a); 00356 if (linear) 00357 return x; 00358 else 00359 return Logit(x); 00360 } 00361 00363 double InverseMap(double q, double a, double b) { 00364 if (linear) 00365 return a + (b - a)*q; 00366 else 00367 return a + (b - a)*InverseLogit(q); 00368 } 00369 00371 vector<double> _lower; 00372 00374 vector<double> _upper; 00375 00377 double _minw; 00378 00380 double _maxw; 00381 00382 private: 00383 // Save the RNG 00384 // 00385 template<class Archive> 00386 void post_save(Archive &ar, const unsigned int file_version) const { 00387 vector<Serializable*> s; 00388 s.push_back(BIEgen); 00389 ar << BOOST_SERIALIZATION_NVP(s); 00390 } 00391 // Reassign pointer to fiducial chain and restore the RNG 00392 // 00393 template<class Archive> 00394 void post_load(Archive &ar, const unsigned int file_version) { 00395 vector<Serializable *>s; 00396 ar >> BOOST_SERIALIZATION_NVP(s); 00397 BIEgen = dynamic_cast<BIEACG*>(s[0]); 00398 chfid = &chains[R0]; 00399 } 00400 00401 // AUTO GENERATED BY ../persistence/autopersist.py 00402 protected: 00403 DifferentialEvolution() {} 00404 private: 00405 friend class boost::serialization::access; 00406 BOOST_SERIALIZATION_SPLIT_MEMBER(); 00407 00408 template<class Archive> 00409 void save(Archive & ar, const unsigned int version) const { 00410 this->pre_save(ar, version); 00411 try { 00412 ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(Simulation); 00413 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00414 } 00415 try { 00416 ar << BOOST_SERIALIZATION_NVP(cntrl); 00417 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00418 } 00419 try { 00420 ar << BOOST_SERIALIZATION_NVP(minmc); 00421 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00422 } 00423 try { 00424 ar << BOOST_SERIALIZATION_NVP(state_iter); 00425 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00426 } 00427 try { 00428 ar << BOOST_SERIALIZATION_NVP(tiny); 00429 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00430 } 00431 try { 00432 ar << BOOST_SERIALIZATION_NVP(jfreq); 00433 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00434 } 00435 try { 00436 ar << BOOST_SERIALIZATION_NVP(linear); 00437 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00438 } 00439 try { 00440 ar << BOOST_SERIALIZATION_NVP(nfifo); 00441 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00442 } 00443 try { 00444 ar << BOOST_SERIALIZATION_NVP(width); 00445 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00446 } 00447 try { 00448 ar << BOOST_SERIALIZATION_NVP(gamma0); 00449 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00450 } 00451 try { 00452 ar << BOOST_SERIALIZATION_NVP(gamma); 00453 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00454 } 00455 try { 00456 ar << BOOST_SERIALIZATION_NVP(ncount); 00457 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00458 } 00459 try { 00460 ar << BOOST_SERIALIZATION_NVP(caching); 00461 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00462 } 00463 try { 00464 ar << BOOST_SERIALIZATION_NVP(distrib); 00465 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00466 } 00467 try { 00468 ar << BOOST_SERIALIZATION_NVP(R0); 00469 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00470 } 00471 try { 00472 ar << BOOST_SERIALIZATION_NVP(update_flag); 00473 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00474 } 00475 try { 00476 ar << BOOST_SERIALIZATION_NVP(update_flag1); 00477 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00478 } 00479 try { 00480 ar << BOOST_SERIALIZATION_NVP(nstat0); 00481 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00482 } 00483 try { 00484 ar << BOOST_SERIALIZATION_NVP(nstat1); 00485 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00486 } 00487 try { 00488 ar << BOOST_SERIALIZATION_NVP(arate); 00489 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00490 } 00491 try { 00492 ar << BOOST_SERIALIZATION_NVP(Ntot); 00493 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00494 } 00495 try { 00496 ar << BOOST_SERIALIZATION_NVP(philower); 00497 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00498 } 00499 try { 00500 ar << BOOST_SERIALIZATION_NVP(phiupper); 00501 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00502 } 00503 try { 00504 ar << BOOST_SERIALIZATION_NVP(totalnum); 00505 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00506 } 00507 try { 00508 ar << BOOST_SERIALIZATION_NVP(totaltry); 00509 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00510 } 00511 try { 00512 ar << BOOST_SERIALIZATION_NVP(unit); 00513 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00514 } 00515 try { 00516 ar << BOOST_SERIALIZATION_NVP(chains_initialized); 00517 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00518 } 00519 try { 00520 ar << BOOST_SERIALIZATION_NVP(_lower); 00521 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00522 } 00523 try { 00524 ar << BOOST_SERIALIZATION_NVP(_upper); 00525 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00526 } 00527 try { 00528 ar << BOOST_SERIALIZATION_NVP(_minw); 00529 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00530 } 00531 try { 00532 ar << BOOST_SERIALIZATION_NVP(_maxw); 00533 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00534 } 00535 this->post_save(ar, version); 00536 } 00537 00538 template<class Archive> 00539 void load(Archive & ar, const unsigned int version) { 00540 this->pre_load(ar, version); 00541 try { 00542 ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(Simulation); 00543 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00544 } 00545 try { 00546 ar >> BOOST_SERIALIZATION_NVP(cntrl); 00547 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00548 } 00549 try { 00550 ar >> BOOST_SERIALIZATION_NVP(minmc); 00551 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00552 } 00553 try { 00554 ar >> BOOST_SERIALIZATION_NVP(state_iter); 00555 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00556 } 00557 try { 00558 ar >> BOOST_SERIALIZATION_NVP(tiny); 00559 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00560 } 00561 try { 00562 ar >> BOOST_SERIALIZATION_NVP(jfreq); 00563 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00564 } 00565 try { 00566 ar >> BOOST_SERIALIZATION_NVP(linear); 00567 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00568 } 00569 try { 00570 ar >> BOOST_SERIALIZATION_NVP(nfifo); 00571 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00572 } 00573 try { 00574 ar >> BOOST_SERIALIZATION_NVP(width); 00575 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00576 } 00577 try { 00578 ar >> BOOST_SERIALIZATION_NVP(gamma0); 00579 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00580 } 00581 try { 00582 ar >> BOOST_SERIALIZATION_NVP(gamma); 00583 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00584 } 00585 try { 00586 ar >> BOOST_SERIALIZATION_NVP(ncount); 00587 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00588 } 00589 try { 00590 ar >> BOOST_SERIALIZATION_NVP(caching); 00591 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00592 } 00593 try { 00594 ar >> BOOST_SERIALIZATION_NVP(distrib); 00595 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00596 } 00597 try { 00598 ar >> BOOST_SERIALIZATION_NVP(R0); 00599 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00600 } 00601 try { 00602 ar >> BOOST_SERIALIZATION_NVP(update_flag); 00603 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00604 } 00605 try { 00606 ar >> BOOST_SERIALIZATION_NVP(update_flag1); 00607 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00608 } 00609 try { 00610 ar >> BOOST_SERIALIZATION_NVP(nstat0); 00611 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00612 } 00613 try { 00614 ar >> BOOST_SERIALIZATION_NVP(nstat1); 00615 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00616 } 00617 try { 00618 ar >> BOOST_SERIALIZATION_NVP(arate); 00619 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00620 } 00621 try { 00622 ar >> BOOST_SERIALIZATION_NVP(Ntot); 00623 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00624 } 00625 try { 00626 ar >> BOOST_SERIALIZATION_NVP(philower); 00627 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00628 } 00629 try { 00630 ar >> BOOST_SERIALIZATION_NVP(phiupper); 00631 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00632 } 00633 try { 00634 ar >> BOOST_SERIALIZATION_NVP(totalnum); 00635 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00636 } 00637 try { 00638 ar >> BOOST_SERIALIZATION_NVP(totaltry); 00639 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00640 } 00641 try { 00642 ar >> BOOST_SERIALIZATION_NVP(unit); 00643 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00644 } 00645 try { 00646 ar >> BOOST_SERIALIZATION_NVP(chains_initialized); 00647 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00648 } 00649 try { 00650 ar >> BOOST_SERIALIZATION_NVP(_lower); 00651 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00652 } 00653 try { 00654 ar >> BOOST_SERIALIZATION_NVP(_upper); 00655 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00656 } 00657 try { 00658 ar >> BOOST_SERIALIZATION_NVP(_minw); 00659 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00660 } 00661 try { 00662 ar >> BOOST_SERIALIZATION_NVP(_maxw); 00663 BIE_CATCH_BOOST_SERIALIZATION_EXCEPTION; 00664 } 00665 this->post_load(ar, version); 00666 } 00667 00668 00669 }; 00670 00671 } 00672 BIE_CLASS_TYPE_INFO(BIE::DifferentialEvolution) 00673 BIE_CLASS_EXPORT_KEY(BIE::DifferentialEvolution) 00674 #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
|