* Bug #9701 fixed - optim gateway for large problems 28/12628/7
Paul BIGNIER [Fri, 20 Sep 2013 15:51:00 +0000 (17:51 +0200)]
The computation of the required memory was failing for large problems,
in the optim gateway with "qn" option.

Change-Id: Iadeb032429b2b617f9fc696315785b8bd0038356

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_9701.dia.ref [new file with mode: 0644]
scilab/modules/optimization/tests/nonreg_tests/bug_9701.tst [new file with mode: 0644]

index 084e2c0..eeac544 100644 (file)
@@ -82,6 +82,8 @@ Scilab Bug Fixes
 
 * Bug #9697 fixed - Printed information for optim "qn" and "gc" with bounds and imp=1 fixed.
 
+* Bug #9701 fixed - optim with "qn" option was failing for large problems.
+
 * 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 0337eee..2261c49 100644 (file)
                                 The <literal>"nd"</literal> algorithm does not accept
                                 bounds on <literal>x</literal>.
                             </para>
+                            <para>
+                                The <literal>"qn"</literal> cannot be used if
+                                <literal>size(x0)&gt;46333</literal>.
+                            </para>
                         </listitem>
                     </itemizedlist>
                 </listitem>
index 40a6efc..663ad8d 100644 (file)
@@ -580,6 +580,12 @@ c     optimiseur n1qn1 : Quasi-Newton without constraints
       if(icontr.eq.1.and.ialg.eq.1) then
          lvar=ldisp
          mode=3
+c        If nx is greater than 46333, then we cannot compute nx*(nx+13)/2 properly,
+c        which is the required memory for the "qn" algorithm
+         if (nx.gt.46333) then
+            call error(17)
+            return
+         endif
          ntv=nx*(nx+13)/2
          ldisp=lvar + nx
          if(indtv.eq.0) then
diff --git a/scilab/modules/optimization/tests/nonreg_tests/bug_9701.dia.ref b/scilab/modules/optimization/tests/nonreg_tests/bug_9701.dia.ref
new file mode 100644 (file)
index 0000000..3ff33a6
--- /dev/null
@@ -0,0 +1,36 @@
+// =============================================================================
+// 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.
+// =============================================================================
+//
+// <-- ENGLISH IMPOSED -->
+//
+// <-- Non-regression test for bug 9701 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=9701
+//
+// <-- Short Description -->
+// optim gateway was failing for large problems.
+//
+function [f, g, ind] = optimCost(x, ind, n)
+    xref = (1:n)'
+    if ind == 1 | ind == 4 then
+        f = 0.5*sum((x-xref).^2)
+    else
+        f = 0
+    end
+    if ind == 1 | ind == 4 then
+        g = x-xref
+    else
+        g = zeros(x)
+    end
+endfunction
+stacksize("max");
+n = 50000;
+x0 = ones(n, 1);
+try optim(list(optimCost, n), x0, "qn", "ar",1000,1000, imp=2); catch msg = lasterror(); end
+refMsg = "stack size exceeded!";
+assert_checkequal(msg(1), refMsg);
diff --git a/scilab/modules/optimization/tests/nonreg_tests/bug_9701.tst b/scilab/modules/optimization/tests/nonreg_tests/bug_9701.tst
new file mode 100644 (file)
index 0000000..5cc952d
--- /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.
+// =============================================================================
+//
+// <-- ENGLISH IMPOSED -->
+//
+// <-- Non-regression test for bug 9701 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=9701
+//
+// <-- Short Description -->
+// optim gateway was failing for large problems.
+//
+
+function [f, g, ind] = optimCost(x, ind, n)
+    xref = (1:n)'
+    if ind == 1 | ind == 4 then
+        f = 0.5*sum((x-xref).^2)
+    else
+        f = 0
+    end
+    if ind == 1 | ind == 4 then
+        g = x-xref
+    else
+        g = zeros(x)
+    end
+endfunction
+
+stacksize("max");
+n = 50000;
+x0 = ones(n, 1);
+
+try optim(list(optimCost, n), x0, "qn", "ar",1000,1000, imp=2); catch msg = lasterror(); end
+refMsg = "stack size exceeded!";
+
+assert_checkequal(msg(1), refMsg);