* Bug #9789 fixed - Optimization: optim printing its termination status 56/12656/3
Paul BIGNIER [Wed, 25 Sep 2013 08:28:30 +0000 (10:28 +0200)]
To know the termination status of optim, users had to get the output flag or
set imp>=1 as input argument.

Now, optim prints its termination status even when "imp" is not given
(imp=0 by default).

The nonreg test was inspired from the duplicate bug #9692.

Change-Id: I5f4f7bfda3faa892791c9bdce9157357c5bf47ae

14 files changed:
scilab/CHANGES_5.5.X
scilab/modules/optimization/help/en_US/optim.xml
scilab/modules/optimization/sci_gateway/fortran/sci_f_optim.f
scilab/modules/optimization/tests/nonreg_tests/bug_3161.dia.ref
scilab/modules/optimization/tests/nonreg_tests/bug_4433.dia.ref
scilab/modules/optimization/tests/nonreg_tests/bug_4638.dia.ref
scilab/modules/optimization/tests/nonreg_tests/bug_9208.dia.ref
scilab/modules/optimization/tests/nonreg_tests/bug_9789.dia.ref [new file with mode: 0644]
scilab/modules/optimization/tests/nonreg_tests/bug_9789.tst [new file with mode: 0644]
scilab/modules/optimization/tests/unit_tests/optim_costflist.dia.ref
scilab/modules/optimization/tests/unit_tests/optim_matrix.dia.ref
scilab/modules/optimization/tests/unit_tests/optim_sourcec.dia.ref
scilab/modules/optimization/tests/unit_tests/optim_sourcefortran1.dia.ref
scilab/modules/optimization/tests/unit_tests/optim_sourcefortran2.dia.ref

index 48147c4..b32a37b 100644 (file)
@@ -456,6 +456,8 @@ Bug Fixes
 
 * Bug #9780 fixed - gmres solver did not run with complex systems.
 
+* Bug #9789 fixed - optim() now prints termination information whatever the "imp" input argument is.
+
 * Bug #9821 fixed - getrelativefilename did not manage matrix of strings.
 
 * Bug #9851 fixed - Error message occurred because of a cut-off frequency of 0.25Hz with irr.
index 70bc21f..b1e8707 100644 (file)
                 <term>"imp=iflag"</term>
                 <listitem>
                     <para>named argument used to set the trace mode (default
-                        <literal>imp=0</literal>, which prints no messages). If <varname>imp</varname>
+                        <literal>imp=0</literal>, which only prints termination status). If <varname>imp</varname>
                         is greater or equal to 1, more information are printed, depending on the
                         algorithm chosen. More precisely:
                     </para>
index e0e7540..3120617 100644 (file)
@@ -1023,30 +1023,28 @@ c     commentaires finaux
       endif
 
  360  continue
-      if(imp.ne.0) then
-         if(indopt.eq.1) then
-            call writebufscioptim(buf,epsg)
-            call msgs(12,0)
-         elseif(indopt.eq.2) then
-            call writebufscioptim(buf,epsg)
-            call msgs(13,0)
-         elseif(indopt.eq.3)  then
-            call msgs(14,0)
-         elseif(indopt.eq.4)  then
-            call msgs(15,0)
-         elseif(indopt.eq.5)  then
-            call msgs(16,0)
-         elseif(indopt.eq.6)  then
-            call msgs(17,0)
-         elseif(indopt.eq.7)  then
-            call msgs(18,0)
-         elseif(indopt.eq.8)  then
-            call msgs(19,0)
-         elseif(indopt.eq.9)  then
-            call msgs(20,0)
-         elseif(indopt.ge.10)  then
-            call msgs(21,0)
-         endif
+      if(indopt.eq.1) then
+         call writebufscioptim(buf,epsg)
+         call msgs(12,0)
+      elseif(indopt.eq.2) then
+         call writebufscioptim(buf,epsg)
+         call msgs(13,0)
+      elseif(indopt.eq.3)  then
+         call msgs(14,0)
+      elseif(indopt.eq.4)  then
+         call msgs(15,0)
+      elseif(indopt.eq.5)  then
+         call msgs(16,0)
+      elseif(indopt.eq.6)  then
+         call msgs(17,0)
+      elseif(indopt.eq.7)  then
+         call msgs(18,0)
+      elseif(indopt.eq.8)  then
+         call msgs(19,0)
+      elseif(indopt.eq.9)  then
+         call msgs(20,0)
+      elseif(indopt.ge.10)  then
+         call msgs(21,0)
       endif
       return
       end
index c12804d..d44f62e 100644 (file)
@@ -4,6 +4,7 @@
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
+// <-- CLI SHELL MODE -->
 // <-- Non-regression test for bug 3161 -->
 //
 // <-- Bugzilla URL -->
@@ -26,5 +27,7 @@ p0=[3;5;10];
 p = [];
 err = [];
 [p,err]=datafit(G,Z,p0);
+Optim stops: maximum number of calls to f is reached.
+
 if p == [] then bugmes();quit;end;
 if err == [] then bugmes();quit;end;
index 72a3659..a98855f 100644 (file)
@@ -4,6 +4,7 @@
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
+// <-- CLI SHELL MODE -->
 // <-- Non-regression test for bug 4433 -->
 //
 // <-- Bugzilla URL -->
@@ -16,5 +17,25 @@ for i=1:10
   deff('[y,dy,imp] = testfunc(x,imp)','y=sum(x.^2); dy = 2*x;');
   x0=40*ones(100,1);
   [f,xo]=optim(testfunc,x0,algo='gc',imp=0);
-end
+end  
+Norm of projected gradient lower than   0.0000000D+00.
+
+Norm of projected gradient lower than   0.0000000D+00.
+
+Norm of projected gradient lower than   0.0000000D+00.
+
+Norm of projected gradient lower than   0.0000000D+00.
+
+Norm of projected gradient lower than   0.0000000D+00.
+
+Norm of projected gradient lower than   0.0000000D+00.
+
+Norm of projected gradient lower than   0.0000000D+00.
+
+Norm of projected gradient lower than   0.0000000D+00.
+
+Norm of projected gradient lower than   0.0000000D+00.
+
+Norm of projected gradient lower than   0.0000000D+00.
+
 // =============================================================================
index e942d1c..ee1793a 100644 (file)
@@ -4,6 +4,7 @@
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
+// <-- CLI SHELL MODE -->
 // <-- Non-regression test for bug 4638 -->
 //
 // <-- Bugzilla URL -->
@@ -242,10 +243,9 @@ function [y, dy, ind] = optim_test(x,ind)
   Ainv = inv(A);
 endfunction
 [f_opt, x_opt] = optim(optim_test,ones(10,1));
-hellofromoptim_test
-
-hellofromoptim_test
-
-hellofromoptim_test
+hello from optim_test
+hello from optim_test
+hello from optim_test
+Norm of projected gradient lower than   0.0000000D+00.
 
 // =============================================================================
index 870c244..87ff92c 100644 (file)
@@ -29,10 +29,16 @@ function [f, g, ind] = costfunction(x, ind, a, b, c, d)
 endfunction
 costf = list ( costfunction , a , b , c, d );
 [fopt, xopt, w, g, iters, evals, err] = optim ( costf , x0 );
+Norm of projected gradient lower than   0.0000000D+00.
+
 assert_checkequal([iters evals err], [10 11 1]);
 [fopt, xopt, w, g, iters, evals, err] = optim ( costf , x0 , "ar",nap=5 );
+Optim stops: maximum number of calls to f is reached.
+
 assert_checkequal([iters evals err], [4 5 4]);
 [fopt, xopt, w, g, iters, evals, err] = optim ( costf , x0 , "ar",nap=100,iter=5 );
+Optim stops: maximum number of iterations is reached.
+
 assert_checkequal([iters evals err], [6 7 5]);
 // Example 2
 x0 = [-1.2 1.0];
@@ -44,8 +50,14 @@ function [f, g, ind] = rosenbrockCost2(x, ind)
     g = derivative ( rosenbrock , x.' , order = 4 );
 endfunction
 [fopt, xopt, w, g, iters, evals, err] = optim ( rosenbrockCost2 , x0 );
+End of optimization.
+
 assert_checkequal([iters evals err], [37 50 9]);
 [fopt, xopt, w, g, iters, evals, err] = optim ( rosenbrockCost2 , x0 , "ar",nap=10 );
+Optim stops: maximum number of calls to f is reached.
+
 assert_checkequal([iters evals err], [8 10 4]);
 [fopt, xopt, w, g, iters, evals, err] = optim ( rosenbrockCost2 , x0 , "ar",nap=100,iter=10 );
+Optim stops: maximum number of iterations is reached.
+
 assert_checkequal([iters evals err], [11 14 5]);
diff --git a/scilab/modules/optimization/tests/nonreg_tests/bug_9789.dia.ref b/scilab/modules/optimization/tests/nonreg_tests/bug_9789.dia.ref
new file mode 100644 (file)
index 0000000..faa90fc
--- /dev/null
@@ -0,0 +1,38 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 9789 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=9789
+//
+// <-- Short Description -->
+// optim prints its termination status even when "imp" is not given,
+// so the user is informed of the final state of the optimization.
+//
+function [ f , g , ind ] = woodFG ( x , ind )
+    if ind == 2 | ind == 3 | ind == 4 then
+        A = x(2)-x(1)^2
+        B = x(4)-x(3)^2
+    end
+    if ind == 2 | ind == 4 then
+        f = 100*A^2+(1-x(1))^2+90*B^2+(1-x(3))^2+...
+        10.1*((x(2)-1)^2+(x(4)-1)^2)+19.8*(x(2)-1)*(x(4)-1)
+    end
+    if ind == 3 | ind == 4 then
+        g(1) = -2*(200*x(1)*A+1.-x(1))
+        g(2) = 2*(100*A+10.1*(x(2)-1)+9.9*(x(4)-1))
+        g(3) = -2*(180*x(3)*B+1.-x(3))
+        g(4) = 2*(90*B+10.1*(x(4)-1)+9.9*(x(2)-1))
+    end
+endfunction
+x0 = [-3 -1 -3 -1];
+[ fopt , xopt ] = optim ( woodFG , x0 );
+Optim stops: maximum number of calls to f is reached.
+
diff --git a/scilab/modules/optimization/tests/nonreg_tests/bug_9789.tst b/scilab/modules/optimization/tests/nonreg_tests/bug_9789.tst
new file mode 100644 (file)
index 0000000..cb93f38
--- /dev/null
@@ -0,0 +1,38 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 9789 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=9789
+//
+// <-- Short Description -->
+// optim prints its termination status even when "imp" is not given,
+// so the user is informed of the final state of the optimization.
+//
+
+function [ f , g , ind ] = woodFG ( x , ind )
+    if ind == 2 | ind == 3 | ind == 4 then
+        A = x(2)-x(1)^2
+        B = x(4)-x(3)^2
+    end
+    if ind == 2 | ind == 4 then
+        f = 100*A^2+(1-x(1))^2+90*B^2+(1-x(3))^2+...
+        10.1*((x(2)-1)^2+(x(4)-1)^2)+19.8*(x(2)-1)*(x(4)-1)
+    end
+    if ind == 3 | ind == 4 then
+        g(1) = -2*(200*x(1)*A+1.-x(1))
+        g(2) = 2*(100*A+10.1*(x(2)-1)+9.9*(x(4)-1))
+        g(3) = -2*(180*x(3)*B+1.-x(3))
+        g(4) = 2*(90*B+10.1*(x(4)-1)+9.9*(x(2)-1))
+    end
+endfunction
+x0 = [-3 -1 -3 -1];
+
+[ fopt , xopt ] = optim ( woodFG , x0 );
index be83dae..c916ad3 100644 (file)
@@ -1,9 +1,10 @@
 // =============================================================================
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) ????-2008 - INRIA - Michael Baudin
+// Copyright (C) 2008 - INRIA - Michael Baudin
 //
 //  This file is distributed under the same license as the Scilab package.
-//
+// =============================================================================
+// <-- CLI SHELL MODE -->
 // optim_costflist.tst --
 //   Test the optim command in the case where the cost function is a list.
 //
@@ -11,7 +12,7 @@
 // In the following case, costf is equal to list(sipn,sip2,ne,nc,cpen)
 // where sipn is a function.
 // The case is even more complex, since the 3d argument
-// of sipn is the dummy argument sip1, which is, in turn,
+// of sipn is the dummy argument sip1, which is, in turn, 
 // a function which real value is sip2.
 // penalization (see doc)
 //
@@ -20,24 +21,24 @@ function [f,g,ind]=sip2(x,ind)
   f= [ x(1)+x(2)-1, -x(1), (x(1)^2+x(2)^2)/2]
   g= [ 1, -1, x(1); 1,  0, x(2)]
 endfunction
-cpen=50;
-ne=1;
+cpen=50; 
+ne=1; 
 nc=2;
-bi=[0 0];
+bi=[0 0]; 
 bs=[2 2];
 function [fpen,gpen,ind]=sipn(x,ind,sip1,ne,nc,cpen)
   [f,g,indic]=sip1(x,ind)
-  if indic < 0 then
+  if indic < 0 then 
     ind=indic
     return
   end
-  if nc >ne then
+  if nc >ne then 
     for i=ne+1:nc
       f(i)=max([0 f(i)])
     end
   end
   fpen=f(nc+1) + cpen*norm(f(1:nc))^2/2';
-  if ind==2 then
+  if ind==2 then 
     return
   end
   gpen=g(:,nc+1)
@@ -48,7 +49,7 @@ function [fpen,gpen,ind]=sipn(x,ind,sip1,ne,nc,cpen)
   end
   if nc > ne then
     for i=ne+1:nc
-      if f(i) > 0 then
+      if f(i) > 0 then 
          gpen=gpen + cpen*f(i)*g(:,i)
       end
     end
@@ -56,4 +57,6 @@ function [fpen,gpen,ind]=sipn(x,ind,sip1,ne,nc,cpen)
 endfunction
 [f,x,g]=optim(list(sipn,sip2,ne,nc,cpen),...
               'b',bi,bs,[1 1],'ar',20,20,1.e-15);
+Norm of projected gradient lower than   0.1000000D-14.
+
 if norm(x-[0.5 0.5]) + norm(g) > 0.1 then bugmes();quit;end
index 849818e..6534895 100644 (file)
@@ -4,6 +4,7 @@
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
+// <-- CLI SHELL MODE -->
 //
 // optim_matrix.tst --
 //   Test the optim command when the optimized unknown is a matrix.
@@ -17,6 +18,8 @@ A=rand(2,2);
 b=eye(A);
 x0=eye(2,2);
 [f,X,g]=optim(ndsim1,x0);
+Norm of projected gradient lower than   0.9402179D-16.
+
 if norm(X-inv(A))>Leps then bugmes();quit;end
 // Test #2
 // The expected solution of the problem is the solution of Ax=b
@@ -25,6 +28,8 @@ A=rand(2,2);
 b=[1;0];
 Ai=inv(A);
 [f,x,g]=optim(ndsim2,[1;0],'nd');
+End of optimization.
+
 if norm(x-Ai(:,1))>Leps then bugmes();quit;end
 // Test #3
 deff('[f,g,ind]=ndsim3(x,ind)', [
index da1ee3e..1a67236 100644 (file)
@@ -59,6 +59,8 @@ chdir(cur_dir);
 valtd=100;
 // Test with default solver and default settings.
 [f,x,g]=optim('rosenc',x0,'td',valtd);
+Norm of projected gradient lower than   0.0000000D+00.
+
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
 // Test with all solvers
 solverlist=["gc" "qn" "nd"];
@@ -66,6 +68,12 @@ for solver=solverlist
   [f,x,g]=optim('rosenc',x0,solver,'td',valtd);
   if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
 end
+Optim stops: maximum number of calls to f is reached.
+
+Norm of projected gradient lower than   0.0000000D+00.
+
+End of optimization.
+
 // Test all verbose levels with all possible solvers
 verboselevels=[0];
 for verbose=verboselevels
@@ -74,3 +82,9 @@ for verbose=verboselevels
     if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
   end
 end
+Optim stops: maximum number of calls to f is reached.
+
+Norm of projected gradient lower than   0.0000000D+00.
+
+End of optimization.
+
index 102b837..01f83cf 100644 (file)
@@ -61,12 +61,20 @@ chdir(cur_dir);
 x0 = 1.2*ones(n, 1);
 valtd = 100;
 [f, xo, go] = optim('rosenf', x0, 'td', valtd);
+Norm of projected gradient lower than   0.0000000D+00.
+
 // Test with all solvers
 solverlist = ["gc" "qn" "nd"];
 for solver = solverlist
   [f, x, g] = optim('rosenf', x0, solver, 'td', valtd);
   if abs(f - 1 + norm(x - xopt) ) > Leps then bugmes();quit;end
 end
+Optim stops: maximum number of calls to f is reached.
+
+Norm of projected gradient lower than   0.0000000D+00.
+
+End of optimization.
+
 // Test all verbose levels with all possible solvers
 verboselevels = [0];
 for verbose = verboselevels
@@ -75,5 +83,11 @@ for verbose = verboselevels
     if abs(f - 1 + norm(x - xopt) ) > Leps then bugmes();quit;end
   end
 end
+Optim stops: maximum number of calls to f is reached.
+
+Norm of projected gradient lower than   0.0000000D+00.
+
+End of optimization.
+
 // Clean-up
 ulink();
index 960184f..233ebaf 100644 (file)
@@ -91,70 +91,130 @@ xopt = .1*bs;
 // Solve the problem
 //
 [f, x, g] = optim('rosenf', x0, 'in');
+Norm of projected gradient lower than   0.0000000D+00.
+
 if abs(f - 1 + norm(x - xopt) ) > Leps then bugmes();quit;end
 [f, x, g] = optim('rosenf', x0, 'gc', 'in');
+Optim stops: maximum number of calls to f is reached.
+
 if abs(f - 1 + norm(x - xopt) ) > Leps then bugmes();quit;end
 //
 [f, x, g] = optim('rosenf', x0, 'nd', 'in');
+Optim stops: maximum number of calls to f is reached.
+
 if abs(f - 1 + norm(x - xopt) ) > Leps then bugmes();quit;end
 [f, x, g] = optim('rosenf', x0, 'qn', 1, 'in');
+Norm of projected gradient lower than   0.0000000D+00.
+
 if abs(f - 1 + norm(x - xopt) ) > Leps then bugmes();quit;end
 [f, x, g] = optim('rosenf', x0, 'gc', 1, 50, 'in');
+Optim stops: maximum number of calls to f is reached.
+
 if abs(f - 1 + norm(x - xopt) ) > Leps then bugmes();quit;end
 //
 [f, x ,g] = optim('rosenf', x0, 'nd', 1,50, 'in');
+Optimization stops because too small variations for x.
+
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
 [f, x1, g] =optim('rosenf', x0,  'ar', 100, 6, 'in');
+Optim stops: maximum number of iterations is reached.
+
 [f, x, g, to] = optim('rosenf', x0,  'ar', 100, 3, 'in');
+Optim stops: maximum number of iterations is reached.
+
 [f, x, g, to] = optim('rosenf', x , to, 'ar', 100, 3, 'in');
+Optim stops: maximum number of iterations is reached.
+
 if norm(x-x1)/norm(x-xopt) > 0.1 then  bugmes();quit;end
 [f, x1, g] = optim('rosenf', 'b', bi, bs, x0, 'ar', 100, 6, 'in');
+Optim stops: maximum number of iterations is reached.
+
 [f, x, g, to] = optim('rosenf', 'b', bi, bs, x0, 'ar', 100, 3, 'in');
+Optim stops: maximum number of iterations is reached.
+
 [f, x, g]   =optim('rosenf', 'b', bi, bs, x, to, 'ar', 100, 3, 'in');
+Optim stops: too small variations in gradient direction.
+
 if norm(x-x1)/norm(x-xopt) > 0.1 then  bugmes();quit;end
 //
 // Test all possible stop criteria settings
 //
 [f, x, g] = optim('rosenf', x0, 'ar', 'in');
+Norm of projected gradient lower than   0.0000000D+00.
+
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
 [f, x, g] = optim('rosenf', x0, 'ar', 100, 'in');
+Norm of projected gradient lower than   0.0000000D+00.
+
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
 [f, x, g] = optim('rosenf', x0, 'ar', 100, 100, 'in');
+Norm of projected gradient lower than   0.0000000D+00.
+
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
 [f, x, g] = optim('rosenf', x0, 'ar', 100, 100, %eps, 'in');
+Norm of projected gradient lower than   0.0000000D+00.
+
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
 [f, x, g] = optim('rosenf', x0, 'ar', 100, 100, %eps, %eps, 'in');
+Norm of projected gradient lower than   0.0000000D+00.
+
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
 [f, x, g] = optim('rosenf', x0, 'ar', 100, 100, 10.*%eps, %eps, epsx, 'in');
+Norm of projected gradient lower than   0.0000000D+00.
+
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
 [f, x, g] = optim('rosenf', x0, 'gc', 'ar', 100, 100, %eps, %eps, epsx, 'in');
+Optim stops: maximum number of calls to f is reached.
+
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
 //
 [f, x, g] = optim('rosenf', 'b', bi, bs, x0, 'in');
+Optim stops: maximum number of calls to f is reached.
+
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
 [f, x, g] = optim('rosenf', 'b', bi, bs, x0, 'gc', 'in');
+at last iteration f decreases by less than   0.2220446D-15.
+
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
 [f, x] = optim('rosenf', 'b', bi, bs, x0, 'ar', 100, 100, 1.d-8, 'in');
+Norm of projected gradient lower than   0.1000000D-07.
+
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
 [f, x, g] = optim('rosenf', ..
 'b', bi, bs, x0, 'gc', 'ar', 100, 100, %eps, %eps, epsx, 'in');
+at last iteration f decreases by less than   0.2220446D-15.
+
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
 [f, x, g, to, td] = optim('rosenf', x0, 'in', 'sd');
+Norm of projected gradient lower than   0.0000000D+00.
+
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
 [f, x, g, ti] = optim('rosenf', x0, 'gc', 'in', 'si');
+Optim stops: maximum number of calls to f is reached.
+
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
 [f, x, g, to, ti, td] = optim('rosenf', x0, to, 'in', 'si', 'sd');
+Norm of projected gradient lower than   0.0000000D+00.
+
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
 [f, x, g, td] = optim('rosenf', ..
 'b', bi, bs, x0, 'gc', 'ar', 100, 100, %eps, %eps, epsx, 'in', 'sd');
+at last iteration f decreases by less than   0.2220446D-15.
+
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
 [f, x, g, ti] = optim('rosenf', x0, 'gc', 'ar', 100, 100, %eps, 'in', 'si');
+Optim stops: maximum number of calls to f is reached.
+
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
 [f, x, g, ti, td] = optim('rosenf', ..
 x0, 'gc', 'ar', 100, 100, %eps, 'in', 'si', 'sd');
+Optim stops: maximum number of calls to f is reached.
+
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
 [f,  x,  g,  ti,  td] = optim('rosenf', ..
 x0, 'gc', 'ar', 100, 100, %eps, 'in', 'ti', ti, 'td', td, 'si', 'sd');
+Optim stops: maximum number of calls to f is reached.
+
 if abs(f - 1 + norm(x - xopt) ) > Leps then bugmes();quit;end
 // Clean-up
 ulink();