From 0516dd8dda2cf4d8863b9dbdd066da76c22f855f Mon Sep 17 00:00:00 2001
From: Sergi Hernandez Juan <shernand@iri.upc.edu>
Date: Wed, 27 Jan 2021 09:18:35 +0100
Subject: [PATCH] Added a flag to indicate if the convergence went beyond the
 specified limits.

---
 include/gradient.h |  2 +-
 src/gradient.cpp   | 10 +++++-----
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/include/gradient.h b/include/gradient.h
index 28ac290..df93c2c 100644
--- a/include/gradient.h
+++ b/include/gradient.h
@@ -28,7 +28,7 @@ class CGradient
     void get_coord_constraints(double &max,double &min);
     void set_function(boost::function<double (double)> p_function);
     void set_function_der(boost::function<double (double)> p_function);
-    bool compute(double max_func_error,unsigned int max_iter,double start_point,bool max=true);
+    bool compute(double max_func_error,unsigned int max_iter,double start_point,bool &beyond_limits,bool max=true);
     double get_value(void);
     double get_coordinate(void);
     ~CGradient();
diff --git a/src/gradient.cpp b/src/gradient.cpp
index 3301bb4..dd2e5cd 100644
--- a/src/gradient.cpp
+++ b/src/gradient.cpp
@@ -47,13 +47,13 @@ void CGradient::set_function_der(boost::function<double (double)> p_function)
   this->p_function_der=p_function;
 }
 
-bool CGradient::compute(double max_func_error,unsigned int max_iter,double start_point,bool max)
+bool CGradient::compute(double max_func_error,unsigned int max_iter,double start_point,bool &beyond_limits,bool max)
 {
   unsigned int iteration=0;
   double gamma=1.0,func_value,func_der_value,prev_func_value,prev_func_der_value;
   double coord,prev_coord,coord_inc;
-  bool beyond_limits=false;
 
+  beyond_limits=false;
   coord=start_point;
   func_value=this->p_function(coord);
   func_der_value=this->p_function_der(coord);
@@ -68,7 +68,7 @@ bool CGradient::compute(double max_func_error,unsigned int max_iter,double start
       coord+=coord_inc;
     else
       coord-=coord_inc;
-    if(coord>this->max_coord)
+    if((coord-this->max_coord)>max_func_error)
     {
       coord=this->max_coord;
       this->coordinate=coord;
@@ -76,7 +76,7 @@ bool CGradient::compute(double max_func_error,unsigned int max_iter,double start
       beyond_limits=true;
       break;
     }
-    else if(coord<this->min_coord)
+    else if((coord-this->min_coord)<-max_func_error)
     {
       coord=this->min_coord;
       this->coordinate=coord;
@@ -93,7 +93,7 @@ bool CGradient::compute(double max_func_error,unsigned int max_iter,double start
   }while((fabs(func_value-prev_func_value)>max_func_error || fabs(coord-prev_coord)>0.001) && iteration<max_iter);
   this->coordinate=coord;
   this->value=func_value;
-  if(iteration==max_iter || beyond_limits)
+  if(iteration==max_iter)
     return false;
   else
     return true;
-- 
GitLab