Fix test in optimization module: test_run('optimization', 'optimbase_checkcostfun')
[scilab.git] / scilab / modules / optimization / tests / unit_tests / optimbase / optimbase_newdestroy.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 // 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
11 // <-- CLI SHELL MODE -->
12
13 function [ y , index ] = rosenbrock ( x , index )
14   y = 100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
15 endfunction
16
17 //
18 // myoutputcmd --
19 //  This command is called back by the Optimization 
20 //  algorithm.
21 // Arguments
22 //  state : the current state of the algorithm
23 //    "init", "iter", "done"
24 //  data : the data at the current state
25 //    This is a tlist with the following entries:
26 //    * x : the optimal vector of parameters
27 //    * fval : the minimum function value
28 //    * iteration : the number of iterations performed
29 //    * funccount : the number of function evaluations
30 // stop : set to %f to interrupt algorithm
31 //
32 function stop = myoutputcmd ( state , data )
33   global _OUTPUCMDFLAG_
34   // Unload the array, just to make sure that the minimum is there
35   iter = data.iteration
36   fc = data.funccount
37   fval = data.fval
38   x = data.x
39   _OUTPUCMDFLAG_ = 1
40   stop = %f
41 endfunction
42
43 global _OUTPUCMDFLAG_
44 _OUTPUCMDFLAG_ = 0
45
46 //
47 // myoutputcmd2 --
48 //  This command is called back by the Optimization 
49 //  algorithm.
50 // Arguments
51 //  state : the current state of the algorithm
52 //    "init", "iter", "done"
53 //  data : the data at the current state
54 //    This is a tlist with the following entries:
55 //    * x : the optimal vector of parameters
56 //    * fval : the minimum function value
57 //    * iteration : the number of iterations performed
58 //    * funccount : the number of function evaluations
59 //  myobj : a user-defined data structure
60 // stop : set to %f to interrupt algorithm
61 //
62 function stop = myoutputcmd2 ( state , data , myobj )
63   global _OUTPUCMDFLAG_
64   // Unload the array, just to make sure that the minimum is there
65   iter = data.iteration
66   fc   = data.funccount
67   fval = data.fval
68   x    = data.x
69   _OUTPUCMDFLAG_ = myobj.myarg
70   stop = %f
71 endfunction
72
73
74 global _OUTPUCMDFLAG_
75 _OUTPUCMDFLAG_ = 0
76
77 myobj = tlist(["T_MYSTUFF","myarg"]);
78 myobj.myarg = 12;
79
80 //
81 // In this case, the mydata variable is passed
82 // explicitely by the optimization class.
83 // So the actual name "mydata" does not matter
84 // and whatever variable name can be used.
85 //
86 function [ y , index ] = rosenbrock2 ( x , index , mydata )
87   a = mydata.a
88   y = 100*(x(2)-x(1)^2)^2 + ( a - x(1))^2;
89 endfunction
90
91 //
92 // Test with an additional argument
93 //
94 mystuff = tlist(["T_MYSTUFF","a"]);
95 mystuff.a = 12.0;
96
97 //
98 // Test nearly all features of the optimization "abstract" class
99 //
100
101 opt = optimbase_new ();
102 // Check number of variables
103 opt = optimbase_configure(opt,"-numberofvariables",2);
104 nbvar = optimbase_cget(opt,"-numberofvariables");
105 assert_checkequal ( nbvar , 2 );
106 // Check cost function without additionnal argument
107 opt = optimbase_configure(opt,"-function",rosenbrock);
108 [this,f , index ] = optimbase_function ( opt , [0.0 0.0] , 2 );
109 assert_checkalmostequal ( f , 1.0 , %eps );
110 // Check cost function with additionnal argument
111 opt = optimbase_configure(opt,"-function",list(rosenbrock2,mystuff));
112 [this,f, index ] = optimbase_function ( opt , [0.0 0.0] , 2 );
113 assert_checkalmostequal ( f , 144.0 , %eps );
114 // Check initial guess
115 opt = optimbase_configure(opt,"-x0",[-1.2 1.0]');
116 x0 = optimbase_cget(opt,"-x0");
117 assert_checkalmostequal ( x0 , [-1.2 1.0]' , %eps);
118 // Check maxiter
119 opt = optimbase_configure(opt,"-maxiter",200);
120 maxiter = optimbase_cget(opt,"-maxiter");
121 assert_checkequal ( maxiter , 200);
122 // Check maxfunevals
123 opt = optimbase_configure(opt,"-maxfunevals",200);
124 maxfunevals = optimbase_cget(opt,"-maxfunevals");
125 assert_checkequal ( maxfunevals , 200);
126 // Check tolfunrelative
127 opt = optimbase_configure(opt,"-tolfunrelative",10*%eps);
128 tolfunrelative = optimbase_cget(opt,"-tolfunrelative");
129 assert_checkequal ( tolfunrelative , 10*%eps );
130 // Check tolxrelative
131 opt = optimbase_configure(opt,"-tolxrelative",10*%eps);
132 tolxrelative = optimbase_cget(opt,"-tolxrelative");
133 assert_checkequal ( tolxrelative , 10*%eps );
134 // Check verbose
135 opt = optimbase_configure(opt,"-verbose",1);
136 verbose = optimbase_cget(opt,"-verbose");
137 assert_checkequal ( verbose , 1 );
138 opt = optimbase_configure(opt,"-verbose",0);
139 // Check verbose termination
140 opt = optimbase_configure(opt,"-verbosetermination",1);
141 verbosetermination = optimbase_cget(opt,"-verbosetermination");
142 assert_checkequal ( verbosetermination , 1 );
143 opt = optimbase_configure(opt,"-verbosetermination",0);
144 // Check optimum
145 opt = optimbase_set(opt,"-xopt",[1.0 1.0]);
146 xopt = optimbase_get(opt,"-xopt");
147 assert_checkalmostequal ( xopt , [1.0 1.0], %eps );
148 // Check function value at optimum
149 opt = optimbase_set(opt,"-fopt",1.0);
150 fopt = optimbase_get(opt,"-fopt");
151 assert_checkalmostequal ( fopt , 1.0 , %eps );
152 // Check status
153 opt = optimbase_set(opt,"-status","maxiter");
154 status = optimbase_get(opt,"-status");
155 assert_checkequal ( status , "maxiter" );
156 // Log a message
157 opt = optimbase_configure(opt,"-verbose",1);
158 opt = optimbase_log ( opt , "My interesting message" );
159 opt = optimbase_configure(opt,"-verbose",0);
160 // Log a message relative to the stopping rule
161 opt = optimbase_configure(opt,"-verbosetermination",1);
162 opt = optimbase_stoplog ( opt , "My interesting stop message" );
163 opt = optimbase_configure(opt,"-verbosetermination",0);
164 // Check output command without additionnal argument
165 opt = optimbase_configure(opt,"-outputcommand",myoutputcmd);
166 brutedata = optimbase_outstruct ( opt );
167 mydata = tlist(["T_MYDATA",...
168       "x","fval","iteration","funccount",...
169       "myspecialdata"]);
170 mydata.x = brutedata.x;
171 mydata.fval = brutedata.fval;
172 mydata.iteration = brutedata.iteration;
173 mydata.funccount = brutedata.funccount;
174 mydata.myspecialdata = "yahoo !";
175 optimbase_outputcmd ( opt , "init" , mydata );
176 assert_checkequal ( _OUTPUCMDFLAG_ , 1 );
177 // Check output command with additionnal argument
178 opt = optimbase_configure(opt,"-outputcommand",list(myoutputcmd2,myobj));
179 brutedata = optimbase_outstruct ( opt );
180 mydata = tlist(["T_MYDATA",...
181       "x","fval","iteration","funccount",...
182       "myspecialdata"]);
183 mydata.x = brutedata.x;
184 mydata.fval = brutedata.fval;
185 mydata.iteration = brutedata.iteration;
186 mydata.funccount = brutedata.funccount;
187 mydata.myspecialdata = "yahoo !";
188 optimbase_outputcmd ( opt , "init" , mydata );
189 assert_checkequal ( _OUTPUCMDFLAG_ , 12. );
190 // Check incriter
191 opt = optimbase_incriter ( opt );
192 iter = optimbase_get ( opt , "-iterations");
193 assert_checkequal ( iter , 1 );
194 // Check history storing with xopt
195 opt = optimbase_configure ( opt , "-storehistory" , %t );
196 opt = optimbase_histset ( opt , 1 , "-xopt" , [1.0 1.0]' );
197 x0 = optimbase_histget ( opt , 1 , "-xopt" );
198 assert_checkalmostequal ( x0 , [1.0 1.0]', %eps );
199 // Check history storing with fopt
200 opt = optimbase_configure ( opt , "-storehistory" , %t );
201 opt = optimbase_histset ( opt , 1 , "-fopt" , 1.0 );
202 f0 = optimbase_histget ( opt , 1 , "-fopt" );
203 assert_checkalmostequal ( f0 , 1.0, %eps );
204 // Check the boundsmin, boundsmax and nbineqconst
205 opt = optimbase_configure ( opt , "-boundsmin" , [-5.0 -5.0] );
206 boundsmin = optimbase_cget ( opt , "-boundsmin" );
207 assert_checkequal ( boundsmin , [-5.0 -5.0] );
208 opt = optimbase_configure ( opt , "-boundsmax" , [5.0 5.0] );
209 boundsmax = optimbase_cget ( opt , "-boundsmax" );
210 assert_checkequal ( boundsmax , [5.0 5.0] );
211 opt = optimbase_configure ( opt , "-nbineqconst" , 3 );
212 nbineqconst = optimbase_cget ( opt , "-nbineqconst" );
213 assert_checkequal ( nbineqconst , 3 );
214 // Cleanup
215 opt = optimbase_destroy(opt);
216
217 //
218 // Test error cases
219 //
220 opt = optimbase_new ();
221 //
222 // Test wrong initial guess
223 //
224 cmd = "optimbase_configure(opt,''-x0'',[-1.2 1.0; -1.0 1.2])";
225 assert_checkerror(cmd,"%s: Wrong size for x0 argument: A vector expected.", [], "optimbase_configure");
226 //
227 // Test wrong -tolxmethod
228 //
229 cmd = "optimbase_configure(opt,''-tolxmethod'',''foo'')";
230 assert_checkerror(cmd,"%s: Expected boolean but for variable %s at input #%d, got %s instead.",[],"optimbase_typeboolean","value",3,"string");
231 //
232 // Test wrong -tolfunmethod
233 //
234 cmd = "optimbase_configure(opt,''-tolfunmethod'',''foo'')";
235 assert_checkerror(cmd,"%s: Expected boolean but for variable %s at input #%d, got %s instead.",[],"optimbase_typeboolean","value",3,"string");
236 opt = optimbase_destroy(opt);
237
238 //
239 // Test outstruct when no -outputcommand is defined
240 //
241 opt = optimbase_new ();
242 cmd = "data = optimbase_outstruct ( opt )";
243 assert_checkerror(cmd,"%s: No output command is defined.",[], "optimbase_outstruct");
244 opt = optimbase_destroy(opt);
245
246 //
247 // Test optimbase_cget with unknown key
248 //
249 opt = optimbase_new ();
250 cmd = "value = optimbase_cget (opt,''foo'')";
251 assert_checkerror(cmd,"%s: Unknown key %s",[],"optimbase_cget" , "foo");
252 opt = optimbase_destroy(opt);
253
254 //
255 // Test optimbase_get with unknown key
256 //
257 opt = optimbase_new ();
258 cmd = "value = optimbase_get (opt,''foo'')";
259 assert_checkerror(cmd,"%s: Unknown key %s",[],"optimbase_get" , "foo");
260 opt = optimbase_destroy(opt);
261
262 //
263 // Test various errors 
264 //
265 opt = optimbase_new ();
266 // Test -historyxopt when there is no history
267 cmd = "value = optimbase_get (opt,''-historyxopt'')";
268 assert_checkerror(cmd,"%s: History disabled ; enable -storehistory option.",[],"optimbase_get");
269 // Test -historyfopt when there is no history
270 cmd = "value = optimbase_get (opt,''-historyfopt'')";
271 assert_checkerror(cmd,"%s: History disabled ; enable -storehistory option.",[],"optimbase_get");
272 // Test optimbase_function when there is no function
273 cmd = "[ opt , f , index ] = optimbase_function ( opt , [] , %t )";
274 assert_checkerror(cmd,"%s: Empty function (use -function option).",[],"optimbase_function");
275 // Test optimbase_histget ( this , iter , key ) when there is no history
276 cmd = "optimbase_histget ( opt , 1 , ''-xopt'' )";
277 assert_checkerror(cmd,"%s: History disabled ; turn on -storehistory option.",[],"optimbase_histget");
278 // Test optimbase_histget ( this , iter , key ) with negative iteration
279 opt = optimbase_configure ( opt , "-storehistory" , %t );
280 cmd = "optimbase_histget ( opt , -1 , ''-xopt'' )";
281 assert_checkerror(cmd,"%s: Negative iteration index %d is not allowed.",[],"optimbase_histget",-1);
282 // Cleanup
283 opt = optimbase_destroy(opt);
284
285 //
286 // Test the printing system
287 //
288 opt = optimbase_new ();
289 string(opt)
290 opt
291 opt = optimbase_destroy(opt);
292