Fix test in optimization module: test_run('optimization', 'optimbase_checkcostfun')
[scilab.git] / scilab / modules / optimization / tests / unit_tests / optimbase / optimbase_checkcostfun.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 //
14 // Here, the cost function is OK
15 //
16 function [ y , index ] = rosenbrockOk ( x , index )
17   y = 100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
18 endfunction
19 opt = optimbase_new ();
20 opt = optimbase_configure(opt,"-numberofvariables",2);
21 opt = optimbase_configure(opt,"-x0",[1.1 1.1]');
22 opt = optimbase_configure(opt,"-function",rosenbrockOk);
23 opt = optimbase_checkcostfun(opt);
24 opt = optimbase_destroy(opt);
25
26 //
27 // Here, the cost function is not callable
28 //
29 function [ y , index ] = rosenbrock2 ( x , index )
30   y = fdsmklqfjdsf;
31 endfunction
32 opt = optimbase_new ();
33 opt = optimbase_configure(opt,"-numberofvariables",2);
34 opt = optimbase_configure(opt,"-x0",[1.1 1.1]');
35 opt = optimbase_configure(opt,"-function",rosenbrock2);
36 cmd = "opt = optimbase_checkcostfun(opt);";
37 lclmsg = "%s: Cannot evaluate cost function with ""%s"": %s";
38 scimsg = msprintf(_("Undefined variable: %s\n"), "fdsmklqfjdsf");
39 assert_checkerror(cmd,lclmsg,[],"optimbase_checkcostfun","[f,index]=costf(x0,1)", scimsg);
40 opt = optimbase_destroy(opt);
41
42 //
43 // Here, the cost function is callable, but returns a matrix,
44 // instead of a scalar.
45 //
46 function [ y , index ] = rosenbrock3 ( x , index )
47   y = ones(10,10);
48 endfunction
49 opt = optimbase_new ();
50 opt = optimbase_configure(opt,"-numberofvariables",2);
51 opt = optimbase_configure(opt,"-x0",[1.1 1.1]');
52 opt = optimbase_configure(opt,"-function",rosenbrock3);
53 cmd = "opt = optimbase_checkcostfun(opt);";
54 assert_checkerror(cmd,"%s: The matrix %s from costf(x0,%d) has %d rows, instead of %d.",[],"optimbase_checkcostfun","f",2,10,1);
55 opt = optimbase_destroy(opt);
56
57 //
58 // Test with good non linear constraints
59 //
60 function [ f , c , index ] = optimtestcase ( x , index )
61   f = []
62   c = []
63   if ( index == 2 | index == 6 ) then
64     f = x(1)^2 + x(2)^2 + 2.0 * x(3)^2 + x(4)^2 ...
65       - 5.0 * x(1) - 5.0 * x(2) - 21.0 * x(3) + 7.0 * x(4)
66   end
67   if ( index == 5 | index == 6 ) then
68     c1 = - x(1)^2 - x(2)^2 - x(3)^2 - x(4)^2 ...
69               - x(1) + x(2) - x(3) + x(4) + 8
70     c2 = - x(1)^2 - 2.0 * x(2)^2 - x(3)^2 - 2.0 * x(4)^2 ...
71               + x(1) + x(4) + 10.0
72     c3 = - 2.0 * x(1)^2 - x(2)^2 - x(3)^2 - 2.0 * x(1) ...
73               + x(2) + x(4) + 5.0
74     c = [c1 c2 c3]
75   end
76 endfunction
77 opt = optimbase_new ();
78 opt = optimbase_configure(opt,"-numberofvariables",4);
79 opt = optimbase_configure(opt,"-function",optimtestcase);
80 opt = optimbase_configure(opt,"-x0",[0.0 0.0 0.0 0.0]');
81 opt = optimbase_configure(opt,"-nbineqconst",3);
82 opt = optimbase_checkcostfun(opt);
83 opt = optimbase_destroy(opt);
84
85 //
86 // Test a wrong configuration: we forgot to configure "-nbineqconst"
87 //
88 opt = optimbase_new ();
89 opt = optimbase_configure(opt,"-numberofvariables",4);
90 opt = optimbase_configure(opt,"-function",optimtestcase);
91 opt = optimbase_configure(opt,"-x0",[0.0 0.0 0.0 0.0]');
92 cmd="opt = optimbase_checkcostfun(opt)";
93 errmsg = "%s: The matrix %s from costf(x0,%d) has %d rows, instead of %d.";
94 assert_checkerror(cmd,errmsg,[], "optimbase_checkcostfun" , "index" , 1 , 0 , 1);
95 opt = optimbase_destroy(opt);
96
97 //
98 // Test with wrong  non linear constraints f(x0,2) is not a row vector
99 // The cost function transposes the column vector.
100 //
101 function [ f , c , index ] = optimtestcase2 ( x , index )
102   f = []
103   c = []
104   if ( index == 2 | index == 6 ) then
105     f = x(1)^2 + x(2)^2 + 2.0 * x(3)^2 + x(4)^2 ...
106       - 5.0 * x(1) - 5.0 * x(2) - 21.0 * x(3) + 7.0 * x(4)
107   end
108   if ( index == 5 | index == 6 ) then
109     c1 = - x(1)^2 - x(2)^2 - x(3)^2 - x(4)^2 ...
110               - x(1) + x(2) - x(3) + x(4) + 8
111     c2 = - x(1)^2 - 2.0 * x(2)^2 - x(3)^2 - 2.0 * x(4)^2 ...
112               + x(1) + x(4) + 10.0
113     c3 = - 2.0 * x(1)^2 - x(2)^2 - x(3)^2 - 2.0 * x(1) ...
114               + x(2) + x(4) + 5.0
115     c = [c1 c2 c3].'
116   end
117 endfunction
118 opt = optimbase_new ();
119 opt = optimbase_configure(opt,"-numberofvariables",4);
120 opt = optimbase_configure(opt,"-function",optimtestcase2);
121 opt = optimbase_configure(opt,"-x0",[0.0 0.0 0.0 0.0]');
122 opt = optimbase_configure(opt,"-nbineqconst",3);
123 opt = optimbase_checkcostfun(opt);
124 opt = optimbase_destroy(opt);
125
126 //
127 // Test with wrong  non linear constraints f(x0,2) is a row vector with 5 components instead of 3
128 //
129 function [ f , c , index ] = optimtestcase3 ( x , index )
130   f = []
131   c = []
132   if ( index == 2 | index == 6 ) then
133     f = x(1)^2 + x(2)^2 + 2.0 * x(3)^2 + x(4)^2 ...
134       - 5.0 * x(1) - 5.0 * x(2) - 21.0 * x(3) + 7.0 * x(4)
135   end
136   if ( index == 5 | index == 6 ) then
137     c1 = - x(1)^2 - x(2)^2 - x(3)^2 - x(4)^2 ...
138               - x(1) + x(2) - x(3) + x(4) + 8
139     c2 = - x(1)^2 - 2.0 * x(2)^2 - x(3)^2 - 2.0 * x(4)^2 ...
140               + x(1) + x(4) + 10.0
141     c3 = - 2.0 * x(1)^2 - x(2)^2 - x(3)^2 - 2.0 * x(1) ...
142               + x(2) + x(4) + 5.0
143     c = [c1 c2 c3 0.0 0.0]
144   end
145 endfunction
146 opt = optimbase_new ();
147 opt = optimbase_configure(opt,"-numberofvariables",4);
148 opt = optimbase_configure(opt,"-function",optimtestcase3);
149 opt = optimbase_configure(opt,"-x0",[0.0 0.0 0.0 0.0]');
150 opt = optimbase_configure(opt,"-nbineqconst",3);
151 cmd = "opt = optimbase_checkcostfun(opt);";
152 assert_checkerror(cmd,"%s: The matrix %s from costf(x0,%d) has %d columns, instead of %d.",[],"optimbase_checkcostfun","c",5,5,3);
153 opt = optimbase_destroy(opt);
154
155 //
156 // Test with wrong  non linear constraints f(x0,3) is a column vector
157 // The cost function transposes the column vector.
158 //
159 function [ f , c , index ] = optimtestcase4 ( x , index )
160   f = []
161   c = []
162   if ( index == 2 | index == 6 ) then
163     f = x(1)^2 + x(2)^2 + 2.0 * x(3)^2 + x(4)^2 ...
164       - 5.0 * x(1) - 5.0 * x(2) - 21.0 * x(3) + 7.0 * x(4)
165   end
166   if ( index == 5 | index == 6 ) then
167     c1 = - x(1)^2 - x(2)^2 - x(3)^2 - x(4)^2 ...
168               - x(1) + x(2) - x(3) + x(4) + 8
169     c2 = - x(1)^2 - 2.0 * x(2)^2 - x(3)^2 - 2.0 * x(4)^2 ...
170               + x(1) + x(4) + 10.0
171     c3 = - 2.0 * x(1)^2 - x(2)^2 - x(3)^2 - 2.0 * x(1) ...
172               + x(2) + x(4) + 5.0
173     c = [c1 c2 c3].'
174   end
175 endfunction
176 opt = optimbase_new ();
177 opt = optimbase_configure(opt,"-numberofvariables",4);
178 opt = optimbase_configure(opt,"-function",optimtestcase4);
179 opt = optimbase_configure(opt,"-x0",[0.0 0.0 0.0 0.0]');
180 opt = optimbase_configure(opt,"-nbineqconst",3);
181 opt = optimbase_checkcostfun(opt);
182 opt = optimbase_destroy(opt);
183
184 //
185 // Test with wrong  non linear constraints f(x0,3) is a row vector with 5 columns instead of 4
186 //
187 function [ f , c , index ] = optimtestcase5 ( x , index )
188   f = []
189   c = []
190   if ( index == 2 | index == 6 ) then
191     f = x(1)^2 + x(2)^2 + 2.0 * x(3)^2 + x(4)^2 ...
192       - 5.0 * x(1) - 5.0 * x(2) - 21.0 * x(3) + 7.0 * x(4)
193   end
194   if ( index == 5 | index == 6 ) then
195     c1 = - x(1)^2 - x(2)^2 - x(3)^2 - x(4)^2 ...
196               - x(1) + x(2) - x(3) + x(4) + 8
197     c2 = - x(1)^2 - 2.0 * x(2)^2 - x(3)^2 - 2.0 * x(4)^2 ...
198               + x(1) + x(4) + 10.0
199     c3 = - 2.0 * x(1)^2 - x(2)^2 - x(3)^2 - 2.0 * x(1) ...
200               + x(2) + x(4) + 5.0
201     c = [c1 c2 c3 0.0]
202   end
203 endfunction
204 opt = optimbase_new ();
205 opt = optimbase_configure(opt,"-numberofvariables",4);
206 opt = optimbase_configure(opt,"-function",optimtestcase5);
207 opt = optimbase_configure(opt,"-x0",[0.0 0.0 0.0 0.0]');
208 opt = optimbase_configure(opt,"-nbineqconst",3);
209 cmd = "opt = optimbase_checkcostfun(opt);";
210 assert_checkerror(cmd,"%s: The matrix %s from costf(x0,%d) has %d columns, instead of %d.",[],"optimbase_checkcostfun","c",5,4,3);
211 opt = optimbase_destroy(opt);
212
213
214 //
215 // Test with correct rosenbrock function
216 //
217 function [ f , g , index ] = rosenbrock ( x , index )
218   f = 100.0 *(x(2)-x(1)^2)^2 + (1-x(1))^2;
219   g(1,1) = - 400. * ( x(2) - x(1)**2 ) * x(1) -2. * ( 1. - x(1) )
220   g(1,2) = 200. * ( x(2) - x(1)**2 )
221 endfunction
222
223 opt = optimbase_new ();
224 opt = optimbase_configure(opt,"-numberofvariables",2);
225 opt = optimbase_configure(opt,"-function", rosenbrock );
226 opt = optimbase_configure(opt,"-withderivatives",%t);
227 opt = optimbase_configure(opt,"-x0",[-1.2 1.0].');
228 opt = optimbase_checkcostfun(opt);
229 opt = optimbase_destroy(opt);
230 //
231 // Test with not correct rosenbrock function : g is a column vector instead of row vector
232 // The cost function transposes the column vector.
233 function [ f , g , index ] = rosenbrock4 ( x , index )
234   f = 100.0 *(x(2)-x(1)^2)^2 + (1-x(1))^2;
235   g(1) = - 400. * ( x(2) - x(1)**2 ) * x(1) -2. * ( 1. - x(1) )
236   g(2) = 200. * ( x(2) - x(1)**2 )
237 endfunction
238
239 opt = optimbase_new ();
240 opt = optimbase_configure(opt,"-numberofvariables",2);
241 opt = optimbase_configure(opt,"-function", rosenbrock4 );
242 opt = optimbase_configure(opt,"-withderivatives",%t);
243 opt = optimbase_configure(opt,"-x0",[-1.2 1.0].');
244 opt = optimbase_checkcostfun(opt);
245 opt = optimbase_destroy(opt);
246