0cdd69f902e5062c8ab2af1dcc24871253c1f367
[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 // 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 // <-- CLI SHELL MODE -->
14 function [ y , index ] = rosenbrock ( x , index )
15     y = 100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
16 endfunction
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 global _OUTPUCMDFLAG_
43 _OUTPUCMDFLAG_ = 0
44  _OUTPUCMDFLAG_  = 
45    0.
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 global _OUTPUCMDFLAG_
73 _OUTPUCMDFLAG_ = 0
74  _OUTPUCMDFLAG_  = 
75    0.
76 myobj = tlist(["T_MYSTUFF","myarg"]);
77 myobj.myarg = 12;
78 //
79 // In this case, the mydata variable is passed
80 // explicitely by the optimization class.
81 // So the actual name "mydata" does not matter
82 // and whatever variable name can be used.
83 //
84 function [ y , index ] = rosenbrock2 ( x , index , mydata )
85     a = mydata.a
86     y = 100*(x(2)-x(1)^2)^2 + ( a - x(1))^2;
87 endfunction
88 //
89 // Test with an additional argument
90 //
91 mystuff = tlist(["T_MYSTUFF","a"]);
92 mystuff.a = 12.0;
93 //
94 // Test nearly all features of the optimization "abstract" class
95 //
96 opt = optimbase_new ();
97 // Check number of variables
98 opt = optimbase_configure(opt,"-numberofvariables",2);
99 nbvar = optimbase_cget(opt,"-numberofvariables");
100 assert_checkequal ( nbvar , 2 );
101 // Check cost function without additional argument
102 opt = optimbase_configure(opt,"-function",rosenbrock);
103 [this,f , index ] = optimbase_function ( opt , [0.0 0.0] , 2 );
104 assert_checkalmostequal ( f , 1.0 , %eps );
105 // Check cost function with additional argument
106 opt = optimbase_configure(opt,"-function",list(rosenbrock2,mystuff));
107 [this,f, index ] = optimbase_function ( opt , [0.0 0.0] , 2 );
108 assert_checkalmostequal ( f , 144.0 , %eps );
109 // Check initial guess
110 opt = optimbase_configure(opt,"-x0",[-1.2 1.0]');
111 x0 = optimbase_cget(opt,"-x0");
112 assert_checkalmostequal ( x0 , [-1.2 1.0]' , %eps);
113 // Check maxiter
114 opt = optimbase_configure(opt,"-maxiter",200);
115 maxiter = optimbase_cget(opt,"-maxiter");
116 assert_checkequal ( maxiter , 200);
117 // Check maxfunevals
118 opt = optimbase_configure(opt,"-maxfunevals",200);
119 maxfunevals = optimbase_cget(opt,"-maxfunevals");
120 assert_checkequal ( maxfunevals , 200);
121 // Check tolfunrelative
122 opt = optimbase_configure(opt,"-tolfunrelative",10*%eps);
123 tolfunrelative = optimbase_cget(opt,"-tolfunrelative");
124 assert_checkequal ( tolfunrelative , 10*%eps );
125 // Check tolxrelative
126 opt = optimbase_configure(opt,"-tolxrelative",10*%eps);
127 tolxrelative = optimbase_cget(opt,"-tolxrelative");
128 assert_checkequal ( tolxrelative , 10*%eps );
129 // Check verbose
130 opt = optimbase_configure(opt,"-verbose",1);
131 verbose = optimbase_cget(opt,"-verbose");
132 assert_checkequal ( verbose , 1 );
133 opt = optimbase_configure(opt,"-verbose",0);
134 // Check verbose termination
135 opt = optimbase_configure(opt,"-verbosetermination",1);
136 verbosetermination = optimbase_cget(opt,"-verbosetermination");
137 assert_checkequal ( verbosetermination , 1 );
138 opt = optimbase_configure(opt,"-verbosetermination",0);
139 // Check optimum
140 opt = optimbase_set(opt,"-xopt",[1.0 1.0]);
141 xopt = optimbase_get(opt,"-xopt");
142 assert_checkalmostequal ( xopt , [1.0 1.0], %eps );
143 // Check function value at optimum
144 opt = optimbase_set(opt,"-fopt",1.0);
145 fopt = optimbase_get(opt,"-fopt");
146 assert_checkalmostequal ( fopt , 1.0 , %eps );
147 // Check status
148 opt = optimbase_set(opt,"-status","maxiter");
149 status = optimbase_get(opt,"-status");
150 assert_checkequal ( status , "maxiter" );
151 // Log a message
152 opt = optimbase_configure(opt,"-verbose",1);
153 opt = optimbase_log ( opt , "My interesting message" );
154 My interesting message
155 opt = optimbase_configure(opt,"-verbose",0);
156 // Log a message relative to the stopping rule
157 opt = optimbase_configure(opt,"-verbosetermination",1);
158 opt = optimbase_stoplog ( opt , "My interesting stop message" );
159 opt = optimbase_configure(opt,"-verbosetermination",0);
160 // Check output command without additional argument
161 opt = optimbase_configure(opt,"-outputcommand",myoutputcmd);
162 brutedata = optimbase_outstruct ( opt );
163 mydata = tlist(["T_MYDATA",...
164 "x","fval","iteration","funccount",...
165 "myspecialdata"]);
166 mydata.x = brutedata.x;
167 mydata.fval = brutedata.fval;
168 mydata.iteration = brutedata.iteration;
169 mydata.funccount = brutedata.funccount;
170 mydata.myspecialdata = "yahoo !";
171 optimbase_outputcmd ( opt , "init" , mydata );
172 assert_checkequal ( _OUTPUCMDFLAG_ , 1 );
173 // Check output command with additional argument
174 opt = optimbase_configure(opt,"-outputcommand",list(myoutputcmd2,myobj));
175 brutedata = optimbase_outstruct ( opt );
176 mydata = tlist(["T_MYDATA",...
177 "x","fval","iteration","funccount",...
178 "myspecialdata"]);
179 mydata.x = brutedata.x;
180 mydata.fval = brutedata.fval;
181 mydata.iteration = brutedata.iteration;
182 mydata.funccount = brutedata.funccount;
183 mydata.myspecialdata = "yahoo !";
184 optimbase_outputcmd ( opt , "init" , mydata );
185 assert_checkequal ( _OUTPUCMDFLAG_ , 12. );
186 // Check incriter
187 opt = optimbase_incriter ( opt );
188 iter = optimbase_get ( opt , "-iterations");
189 assert_checkequal ( iter , 1 );
190 // Check history storing with xopt
191 opt = optimbase_configure ( opt , "-storehistory" , %t );
192 opt = optimbase_histset ( opt , 1 , "-xopt" , [1.0 1.0]' );
193 x0 = optimbase_histget ( opt , 1 , "-xopt" );
194 assert_checkalmostequal ( x0 , [1.0 1.0]', %eps );
195 // Check history storing with fopt
196 opt = optimbase_configure ( opt , "-storehistory" , %t );
197 opt = optimbase_histset ( opt , 1 , "-fopt" , 1.0 );
198 f0 = optimbase_histget ( opt , 1 , "-fopt" );
199 assert_checkalmostequal ( f0 , 1.0, %eps );
200 // Check the boundsmin, boundsmax and nbineqconst
201 opt = optimbase_configure ( opt , "-boundsmin" , [-5.0 -5.0] );
202 boundsmin = optimbase_cget ( opt , "-boundsmin" );
203 assert_checkequal ( boundsmin , [-5.0 -5.0] );
204 opt = optimbase_configure ( opt , "-boundsmax" , [5.0 5.0] );
205 boundsmax = optimbase_cget ( opt , "-boundsmax" );
206 assert_checkequal ( boundsmax , [5.0 5.0] );
207 opt = optimbase_configure ( opt , "-nbineqconst" , 3 );
208 nbineqconst = optimbase_cget ( opt , "-nbineqconst" );
209 assert_checkequal ( nbineqconst , 3 );
210 // Cleanup
211 opt = optimbase_destroy(opt);
212 //
213 // Test error cases
214 //
215 opt = optimbase_new ();
216 //
217 // Test wrong initial guess
218 //
219 cmd = "optimbase_configure(opt,''-x0'',[-1.2 1.0; -1.0 1.2])";
220 assert_checkerror(cmd,"%s: Wrong size for x0 argument: A vector expected.", [], "optimbase_configure");
221 //
222 // Test wrong -tolxmethod
223 //
224 cmd = "optimbase_configure(opt,''-tolxmethod'',''foo'')";
225 assert_checkerror(cmd,"%s: Expected boolean but for variable %s at input #%d, got %s instead.",[],"optimbase_typeboolean","value",3,"string");
226 //
227 // Test wrong -tolfunmethod
228 //
229 cmd = "optimbase_configure(opt,''-tolfunmethod'',''foo'')";
230 assert_checkerror(cmd,"%s: Expected boolean but for variable %s at input #%d, got %s instead.",[],"optimbase_typeboolean","value",3,"string");
231 opt = optimbase_destroy(opt);
232 //
233 // Test outstruct when no -outputcommand is defined
234 //
235 opt = optimbase_new ();
236 cmd = "data = optimbase_outstruct ( opt )";
237 assert_checkerror(cmd,"%s: No output command is defined.",[], "optimbase_outstruct");
238 opt = optimbase_destroy(opt);
239 //
240 // Test optimbase_cget with unknown key
241 //
242 opt = optimbase_new ();
243 cmd = "value = optimbase_cget (opt,''foo'')";
244 assert_checkerror(cmd,"%s: Unknown key %s",[],"optimbase_cget" , "foo");
245 opt = optimbase_destroy(opt);
246 //
247 // Test optimbase_get with unknown key
248 //
249 opt = optimbase_new ();
250 cmd = "value = optimbase_get (opt,''foo'')";
251 assert_checkerror(cmd,"%s: Unknown key %s",[],"optimbase_get" , "foo");
252 opt = optimbase_destroy(opt);
253 //
254 // Test various errors
255 //
256 opt = optimbase_new ();
257 // Test -historyxopt when there is no history
258 cmd = "value = optimbase_get (opt,''-historyxopt'')";
259 assert_checkerror(cmd,"%s: History disabled ; enable -storehistory option.",[],"optimbase_get");
260 // Test -historyfopt when there is no history
261 cmd = "value = optimbase_get (opt,''-historyfopt'')";
262 assert_checkerror(cmd,"%s: History disabled ; enable -storehistory option.",[],"optimbase_get");
263 // Test optimbase_function when there is no function
264 cmd = "[ opt , f , index ] = optimbase_function ( opt , [] , %t )";
265 assert_checkerror(cmd,"%s: Empty function (use -function option).",[],"optimbase_function");
266 // Test optimbase_histget ( this , iter , key ) when there is no history
267 cmd = "optimbase_histget ( opt , 1 , ''-xopt'' )";
268 assert_checkerror(cmd,"%s: History disabled ; turn on -storehistory option.",[],"optimbase_histget");
269 // Test optimbase_histget ( this , iter , key ) with negative iteration
270 opt = optimbase_configure ( opt , "-storehistory" , %t );
271 cmd = "optimbase_histget ( opt , -1 , ''-xopt'' )";
272 assert_checkerror(cmd,"%s: Negative iteration index %d is not allowed.",[],"optimbase_histget",-1);
273 // Cleanup
274 opt = optimbase_destroy(opt);
275 //
276 // Test the printing system
277 //
278 opt = optimbase_new ();
279 string(opt)
280  ans  =
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 Optim Base Object:
335 ==================
336 Number of variables : 0
337 Initial Guess : []
338 Initial Function Value :
339 Number of Inequality Constraints :0
340 Bounds Mininimum : []
341 Bounds Maxinimum :[]
342 Optimum Parameters : [0]
343 Optimum Function Value :0
344 Number of iterations : 0
345 Maximum number of iterations : 100
346 Number function evaluations : 0
347 Maximum number of function evaluations : 100
348 Termination Method on function value : F
349 Termination Absolute Tolerance on function value : 0
350 Termination Relative Tolerance on function value : 2.220D-16
351 Termination Method on x : T
352 Termination Absolute Tolerance on x : 0
353 Termination Relative Tolerance on x : 1.490D-08
354 Optimization Status : 
355 Verbose logging : 0
356 Verbose Termination : 0
357 Verbose Log File : 
358 Verbose Log File Startup Up: F
359 Store History : F
360 opt = optimbase_destroy(opt);