* Function without output argument cannot be call in assignation expression 01/17101/5
Antoine ELIAS [Tue, 25 Aug 2015 10:30:11 +0000 (12:30 +0200)]
    function foo()
        //...
    endfunction

    val = foo() //return error
Function without output argument cannot be call in assignation expression

test_run optimization

Change-Id: Iab18fb5a45337683a33df63a547ad77bd5fd9d75

scilab/CHANGES
scilab/modules/optimization/macros/neldermead/fminsearch.sci
scilab/modules/optimization/tests/unit_tests/neldermead/fminsearch_output.dia.ref
scilab/modules/optimization/tests/unit_tests/neldermead/fminsearch_output.tst
scilab/modules/optimization/tests/unit_tests/neldermead/fminsearch_outputobsolete.dia.ref [deleted file]
scilab/modules/optimization/tests/unit_tests/neldermead/fminsearch_outputobsolete.tst [deleted file]
scilab/modules/optimization/tests/unit_tests/optimsimplex/optimsimplex_randbounds.dia.ref

index 015c791..7226f15 100644 (file)
@@ -89,6 +89,13 @@ Other feature changes
   cause any error. The previous behavior can be recalled by simply
   calling: ieee(0)
 
+* Function without output argument cannot be call in assignation expression
+
+    function foo()
+        //...
+    endfunction
+
+    val = foo() //return error
 
 Other feature additions
 =======================
index 9bcba2f..86275ee 100644 (file)
@@ -161,6 +161,11 @@ function [x,fval,exitflag,output] = fminsearch ( varargin )
         warning(warnMessage);
     endfunction
 
+    function errMessage = fms_errheaderobsolete (oldheader, newheader)
+        errMessage = msprintf(_("Calling sequence %s is obsolete."),oldheader)
+        errMessage = [errMessage, msprintf(_("Please use %s instead."),newheader)]
+    endfunction
+
 
     function assert_typecallable ( var , varname , ivar )
         // Check that var is a function or a list
@@ -236,6 +241,29 @@ function [x,fval,exitflag,output] = fminsearch ( varargin )
     if ( Display == "iter" ) then
         mprintf ( "%10s   %10s   %10s %17s\n" , "Iteration", "Func-count" , "min f(x)" , "Procedure" );
     end
+
+    //check OutputFcn format
+    if or(type(OutputFcn) == [11 13]) then
+        macroInfo = macrovar(OutputFcn);
+        if size(macroInfo(2), "*") <> 1 then
+            errMessage = fms_errheaderobsolete("outputfun(x,optimValues , state )", "stop=outputfun(x,optimValues , state )");
+            error(errMessage);
+        end
+    elseif type(OutputFcn) == 15 then
+        for i = 1 : size(OutputFcn)
+            if or(type(OutputFcn(i)) == [11 13]) then
+                macroInfo = macrovar(OutputFcn(i));
+                if size(macroInfo(2), "*") <> 1 then
+                    errMessage = fms_errheaderobsolete("outputfun(x,optimValues , state )", "stop=outputfun(x,optimValues , state )");
+                    error(errMessage);
+                end
+            end
+        end
+    elseif (OutputFcn <> [])
+        // The user did something wrong...
+        errmsg = msprintf(gettext("%s: The value of the ''OutputFcn'' option is neither a function nor a list."), "fminsearch");
+        error(errmsg)
+    end
     //
     // Check input arguments
     assert_typecallable ( fun , "costf" , 1)
index 7c5efdf..273ea25 100644 (file)
@@ -12,7 +12,7 @@
 // along with this program.
 // <-- ENGLISH IMPOSED -->
 function y = rosenbrock ( x )
-  y = 100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
+    y = 100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
 endfunction
 //
 // Use output function
@@ -30,42 +30,42 @@ endfunction
 //    "init", "iter", "done"
 //
 function stop = outfun ( x , optimValues , state )
-  plot( x(1),x(2),'.');
-  // Unload all fields and check consistent values
-  fc = optimValues.funccount;
-  fv = optimValues.fval;
-  it = optimValues.iteration;
-  pr = optimValues.procedure;
-  select pr
-  case "initial simplex"
-    // OK
-  case "expand"
-    // OK
-  case "reflect"
-    // OK
-  case "shrink"
-    // OK
-  case "contract inside"
-    // OK
-  case "contract outside"
-    // OK
-  case ""
-    // OK
-  else
-    error ( sprintf ( "Unknown procedure %s." , pr ) )
-  end
-  select state
-  case "init"
-    // OK
-  case "iter"
-    // OK
-  case "done"
-    // OK
-  else
-    error ( sprintf ( "Unknown state %s." , state ) )
-  end
-  mprintf ( "%d %s %d -%s- %s\n" , fc , string(fv) , it , pr , state )
-  stop = %f
+    plot( x(1),x(2),".");
+    // Unload all fields and check consistent values
+    fc = optimValues.funccount;
+    fv = optimValues.fval;
+    it = optimValues.iteration;
+    pr = optimValues.procedure;
+    select pr
+    case "initial simplex"
+        // OK
+    case "expand"
+        // OK
+    case "reflect"
+        // OK
+    case "shrink"
+        // OK
+    case "contract inside"
+        // OK
+    case "contract outside"
+        // OK
+    case ""
+        // OK
+    else
+        error ( sprintf ( "Unknown procedure %s." , pr ) )
+    end
+    select state
+    case "init"
+        // OK
+    case "iter"
+        // OK
+    case "done"
+        // OK
+    else
+        error ( sprintf ( "Unknown state %s." , state ) )
+    end
+    mprintf ( "%d %s %d -%s- %s\n" , fc , string(fv) , it , pr , state )
+    stop = %f
 endfunction
 opt = optimset ( "OutputFcn" , outfun);
 opt = optimset ( opt , "MaxIter" , 10 );
@@ -90,16 +90,16 @@ close(gcf());
 // Use several output functions
 //
 function stop = outfun2 ( x , optimValues , state )
-  global __fig1__
-  scf ( __fig1__ );
-  plot( x(1),x(2),'.');
-  stop = %f
+    global __fig1__
+    scf ( __fig1__ );
+    plot( x(1),x(2),".");
+    stop = %f
 endfunction
 function stop = outfun3 ( x , optimValues , state )
-  global __fig2__
-  scf ( __fig2__ );
-  plot( x(1),x(2),'o');
-  stop = %f
+    global __fig2__
+    scf ( __fig2__ );
+    plot( x(1),x(2),"o");
+    stop = %f
 endfunction
 myfunctions = list ( outfun2 , outfun3 );
 global __fig1__
@@ -131,7 +131,7 @@ close(__fig2__);
 //    "init", "iter", "done"
 //
 function plotfun ( x , optimValues , state )
-  plot(x(1),x(2),'.');
+    plot(x(1),x(2),".");
 endfunction
 opt = optimset ( "PlotFcns" , plotfun);
 opt = optimset ( opt , "MaxIter" , 10 );
@@ -144,14 +144,14 @@ close(gcf());
 // Use several plot functions
 //
 function plotfun2 ( x , optimValues , state )
-  global __fig1__
-  scf ( __fig1__ );
-  plot( x(1),x(2),'.');
+    global __fig1__
+    scf ( __fig1__ );
+    plot( x(1),x(2),".");
 endfunction
 function plotfun3 ( x , optimValues , state )
-  global __fig2__
-  scf ( __fig2__ );
-  plot( x(1),x(2),'o');
+    global __fig2__
+    scf ( __fig2__ );
+    plot( x(1),x(2),"o");
 endfunction
 myfunctions = list ( plotfun2 , plotfun3 );
 global __fig1__
@@ -212,9 +212,9 @@ close(gcf());
 //
 // Use output function to stop the algorithm.
 // This sets the exitflag to -1.
-function stop = outfunStop ( x , optimValues , state )  
-  fv = optimValues.fval;
-  stop = ( fv < 1.e-5 )
+function stop = outfunStop ( x , optimValues , state )
+    fv = optimValues.fval;
+    stop = ( fv < 1.e-5 )
 endfunction
 opt = optimset ( "OutputFcn" , outfunStop);
 [x , fval , exitflag , output] = fminsearch ( rosenbrock , [-1.2 1] , opt );
index 6ee702e..1548d44 100644 (file)
@@ -14,7 +14,7 @@
 // <-- ENGLISH IMPOSED -->
 
 function y = rosenbrock ( x )
-  y = 100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
+    y = 100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
 endfunction
 //
 // Use output function
@@ -32,42 +32,42 @@ endfunction
 //    "init", "iter", "done"
 //
 function stop = outfun ( x , optimValues , state )
-  plot( x(1),x(2),'.');
-  // Unload all fields and check consistent values
-  fc = optimValues.funccount;
-  fv = optimValues.fval;
-  it = optimValues.iteration;
-  pr = optimValues.procedure;
-  select pr
-  case "initial simplex"
-    // OK
-  case "expand"
-    // OK
-  case "reflect"
-    // OK
-  case "shrink"
-    // OK
-  case "contract inside"
-    // OK
-  case "contract outside"
-    // OK
-  case ""
-    // OK
-  else
-    error ( sprintf ( "Unknown procedure %s." , pr ) )
-  end
-  select state
-  case "init"
-    // OK
-  case "iter"
-    // OK
-  case "done"
-    // OK
-  else
-    error ( sprintf ( "Unknown state %s." , state ) )
-  end
-  mprintf ( "%d %s %d -%s- %s\n" , fc , string(fv) , it , pr , state )
-  stop = %f
+    plot( x(1),x(2),".");
+    // Unload all fields and check consistent values
+    fc = optimValues.funccount;
+    fv = optimValues.fval;
+    it = optimValues.iteration;
+    pr = optimValues.procedure;
+    select pr
+    case "initial simplex"
+        // OK
+    case "expand"
+        // OK
+    case "reflect"
+        // OK
+    case "shrink"
+        // OK
+    case "contract inside"
+        // OK
+    case "contract outside"
+        // OK
+    case ""
+        // OK
+    else
+        error ( sprintf ( "Unknown procedure %s." , pr ) )
+    end
+    select state
+    case "init"
+        // OK
+    case "iter"
+        // OK
+    case "done"
+        // OK
+    else
+        error ( sprintf ( "Unknown state %s." , state ) )
+    end
+    mprintf ( "%d %s %d -%s- %s\n" , fc , string(fv) , it , pr , state )
+    stop = %f
 endfunction
 opt = optimset ( "OutputFcn" , outfun);
 opt = optimset ( opt , "MaxIter" , 10 );
@@ -77,16 +77,16 @@ close(gcf());
 // Use several output functions
 //
 function stop = outfun2 ( x , optimValues , state )
-  global __fig1__
-  scf ( __fig1__ );
-  plot( x(1),x(2),'.');
-  stop = %f
+    global __fig1__
+    scf ( __fig1__ );
+    plot( x(1),x(2),".");
+    stop = %f
 endfunction
 function stop = outfun3 ( x , optimValues , state )
-  global __fig2__
-  scf ( __fig2__ );
-  plot( x(1),x(2),'o');
-  stop = %f
+    global __fig2__
+    scf ( __fig2__ );
+    plot( x(1),x(2),"o");
+    stop = %f
 endfunction
 myfunctions = list ( outfun2 , outfun3 );
 global __fig1__
@@ -115,7 +115,7 @@ close(__fig2__);
 //    "init", "iter", "done"
 //
 function plotfun ( x , optimValues , state )
-  plot(x(1),x(2),'.');
+    plot(x(1),x(2),".");
 endfunction
 opt = optimset ( "PlotFcns" , plotfun);
 opt = optimset ( opt , "MaxIter" , 10 );
@@ -125,14 +125,14 @@ close(gcf());
 // Use several plot functions
 //
 function plotfun2 ( x , optimValues , state )
-  global __fig1__
-  scf ( __fig1__ );
-  plot( x(1),x(2),'.');
+    global __fig1__
+    scf ( __fig1__ );
+    plot( x(1),x(2),".");
 endfunction
 function plotfun3 ( x , optimValues , state )
-  global __fig2__
-  scf ( __fig2__ );
-  plot( x(1),x(2),'o');
+    global __fig2__
+    scf ( __fig2__ );
+    plot( x(1),x(2),"o");
 endfunction
 myfunctions = list ( plotfun2 , plotfun3 );
 global __fig1__
@@ -180,9 +180,9 @@ close(gcf());
 //
 // Use output function to stop the algorithm.
 // This sets the exitflag to -1.
-function stop = outfunStop ( x , optimValues , state )  
-  fv = optimValues.fval;
-  stop = ( fv < 1.e-5 )
+function stop = outfunStop ( x , optimValues , state )
+    fv = optimValues.fval;
+    stop = ( fv < 1.e-5 )
 endfunction
 opt = optimset ( "OutputFcn" , outfunStop);
 [x , fval , exitflag , output] = fminsearch ( rosenbrock , [-1.2 1] , opt );
diff --git a/scilab/modules/optimization/tests/unit_tests/neldermead/fminsearch_outputobsolete.dia.ref b/scilab/modules/optimization/tests/unit_tests/neldermead/fminsearch_outputobsolete.dia.ref
deleted file mode 100644 (file)
index aaa7da1..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2011 - DIGITEO - Michael Baudin
-//
-// Copyright (C) 2012 - 2016 - Scilab Enterprises
-//
-// This file is hereby licensed under the terms of the GNU GPL v2.0,
-// pursuant to article 5.3.4 of the CeCILL v.2.1.
-// This file was originally licensed under the terms of the CeCILL v2.1,
-// and continues to be available under such terms.
-// For more information, see the COPYING file which you should have received
-// along with this program.
-// <-- ENGLISH IMPOSED -->
-// <-- NO CHECK REF -->
-// <-- CLI SHELL MODE -->
-// This test is designed to produce a warning:
-// this warning is localized.
-// This is why we do not check the ref.
-// Checking the ref file under Linux fails, because
-// <-- ENGLISH IMPOSED --> has no effect there.
-// See : http://bugzilla.scilab.org/show_bug.cgi?id=9284
-function [ y , index ] = rosenbrock ( x , index )
-  y = 100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
-endfunction
-//
-// Ensure backward compatibility.
-// Check that it works also without a stop output variable.
-//
-function outfun4 ( x , optimValues , state )
-endfunction
-opt = optimset ( "OutputFcn" , outfun4);
-opt = optimset ( opt , "MaxIter" , 10 );
-[x fval] = fminsearch ( rosenbrock , [-1.2 1] , opt );
-AVERTISSEMENT : Syntax outputfun(x,optimValues , state ) is obsolete.
-AVERTISSEMENT : Utilisez plutôt stop=outputfun(x,optimValues , state ) s'il vous plait.
-AVERTISSEMENT : Cette fonctionnalité va être définitivement enlevée dans Scilab 5.4.1
-
-fminsearch: Exiting: Maximum number of iterations has been exceeded
-         - increase MaxIter option.
-         Current function value: 4.1355598
diff --git a/scilab/modules/optimization/tests/unit_tests/neldermead/fminsearch_outputobsolete.tst b/scilab/modules/optimization/tests/unit_tests/neldermead/fminsearch_outputobsolete.tst
deleted file mode 100644 (file)
index 7cf3feb..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2011 - DIGITEO - Michael Baudin
-//
-// Copyright (C) 2012 - 2016 - Scilab Enterprises
-//
-// This file is hereby licensed under the terms of the GNU GPL v2.0,
-// pursuant to article 5.3.4 of the CeCILL v.2.1.
-// This file was originally licensed under the terms of the CeCILL v2.1,
-// and continues to be available under such terms.
-// For more information, see the COPYING file which you should have received
-// along with this program.
-
-// <-- ENGLISH IMPOSED -->
-// <-- NO CHECK REF -->
-// <-- CLI SHELL MODE -->
-
-
-// This test is designed to produce a warning:
-// this warning is localized.
-// This is why we do not check the ref.
-// Checking the ref file under Linux fails, because
-// <-- ENGLISH IMPOSED --> has no effect there.
-// See : http://bugzilla.scilab.org/show_bug.cgi?id=9284
-
-function [ y , index ] = rosenbrock ( x , index )
-  y = 100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
-endfunction
-
-
-
-//
-// Ensure backward compatibility.
-// Check that it works also without a stop output variable.
-//
-function outfun4 ( x , optimValues , state )
-endfunction
-opt = optimset ( "OutputFcn" , outfun4);
-opt = optimset ( opt , "MaxIter" , 10 );
-[x fval] = fminsearch ( rosenbrock , [-1.2 1] , opt );
-
index 678275e..2ff9188 100644 (file)
@@ -27,9 +27,9 @@ expected = [
 71189.511402687028748915  -4.9977886537089943885803  -1.69672908261418342590
 ]
  expected  = 
-    24.2000    - 1.2000000    1.0000000
-    3347.7383  - 2.8867513    2.5604385
-    71189.5114  - 4.9977887  - 1.6967291
+   24.2       -1.2         1.       
+   3347.7383  -2.8867513   2.5604385
+   71189.511  -4.9977887  -1.6967291
 assert_checkalmostequal ( computed , expected , %eps );
 s1 = optimsimplex_destroy ( s1 );
 //
@@ -73,11 +73,11 @@ expected = [
 10770.01508687966997968     3.497452358715236186981     1.857310198247432708740
 ]
  expected  = 
-    24.2000    - 1.2000000    1.0000000
-    3347.7383  - 2.8867513    2.5604385
-    71189.5114  - 4.9977887  - 1.6967291
-    211.0178     1.6538110    1.2839179
-    10770.0151    3.4974524    1.8573102
+   24.2       -1.2         1.       
+   3347.7383  -2.8867513   2.5604385
+   71189.511  -4.9977887  -1.6967291
+   211.0178    1.653811    1.2839179
+   10770.015   3.4974524   1.8573102
 assert_checkequal ( mydude.nb , 5 );
 s1 = optimsimplex_destroy ( s1 );
 // Test unconsistent size of boundsmin