* Function without output argument cannot be call in assignation expression
[scilab.git] / scilab / modules / optimization / tests / unit_tests / neldermead / fminsearch_output.tst
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2008-2009 - INRIA - Michael Baudin
3 // Copyright (C) 2011 - DIGITEO - Michael Baudin
4 //
5 // Copyright (C) 2012 - 2016 - Scilab Enterprises
6 //
7 // This file is hereby licensed under the terms of the GNU GPL v2.0,
8 // pursuant to article 5.3.4 of the CeCILL v.2.1.
9 // This file was originally licensed under the terms of the CeCILL v2.1,
10 // and continues to be available under such terms.
11 // For more information, see the COPYING file which you should have received
12 // along with this program.
13
14 // <-- ENGLISH IMPOSED -->
15
16 function y = rosenbrock ( x )
17     y = 100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
18 endfunction
19 //
20 // Use output function
21 //
22 // outfun --
23 //   A sample output function
24 // Arguments, input
25 //   x : the current point
26 //   optimValues : a tlist which contains the following fields
27 //     funccount : the number of function evaluations
28 //     fval : the current function value
29 //     iteration : the current iteration
30 //     procedure : a string containing the current type of step
31 //  state : the current state of the algorithm
32 //    "init", "iter", "done"
33 //
34 function stop = outfun ( x , optimValues , state )
35     plot( x(1),x(2),".");
36     // Unload all fields and check consistent values
37     fc = optimValues.funccount;
38     fv = optimValues.fval;
39     it = optimValues.iteration;
40     pr = optimValues.procedure;
41     select pr
42     case "initial simplex"
43         // OK
44     case "expand"
45         // OK
46     case "reflect"
47         // OK
48     case "shrink"
49         // OK
50     case "contract inside"
51         // OK
52     case "contract outside"
53         // OK
54     case ""
55         // OK
56     else
57         error ( sprintf ( "Unknown procedure %s." , pr ) )
58     end
59     select state
60     case "init"
61         // OK
62     case "iter"
63         // OK
64     case "done"
65         // OK
66     else
67         error ( sprintf ( "Unknown state %s." , state ) )
68     end
69     mprintf ( "%d %s %d -%s- %s\n" , fc , string(fv) , it , pr , state )
70     stop = %f
71 endfunction
72 opt = optimset ( "OutputFcn" , outfun);
73 opt = optimset ( opt , "MaxIter" , 10 );
74 [x fval] = fminsearch ( rosenbrock , [-1.2 1] , opt );
75 close(gcf());
76 //
77 // Use several output functions
78 //
79 function stop = outfun2 ( x , optimValues , state )
80     global __fig1__
81     scf ( __fig1__ );
82     plot( x(1),x(2),".");
83     stop = %f
84 endfunction
85 function stop = outfun3 ( x , optimValues , state )
86     global __fig2__
87     scf ( __fig2__ );
88     plot( x(1),x(2),"o");
89     stop = %f
90 endfunction
91 myfunctions = list ( outfun2 , outfun3 );
92 global __fig1__
93 global __fig2__
94 __fig1__ = scf();
95 __fig2__ = scf();
96 opt = optimset ( "OutputFcn" , myfunctions );
97 opt = optimset ( opt , "MaxIter" , 10 );
98 [x fval] = fminsearch ( rosenbrock , [-1.2 1] , opt );
99 close(__fig1__);
100 close(__fig2__);
101 //
102 // Use plot function
103 //
104 //
105 // plotfun --
106 //   A sample plot function
107 // Arguments, input
108 //   x : the current point
109 //   optimValues : a tlist which contains the following fields
110 //     funcCount" : the number of function evaluations
111 //     fval : the current function value
112 //     iteration : the current iteration
113 //     procedure : a string containing the current type of step
114 //  state : the current state of the algorithm
115 //    "init", "iter", "done"
116 //
117 function plotfun ( x , optimValues , state )
118     plot(x(1),x(2),".");
119 endfunction
120 opt = optimset ( "PlotFcns" , plotfun);
121 opt = optimset ( opt , "MaxIter" , 10 );
122 [x fval] = fminsearch ( rosenbrock , [-1.2 1] , opt );
123 close(gcf());
124 //
125 // Use several plot functions
126 //
127 function plotfun2 ( x , optimValues , state )
128     global __fig1__
129     scf ( __fig1__ );
130     plot( x(1),x(2),".");
131 endfunction
132 function plotfun3 ( x , optimValues , state )
133     global __fig2__
134     scf ( __fig2__ );
135     plot( x(1),x(2),"o");
136 endfunction
137 myfunctions = list ( plotfun2 , plotfun3 );
138 global __fig1__
139 global __fig2__
140 __fig1__ = scf();
141 __fig2__ = scf();
142 opt = optimset ( "PlotFcns" , myfunctions );
143 opt = optimset ( opt , "MaxIter" , 10 );
144 [x fval] = fminsearch ( rosenbrock , [-1.2 1] , opt );
145 close(__fig1__);
146 close(__fig2__);
147 //
148 // Use optimplotfval plot function
149 //
150 opt = optimset ( "PlotFcns" , optimplotfval );
151 opt = optimset ( opt , "MaxIter" , 10 );
152 [x fval] = fminsearch ( rosenbrock , [-1.2 1] , opt );
153 close(gcf());
154 //
155 // Use optimplotx plot function
156 //
157 opt = optimset ( "PlotFcns" , optimplotx );
158 opt = optimset ( opt , "MaxIter" , 10 );
159 [x fval] = fminsearch ( rosenbrock , [-1.2 1] , opt );
160 close(gcf());
161 //
162 // Use optimplotfunccount plot function
163 //
164 opt = optimset ( "PlotFcns" , optimplotfunccount );
165 opt = optimset ( opt , "MaxIter" , 10 );
166 [x fval] = fminsearch ( rosenbrock , [-1.2 1] , opt );
167 close(gcf());
168
169 //
170 // Use all 3 plot functions
171 //
172 myfunctions = list ( optimplotfval , optimplotx , optimplotfunccount );
173 opt = optimset ( "PlotFcns" , myfunctions );
174 opt = optimset ( opt , "MaxIter" , 10 );
175 [x fval] = fminsearch ( rosenbrock , [-1.2 1] , opt );
176 close(gcf());
177 close(gcf());
178 close(gcf());
179
180 //
181 // Use output function to stop the algorithm.
182 // This sets the exitflag to -1.
183 function stop = outfunStop ( x , optimValues , state )
184     fv = optimValues.fval;
185     stop = ( fv < 1.e-5 )
186 endfunction
187 opt = optimset ( "OutputFcn" , outfunStop);
188 [x , fval , exitflag , output] = fminsearch ( rosenbrock , [-1.2 1] , opt );
189 assert_checkalmostequal ( x , [1.0 1.0], 1.e-2 );
190 assert_checktrue ( fval < 1e-5 );
191 assert_checkequal ( exitflag , -1 );
192
193
194