* Bug #9688 fixed - optim could crash when imp option was < 0 62/12662/4
Paul BIGNIER [Wed, 25 Sep 2013 14:45:37 +0000 (16:45 +0200)]
"imp" is now set to 0 when it is < 0.

Change-Id: I1ff155b3b6895354b5762ff273b76bdcce93b5a0

scilab/CHANGES_5.5.X
scilab/modules/optimization/sci_gateway/fortran/sci_f_optim.f
scilab/modules/optimization/tests/nonreg_tests/bug_9688.dia.ref [new file with mode: 0644]
scilab/modules/optimization/tests/nonreg_tests/bug_9688.tst [new file with mode: 0644]

index 48147c4..2b205b7 100644 (file)
@@ -446,6 +446,8 @@ Bug Fixes
 
 * Bug #9601 fixed - Cylinder demonstration fixed.
 
+* Bug #9688 fixed - optim() could crash when "imp" option was < 0. It is now set to 0 in that case.
+
 * Bug #9690 fixed - The "imp" option for optim could crash Scilab and was not consistent with the help page.
 
 * Bug #9691 fixed - "imp" option in optim help page was poorly documented.
index e0e7540..ef9e4f4 100644 (file)
@@ -64,6 +64,7 @@ c
          if(eqid(idstk(1,top),impn)) then
             if (.not.getscalar('optim',top,top,lr)) return
             imp=stk(lr)
+            if (imp.lt.0) imp=0
             top=top-1
             rhs=rhs-1
          endif
diff --git a/scilab/modules/optimization/tests/nonreg_tests/bug_9688.dia.ref b/scilab/modules/optimization/tests/nonreg_tests/bug_9688.dia.ref
new file mode 100644 (file)
index 0000000..306ab35
--- /dev/null
@@ -0,0 +1,40 @@
+// =============================================================================
+// 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 -->
+// <-- ENGLISH IMPOSED -->
+//
+// <-- Non-regression test for bug 9688 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=9688
+//
+// <-- Short Description -->
+// optim could crash when "imp" option was < 0
+//
+function [ f , g , ind ] = woodFG ( x , ind )
+    f = []
+    g = []
+    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, gopt ] = optim ( woodFG, x0, "qn", imp=-1);
+[ fopt, xopt, gopt ] = optim ( woodFG, x0, "qn", imp=-1);
+[ fopt, xopt, gopt ] = optim ( woodFG, x0, "nd", imp=-1);
diff --git a/scilab/modules/optimization/tests/nonreg_tests/bug_9688.tst b/scilab/modules/optimization/tests/nonreg_tests/bug_9688.tst
new file mode 100644 (file)
index 0000000..519dd8b
--- /dev/null
@@ -0,0 +1,41 @@
+// =============================================================================
+// 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 -->
+// <-- ENGLISH IMPOSED -->
+//
+// <-- Non-regression test for bug 9688 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=9688
+//
+// <-- Short Description -->
+// optim could crash when "imp" option was < 0
+//
+function [ f , g , ind ] = woodFG ( x , ind )
+    f = []
+    g = []
+    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, gopt ] = optim ( woodFG, x0, "qn", imp=-1);
+[ fopt, xopt, gopt ] = optim ( woodFG, x0, "qn", imp=-1);
+[ fopt, xopt, gopt ] = optim ( woodFG, x0, "nd", imp=-1);