diff --git a/include/GObservations.hpp b/include/GObservations.hpp index c7f5185..6dd2cef 100644 --- a/include/GObservations.hpp +++ b/include/GObservations.hpp @@ -125,6 +125,7 @@ public: void models(const std::string& filename); const GModels& models(void) const; void optimize(GOptimizer& opt); + void errors(GOptimizer& opt); void eval(void); double logL(void) const; double npred(void) const; diff --git a/include/GOptimizer.hpp b/include/GOptimizer.hpp index 892b964..73a236a 100644 --- a/include/GOptimizer.hpp +++ b/include/GOptimizer.hpp @@ -67,6 +67,7 @@ public: virtual GOptimizer* clone(void) const = 0; virtual std::string classname(void) const = 0; virtual void optimize(GOptimizerFunction& fct, GOptimizerPars& pars) = 0; + virtual void errors(GOptimizerFunction& fct, GOptimizerPars& pars) = 0; virtual double value(void) const = 0; virtual int status(void) const = 0; virtual int iter(void) const = 0; diff --git a/include/GOptimizerLM.hpp b/include/GOptimizerLM.hpp index 09a86e7..c81ae92 100644 --- a/include/GOptimizerLM.hpp +++ b/include/GOptimizerLM.hpp @@ -66,6 +66,7 @@ public: virtual GOptimizerLM* clone(void) const; virtual std::string classname(void) const; virtual void optimize(GOptimizerFunction& fct, GOptimizerPars& pars); + void errors(GOptimizerFunction& fct, GOptimizerPars& pars); virtual double value(void) const { return m_value; } //!< @brief Return function value virtual int status(void) const { return m_status; } //!< @brief Return optimization status virtual int iter(void) const { return m_iter; } //!< @brief Return number of iterations @@ -94,7 +95,6 @@ protected: void copy_members(const GOptimizerLM& opt); void free_members(void); void iteration(GOptimizerFunction& fct, GOptimizerPars& pars); - void errors(GOptimizerFunction& fct, GOptimizerPars& pars); double step_size(const GVector& grad, const GOptimizerPars& pars); // Protected members diff --git a/src/obs/GObservations.cpp b/src/obs/GObservations.cpp index 54f1f93..245a19f 100644 --- a/src/obs/GObservations.cpp +++ b/src/obs/GObservations.cpp @@ -722,6 +722,27 @@ void GObservations::optimize(GOptimizer& opt) /***********************************************************************//** + * @brief Computes parameter errors using optimizer + * + * @param[in] opt Optimizer. + * + * Calculates the errors of the free parameters of the models by using + * the optimizer that has been provided by the @p opt argument. + ***************************************************************************/ +void GObservations::errors(GOptimizer& opt) +{ + // Extract optimizer parameter container from model container + GOptimizerPars pars = m_models.pars(); + + // Optimize model parameters + opt.errors(m_fct, pars); + + // Return + return; +} + + +/***********************************************************************//** * @brief Evaluate function * * Evaluates the likelihood funtion at the actual set of parameters. diff --git a/src/opt/GOptimizerLM.cpp b/src/opt/GOptimizerLM.cpp index 0e362a9..2c87228 100644 --- a/src/opt/GOptimizerLM.cpp +++ b/src/opt/GOptimizerLM.cpp @@ -409,9 +409,6 @@ void GOptimizerLM::optimize(GOptimizerFunction& fct, GOptimizerPars& pars) } } // endfor: iterations - - // Compute parameter uncertainties - errors(fct, pars); // Free now all temporarily frozen parameters so that the resulting // model has the same attributes as the initial model @@ -432,7 +429,12 @@ void GOptimizerLM::optimize(GOptimizerFunction& fct, GOptimizerPars& pars) // ... otherwise just execute final step else { - errors(fct, pars); + + // Evaluate function + fct.eval(pars); + + // Save function value + m_value = fct.value(); } // Return