From b195c86abdfe9c87af1c12a2e3c046a576dfd2cd Mon Sep 17 00:00:00 2001
From: Oliver Sander <oliver.sander@tu-dresden.de>
Date: Sat, 18 Jan 2020 15:10:58 +0100
Subject: [PATCH] Collect some statistics about trust-region runs

Automatic testing of the RiemannianTrustRegionSolver class requires
to know what it did on the previous run.  This patch adds
some infrastructure to collect this information.
---
 dune/gfe/riemanniantrsolver.cc |  5 ++++-
 dune/gfe/riemanniantrsolver.hh | 16 +++++++++++++++-
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/dune/gfe/riemanniantrsolver.cc b/dune/gfe/riemanniantrsolver.cc
index 778effaa..bacafb19 100644
--- a/dune/gfe/riemanniantrsolver.cc
+++ b/dune/gfe/riemanniantrsolver.cc
@@ -351,7 +351,8 @@ void RiemannianTrustRegionSolver<Basis,TargetSpace>::solve()
                                                localMapper,
                                                0);
 #endif
-    for (int i=0; i<maxTrustRegionSteps_; i++) {
+    auto& i = statistics_.finalIteration;
+    for (i=0; i<maxTrustRegionSteps_; i++) {
 
 /*        std::cout << "current iterate:\n";
         for (size_t j=0; j<x_.size(); j++)
@@ -643,4 +644,6 @@ void RiemannianTrustRegionSolver<Basis,TargetSpace>::solve()
     // //////////////////////////////////////////////
     if (instrumented_)
         fclose(fp);
+
+    statistics_.finalEnergy = oldEnergy;
 }
diff --git a/dune/gfe/riemanniantrsolver.hh b/dune/gfe/riemanniantrsolver.hh
index add3d56d..7c91aac1 100644
--- a/dune/gfe/riemanniantrsolver.hh
+++ b/dune/gfe/riemanniantrsolver.hh
@@ -92,6 +92,16 @@ class RiemannianTrustRegionSolver
     typedef typename MapperFactory<typename Basis::GridView,Basis>::LocalMapper LocalMapper;
 #endif
 
+    /** \brief Records information about the last run of the RiemannianTrustRegionSolver
+     *
+     * This is used primarily for unit testing.
+     */
+    struct Statistics
+    {
+      std::size_t finalIteration;
+
+      field_type finalEnergy;
+    };
 
 public:
 
@@ -144,6 +154,8 @@ public:
 
     SolutionType getSol() const {return x_;}
 
+    const Statistics& getStatistics() const {return statistics_;}
+
 protected:
 
 #if HAVE_MPI
@@ -163,7 +175,7 @@ protected:
     Dune::FieldVector<double,blocksize> scaling_;
 
     /** \brief Maximum number of trust-region steps */
-    int maxTrustRegionSteps_;
+    std::size_t maxTrustRegionSteps_;
 
     /** \brief Maximum number of multigrid iterations */
     int innerIterations_;
@@ -195,6 +207,8 @@ protected:
     /** \brief If set to true we log convergence speed and other stuff */
     bool instrumented_;
 
+    /** \brief Store information about solver runs for unit testing */
+    Statistics statistics_;
 };
 
 #include "riemanniantrsolver.cc"
-- 
GitLab