From 093c3102e6bb4e3b35d13d9be3f19c4eda876d9e Mon Sep 17 00:00:00 2001
From: Elias Pipping <elias.pipping@fu-berlin.de>
Date: Thu, 9 Jan 2014 14:51:11 +0100
Subject: [PATCH] [Cleanup] Refactor minimisation

---
 dune/tectonic/minimisation.hh | 26 +++++++++++---------------
 1 file changed, 11 insertions(+), 15 deletions(-)

diff --git a/dune/tectonic/minimisation.hh b/dune/tectonic/minimisation.hh
index 389a0a14..71edb09b 100644
--- a/dune/tectonic/minimisation.hh
+++ b/dune/tectonic/minimisation.hh
@@ -12,22 +12,16 @@
 #include "mydirectionalconvexfunction.hh"
 
 template <class Functional>
-void descentMinimisation(Functional const &J,
-                         typename Functional::LocalVector &x,
-                         typename Functional::LocalVector const &v,
-                         Bisection const &bisection) {
-  using LocalVector = typename Functional::LocalVector;
-  using LocalNonlinearity = typename Functional::Nonlinearity;
-
-  MyDirectionalConvexFunction<LocalNonlinearity> const JRest(
+double lineSearch(Functional const &J,
+                  typename Functional::LocalVector const &x,
+                  typename Functional::LocalVector const &v,
+                  Bisection const &bisection) {
+  MyDirectionalConvexFunction<typename Functional::Nonlinearity> const JRest(
       computeDirectionalA(J.A, v), computeDirectionalb(J.A, J.b, x, v), *J.phi,
       x, v);
-  // }}}
 
   int count;
-  double const stepsize = bisection.minimize(JRest, 0.0, 0.0, count);
-
-  Arithmetic::addProduct(x, stepsize, v);
+  return bisection.minimize(JRest, 0.0, 0.0, count);
 }
 
 template <class Functional>
@@ -38,12 +32,14 @@ void minimise(Functional const &J, typename Functional::LocalVector &x,
   for (size_t step = 0; step < steps; ++step) {
     LocalVector v;
     J.gradient(x, v);
-    if (v.two_norm() == 0.0)
-      return;
 
+    double const vnorm = v.two_norm();
+    if (vnorm <= 0.0)
+      return;
     v *= -1;
 
-    descentMinimisation(J, x, v, bisection);
+    double const alpha = lineSearch(J, x, v, bisection);
+    Arithmetic::addProduct(x, alpha, v);
   }
 }
 #endif
-- 
GitLab