* Bug #9697 fixed - basic print info for optim 87/12587/4
Paul BIGNIER [Wed, 18 Sep 2013 13:36:49 +0000 (15:36 +0200)]
The optim "qn" and "gc" with bounds and imp=1 did not print
the basic information of the problem.

Change-Id: I0b54fd3f6f8ae1d1077a2b50b6d0f62317d36c22

scilab/CHANGES_5.5.X
scilab/modules/optimization/src/fortran/gcbd.f
scilab/modules/optimization/src/fortran/qnbd.f
scilab/modules/optimization/tests/nonreg_tests/bug_9697.dia.ref [new file with mode: 0644]
scilab/modules/optimization/tests/nonreg_tests/bug_9697.tst [new file with mode: 0644]

index abe426d..afedb97 100644 (file)
@@ -20,6 +20,8 @@ Scilab Bug Fixes
 
 * Bug #9110 fixed - Examples and references to other functions added in the Statistics help pages.
 
+* Bug #9697 fixed - Printed information for optim "qn" and "gc" with bounds and imp=1 fixed.
+
 * Bug #10175 fixed - Clearer example added for sp2adj to adj2sp conversion (and backwards conversion).
 
 * Bug #10234 fixed - reglin function moved from CACSD to Statistics module.
index 67fade1..dac4aee 100644 (file)
@@ -166,6 +166,31 @@ c
       ialg(8)=4
       ialg(9)=12
 c
+c---- initial printing
+      if(imp.gt.0) then
+         write (bufstr,900)
+         call basout(io_out, io, bufstr(1:lnblnk(bufstr)))
+         write (bufstr,901) n
+         call basout(io_out, io, bufstr(1:lnblnk(bufstr)))
+         write (bufstr,902) df0
+         call basout(io_out, io, bufstr(1:lnblnk(bufstr)))
+         write (bufstr,903) epsg
+         call basout(io_out, io, bufstr(1:lnblnk(bufstr)))
+         write (bufstr,904) itmax
+         call basout(io_out, io, bufstr(1:lnblnk(bufstr)))
+         write (bufstr,905) napmax
+         call basout(io_out, io, bufstr(1:lnblnk(bufstr)))
+         write (bufstr,906) imp
+         call basout(io_out, io, bufstr(1:lnblnk(bufstr)))
+      endif
+900   format (" gcdb: entry point")
+901   format (5x,"dimension of the problem (n):",i6)
+902   format (5x,"expected decrease for f (df0):",d9.2)
+903   format (5x,"relative precision on g (epsg):",d9.2)
+904   format (5x,"maximal number of iterations (itmax):",i6)
+905   format (5x,"maximal number of simulations (napmax):",i6)
+906   format (5x,"printing level (imp):",i4)
+c
 c     verification des entrees
       ii=min(n,napmax,itmax)
       if(ii.gt.0)go to 10
@@ -175,7 +200,7 @@ c     verification des entrees
         call basout(io ,lp ,bufstr(1:lnblnk(bufstr)))
       endif
       
-123   format(' gcbd : retour avec indgc=',i8)
+123   format(' gcbd : return with indgc=',i8)
       return
 10    aa=min(zero,epsg,df0)
       do 11 i=1,n
@@ -205,7 +230,7 @@ c
       if(nfin.gt.nvect) then
          write(bufstr,1000) nfin,nvect
          call basout(io ,lp ,bufstr(1:lnblnk(bufstr)))
-1000  format (' gcbd:insuffisance memoire; nvect=',i5,'devrait etre:',
+1000  format (' gcbd:insufficient memory; nvect=',i5,'should be:',
      &  i5)
       indgc=-14
       return
@@ -217,7 +242,7 @@ c
       if(nfin.gt.nivect) then
          write(bufstr,2000)nfin,nivect
          call basout(io ,lp ,bufstr(1:lnblnk(bufstr)))
-2000  format (' gcbd:insuffisance memoire; nivect=',i5,'devrait etre:',
+2000  format (' gcbd:insufficient memory; nivect=',i5,'should be:',
      &  i5)
       indgc=-14
       return
index 3866450..0523c87 100644 (file)
@@ -106,11 +106,25 @@ c
       dimension trav(ntrav),itrav(nitrav),izs(*)
       external simul
 c
+c---- initial printing
       if(imp.ge.1) then
-        write(bufstr,1010)
-        call basout(io_out ,io ,bufstr(1:lnblnk(bufstr)))
-        endif
-1010  format(' *********** qnbd ****************')
+         call basout(io_out, io, '')
+         write(bufstr,1010)
+         call basout(io_out ,io ,bufstr(1:lnblnk(bufstr)))
+         write(bufstr,750) n,epsg,imp
+         call basout(io_out ,io ,bufstr(1:lnblnk(bufstr)))
+         write(bufstr,751) itmax
+         call basout(io_out ,io ,bufstr(1:lnblnk(bufstr)))
+         write(bufstr,752) napmax
+         call basout(io_out ,io ,bufstr(1:lnblnk(bufstr)))
+         call basout(io_out ,io ,
+     $    '------------------------------------------------')
+1010    format(' *********** qnbd (with bound cstr) ****************')
+750     format('dimension=',i10,', epsq=',e24.16,
+     $ ', verbosity level: imp=',i10)
+751     format('max number of iterations allowed: iter=',i10)
+752     format('max number of calls to costf allowed: nap=',i10)
+      endif
 c
 c
 c     parametres caracteristiques de l algorithme
diff --git a/scilab/modules/optimization/tests/nonreg_tests/bug_9697.dia.ref b/scilab/modules/optimization/tests/nonreg_tests/bug_9697.dia.ref
new file mode 100644 (file)
index 0000000..da16e8d
--- /dev/null
@@ -0,0 +1,63 @@
+// =============================================================================
+// 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 9697 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=9697
+//
+// <-- Short Description -->
+// The optim/"qn" /"gc" with bounds and imp=1 did not print the basic information of the problem.
+//
+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)
+    else
+        f = 0
+    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))
+    else
+        g = zeros(x)
+    end
+endfunction
+x0 = [-3 -1 -3 -1];
+binf = [-10 -10 -10 -10];
+bsup = [0 0 0 0];
+[fopt, xopt, gopt] = optim(woodFG, "b", binf, bsup, x0, "qn", imp=1);
+
+ *********** qnbd (with bound cstr) ****************
+dimension=         4, epsq=  0.2220446049250313E-15, verbosity level: imp=         1
+max number of iterations allowed: iter=       100
+max number of calls to costf allowed: nap=       100
+------------------------------------------------
+ qnbd : retour cause gradient projete petit= 0.0000D+00
+ qnbd : indqn=       1
+Norm of projected gradient lower than   0.2220446D-15.
+
+[fopt, xopt, gopt] = optim(woodFG, "b", binf, bsup, x0, "gc", imp=1);
+ gcdb: entry point
+     dimension of the problem (n):     4
+     expected decrease for f (df0): 0.10D+01
+     relative precision on g (epsg): 0.22D-15
+     maximal number of iterations (itmax):   100
+     maximal number of simulations (napmax):   100
+     printing level (imp):   1
+ gcbd : retour avec indgc=       1
+ f,norme grad,nap,iter,indgc= 0.4200E+02 0.0000E+00     4     3     1
+Norm of projected gradient lower than   0.2220446D-15.
+
diff --git a/scilab/modules/optimization/tests/nonreg_tests/bug_9697.tst b/scilab/modules/optimization/tests/nonreg_tests/bug_9697.tst
new file mode 100644 (file)
index 0000000..d920d01
--- /dev/null
@@ -0,0 +1,45 @@
+// =============================================================================
+// 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 9697 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=9697
+//
+// <-- Short Description -->
+// The optim/"qn" /"gc" with bounds and imp=1 did not print the basic information of the problem.
+//
+
+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)
+    else
+        f = 0
+    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))
+    else
+        g = zeros(x)
+    end
+endfunction
+
+x0 = [-3 -1 -3 -1];
+binf = [-10 -10 -10 -10];
+bsup = [0 0 0 0];
+
+[fopt, xopt, gopt] = optim(woodFG, "b", binf, bsup, x0, "qn", imp=1);
+[fopt, xopt, gopt] = optim(woodFG, "b", binf, bsup, x0, "gc", imp=1);