79 lines
2.2 KiB
Matlab
Executable File
79 lines
2.2 KiB
Matlab
Executable File
%%***********************************************************
|
|
%% etp: Education testing problem.
|
|
%%
|
|
%% (dual problem) maximize e'*d
|
|
%% subject to B - diag(d) >= 0
|
|
%% d >= 0
|
|
%%
|
|
%% (primal problem) minimize Tr B*X
|
|
%% subject to X >= 0
|
|
%% diag(X) >= e
|
|
%%
|
|
%% Ref: M.T. Chu, J.W. Wright, IMA J. of Numerical Anal.,
|
|
%% 15 (1995), pp. 141--160.
|
|
%%-----------------------------------------------------------
|
|
%% [blk,Avec,C,b,X0,y0,Z0,objval,d] = etp(B,feas,solve);
|
|
%%
|
|
%% B = nxn positive definite.
|
|
%% feas = 1 if want feasible starting point
|
|
%% = 0 if otherwise.
|
|
%% solve = 0 just to initialize
|
|
%% = 1 if want to solve the problem.
|
|
%%*****************************************************************
|
|
%% SDPT3: version 4.0
|
|
%% Copyright (c) 1997 by
|
|
%% Kim-Chuan Toh, Michael J. Todd, Reha H. Tutuncu
|
|
%% Last Modified: 16 Sep 2004
|
|
%%*****************************************************************
|
|
|
|
function [blk,Avec,C,b,X0,y0,Z0,objval,d] = etp(B,feas,solve);
|
|
|
|
if (nargin < 2); feas = 0; end
|
|
if (nargin < 3); solve = 0; end
|
|
if isempty(feas); feas = 0; end
|
|
if (~isreal(B))
|
|
error('only real B allowed');
|
|
elseif (norm(B-B','fro') > 1e-13);
|
|
error(' B must be symmetric');
|
|
end;
|
|
%%
|
|
%% validate B
|
|
%%
|
|
n = length(B);
|
|
d = eig(B); d = real(d);
|
|
if (min(d) < 0);
|
|
error('B must be positive def');
|
|
end;
|
|
%%
|
|
%%
|
|
blk{1,1} = 's'; blk{1,2} = n;
|
|
blk{2,1} = 'l'; blk{2,2} = n;
|
|
b = ones(n,1);
|
|
C{1,1} = B;
|
|
C{2,1} = zeros(n,1);
|
|
|
|
A = cell(2,n);
|
|
for k = 1:n
|
|
A{1,k} = sparse(k,k,1,n,n);
|
|
A{2,k} = [zeros(k-1,1); -1; zeros(n-k,1)];
|
|
end;
|
|
|
|
Avec = svec(blk,A,ones(size(blk,1),1));
|
|
if (feas == 1);
|
|
y0 = 0.9*min(d)*ones(n,1);
|
|
Z0 = ops(C,'-',Atyfun(blk,Avec,[],[],y0));
|
|
X0{1,1} = 1.1*eye(n);
|
|
X0{2,1} = 0.1*ones(n,1);
|
|
elseif (feas == 0);
|
|
[X0,y0,Z0] = infeaspt(blk,Avec,C,b);
|
|
end;
|
|
if (solve)
|
|
[obj,X,y,Z] = sqlp(blk,Avec,C,b,[],X0,y0,Z0);
|
|
objval = obj(2);
|
|
d = y;
|
|
else
|
|
objval = []; d = [];
|
|
end
|
|
%%===========================================================
|
|
|