[optimization] fix tests
[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   "Number of variables : 0"                                     
284   "Initial Guess : []"                                          
285   "Initial Function Value :"                                    
286   "Number of Inequality Constraints :0"                         
287   "Bounds Mininimum : []"                                       
288   "Bounds Maxinimum :[]"                                        
289   "Optimum Parameters : [0]"                                    
290   "Optimum Function Value :0"                                   
291   "Number of iterations : 0"                                    
292   "Maximum number of iterations : 100"                          
293   "Number function evaluations : 0"                             
294   "Maximum number of function evaluations : 100"                
295   "Termination Method on function value : F"                    
296   "Termination Absolute Tolerance on function value : 0"        
297   "Termination Relative Tolerance on function value : 2.220D-16"
298   "Termination Method on x : T"                                 
299   "Termination Absolute Tolerance on x : 0"                     
300   "Termination Relative Tolerance on x : 1.490D-08"             
301   "Optimization Status : "                                      
302   "Verbose logging : 0"                                         
303   "Verbose Termination : 0"                                     
304   "Verbose Log File : "                                         
305   "Verbose Log File Startup Up: F"                              
306   "Store History : F"                                           
307 opt
308  opt  = 
309 Optim Base Object:
310 ==================
311 Number of variables : 0
312 Initial Guess : []
313 Initial Function Value :
314 Number of Inequality Constraints :0
315 Bounds Mininimum : []
316 Bounds Maxinimum :[]
317 Optimum Parameters : [0]
318 Optimum Function Value :0
319 Number of iterations : 0
320 Maximum number of iterations : 100
321 Number function evaluations : 0
322 Maximum number of function evaluations : 100
323 Termination Method on function value : F
324 Termination Absolute Tolerance on function value : 0
325 Termination Relative Tolerance on function value : 2.220D-16
326 Termination Method on x : T
327 Termination Absolute Tolerance on x : 0
328 Termination Relative Tolerance on x : 1.490D-08
329 Optimization Status : 
330 Verbose logging : 0
331 Verbose Termination : 0
332 Verbose Log File : 
333 Verbose Log File Startup Up: F
334 Store History : F
335 opt = optimbase_destroy(opt);