Commit 2c3a446b8683039e4bd850c3df722a74d3c25345

Authored by Jürgen Knödlseder
1 parent 280c07a9

Relpace pointer to optimizer by optimizer member (avoids memory leak when reassi…

…gning the old best optimizer result).
src/cterror/cterror.cpp
@@ -233,16 +233,16 @@ void cterror::run(void) @@ -233,16 +233,16 @@ void cterror::run(void)
233 } 233 }
234 234
235 // Optimize and save best log-likelihood 235 // Optimize and save best log-likelihood
236 - m_obs.optimize(*m_opt);  
237 - m_obs.errors(*m_opt); 236 + m_obs.optimize(m_opt);
  237 + m_obs.errors(m_opt);
238 m_best_logL = m_obs.logL(); 238 m_best_logL = m_obs.logL();
239 239
240 // Store optimizer for later recovery 240 // Store optimizer for later recovery
241 - GOptimizerLM best_opt = *m_opt; 241 + GOptimizerLM best_opt = m_opt;
242 242
243 // Write optimised model into logger 243 // Write optimised model into logger
244 if (logTerse()) { 244 if (logTerse()) {
245 - log << *m_opt << std::endl; 245 + log << m_opt << std::endl;
246 log << gammalib::parformat("Maximum log likelihood"); 246 log << gammalib::parformat("Maximum log likelihood");
247 log << gammalib::str(m_best_logL,3) << std::endl; 247 log << gammalib::str(m_best_logL,3) << std::endl;
248 log << m_obs.models() << std::endl; 248 log << m_obs.models() << std::endl;
@@ -353,7 +353,7 @@ void cterror::run(void) @@ -353,7 +353,7 @@ void cterror::run(void)
353 } // endif: source model exists 353 } // endif: source model exists
354 354
355 // Recover optimizer 355 // Recover optimizer
356 - *m_opt = best_opt; 356 + m_opt = best_opt;
357 357
358 // Return 358 // Return
359 return; 359 return;
@@ -406,20 +406,14 @@ void cterror::init_members(void) @@ -406,20 +406,14 @@ void cterror::init_members(void)
406 406
407 // Initialise protected members 407 // Initialise protected members
408 m_obs.clear(); 408 m_obs.clear();
  409 + m_opt.clear();
409 m_dlogL = 0.0; 410 m_dlogL = 0.0;
410 m_best_logL = 0.0; 411 m_best_logL = 0.0;
411 m_model_par = NULL; 412 m_model_par = NULL;
412 - m_opt = NULL;  
413 -  
414 - // Allocate LM optimizer  
415 - GOptimizerLM* opt = new GOptimizerLM();  
416 413
417 // Set optimizer parameters 414 // Set optimizer parameters
418 - opt->max_iter(m_max_iter);  
419 - opt->max_stalls(10);  
420 -  
421 - // Set optimizer pointer  
422 - m_opt = opt; 415 + m_opt.max_iter(m_max_iter);
  416 + m_opt.max_stalls(10);
423 417
424 // Return 418 // Return
425 return; 419 return;
@@ -443,7 +437,7 @@ void cterror::copy_members(const cterror&amp; app) @@ -443,7 +437,7 @@ void cterror::copy_members(const cterror&amp; app)
443 m_obs = app.m_obs; 437 m_obs = app.m_obs;
444 m_dlogL = app.m_dlogL; 438 m_dlogL = app.m_dlogL;
445 m_best_logL = app.m_best_logL; 439 m_best_logL = app.m_best_logL;
446 - m_opt = app.m_opt->clone(); 440 + m_opt = app.m_opt;
447 m_model_par = NULL; 441 m_model_par = NULL;
448 442
449 // Return 443 // Return
@@ -666,7 +660,7 @@ double cterror::evaluate(const double&amp; value) @@ -666,7 +660,7 @@ double cterror::evaluate(const double&amp; value)
666 m_model_par->fix(); 660 m_model_par->fix();
667 661
668 // Re-optimize 662 // Re-optimize
669 - m_obs.optimize(*m_opt); 663 + m_obs.optimize(m_opt);
670 664
671 // Retrieve likelihood 665 // Retrieve likelihood
672 logL = m_obs.logL(); 666 logL = m_obs.logL();
src/cterror/cterror.hpp
@@ -84,7 +84,7 @@ protected: @@ -84,7 +84,7 @@ protected:
84 double m_dlogL; //!< Likelihood difference for upper limit computation 84 double m_dlogL; //!< Likelihood difference for upper limit computation
85 GModelPar* m_model_par; //!< Pointer to model parameter 85 GModelPar* m_model_par; //!< Pointer to model parameter
86 double m_best_logL; //!< Best fit log likelihood of given model 86 double m_best_logL; //!< Best fit log likelihood of given model
87 - GOptimizerLM* m_opt; //!< Optimizer 87 + GOptimizerLM m_opt; //!< Optimizer
88 88
89 }; 89 };
90 90
@@ -92,7 +92,7 @@ protected: @@ -92,7 +92,7 @@ protected:
92 /***********************************************************************//** 92 /***********************************************************************//**
93 * @brief Return observation container 93 * @brief Return observation container
94 * 94 *
95 - * @return Reference to observation container 95 + * @return Reference to observation container.
96 ***************************************************************************/ 96 ***************************************************************************/
97 inline 97 inline
98 const GObservations& cterror::obs(void) const 98 const GObservations& cterror::obs(void) const
@@ -100,15 +100,16 @@ const GObservations&amp; cterror::obs(void) const @@ -100,15 +100,16 @@ const GObservations&amp; cterror::obs(void) const
100 return m_obs; 100 return m_obs;
101 } 101 }
102 102
  103 +
103 /***********************************************************************//** 104 /***********************************************************************//**
104 * @brief Return optimizer 105 * @brief Return optimizer
105 * 106 *
106 - * @return Pointer to optimizer 107 + * @return Pointer to optimizer.
107 ***************************************************************************/ 108 ***************************************************************************/
108 inline 109 inline
109 const GOptimizer* cterror::opt(void) const 110 const GOptimizer* cterror::opt(void) const
110 { 111 {
111 - return m_opt; 112 + return &m_opt;
112 } 113 }
113 114
114 #endif /* CTERROR_HPP */ 115 #endif /* CTERROR_HPP */
src/ctulimit/ctulimit.cpp
@@ -247,16 +247,16 @@ void ctulimit::run(void) @@ -247,16 +247,16 @@ void ctulimit::run(void)
247 } 247 }
248 248
249 // Optimize and save best log-likelihood 249 // Optimize and save best log-likelihood
250 - m_obs.optimize(*m_opt);  
251 - m_obs.errors(*m_opt); 250 + m_obs.optimize(m_opt);
  251 + m_obs.errors(m_opt);
252 m_best_logL = m_obs.logL(); 252 m_best_logL = m_obs.logL();
253 253
254 // Store optimizer for later recovery 254 // Store optimizer for later recovery
255 - best_opt = *m_opt; 255 + best_opt = m_opt;
256 256
257 // Write optimised model into logger 257 // Write optimised model into logger
258 if (logTerse()) { 258 if (logTerse()) {
259 - log << *m_opt << std::endl; 259 + log << m_opt << std::endl;
260 log << gammalib::parformat("Maximum log likelihood"); 260 log << gammalib::parformat("Maximum log likelihood");
261 log << gammalib::str(m_best_logL,3) << std::endl; 261 log << gammalib::str(m_best_logL,3) << std::endl;
262 log << m_obs.models() << std::endl; 262 log << m_obs.models() << std::endl;
@@ -341,7 +341,7 @@ void ctulimit::run(void) @@ -341,7 +341,7 @@ void ctulimit::run(void)
341 m_obs.models(models_orig); 341 m_obs.models(models_orig);
342 342
343 // Recover optimizer 343 // Recover optimizer
344 - *m_opt = best_opt; 344 + m_opt = best_opt;
345 345
346 // Return 346 // Return
347 return; 347 return;
@@ -408,6 +408,7 @@ void ctulimit::init_members(void) @@ -408,6 +408,7 @@ void ctulimit::init_members(void)
408 408
409 // Initialise protected members 409 // Initialise protected members
410 m_obs.clear(); 410 m_obs.clear();
  411 + m_opt.clear();
411 m_dlogL = 0.0; 412 m_dlogL = 0.0;
412 m_skymodel = NULL; 413 m_skymodel = NULL;
413 m_model_par = NULL; 414 m_model_par = NULL;
@@ -415,17 +416,10 @@ void ctulimit::init_members(void) @@ -415,17 +416,10 @@ void ctulimit::init_members(void)
415 m_flux_ulimit = 0.0; 416 m_flux_ulimit = 0.0;
416 m_diff_ulimit = 0.0; 417 m_diff_ulimit = 0.0;
417 m_eflux_ulimit = 0.0; 418 m_eflux_ulimit = 0.0;
418 - m_opt = NULL;  
419 -  
420 - // Allocate LM optimizer  
421 - GOptimizerLM* opt = new GOptimizerLM();  
422 419
423 // Set optimizer parameters 420 // Set optimizer parameters
424 - opt->max_iter(m_max_iter);  
425 - opt->max_stalls(10);  
426 -  
427 - // Set optimizer pointer  
428 - m_opt = opt; 421 + m_opt.max_iter(m_max_iter);
  422 + m_opt.max_stalls(10);
429 423
430 // Return 424 // Return
431 return; 425 return;
@@ -458,7 +452,7 @@ void ctulimit::copy_members(const ctulimit&amp; app) @@ -458,7 +452,7 @@ void ctulimit::copy_members(const ctulimit&amp; app)
458 m_diff_ulimit = app.m_diff_ulimit; 452 m_diff_ulimit = app.m_diff_ulimit;
459 m_flux_ulimit = app.m_flux_ulimit; 453 m_flux_ulimit = app.m_flux_ulimit;
460 m_eflux_ulimit = app.m_eflux_ulimit; 454 m_eflux_ulimit = app.m_eflux_ulimit;
461 - m_opt = app.m_opt->clone(); 455 + m_opt = app.m_opt;
462 456
463 // Extract model parameter 457 // Extract model parameter
464 get_model_parameter(); 458 get_model_parameter();
@@ -697,7 +691,7 @@ double ctulimit::evaluate(const double&amp; value) @@ -697,7 +691,7 @@ double ctulimit::evaluate(const double&amp; value)
697 m_model_par->fix(); 691 m_model_par->fix();
698 692
699 // Re-optimize 693 // Re-optimize
700 - m_obs.optimize(*m_opt); 694 + m_obs.optimize(m_opt);
701 695
702 // Retrieve likelihood 696 // Retrieve likelihood
703 logL = m_obs.logL(); 697 logL = m_obs.logL();
src/ctulimit/ctulimit.hpp
@@ -103,14 +103,14 @@ protected: @@ -103,14 +103,14 @@ protected:
103 double m_diff_ulimit; //!< Differential upper limit value 103 double m_diff_ulimit; //!< Differential upper limit value
104 double m_flux_ulimit; //!< Flux upper limit value 104 double m_flux_ulimit; //!< Flux upper limit value
105 double m_eflux_ulimit; //!< Energy flux upper limits 105 double m_eflux_ulimit; //!< Energy flux upper limits
106 - GOptimizerLM* m_opt; //!< Optimizer 106 + GOptimizerLM m_opt; //!< Optimizer
107 }; 107 };
108 108
109 109
110 /***********************************************************************//** 110 /***********************************************************************//**
111 * @brief Return observation container 111 * @brief Return observation container
112 * 112 *
113 - * @return Reference to observation container 113 + * @return Reference to observation container.
114 ***************************************************************************/ 114 ***************************************************************************/
115 inline 115 inline
116 const GObservations& ctulimit::obs(void) const 116 const GObservations& ctulimit::obs(void) const
@@ -118,10 +118,23 @@ const GObservations&amp; ctulimit::obs(void) const @@ -118,10 +118,23 @@ const GObservations&amp; ctulimit::obs(void) const
118 return m_obs; 118 return m_obs;
119 } 119 }
120 120
  121 +
  122 +/***********************************************************************//**
  123 + * @brief Return optimizer
  124 + *
  125 + * @return Pointer to optimizer.
  126 + ***************************************************************************/
  127 +inline
  128 +const GOptimizer* ctulimit::opt(void) const
  129 +{
  130 + return &m_opt;
  131 +}
  132 +
  133 +
121 /***********************************************************************//** 134 /***********************************************************************//**
122 * @brief Return differential upper limit 135 * @brief Return differential upper limit
123 * 136 *
124 - * @return differential upper limit 137 + * @return Differential upper flux limit.
125 ***************************************************************************/ 138 ***************************************************************************/
126 inline 139 inline
127 const double& ctulimit::diff_ulimit(void) const 140 const double& ctulimit::diff_ulimit(void) const
@@ -129,10 +142,11 @@ const double&amp; ctulimit::diff_ulimit(void) const @@ -129,10 +142,11 @@ const double&amp; ctulimit::diff_ulimit(void) const
129 return m_diff_ulimit; 142 return m_diff_ulimit;
130 } 143 }
131 144
  145 +
132 /***********************************************************************//** 146 /***********************************************************************//**
133 * @brief Return flux upper limit 147 * @brief Return flux upper limit
134 * 148 *
135 - * @return flux upper limit 149 + * @return Upper flux limit.
136 ***************************************************************************/ 150 ***************************************************************************/
137 inline 151 inline
138 const double& ctulimit::flux_ulimit(void) const 152 const double& ctulimit::flux_ulimit(void) const
@@ -140,10 +154,11 @@ const double&amp; ctulimit::flux_ulimit(void) const @@ -140,10 +154,11 @@ const double&amp; ctulimit::flux_ulimit(void) const
140 return m_flux_ulimit; 154 return m_flux_ulimit;
141 } 155 }
142 156
  157 +
143 /***********************************************************************//** 158 /***********************************************************************//**
144 * @brief return energy flux upper limit 159 * @brief return energy flux upper limit
145 * 160 *
146 - * @return energy flux upper limits 161 + * @return Upper energy flux limit.
147 ***************************************************************************/ 162 ***************************************************************************/
148 inline 163 inline
149 const double& ctulimit::eflux_ulimit(void) const 164 const double& ctulimit::eflux_ulimit(void) const