Commit 89304f89134dbb14228f0720c6c6608d1ccf52a6

Authored by Jürgen Knödlseder
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.
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 =
... ...
src/ctlike/ctlike.hpp
... ... @@ -63,6 +63,7 @@ public:
63 63 GOptimizer* opt(void) { return m_opt; }
64 64 void get_parameters(void);
65 65 void optimize_lm(void);
  66 + double reoptimize_lm(void);
66 67  
67 68 protected:
68 69 // Protected methods
... ...