Fix test in optimization module: test_run('optimization', 'optimbase_checkcostfun')
[scilab.git] / scilab / modules / optimization / tests / unit_tests / optimbase / optimbase_newdestroy.dia.ref
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 // This file must be used under the terms of the CeCILL.
6 // This source file is licensed as described in the file COPYING, which
7 // you should have received as part of this distribution.  The terms
8 // are also available at
9 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10 // <-- CLI SHELL MODE -->
11 function [ y , index ] = rosenbrock ( x , index )
12   y = 100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
13 endfunction
14 //
15 // myoutputcmd --
16 //  This command is called back by the Optimization 
17 //  algorithm.
18 // Arguments
19 //  state : the current state of the algorithm
20 //    "init", "iter", "done"
21 //  data : the data at the current state
22 //    This is a tlist with the following entries:
23 //    * x : the optimal vector of parameters
24 //    * fval : the minimum function value
25 //    * iteration : the number of iterations performed
26 //    * funccount : the number of function evaluations
27 // stop : set to %f to interrupt algorithm
28 //
29 function stop = myoutputcmd ( state , data )
30   global _OUTPUCMDFLAG_
31   // Unload the array, just to make sure that the minimum is there
32   iter = data.iteration
33   fc = data.funccount
34   fval = data.fval
35   x = data.x
36   _OUTPUCMDFLAG_ = 1
37   stop = %f
38 endfunction
39 global _OUTPUCMDFLAG_
40 _OUTPUCMDFLAG_ = 0
41  _OUTPUCMDFLAG_  =
42  
43     0.  
44 //
45 // myoutputcmd2 --
46 //  This command is called back by the Optimization 
47 //  algorithm.
48 // Arguments
49 //  state : the current state of the algorithm
50 //    "init", "iter", "done"
51 //  data : the data at the current state
52 //    This is a tlist with the following entries:
53 //    * x : the optimal vector of parameters
54 //    * fval : the minimum function value
55 //    * iteration : the number of iterations performed
56 //    * funccount : the number of function evaluations
57 //  myobj : a user-defined data structure
58 // stop : set to %f to interrupt algorithm
59 //
60 function stop = myoutputcmd2 ( state , data , myobj )
61   global _OUTPUCMDFLAG_
62   // Unload the array, just to make sure that the minimum is there
63   iter = data.iteration
64   fc   = data.funccount
65   fval = data.fval
66   x    = data.x
67   _OUTPUCMDFLAG_ = myobj.myarg
68   stop = %f
69 endfunction
70 global _OUTPUCMDFLAG_
71 _OUTPUCMDFLAG_ = 0
72  _OUTPUCMDFLAG_  =
73  
74     0.  
75 myobj = tlist(["T_MYSTUFF","myarg"]);
76 myobj.myarg = 12;
77 //
78 // In this case, the mydata variable is passed
79 // explicitely by the optimization class.
80 // So the actual name "mydata" does not matter
81 // and whatever variable name can be used.
82 //
83 function [ y , index ] = rosenbrock2 ( x , index , mydata )
84   a = mydata.a
85   y = 100*(x(2)-x(1)^2)^2 + ( a - x(1))^2;
86 endfunction
87 //
88 // Test with an additional argument
89 //
90 mystuff = tlist(["T_MYSTUFF","a"]);
91 mystuff.a = 12.0;
92 //
93 // Test nearly all features of the optimization "abstract" class
94 //
95 opt = optimbase_new ();
96 // Check number of variables
97 opt = optimbase_configure(opt,"-numberofvariables",2);
98 nbvar = optimbase_cget(opt,"-numberofvariables");
99 assert_checkequal ( nbvar , 2 );
100 // Check cost function without additionnal argument
101 opt = optimbase_configure(opt,"-function",rosenbrock);
102 [this,f , index ] = optimbase_function ( opt , [0.0 0.0] , 2 );
103 assert_checkalmostequal ( f , 1.0 , %eps );
104 // Check cost function with additionnal argument
105 opt = optimbase_configure(opt,"-function",list(rosenbrock2,mystuff));
106 [this,f, index ] = optimbase_function ( opt , [0.0 0.0] , 2 );
107 assert_checkalmostequal ( f , 144.0 , %eps );
108 // Check initial guess
109 opt = optimbase_configure(opt,"-x0",[-1.2 1.0]');
110 x0 = optimbase_cget(opt,"-x0");
111 assert_checkalmostequal ( x0 , [-1.2 1.0]' , %eps);
112 // Check maxiter
113 opt = optimbase_configure(opt,"-maxiter",200);
114 maxiter = optimbase_cget(opt,"-maxiter");
115 assert_checkequal ( maxiter , 200);
116 // Check maxfunevals
117 opt = optimbase_configure(opt,"-maxfunevals",200);
118 maxfunevals = optimbase_cget(opt,"-maxfunevals");
119 assert_checkequal ( maxfunevals , 200);
120 // Check tolfunrelative
121 opt = optimbase_configure(opt,"-tolfunrelative",10*%eps);
122 tolfunrelative = optimbase_cget(opt,"-tolfunrelative");
123 assert_checkequal ( tolfunrelative , 10*%eps );
124 // Check tolxrelative
125 opt = optimbase_configure(opt,"-tolxrelative",10*%eps);
126 tolxrelative = optimbase_cget(opt,"-tolxrelative");
127 assert_checkequal ( tolxrelative , 10*%eps );
128 // Check verbose
129 opt = optimbase_configure(opt,"-verbose",1);
130 verbose = optimbase_cget(opt,"-verbose");
131 assert_checkequal ( verbose , 1 );
132 opt = optimbase_configure(opt,"-verbose",0);
133 // Check verbose termination
134 opt = optimbase_configure(opt,"-verbosetermination",1);
135 verbosetermination = optimbase_cget(opt,"-verbosetermination");
136 assert_checkequal ( verbosetermination , 1 );
137 opt = optimbase_configure(opt,"-verbosetermination",0);
138 // Check optimum
139 opt = optimbase_set(opt,"-xopt",[1.0 1.0]);
140 xopt = optimbase_get(opt,"-xopt");
141 assert_checkalmostequal ( xopt , [1.0 1.0], %eps );
142 // Check function value at optimum
143 opt = optimbase_set(opt,"-fopt",1.0);
144 fopt = optimbase_get(opt,"-fopt");
145 assert_checkalmostequal ( fopt , 1.0 , %eps );
146 // Check status
147 opt = optimbase_set(opt,"-status","maxiter");
148 status = optimbase_get(opt,"-status");
149 assert_checkequal ( status , "maxiter" );
150 // Log a message
151 opt = optimbase_configure(opt,"-verbose",1);
152 opt = optimbase_log ( opt , "My interesting message" );
153 My interesting message
154 opt = optimbase_configure(opt,"-verbose",0);
155 // Log a message relative to the stopping rule
156 opt = optimbase_configure(opt,"-verbosetermination",1);
157 opt = optimbase_stoplog ( opt , "My interesting stop message" );
158 opt = optimbase_configure(opt,"-verbosetermination",0);
159 // Check output command without additionnal argument
160 opt = optimbase_configure(opt,"-outputcommand",myoutputcmd);
161 brutedata = optimbase_outstruct ( opt );
162 mydata = tlist(["T_MYDATA",...
163       "x","fval","iteration","funccount",...
164       "myspecialdata"]);
165 mydata.x = brutedata.x;
166 mydata.fval = brutedata.fval;
167 mydata.iteration = brutedata.iteration;
168 mydata.funccount = brutedata.funccount;
169 mydata.myspecialdata = "yahoo !";
170 optimbase_outputcmd ( opt , "init" , mydata );
171 assert_checkequal ( _OUTPUCMDFLAG_ , 1 );
172 // Check output command with additionnal argument
173 opt = optimbase_configure(opt,"-outputcommand",list(myoutputcmd2,myobj));
174 brutedata = optimbase_outstruct ( opt );
175 mydata = tlist(["T_MYDATA",...
176       "x","fval","iteration","funccount",...
177       "myspecialdata"]);
178 mydata.x = brutedata.x;
179 mydata.fval = brutedata.fval;
180 mydata.iteration = brutedata.iteration;
181 mydata.funccount = brutedata.funccount;
182 mydata.myspecialdata = "yahoo !";
183 optimbase_outputcmd ( opt , "init" , mydata );
184 assert_checkequal ( _OUTPUCMDFLAG_ , 12. );
185 // Check incriter
186 opt = optimbase_incriter ( opt );
187 iter = optimbase_get ( opt , "-iterations");
188 assert_checkequal ( iter , 1 );
189 // Check history storing with xopt
190 opt = optimbase_configure ( opt , "-storehistory" , %t );
191 opt = optimbase_histset ( opt , 1 , "-xopt" , [1.0 1.0]' );
192 x0 = optimbase_histget ( opt , 1 , "-xopt" );
193 assert_checkalmostequal ( x0 , [1.0 1.0]', %eps );
194 // Check history storing with fopt
195 opt = optimbase_configure ( opt , "-storehistory" , %t );
196 opt = optimbase_histset ( opt , 1 , "-fopt" , 1.0 );
197 f0 = optimbase_histget ( opt , 1 , "-fopt" );
198 assert_checkalmostequal ( f0 , 1.0, %eps );
199 // Check the boundsmin, boundsmax and nbineqconst
200 opt = optimbase_configure ( opt , "-boundsmin" , [-5.0 -5.0] );
201 boundsmin = optimbase_cget ( opt , "-boundsmin" );
202 assert_checkequal ( boundsmin , [-5.0 -5.0] );
203 opt = optimbase_configure ( opt , "-boundsmax" , [5.0 5.0] );
204 boundsmax = optimbase_cget ( opt , "-boundsmax" );
205 assert_checkequal ( boundsmax , [5.0 5.0] );
206 opt = optimbase_configure ( opt , "-nbineqconst" , 3 );
207 nbineqconst = optimbase_cget ( opt , "-nbineqconst" );
208 assert_checkequal ( nbineqconst , 3 );
209 // Cleanup
210 opt = optimbase_destroy(opt);
211 //
212 // Test error cases
213 //
214 opt = optimbase_new ();
215 //
216 // Test wrong initial guess
217 //
218 cmd = "optimbase_configure(opt,''-x0'',[-1.2 1.0; -1.0 1.2])";
219 assert_checkerror(cmd,"%s: Wrong size for x0 argument: A vector expected.", [], "optimbase_configure");
220 //
221 // Test wrong -tolxmethod
222 //
223 cmd = "optimbase_configure(opt,''-tolxmethod'',''foo'')";
224 assert_checkerror(cmd,"%s: Expected boolean but for variable %s at input #%d, got %s instead.",[],"optimbase_typeboolean","value",3,"string");
225 //
226 // Test wrong -tolfunmethod
227 //
228 cmd = "optimbase_configure(opt,''-tolfunmethod'',''foo'')";
229 assert_checkerror(cmd,"%s: Expected boolean but for variable %s at input #%d, got %s instead.",[],"optimbase_typeboolean","value",3,"string");
230 opt = optimbase_destroy(opt);
231 //
232 // Test outstruct when no -outputcommand is defined
233 //
234 opt = optimbase_new ();
235 cmd = "data = optimbase_outstruct ( opt )";
236 assert_checkerror(cmd,"%s: No output command is defined.",[], "optimbase_outstruct");
237 opt = optimbase_destroy(opt);
238 //
239 // Test optimbase_cget with unknown key
240 //
241 opt = optimbase_new ();
242 cmd = "value = optimbase_cget (opt,''foo'')";
243 assert_checkerror(cmd,"%s: Unknown key %s",[],"optimbase_cget" , "foo");
244 opt = optimbase_destroy(opt);
245 //
246 // Test optimbase_get with unknown key
247 //
248 opt = optimbase_new ();
249 cmd = "value = optimbase_get (opt,''foo'')";
250 assert_checkerror(cmd,"%s: Unknown key %s",[],"optimbase_get" , "foo");
251 opt = optimbase_destroy(opt);
252 //
253 // Test various errors 
254 //
255 opt = optimbase_new ();
256 // Test -historyxopt when there is no history
257 cmd = "value = optimbase_get (opt,''-historyxopt'')";
258 assert_checkerror(cmd,"%s: History disabled ; enable -storehistory option.",[],"optimbase_get");
259 // Test -historyfopt when there is no history
260 cmd = "value = optimbase_get (opt,''-historyfopt'')";
261 assert_checkerror(cmd,"%s: History disabled ; enable -storehistory option.",[],"optimbase_get");
262 // Test optimbase_function when there is no function
263 cmd = "[ opt , f , index ] = optimbase_function ( opt , [] , %t )";
264 assert_checkerror(cmd,"%s: Empty function (use -function option).",[],"optimbase_function");
265 // Test optimbase_histget ( this , iter , key ) when there is no history
266 cmd = "optimbase_histget ( opt , 1 , ''-xopt'' )";
267 assert_checkerror(cmd,"%s: History disabled ; turn on -storehistory option.",[],"optimbase_histget");
268 // Test optimbase_histget ( this , iter , key ) with negative iteration
269 opt = optimbase_configure ( opt , "-storehistory" , %t );
270 cmd = "optimbase_histget ( opt , -1 , ''-xopt'' )";
271 assert_checkerror(cmd,"%s: Negative iteration index %d is not allowed.",[],"optimbase_histget",-1);
272 // Cleanup
273 opt = optimbase_destroy(opt);
274 //
275 // Test the printing system
276 //
277 opt = optimbase_new ();
278 string(opt)
279  ans  =
280  
281 !Optim Base Object:                                            !
282 !                                                              !
283 !==================                                            !
284 !                                                              !
285 !Number of variables : 0                                       !
286 !                                                              !
287 !Initial Guess : []                                            !
288 !                                                              !
289 !Initial Function Value :                                      !
290 !                                                              !
291 !Number of Inequality Constraints :0                           !
292 !                                                              !
293 !Bounds Mininimum : []                                         !
294 !                                                              !
295 !Bounds Maxinimum :[]                                          !
296 !                                                              !
297 !Optimum Parameters : [0]                                      !
298 !                                                              !
299 !Optimum Function Value :0                                     !
300 !                                                              !
301 !Number of iterations : 0                                      !
302 !                                                              !
303 !Maximum number of iterations : 100                            !
304 !                                                              !
305 !Number function evaluations : 0                               !
306 !                                                              !
307 !Maximum number of function evaluations : 100                  !
308 !                                                              !
309 !Termination Method on function value : F                      !
310 !                                                              !
311 !Termination Absolute Tolerance on function value : 0          !
312 !                                                              !
313 !Termination Relative Tolerance on function value : 2.220D-16  !
314 !                                                              !
315 !Termination Method on x : T                                   !
316 !                                                              !
317 !Termination Absolute Tolerance on x : 0                       !
318 !                                                              !
319 !Termination Relative Tolerance on x : 1.490D-08               !
320 !                                                              !
321 !Optimization Status :                                         !
322 !                                                              !
323 !Verbose logging : 0                                           !
324 !                                                              !
325 !Verbose Termination : 0                                       !
326 !                                                              !
327 !Verbose Log File :                                            !
328 !                                                              !
329 !Verbose Log File Startup Up: F                                !
330 !                                                              !
331 !Store History : F                                             !
332 opt
333  opt  =
334  
335 Optim Base Object:
336 ==================
337 Number of variables : 0
338 Initial Guess : []
339 Initial Function Value :
340 Number of Inequality Constraints :0
341 Bounds Mininimum : []
342 Bounds Maxinimum :[]
343 Optimum Parameters : [0]
344 Optimum Function Value :0
345 Number of iterations : 0
346 Maximum number of iterations : 100
347 Number function evaluations : 0
348 Maximum number of function evaluations : 100
349 Termination Method on function value : F
350 Termination Absolute Tolerance on function value : 0
351 Termination Relative Tolerance on function value : 2.220D-16
352 Termination Method on x : T
353 Termination Absolute Tolerance on x : 0
354 Termination Relative Tolerance on x : 1.490D-08
355 Optimization Status : 
356 Verbose logging : 0
357 Verbose Termination : 0
358 Verbose Log File : 
359 Verbose Log File Startup Up: F
360 Store History : F
361 opt = optimbase_destroy(opt);