Optimization: clarify the imp<0 case of optim 93/13093/6
Paul BIGNIER [Wed, 6 Nov 2013 14:14:23 +0000 (15:14 +0100)]
In optim's calling sequence, when the imp flag is < 0,
it means that the objective function is going to be called with ind=1.

Change-Id: Ief6d29fcab4f23ef22723591be431df257dfcb68

scilab/modules/optimization/help/en_US/optim.xml
scilab/modules/optimization/tests/nonreg_tests/bug_9688.dia.ref
scilab/modules/optimization/tests/nonreg_tests/bug_9688.tst

index 37c8a9c..0337eee 100644 (file)
                             </itemizedlist>
                         </listitem>
                     </itemizedlist>
+                    <para>
+                        If <varname>imp</varname> is lower than 0, then the cost function is evaluated every
+                        <varname>-m</varname> iterations, with <literal>ind=1</literal>.
+                    </para>
                 </listitem>
             </varlistentry>
             <varlistentry>
             <literal>mydata</literal> is used to store the number of function
             evaluations as well as the number of iterations.
         </para>
-        <programlisting role="example">
-            function [f, g, ind] = cost(x, ind)
-            global _MYDATA_
-            if ( ind == 1 )
-            _MYDATA_.niter = _MYDATA_.niter + 1;
-            else
-            _MYDATA_.nfevals = _MYDATA_.nfevals + 1;
-            end
-            xref = [1; 2; 3];
-            if ( ind == 2 | ind == 4 ) then
-            f = 0.5*norm(x-xref)^2;
-            else
-            f = 0;
-            end
-            if ( ind == 3 | ind == 4 ) then
-            g = x-xref;
-            else
-            g = zeros(3, 1);
-            end
-            endfunction
-            x0 = [1; -1; 1];
-            global _MYDATA_
-            _MYDATA_ = tlist ( ["MYDATA", "niter", "nfevals"]);
-            _MYDATA_.niter = 0;
-            _MYDATA_.nfevals = 0;
-            [f, xopt] = optim(cost, x0, imp=-1);
-            mprintf ( "Number of function evaluations: %d\n", _MYDATA_.nfevals );
-            mprintf ( "Number of iterations: %d\n", _MYDATA_.niter );
-        </programlisting>
+        <programlisting role="example"><![CDATA[
+function [f, g, ind] = cost(x, ind)
+    global _MYDATA_
+    if ( ind == 1 )
+        _MYDATA_.niter = _MYDATA_.niter + 1;
+    end
+    _MYDATA_.nfevals = _MYDATA_.nfevals + 1;
+    xref = [1; 2; 3];
+    if ( ind == 2 | ind == 4 ) then
+        f = 0.5*norm(x-xref)^2;
+    else
+        f = 0;
+    end
+    if ( ind == 3 | ind == 4 ) then
+        g = x-xref;
+    else
+        g = zeros(3, 1);
+    end
+endfunction
+
+x0 = [1; -1; 1];
+global _MYDATA_
+_MYDATA_ = tlist ( ["MYDATA", "niter", "nfevals"]);
+_MYDATA_.niter = 0;
+_MYDATA_.nfevals = 0;
+
+[f, xopt] = optim(cost, x0, imp=-1);
+mprintf ( "Number of function evaluations: %d\n", _MYDATA_.nfevals );
+mprintf ( "Number of iterations: %d\n", _MYDATA_.niter );
+        ]]></programlisting>
         <para>While the previous example perfectly works, there is a risk that the
             same variable <literal>_MYDATA_</literal> is used by some internal
             function used by <literal>optim</literal>. In this case, the value may be
index 306ab35..65cb1c0 100644 (file)
@@ -35,6 +35,7 @@ function [ f , g , ind ] = woodFG ( x , ind )
     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);
+refMsg = msprintf(_("Variable returned by scilab argument function is incorrect."));
+assert_checkerror("[ fopt, xopt, gopt ] = optim ( woodFG, x0, ""qn"", imp=-1);", refMsg);
+assert_checkerror("[ fopt, xopt, gopt ] = optim ( woodFG, x0, ""gc"", imp=-1);", refMsg);
+assert_checkerror("[ fopt, xopt, gopt ] = optim ( woodFG, x0, ""nd"", imp=-1);", refMsg);
index 519dd8b..3e6a590 100644 (file)
@@ -36,6 +36,7 @@ function [ f , g , ind ] = woodFG ( x , ind )
 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);
+refMsg = msprintf(_("Variable returned by scilab argument function is incorrect."));
+assert_checkerror("[ fopt, xopt, gopt ] = optim ( woodFG, x0, ""qn"", imp=-1);", refMsg);
+assert_checkerror("[ fopt, xopt, gopt ] = optim ( woodFG, x0, ""gc"", imp=-1);", refMsg);
+assert_checkerror("[ fopt, xopt, gopt ] = optim ( woodFG, x0, ""nd"", imp=-1);", refMsg);