Commit 89304f89134dbb14228f0720c6c6608d1ccf52a6
1 parent
eac7d1c2
Add reoptimize_lm() method for TS computation. This avoids an unnecessary recomputation.
Still needs to be seen how the error computation can be switched off for recomputation.
Showing
2 changed files
with
56 additions
and
13 deletions
src/ctlike/ctlike.cpp
| ... | ... | @@ -274,16 +274,16 @@ void ctlike::run(void) |
| 274 | 274 | // Optionally perform TS computation |
| 275 | 275 | if (m_tscalc) { |
| 276 | 276 | |
| 277 | - // Store original models and max. likelihood | |
| 278 | - double logL_src = m_logL; | |
| 279 | - GModels* models_orig = m_obs.models().clone(); | |
| 277 | + // Store original maximum likelihood and models | |
| 278 | + double logL_src = m_logL; | |
| 279 | + GModels models_orig = m_obs.models(); | |
| 280 | 280 | |
| 281 | - // Store models whith free parameters | |
| 281 | + // Store models with free parameters | |
| 282 | 282 | std::vector<std::string> free_srcs; |
| 283 | 283 | GModels models = m_obs.models(); |
| 284 | 284 | for (int i = 0; i < models.size(); ++i) { |
| 285 | 285 | GModel* model = models[i]; |
| 286 | - for(int j = 0; j < model->size(); ++j) { | |
| 286 | + for (int j = 0; j < model->size(); ++j) { | |
| 287 | 287 | GModelPar par = model->at(j); |
| 288 | 288 | if (par.is_free()){ |
| 289 | 289 | free_srcs.push_back(model->name()); |
| ... | ... | @@ -296,18 +296,14 @@ void ctlike::run(void) |
| 296 | 296 | for (int i = 0; i < free_srcs.size(); ++i) { |
| 297 | 297 | models.remove(free_srcs[i]); |
| 298 | 298 | m_obs.models(models); |
| 299 | - optimize_lm(); | |
| 300 | - double logL_nosrc = m_logL; | |
| 299 | + double logL_nosrc = reoptimize_lm(); | |
| 301 | 300 | double ts = 2.0 * (logL_src-logL_nosrc); |
| 302 | - std::string name = free_srcs[i]; | |
| 303 | - (*models_orig)[name]->ts(ts); | |
| 304 | - models = *models_orig; | |
| 301 | + models_orig[free_srcs[i]]->ts(ts); | |
| 302 | + models = models_orig; | |
| 305 | 303 | } |
| 306 | 304 | |
| 307 | 305 | // Restore best fit values |
| 308 | - // TODO: store fit results before and avoid refitting | |
| 309 | - m_obs.models(*models_orig); | |
| 310 | - optimize_lm(); | |
| 306 | + m_obs.models(models_orig); | |
| 311 | 307 | |
| 312 | 308 | } // endif: did optional TS computation |
| 313 | 309 | |
| ... | ... | @@ -561,6 +557,52 @@ void ctlike::optimize_lm(void) |
| 561 | 557 | } |
| 562 | 558 | |
| 563 | 559 | |
| 560 | +/***********************************************************************//** | |
| 561 | + * @brief Re-optimize model parameters using Levenberg-Marquardt method | |
| 562 | + * for TS computation | |
| 563 | + ***************************************************************************/ | |
| 564 | +double ctlike::reoptimize_lm(void) | |
| 565 | +{ | |
| 566 | + // Allocate optimizer. The logger is only passed to the optimizer | |
| 567 | + // constructor if optimizer logging is requested. | |
| 568 | + GOptimizerLM* opt = (logTerse()) ? new GOptimizerLM(log) | |
| 569 | + : new GOptimizerLM(); | |
| 570 | + | |
| 571 | + // Set optimizer parameters | |
| 572 | + opt->max_iter(m_max_iter); | |
| 573 | + opt->max_stalls(m_max_stall); | |
| 574 | + | |
| 575 | + // Write Header for optimization and indent for optimizer logging | |
| 576 | + if (logTerse()) { | |
| 577 | + log << std::endl; | |
| 578 | + log.header1("Maximum likelihood re-optimisation"); | |
| 579 | + log.indent(1); | |
| 580 | + } | |
| 581 | + | |
| 582 | + // Perform LM optimization | |
| 583 | + m_obs.optimize(*opt); | |
| 584 | + | |
| 585 | + // Optionally refit | |
| 586 | + if (m_refit) { | |
| 587 | + m_obs.optimize(*opt); | |
| 588 | + } | |
| 589 | + | |
| 590 | + // Store maximum log likelihood value | |
| 591 | + double logL = -(opt->value()); | |
| 592 | + | |
| 593 | + // Write optimization results | |
| 594 | + log.indent(0); | |
| 595 | + if (logTerse()) { | |
| 596 | + log << std::endl; | |
| 597 | + log.header1("Maximum likelihood re-optimization results"); | |
| 598 | + log << *opt << std::endl; | |
| 599 | + } | |
| 600 | + | |
| 601 | + // Return | |
| 602 | + return (logL); | |
| 603 | +} | |
| 604 | + | |
| 605 | + | |
| 564 | 606 | /*========================================================================== |
| 565 | 607 | = = |
| 566 | 608 | = Private methods = | ... | ... |