From 87521c32079a1221088ab6c3db8239eafd56c221 Mon Sep 17 00:00:00 2001
From: Martyn Gigg <martyn.gigg@stfc.ac.uk>
Date: Mon, 24 Jun 2013 14:22:26 +0100
Subject: [PATCH] Added more detail to Fit at information log level. Refs #7199

* The value of the cost function is printed after each iteration
* The Covariance & Hessian matrix are output at the end of the fit
---
 .../MantidCurveFitting/CostFuncLeastSquares.h |  7 +++-
 .../CurveFitting/src/CostFuncLeastSquares.cpp | 41 +++++++++++++++++++
 .../Mantid/Framework/CurveFitting/src/Fit.cpp |  6 ++-
 3 files changed, 51 insertions(+), 3 deletions(-)

diff --git a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CostFuncLeastSquares.h b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CostFuncLeastSquares.h
index 730063e7e75..5909b3553ab 100644
--- a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CostFuncLeastSquares.h
+++ b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CostFuncLeastSquares.h
@@ -10,6 +10,10 @@
 
 namespace Mantid
 {
+namespace Kernel
+{
+  class Logger;
+}
 namespace CurveFitting
 {
   class SeqDomain;
@@ -44,7 +48,7 @@ class DLLExport CostFuncLeastSquares : public CostFuncFitting
 {
 public:
   /// Constructor
-  CostFuncLeastSquares():CostFuncFitting(),m_value(0),m_pushed(false){}
+  CostFuncLeastSquares();
   /// Virtual destructor
   virtual ~CostFuncLeastSquares() {}
 
@@ -103,6 +107,7 @@ private:
   friend class SeqDomain;
   friend class ParDomain;
 
+  Kernel::Logger & m_log;
 };
 
 } // namespace CurveFitting
diff --git a/Code/Mantid/Framework/CurveFitting/src/CostFuncLeastSquares.cpp b/Code/Mantid/Framework/CurveFitting/src/CostFuncLeastSquares.cpp
index 64b56b67923..d746a2ce151 100644
--- a/Code/Mantid/Framework/CurveFitting/src/CostFuncLeastSquares.cpp
+++ b/Code/Mantid/Framework/CurveFitting/src/CostFuncLeastSquares.cpp
@@ -8,6 +8,8 @@
 #include "MantidAPI/CompositeDomain.h"
 #include "MantidAPI/FunctionValues.h"
 
+#include <iomanip>
+
 namespace
 {
   const bool debug = false;
@@ -20,6 +22,12 @@ namespace CurveFitting
 
 DECLARE_COSTFUNCTION(CostFuncLeastSquares,Least squares)
 
+/**
+ * Constructor
+ */
+CostFuncLeastSquares::CostFuncLeastSquares() : CostFuncFitting(),m_value(0),m_pushed(false),
+  m_log(Kernel::Logger::get("CostFuncLeastSquares")) {}
+
 /** Calculate value of cost function
  * @return :: The value of the function
  */
@@ -452,8 +460,41 @@ void CostFuncLeastSquares::calActiveCovarianceMatrix(GSLMatrix& covar, double ep
   {
     valDerivHessian();
   }
+  if(m_log.is(Kernel::Logger::Priority::PRIO_INFORMATION))
+  {
+    m_log.information() << "== Hessian (H) ==\n";
+    std::ios::fmtflags prevState = m_log.information().flags();
+    m_log.information() << std::left << std::fixed;
+    for(size_t i = 0; i < m_hessian.size1(); ++i)
+    {
+      for(size_t j = 0; j < m_hessian.size2(); ++j)
+      {
+        m_log.information() << std::setw(10);
+        m_log.information() << m_hessian.get(i,j) << "  ";
+      }
+      m_log.information() << "\n";
+    }
+    m_log.information().flags(prevState);
+  }
   covar = m_hessian;
   covar.invert();
+  if(m_log.is(Kernel::Logger::Priority::PRIO_INFORMATION))
+  {
+    m_log.information() << "== Covariance matrix (H^-1) ==\n";
+    std::ios::fmtflags prevState = m_log.information().flags();
+    m_log.information() << std::left << std::fixed;
+    for(size_t i = 0; i < covar.size1(); ++i)
+    {
+      for(size_t j = 0; j < covar.size2(); ++j)
+      {
+        m_log.information() << std::setw(10);
+        m_log.information() << covar.get(i,j) << "  ";
+      }
+      m_log.information() << "\n";
+    }
+    m_log.information().flags(prevState);
+  }
+
 }
 
 } // namespace CurveFitting
diff --git a/Code/Mantid/Framework/CurveFitting/src/Fit.cpp b/Code/Mantid/Framework/CurveFitting/src/Fit.cpp
index 68e617c8b8b..d89d55335e5 100644
--- a/Code/Mantid/Framework/CurveFitting/src/Fit.cpp
+++ b/Code/Mantid/Framework/CurveFitting/src/Fit.cpp
@@ -611,8 +611,6 @@ namespace CurveFitting
     size_t iter = 0;
     bool success = false;
     std::string errorString;
-    //double costFuncVal = 0;
-    //do
     g_log.debug("Starting minimizer iteration\n");
     while (static_cast<int>(iter) < maxIterations)
     {
@@ -633,6 +631,10 @@ namespace CurveFitting
       }
       prog.report();
       m_function->iterationFinished();
+      if(g_log.is(Kernel::Logger::Priority::PRIO_INFORMATION))
+      {
+        g_log.information() << "Iteration " << iter << ", cost function = " << minimizer->costFunctionVal() << "\n";
+      }
     }
     g_log.information() << "Number of minimizer iterations=" << iter << "\n";
 
-- 
GitLab