[37] | 1 | function out = yalmiptest(prefered_solver,auto) |
---|
| 2 | %YALMIPTEST Runs a number of test problems. |
---|
| 3 | % |
---|
| 4 | % YALMIPTEST is recommended when a new solver or a new version |
---|
| 5 | % of YALMIP installed. |
---|
| 6 | % |
---|
| 7 | % EXAMPLES |
---|
| 8 | % YALMIPTEST % Without argument, default solver used |
---|
| 9 | % YALMIPTEST('solver tag') % Test with specified solver |
---|
| 10 | % YALMIPTEST(options) % Test with specific options structure from |
---|
| 11 | % |
---|
| 12 | % See also SDPSETTINGS, YALMIPDEMO |
---|
| 13 | |
---|
| 14 | % Author Johan Löfberg |
---|
| 15 | % $Id: yalmiptest.m,v 1.27 2006/05/16 14:44:27 joloef Exp $ |
---|
| 16 | |
---|
| 17 | |
---|
| 18 | if ~exist('sedumi2pen.m') |
---|
| 19 | disp('Add /yalmip/extras to your path first...') |
---|
| 20 | return |
---|
| 21 | end |
---|
| 22 | |
---|
| 23 | if ~exist('bmibnb.m') |
---|
| 24 | disp('Add /yalmip/modules/ with sub-directories to your path first...') |
---|
| 25 | return |
---|
| 26 | end |
---|
| 27 | |
---|
| 28 | if ~exist('pwa_yalmip.m') |
---|
| 29 | disp('Add /yalmip/operators to your path first...') |
---|
| 30 | return |
---|
| 31 | end |
---|
| 32 | |
---|
| 33 | if ~exist('callsedumi.m') |
---|
| 34 | disp('Add /yalmip/solvers to your path first...') |
---|
| 35 | return |
---|
| 36 | end |
---|
| 37 | |
---|
| 38 | detected = which('yalmip.m','-all'); |
---|
| 39 | if length(detected)>1 |
---|
| 40 | disp('You seem to have multiple installations of YALMIP in your path. Please correct this...'); |
---|
| 41 | detected |
---|
| 42 | return |
---|
| 43 | end |
---|
| 44 | |
---|
| 45 | donttest = 0; |
---|
| 46 | if (nargin==1) & isa(prefered_solver,'char') & strcmp(prefered_solver,'test') |
---|
| 47 | donttest = 0; |
---|
| 48 | prefered_solver = ''; |
---|
| 49 | else |
---|
| 50 | donttest = 1; |
---|
| 51 | end |
---|
| 52 | |
---|
| 53 | if nargin==0 |
---|
| 54 | prefered_solver = ''; |
---|
| 55 | else |
---|
| 56 | if ~(isa(prefered_solver,'struct') | isa(prefered_solver,'char')) |
---|
| 57 | error('Argument should be a solver tag, or a sdpsettings structure'); |
---|
| 58 | end |
---|
| 59 | if isa(prefered_solver,'char') |
---|
| 60 | donttest = 1; |
---|
| 61 | end |
---|
| 62 | end |
---|
| 63 | |
---|
| 64 | if ~(exist('callsedumi')==2) |
---|
| 65 | disp('The directory yalmip/solvers is not in your path.') |
---|
| 66 | disp('Put yalmip/, yalmip/solvers, yalmip/extras and yalmip/demos in your MATLAB path.'); |
---|
| 67 | return |
---|
| 68 | end |
---|
| 69 | |
---|
| 70 | foundstring = {'not found','found'}; |
---|
| 71 | teststring = {'-failed','+passed'}; |
---|
| 72 | if ~donttest |
---|
| 73 | header = {'Solver','Version/module','Status','Unit test'}; |
---|
| 74 | else |
---|
| 75 | header = {'Solver','Version/module','Status'}; |
---|
| 76 | end |
---|
| 77 | |
---|
| 78 | [solvers,found] = getavailablesolvers(0); |
---|
| 79 | solvers = solvers([find(found);find(~found)]); |
---|
| 80 | found = [found(find(found));found(find(~found))]; |
---|
| 81 | j = 1; |
---|
| 82 | for i = 1:length(solvers) |
---|
| 83 | if solvers(i).show |
---|
| 84 | data{j,1} = upper(solvers(i).tag); |
---|
| 85 | data{j,2} = solvers(i).version; |
---|
| 86 | data{j,3} = foundstring{found(i)+1}; |
---|
| 87 | if ~donttest |
---|
| 88 | if found(i) |
---|
| 89 | if options.verbose |
---|
| 90 | disp(['Testing ' solvers(i).tag '...']); |
---|
| 91 | end |
---|
| 92 | try |
---|
| 93 | if solvers(i).maxdet |
---|
| 94 | pass = lyapell(sdpsettings('solver',solvers(i).tag,'verbose',0)); |
---|
| 95 | else |
---|
| 96 | if solvers(i).sdp |
---|
| 97 | pass = stabtest(sdpsettings('solver',solvers(i).tag,'verbose',0)); |
---|
| 98 | else |
---|
| 99 | pass = feasiblelp(sdpsettings('solver',solvers(i).tag,'verbose',0)); |
---|
| 100 | end |
---|
| 101 | end |
---|
| 102 | data{j,4} = teststring{pass+1}; |
---|
| 103 | catch |
---|
| 104 | data{j,4} = '-failed'; |
---|
| 105 | end |
---|
| 106 | else |
---|
| 107 | data{j,4} = 'not tested'; |
---|
| 108 | end |
---|
| 109 | end |
---|
| 110 | j = j+1; |
---|
| 111 | end |
---|
| 112 | end |
---|
| 113 | |
---|
| 114 | if isa(prefered_solver,'char') |
---|
| 115 | ops = sdpsettings('Solver',prefered_solver); |
---|
| 116 | else |
---|
| 117 | ops = prefered_solver; |
---|
| 118 | end |
---|
| 119 | |
---|
| 120 | if ~((nargin==2) & (ops.verbose==0)) |
---|
| 121 | table({'Searching for installed solvers'},header,data); |
---|
| 122 | disp(' ') |
---|
| 123 | end |
---|
| 124 | if nargin<2 |
---|
| 125 | disp('Press any key to continue test') |
---|
| 126 | pause |
---|
| 127 | end |
---|
| 128 | |
---|
| 129 | i=1; |
---|
| 130 | test{i}.fcn = 'testsdpvar'; |
---|
| 131 | test{i}.desc = 'sdpvar/set methods'; |
---|
| 132 | i = i+1; |
---|
| 133 | |
---|
| 134 | test{i}.fcn = 'feasiblelp'; |
---|
| 135 | test{i}.desc = 'LP'; |
---|
| 136 | i = i+1; |
---|
| 137 | |
---|
| 138 | test{i}.fcn = 'toepapprox'; |
---|
| 139 | test{i}.desc = 'LP'; |
---|
| 140 | i = i+1; |
---|
| 141 | |
---|
| 142 | test{i}.fcn = 'feasibleqp'; |
---|
| 143 | test{i}.desc = 'QP'; |
---|
| 144 | i = i+1; |
---|
| 145 | |
---|
| 146 | test{i}.fcn = 'toepapprox2'; |
---|
| 147 | test{i}.desc = 'QP'; |
---|
| 148 | i = i+1; |
---|
| 149 | |
---|
| 150 | |
---|
| 151 | test{i}.fcn = 'socptest1'; |
---|
| 152 | test{i}.desc = 'SOCP'; |
---|
| 153 | i = i+1; |
---|
| 154 | |
---|
| 155 | test{i}.fcn = 'socptest2'; |
---|
| 156 | test{i}.desc = 'SOCP'; |
---|
| 157 | i = i+1; |
---|
| 158 | |
---|
| 159 | test{i}.fcn = 'socptest3'; |
---|
| 160 | test{i}.desc = 'SOCP'; |
---|
| 161 | i = i+1; |
---|
| 162 | |
---|
| 163 | test{i}.fcn = 'complete'; |
---|
| 164 | test{i}.desc = 'SDP'; |
---|
| 165 | i = i+1; |
---|
| 166 | |
---|
| 167 | test{i}.fcn = 'complete_2'; |
---|
| 168 | test{i}.desc = 'SDP'; |
---|
| 169 | i = i+1; |
---|
| 170 | |
---|
| 171 | test{i}.fcn = 'maxcut'; |
---|
| 172 | test{i}.desc = 'SDP'; |
---|
| 173 | i = i+1; |
---|
| 174 | |
---|
| 175 | test{i}.fcn = 'feasible'; |
---|
| 176 | test{i}.desc = 'SDP'; |
---|
| 177 | i = i+1; |
---|
| 178 | |
---|
| 179 | test{i}.fcn = 'lyapell'; |
---|
| 180 | test{i}.desc = 'MAXDET'; |
---|
| 181 | i = i+1; |
---|
| 182 | |
---|
| 183 | test{i}.fcn = 'lyapell2'; |
---|
| 184 | test{i}.desc = 'MAXDET'; |
---|
| 185 | i = i+1; |
---|
| 186 | |
---|
| 187 | %test{i}.fcn = 'circuit1'; |
---|
| 188 | %test{i}.desc = 'GP'; |
---|
| 189 | %i = i+1; |
---|
| 190 | |
---|
| 191 | test{i}.fcn = 'infeasible'; |
---|
| 192 | test{i}.desc = 'Infeasible LP'; |
---|
| 193 | i = i+1; |
---|
| 194 | |
---|
| 195 | test{i}.fcn = 'infeasibleqp'; |
---|
| 196 | test{i}.desc = 'Infeasible QP'; |
---|
| 197 | i = i+1; |
---|
| 198 | |
---|
| 199 | test{i}.fcn = 'infeasiblesdp'; |
---|
| 200 | test{i}.desc = 'Infeasible SDP'; |
---|
| 201 | i = i+1; |
---|
| 202 | |
---|
| 203 | test{i}.fcn = 'momenttest'; |
---|
| 204 | test{i}.desc = 'Moment relaxation'; |
---|
| 205 | i = i+1; |
---|
| 206 | |
---|
| 207 | test{i}.fcn = 'sostest'; |
---|
| 208 | test{i}.desc = 'Sum-of-squares'; |
---|
| 209 | i = i+1; |
---|
| 210 | |
---|
| 211 | test{i}.fcn = 'bmitest'; |
---|
| 212 | test{i}.desc = 'Bilinear SDP'; |
---|
| 213 | i = i+1; |
---|
| 214 | |
---|
| 215 | |
---|
| 216 | |
---|
| 217 | pass_strings = {'Error','Passed','Solver not available'}; |
---|
| 218 | |
---|
| 219 | tt = cputime; |
---|
| 220 | |
---|
| 221 | % Run test-problems |
---|
| 222 | for i = 1:length(test) |
---|
| 223 | try |
---|
| 224 | t=cputime; |
---|
| 225 | if ops.verbose |
---|
| 226 | disp(' '); |
---|
| 227 | disp(['Testing function ' test{i}.fcn]); |
---|
| 228 | disp(' '); |
---|
| 229 | end |
---|
| 230 | [pp,ss,res] = eval([test{i}.fcn '(ops)']); |
---|
| 231 | pass(i) = pp; |
---|
| 232 | sols{i} = ss.info; |
---|
| 233 | results{i}=res; |
---|
| 234 | ttime(i) = cputime-t; |
---|
| 235 | catch |
---|
| 236 | pass(i) = 0; |
---|
| 237 | results{i} = 'NAN'; |
---|
| 238 | sols{i} = 'Unknown problem in YALMIP'; |
---|
| 239 | ttime(i) = cputime-tt; |
---|
| 240 | end |
---|
| 241 | end |
---|
| 242 | totaltime = cputime-tt; |
---|
| 243 | |
---|
| 244 | clear data; |
---|
| 245 | header = {'Test','Solution', 'Solver message'}; |
---|
| 246 | for i = 1:length(pass) |
---|
| 247 | thetime = num2str(ttime(i),4); |
---|
| 248 | data{i,1} = test{i}.desc; |
---|
| 249 | data{i,2} = results{i}; |
---|
| 250 | data{i,3} = sols{i}; |
---|
| 251 | end |
---|
| 252 | if ops.verbose |
---|
| 253 | disp(' '); |
---|
| 254 | end |
---|
| 255 | formats{1}.data.just = 'right'; |
---|
| 256 | formats{2}.data.just = 'right'; |
---|
| 257 | formats{3}.data.just = 'right'; |
---|
| 258 | |
---|
| 259 | formats{1}.header.just = 'right'; |
---|
| 260 | formats{2}.header.just = 'right'; |
---|
| 261 | formats{3}.header.just = 'right'; |
---|
| 262 | |
---|
| 263 | clc |
---|
| 264 | table([],header,data,formats) |
---|
| 265 | |
---|
| 266 | |
---|
| 267 | function [pass,sol,result] = testsdpvar(ops) |
---|
| 268 | |
---|
| 269 | % Test the sdpvar implementation |
---|
| 270 | pass = 1; |
---|
| 271 | sol.info = yalmiperror(0,'YALMIP'); |
---|
| 272 | try |
---|
| 273 | x = sdpvar(2,2); |
---|
| 274 | x = sdpvar(2,2,'symmetric'); |
---|
| 275 | x = sdpvar(2,2,'full'); |
---|
| 276 | x = sdpvar(2,2,'toeplitz'); |
---|
| 277 | x = sdpvar(2,2,'hankel'); |
---|
| 278 | x = sdpvar(2,2,'skew'); |
---|
| 279 | if ~ishermitian(sdpvar(2,2,'hermitian','complex')) |
---|
| 280 | error('bug') |
---|
| 281 | end |
---|
| 282 | if ~issymmetric(sdpvar(2,2,'symmetric','complex')) |
---|
| 283 | error('bug') |
---|
| 284 | end |
---|
| 285 | if ~isreal(real(sdpvar(2,2,'symmetric','complex'))) |
---|
| 286 | error('bug') |
---|
| 287 | end |
---|
| 288 | if isreal(sqrt(-1)*real(sdpvar(2,2,'symmetric','complex'))) |
---|
| 289 | error('bug') |
---|
| 290 | end |
---|
| 291 | x = sdpvar(2,1,'','co'); |
---|
| 292 | if ~isreal(x'*x) |
---|
| 293 | error('bug') |
---|
| 294 | end |
---|
| 295 | x = sdpvar(2,2,'','co'); |
---|
| 296 | if ~isreal(diag(x'*x)) |
---|
| 297 | error('bug') |
---|
| 298 | end |
---|
| 299 | x = sdpvar(1,1); |
---|
| 300 | y = sdpvar(2,2); |
---|
| 301 | x*eye(2); |
---|
| 302 | eye(2)*x; |
---|
| 303 | y*3; |
---|
| 304 | 3*y; |
---|
| 305 | x = sdpvar(2,3); |
---|
| 306 | y = sdpvar(2,3); |
---|
| 307 | setsdpvar(x,randn(2,3)); |
---|
| 308 | z = replace(x,x(1,1:2),[8 9]); |
---|
| 309 | z = x+y; |
---|
| 310 | z = x-y; |
---|
| 311 | z = x+1; |
---|
| 312 | z = x-1; |
---|
| 313 | z = x+ones(2,3); |
---|
| 314 | z = x-ones(2,3); |
---|
| 315 | z = ones(2,3)-x; |
---|
| 316 | z = ones(2,3)-x; |
---|
| 317 | z = eye(2)*x; |
---|
| 318 | z = x*eye(3); |
---|
| 319 | z = diag(x); |
---|
| 320 | z = trace(x); |
---|
| 321 | z = diff(x); |
---|
| 322 | z = fliplr(x); |
---|
| 323 | z = flipud(x); |
---|
| 324 | z = kron(x,eye(3)); |
---|
| 325 | z = kron(eye(3),x); |
---|
| 326 | z = rot90(x); |
---|
| 327 | z = sum(x); |
---|
| 328 | z = diff(x); |
---|
| 329 | z = x'; |
---|
| 330 | z = x.'; |
---|
| 331 | z = tril(x); |
---|
| 332 | z = triu(x); |
---|
| 333 | z = [x y]; |
---|
| 334 | z = [x;y]; |
---|
| 335 | sdpvar x y |
---|
| 336 | diag([x y])*[x^-1;y^-1]; |
---|
| 337 | assert(isequal([x x;x x]*x,[x x;x x].*x)) |
---|
| 338 | assert(isequal(trace([x x;x x]*[x y;y x]),x*x+x*y+y*x+x*x)) |
---|
| 339 | |
---|
| 340 | % Regression ?? |
---|
| 341 | yalmip('clear') |
---|
| 342 | sdpvar x |
---|
| 343 | |
---|
| 344 | (1+x+x^4)*(1-x^2); |
---|
| 345 | |
---|
| 346 | % Regression complex multiplcation |
---|
| 347 | A = randn(10,5)+sqrt(-1)*randn(10,5); |
---|
| 348 | b = randn(10,1)+sqrt(-1)*randn(10,1); |
---|
| 349 | x = sdpvar(5,1); |
---|
| 350 | res = A*x-b; |
---|
| 351 | assert(nnz(clean([res res]'*[res res]-res'*res,1e-8))==0) |
---|
| 352 | assert(isreal(clean(res'*res,1e-8))) |
---|
| 353 | |
---|
| 354 | sdpvar x(1,1,'full','complex'); |
---|
| 355 | assert(isreal(x*x')) |
---|
| 356 | |
---|
| 357 | % x = sdpvar(4,1); |
---|
| 358 | % sdpvar i a |
---|
| 359 | % y = [i a]; |
---|
| 360 | % y(1) |
---|
| 361 | % % i = sdpvar(1,1); |
---|
| 362 | % % a = sdpvar(1,1); |
---|
| 363 | % % [i a] |
---|
| 364 | % |
---|
| 365 | % |
---|
| 366 | % |
---|
| 367 | % size(x([i j])) |
---|
| 368 | % assert(all(size(x([i j])) == [2 1])) |
---|
| 369 | % assert(all(size(x(1,[i j])) == [1 2])) |
---|
| 370 | % % assert(all(size(x(1,[i j])) == [1 2])); |
---|
| 371 | % % x(1,[i j]); |
---|
| 372 | % x([i j],1); |
---|
| 373 | % x([i j],[i j]); |
---|
| 374 | |
---|
| 375 | |
---|
| 376 | |
---|
| 377 | result = 'N/A'; |
---|
| 378 | catch |
---|
| 379 | sol.info = 'Problems'; |
---|
| 380 | result = 'N/A'; |
---|
| 381 | pass = 0; |
---|
| 382 | end |
---|
| 383 | |
---|
| 384 | |
---|
| 385 | function [pass,sol,result] = feasible(ops) |
---|
| 386 | t = sdpvar(1,1); |
---|
| 387 | Y = sdpvar(2,2); |
---|
| 388 | F = set('Y<t*eye(2)'); |
---|
| 389 | F = F+set('Y>[1 0.2;0.2 1]'); |
---|
| 390 | sol = solvesdp(F,t,ops); |
---|
| 391 | pass = ismember(sol.problem,[0 3 4 5]); |
---|
| 392 | if pass |
---|
| 393 | result = resultstring(t,1.2); |
---|
| 394 | else |
---|
| 395 | result = 'N/A'; |
---|
| 396 | end |
---|
| 397 | |
---|
| 398 | |
---|
| 399 | |
---|
| 400 | function [pass,sol,result] = infeasible(ops) |
---|
| 401 | t = sdpvar(1,1); |
---|
| 402 | Y = sdpvar(2,2); |
---|
| 403 | F = set('t>0'); |
---|
| 404 | F = F+set('t<-10'); |
---|
| 405 | sol = solvesdp(F,t,ops); |
---|
| 406 | pass = ~(sol.problem==0); |
---|
| 407 | result = 'N/A'; |
---|
| 408 | |
---|
| 409 | function [pass,sol,result] = lyapell(ops) |
---|
| 410 | A = [1 0;0.4 1]; |
---|
| 411 | B = [0.4;0.08]; |
---|
| 412 | L = [1.9034 1.1501]; |
---|
| 413 | |
---|
| 414 | Y = sdpvar(2,2); |
---|
| 415 | F = set([Y Y*(A-B*L)';(A-B*L)*Y Y]); |
---|
| 416 | F = F+set('L*Y*L''<1'); |
---|
| 417 | sol = solvesdp(F,-logdet(Y),ops); |
---|
| 418 | Y = double(Y); |
---|
| 419 | pass = ismember(sol.problem,[0 3 4 5]); |
---|
| 420 | if pass |
---|
| 421 | result = resultstring(Y,[2.9957 -4.1514;-4.1514 6.2918]); |
---|
| 422 | else |
---|
| 423 | result = 'N/A'; |
---|
| 424 | end |
---|
| 425 | %pass = pass & (sum(sum(abs(Y-[2.9957 -4.15;-4.15 6.29])))<0.01); |
---|
| 426 | |
---|
| 427 | function [pass,sol,result] = lyapell2(ops) |
---|
| 428 | A = [1 0;0.4 1]; |
---|
| 429 | B = [0.4;0.08]; |
---|
| 430 | L = [1.9034 1.1501]; |
---|
| 431 | Y = sdpvar(2,2); |
---|
| 432 | F = set('[Y Y*(A-B*L)'';(A-B*L)*Y Y]>0'); |
---|
| 433 | F = F+set('L*Y*L''<1'); |
---|
| 434 | sol = solvesdp(F,-logdet(Y),ops); |
---|
| 435 | Y = double(Y); |
---|
| 436 | pass = ismember(sol.problem,[0 3 4 5]); |
---|
| 437 | if pass |
---|
| 438 | result = resultstring(Y,[2.9957 -4.1514;-4.1514 6.2918]); |
---|
| 439 | else |
---|
| 440 | result = 'N/A'; |
---|
| 441 | end |
---|
| 442 | |
---|
| 443 | function [pass,sol,result] = complete(ops) |
---|
| 444 | x = sdpvar(1,1); |
---|
| 445 | y = sdpvar(1,1); |
---|
| 446 | z = sdpvar(1,1); |
---|
| 447 | |
---|
| 448 | X = [x 1 2;1 y 3;2 3 100]; |
---|
| 449 | |
---|
| 450 | F = set(X>0); |
---|
| 451 | F = F+set(x>10); |
---|
| 452 | F = F+set(y>0); |
---|
| 453 | F = F+set(z>0); |
---|
| 454 | F = F+set(x<1000); |
---|
| 455 | F = F+set(y<1000); |
---|
| 456 | F = F+set(z<1000); |
---|
| 457 | sol = solvesdp(F,x+y+z,ops); |
---|
| 458 | x = double(x); |
---|
| 459 | y = double(y); |
---|
| 460 | z = double(z); |
---|
| 461 | |
---|
| 462 | pass = ismember(sol.problem,[0 3 4 5]); |
---|
| 463 | result = 'N/A'; |
---|
| 464 | if pass |
---|
| 465 | result = resultstring([x;y;z],[10;0.1787;0]); |
---|
| 466 | else |
---|
| 467 | result = 'N/A'; |
---|
| 468 | end |
---|
| 469 | |
---|
| 470 | |
---|
| 471 | function [pass,sol,result] = complete_2(ops) |
---|
| 472 | x = sdpvar(1,1); |
---|
| 473 | %y = sdpvar(1,1); |
---|
| 474 | z = sdpvar(1,1); |
---|
| 475 | |
---|
| 476 | X = [x 2;2 z]; |
---|
| 477 | |
---|
| 478 | F = set('X>0'); |
---|
| 479 | F = F+set('x>0'); |
---|
| 480 | F = F+set('z>0'); |
---|
| 481 | F = F+set('x<10'); |
---|
| 482 | F = F+set('z<10'); |
---|
| 483 | sol = solvesdp(F,x+z,ops); |
---|
| 484 | x = double(x); |
---|
| 485 | %y = double(y); |
---|
| 486 | z = double(z); |
---|
| 487 | |
---|
| 488 | pass = ismember(sol.problem,[0 3 4 5]); |
---|
| 489 | result = 'N/A'; |
---|
| 490 | if pass |
---|
| 491 | result = resultstring([x;z],[2;2]); |
---|
| 492 | else |
---|
| 493 | result = 'N/A'; |
---|
| 494 | end |
---|
| 495 | |
---|
| 496 | |
---|
| 497 | |
---|
| 498 | function [pass,sol,result] = maxcut(ops) |
---|
| 499 | % Upper bound on maxcut of a n-cycle |
---|
| 500 | n = 15; |
---|
| 501 | Q = zeros(n); |
---|
| 502 | for i = 1:n-1 |
---|
| 503 | Q(i,i+1) = 1;Q(i+1,i) = 1; |
---|
| 504 | end |
---|
| 505 | Q(n,1) = 1;Q(1,n) = 1; |
---|
| 506 | Q = 0.25*(diag(Q*ones(n,1))-Q); |
---|
| 507 | |
---|
| 508 | t = sdpvar(1,1); |
---|
| 509 | tau = sdpvar(n,1); |
---|
| 510 | |
---|
| 511 | F = set('t>0'); |
---|
| 512 | |
---|
| 513 | M = [-Q zeros(n,1);zeros(1,n) t]; |
---|
| 514 | |
---|
| 515 | for i = 1:n |
---|
| 516 | ei = zeros(n,1);ei(i,1) = 1; |
---|
| 517 | M = M+tau(i)*[ei*ei' zeros(n,1);zeros(1,n) -1]; |
---|
| 518 | end |
---|
| 519 | |
---|
| 520 | F = F+set(M>0); |
---|
| 521 | sol = solvesdp(F,t,ops); |
---|
| 522 | |
---|
| 523 | t = double(t); |
---|
| 524 | tau = double(t); |
---|
| 525 | |
---|
| 526 | pass = ismember(sol.problem,[0 3 4 5]); |
---|
| 527 | if pass |
---|
| 528 | result = resultstring(t,14.8361); |
---|
| 529 | else |
---|
| 530 | result = 'N/A'; |
---|
| 531 | end |
---|
| 532 | |
---|
| 533 | |
---|
| 534 | function [pass,sol,result] = socptest1(ops) |
---|
| 535 | x = sdpvar(2,1); |
---|
| 536 | a = [0;1]; |
---|
| 537 | b = [1;1]; |
---|
| 538 | F = set('||x-a||<1'); |
---|
| 539 | F = F+set('||x-b||<1'); |
---|
| 540 | sol = solvesdp(F,sum(x),ops); |
---|
| 541 | pass = ismember(sol.problem,[0 3 4 5]); |
---|
| 542 | |
---|
| 543 | x = double(x); |
---|
| 544 | |
---|
| 545 | if pass |
---|
| 546 | result = resultstring(sum(x),0.58578); |
---|
| 547 | else |
---|
| 548 | result = 'N/A'; |
---|
| 549 | end |
---|
| 550 | |
---|
| 551 | |
---|
| 552 | |
---|
| 553 | function [pass,sol,result] = socptest2(ops) |
---|
| 554 | z = sdpvar(3,1); |
---|
| 555 | x = sdpvar(3,1); |
---|
| 556 | y = sdpvar(3,1); |
---|
| 557 | a = [0;1;0]; |
---|
| 558 | b = [1;1;0]; |
---|
| 559 | F = set('||x-a||<1'); |
---|
| 560 | F = F+set('||x-b||<1'); |
---|
| 561 | F = F+set('x(1)==0.35'); |
---|
| 562 | F = F+set('z(2:3)==[5;6]'); |
---|
| 563 | sol = solvesdp(F,sum(x),ops); |
---|
| 564 | pass = ismember(sol.problem,[0 3 4 5]); |
---|
| 565 | |
---|
| 566 | x = double(x); |
---|
| 567 | y = double(y); |
---|
| 568 | z = double(z); |
---|
| 569 | |
---|
| 570 | if pass |
---|
| 571 | result = resultstring(sum(x),0.27592); |
---|
| 572 | else |
---|
| 573 | result = 'N/A'; |
---|
| 574 | end |
---|
| 575 | |
---|
| 576 | |
---|
| 577 | |
---|
| 578 | function [pass,sol,result] = socptest3(ops) |
---|
| 579 | z = sdpvar(2,1); |
---|
| 580 | x = sdpvar(2,1); |
---|
| 581 | y = sdpvar(3,1); |
---|
| 582 | a = [0;1]; |
---|
| 583 | b = [1;1]; |
---|
| 584 | F = set('||x-a||<1'); |
---|
| 585 | F = F+set('||x-b||<1'); |
---|
| 586 | F = F+set('x(1)==0.35'); |
---|
| 587 | F = F+set('z(1,end)>5'); |
---|
| 588 | F = F+set('z(2,end)<100'); |
---|
| 589 | F = F+set('z(2)==5'); |
---|
| 590 | |
---|
| 591 | sol = solvesdp(F,sum(x),ops); |
---|
| 592 | pass = ismember(sol.problem,[0 3 4 5]); |
---|
| 593 | |
---|
| 594 | x = double(x); |
---|
| 595 | y = double(y); |
---|
| 596 | z = double(z); |
---|
| 597 | if pass |
---|
| 598 | result = resultstring(sum(x),0.59); |
---|
| 599 | else |
---|
| 600 | result = 'N/A'; |
---|
| 601 | end |
---|
| 602 | |
---|
| 603 | |
---|
| 604 | |
---|
| 605 | function [pass,sol,result] = feasiblelp(ops) |
---|
| 606 | N = 5; |
---|
| 607 | A = [2 -1;1 0]; |
---|
| 608 | B = [1;0]; |
---|
| 609 | C = [0.5 0.5]; |
---|
| 610 | [H,S] = create_CHS(A,B,C,N); |
---|
| 611 | x = [2;0]; |
---|
| 612 | t = sdpvar(2*N,1); |
---|
| 613 | U = sdpvar(N,1); |
---|
| 614 | Y = H*x+S*U; |
---|
| 615 | F = set(U<1)+set(U>-1); |
---|
| 616 | F = F+set(Y(N)>-1); |
---|
| 617 | F = F+set(Y(N)<1); |
---|
| 618 | F = F+set([Y;U]<t)+set([Y;U]>-t); |
---|
| 619 | sol = solvesdp(F,sum(t),ops); |
---|
| 620 | pass = ismember(sol.problem,[0 3 4 5]); |
---|
| 621 | if pass |
---|
| 622 | result = resultstring(sum(t),12.66666); |
---|
| 623 | else |
---|
| 624 | result = 'N/A'; |
---|
| 625 | end |
---|
| 626 | |
---|
| 627 | function [pass,sol,result] = feasibleqp(ops) |
---|
| 628 | N = 5; |
---|
| 629 | A = [2 -1;1 0]; |
---|
| 630 | B = [1;0]; |
---|
| 631 | C = [0.5 0.5]; |
---|
| 632 | [H,S] = create_CHS(A,B,C,N); |
---|
| 633 | x = [2;0]; |
---|
| 634 | U = sdpvar(N,1); |
---|
| 635 | Y = H*x+S*U; |
---|
| 636 | F = set(U<1)+set(U>-1); |
---|
| 637 | F = F+set(Y(N)>-1); |
---|
| 638 | F = F+set(Y(N)<1); |
---|
| 639 | sol = solvesdp(F,Y'*Y+U'*U,ops); |
---|
| 640 | pass = ismember(sol.problem,[0 3 4 5]); |
---|
| 641 | if pass |
---|
| 642 | result = resultstring(Y'*Y+U'*U,26.35248); |
---|
| 643 | else |
---|
| 644 | result = 'N/A'; |
---|
| 645 | end |
---|
| 646 | |
---|
| 647 | |
---|
| 648 | function [pass,sol,result] = infeasibleqp(ops) |
---|
| 649 | N = 5; |
---|
| 650 | A = [2 -1;1 0]; |
---|
| 651 | B = [1;0]; |
---|
| 652 | C = [0.5 0.5]; |
---|
| 653 | [H,S] = create_CHS(A,B,C,N); |
---|
| 654 | x = [2;0]; |
---|
| 655 | U = sdpvar(N,1); |
---|
| 656 | Y = H*x+S*U; |
---|
| 657 | F = set(U<1)+set(U>-1); |
---|
| 658 | F = F+set(Y(N)>-1); |
---|
| 659 | F = F+set(Y(N)<1); |
---|
| 660 | F = F + set(U>0); |
---|
| 661 | sol = solvesdp(F,Y'*Y+U'*U,ops); |
---|
| 662 | pass = ismember(sol.problem,[1]); |
---|
| 663 | result = 'N/A'; |
---|
| 664 | |
---|
| 665 | |
---|
| 666 | |
---|
| 667 | function [pass,sol,result] = infeasiblesdp(ops) |
---|
| 668 | A = magic(6); |
---|
| 669 | A = A*A'; |
---|
| 670 | P = sdpvar(6,6); |
---|
| 671 | sol = solvesdp(set(A'*P+P*A < -P) + set(P>eye(6)),trace(P),ops); |
---|
| 672 | pass = (sol.problem==1); |
---|
| 673 | result = 'N/A'; |
---|
| 674 | |
---|
| 675 | function [pass,sol,result]=toepapprox(ops) |
---|
| 676 | |
---|
| 677 | n = 5; |
---|
| 678 | P = magic(n); |
---|
| 679 | Z = sdpvar(n,n,'toeplitz'); |
---|
| 680 | t = sdpvar(n,n,'full'); |
---|
| 681 | F = set(P-Z<t)+set(P-Z>-t); |
---|
| 682 | sol = solvesdp(F,sum(sum(t)),ops); |
---|
| 683 | pass = ismember(sol.problem,[0 3 4 5]); |
---|
| 684 | result = 'N/A'; |
---|
| 685 | if pass |
---|
| 686 | result = resultstring(sum(sum(t)),156); |
---|
| 687 | else |
---|
| 688 | result = 'N/A'; |
---|
| 689 | end |
---|
| 690 | |
---|
| 691 | |
---|
| 692 | function [pass,sol,result]=toepapprox2(ops) |
---|
| 693 | |
---|
| 694 | n = 5; |
---|
| 695 | P = magic(n); |
---|
| 696 | Z = sdpvar(n,n,'toeplitz'); |
---|
| 697 | t = sdpvar(n,n,'full'); |
---|
| 698 | resid = P-Z;resid = resid(:); |
---|
| 699 | sol = solvesdp([],resid'*resid,ops); |
---|
| 700 | pass = ismember(sol.problem,[0 3 4 5]); |
---|
| 701 | result = 'N/A'; |
---|
| 702 | if pass |
---|
| 703 | result = resultstring(resid'*resid,1300); |
---|
| 704 | else |
---|
| 705 | result = 'N/A'; |
---|
| 706 | end |
---|
| 707 | |
---|
| 708 | function [pass,sol,result]=momenttest(ops) |
---|
| 709 | |
---|
| 710 | x1 = sdpvar(1,1); |
---|
| 711 | x2 = sdpvar(1,1); |
---|
| 712 | x3 = sdpvar(1,1); |
---|
| 713 | |
---|
| 714 | objective = -2*x1+x2-x3; |
---|
| 715 | |
---|
| 716 | F = set(x1*(4*x1-4*x2+4*x3-20)+x2*(2*x2-2*x3+9)+x3*(2*x3-13)+24>0); |
---|
| 717 | F = F + set(4-(x1+x2+x3)>0); |
---|
| 718 | F = F + set(6-(3*x2+x3)>0); |
---|
| 719 | F = F + set(x1>0); |
---|
| 720 | F = F + set(2-x1>0); |
---|
| 721 | F = F + set(x2>0); |
---|
| 722 | F = F + set(x3>0); |
---|
| 723 | F = F + set(3-x3>0); |
---|
| 724 | sol = solvemoment(F,objective,ops); |
---|
| 725 | pass = ismember(sol.problem,[0 3 4 5]); |
---|
| 726 | result = 'N/A'; |
---|
| 727 | if pass |
---|
| 728 | result = resultstring(objective,-6); |
---|
| 729 | else |
---|
| 730 | result = 'N/A'; |
---|
| 731 | end |
---|
| 732 | |
---|
| 733 | function [pass,sol,result]=sostest(ops) |
---|
| 734 | |
---|
| 735 | yalmip('clear') |
---|
| 736 | x = sdpvar(1,1); |
---|
| 737 | y = sdpvar(1,1); |
---|
| 738 | t = sdpvar(1,1); |
---|
| 739 | F = set(sos(1+x^7+x^8+y^4-t)); |
---|
| 740 | sol = solvesos(F,-t,ops); |
---|
| 741 | pass = ismember(sol.problem,[0 3 4 5]); |
---|
| 742 | result = 'N/A'; |
---|
| 743 | if pass |
---|
| 744 | result = resultstring(t,0.9509); |
---|
| 745 | else |
---|
| 746 | result = 'N/A'; |
---|
| 747 | end |
---|
| 748 | |
---|
| 749 | function [pass,sol,result]=bmitest(ops) |
---|
| 750 | |
---|
| 751 | A = [-1 2;-3 -4]; |
---|
| 752 | P = sdpvar(2,2); |
---|
| 753 | alpha = sdpvar(1,1); |
---|
| 754 | F = set(P>eye(2))+set(A'*P+P*A < -2*alpha*P)+set(alpha > 0); |
---|
| 755 | sol = solvesdp(F,-alpha,ops); |
---|
| 756 | pass = ismember(sol.problem,[0 3 4 5]); |
---|
| 757 | result = 'N/A'; |
---|
| 758 | if pass |
---|
| 759 | result = resultstring(alpha,2.5); |
---|
| 760 | else |
---|
| 761 | result = 'N/A'; |
---|
| 762 | end |
---|
| 763 | |
---|
| 764 | |
---|
| 765 | function [pass,sol,result]=circuit1(ops) |
---|
| 766 | x = sdpvar(7,1); |
---|
| 767 | |
---|
| 768 | % Data |
---|
| 769 | a = ones(7,1); |
---|
| 770 | alpha = ones(7,1); |
---|
| 771 | beta = ones(7,1); |
---|
| 772 | gamma = ones(7,1); |
---|
| 773 | f = [1 0.8 1 0.7 0.7 0.5 0.5]'; |
---|
| 774 | e = [1 2 1 1.5 1.5 1 2]'; |
---|
| 775 | Cout6 = 10; |
---|
| 776 | Cout7 = 10; |
---|
| 777 | |
---|
| 778 | % Model |
---|
| 779 | C = alpha+beta.*x; |
---|
| 780 | A = sum(a.*x); |
---|
| 781 | P = sum(f.*e.*x); |
---|
| 782 | R = gamma./x; |
---|
| 783 | |
---|
| 784 | D1 = R(1)*(C(4)); |
---|
| 785 | D2 = R(2)*(C(4)+C(5)); |
---|
| 786 | D3 = R(3)*(C(5)+C(7)); |
---|
| 787 | D4 = R(4)*(C(6)+C(7)); |
---|
| 788 | D5 = R(5)*(C(7)); |
---|
| 789 | D6 = R(6)*Cout6; |
---|
| 790 | D7 = R(7)*Cout7; |
---|
| 791 | |
---|
| 792 | % Constraints |
---|
| 793 | F = set(x > 1) + set(P < 20) + set(A < 100); |
---|
| 794 | |
---|
| 795 | % Objective |
---|
| 796 | D = max((D1+D4+D6),(D1+D4+D7),(D2+D4+D6),(D2+D4+D7),(D2+D5+D7),(D3+D5+D6),(D3+D7)); |
---|
| 797 | |
---|
| 798 | sol = solvesdp(F,D,ops); |
---|
| 799 | |
---|
| 800 | pass = ismember(sol.problem,[0 3 4 5]); |
---|
| 801 | result = 'N/A'; |
---|
| 802 | if pass |
---|
| 803 | result = resultstring(D,7.8936); |
---|
| 804 | else |
---|
| 805 | result = 'N/A'; |
---|
| 806 | end |
---|
| 807 | |
---|
| 808 | |
---|
| 809 | |
---|
| 810 | |
---|
| 811 | |
---|
| 812 | function result = resultstring(x,xopt) |
---|
| 813 | if norm(double(x(:))-xopt(:))<1e-3*(1+norm(xopt(:))) |
---|
| 814 | result = 'Correct'; |
---|
| 815 | else |
---|
| 816 | result = 'Incorrect'; |
---|
| 817 | end |
---|
| 818 | |
---|
| 819 | function assert(a) |
---|
| 820 | if ~a |
---|
| 821 | error('Assertion failed!'); |
---|
| 822 | end |
---|
| 823 | |
---|