144 lines
3.8 KiB
Matlab
Executable File
144 lines
3.8 KiB
Matlab
Executable File
%%*****************************************************************
|
|
%% SDPT3data_SEDUMIdata: convert SQLP data in SDPT3 format to
|
|
%% SeDuMi format
|
|
%%
|
|
%% [At,b,c,K] = SDPT3data_SEDUMIdata(blk,AAt,CC,bb);
|
|
%%*****************************************************************
|
|
%% SDPT3: version 4.0
|
|
%% Copyright (c) 1997 by
|
|
%% Kim-Chuan Toh, Michael J. Todd, Reha H. Tutuncu
|
|
%% Last Modified: 16 Sep 2004
|
|
%%*****************************************************************
|
|
|
|
function [At,b,c,K] = SDPT3data_SEDUMIdata(blk,AAt,CC,bb);
|
|
|
|
c = []; At = [];
|
|
b = bb;
|
|
mm = length(bb);
|
|
%%
|
|
if (~iscell(CC))
|
|
Ctmp = CC; clear CC; CC{1} = Ctmp;
|
|
end
|
|
%%
|
|
%% extract unrestricted blk
|
|
%%
|
|
for p = 1:size(blk,1)
|
|
pblk = blk(p,:);
|
|
if (p==1); K.f = []; end
|
|
if strcmp(pblk{1},'u')
|
|
K.f = [K.f, pblk{2}];
|
|
At = [At; AAt{p}];
|
|
c = [c; CC{p}];
|
|
end
|
|
end
|
|
K.f = sum(K.f);
|
|
%%
|
|
%% extract linear blk
|
|
%%
|
|
for p = 1:size(blk,1)
|
|
pblk = blk(p,:);
|
|
if (p==1); K.l = []; end
|
|
if strcmp(pblk{1},'l')
|
|
K.l = [K.l, pblk{2}];
|
|
At = [At; AAt{p,1}];
|
|
c = [c; CC{p,1}];
|
|
end
|
|
end
|
|
K.l = sum(K.l);
|
|
%%
|
|
%% extract second order cone blk
|
|
%%
|
|
for p = 1:size(blk,1)
|
|
pblk = blk(p,:);
|
|
if (p==1); K.q = []; end
|
|
if strcmp(pblk{1},'q')
|
|
K.q = [K.q, pblk{2}];
|
|
At = [At; AAt{p,1}];
|
|
c = [c; CC{p,1}];
|
|
end
|
|
end
|
|
%%
|
|
%% extract rotated cone blk
|
|
%%
|
|
for p = 1:size(blk,1)
|
|
pblk = blk(p,:);
|
|
if (p==1); K.r = []; end
|
|
if strcmp(pblk{1},'r')
|
|
K.r = [K.r, pblk{2}];
|
|
At = [At; AAt{p,1}];
|
|
c = [c; CC{p,1}];
|
|
end
|
|
end
|
|
%%
|
|
%% extract semidefinite cone blk
|
|
%%
|
|
for p = 1:size(blk,1)
|
|
if (p==1); K.s = []; end
|
|
pblk = blk(p,:);
|
|
if strcmp(pblk{1},'s')
|
|
K.s = [K.s, pblk{2}];
|
|
ss = [0,cumsum(pblk{2})];
|
|
idxstart = [0,cumsum(pblk{2}.*pblk{2})];
|
|
numblk = length(pblk{2});
|
|
nnzA = nnz(AAt{p,1});
|
|
II = zeros(2*nnzA,1);
|
|
JJ = zeros(2*nnzA,1);
|
|
VV = zeros(2*nnzA,1);
|
|
m2 = size(AAt{p,1},2);
|
|
if (length(pblk) > 2)
|
|
rr = [0, cumsum(pblk{3})];
|
|
dd = AAt{p,3};
|
|
idxD = [0; find(diff(dd(:,1))); size(dd,1)];
|
|
end
|
|
count = 0;
|
|
for k = 1:mm
|
|
if (k<= m2);
|
|
Ak = smat(pblk,AAt{p,1}(:,k),1);
|
|
else
|
|
idx = [rr(k)+1 : rr(k+1)];
|
|
Vk = AAt{p,2}(:,idx);
|
|
len = pblk{3}(k);
|
|
if (size(dd,2) == 4)
|
|
idx2 = [idxD(k)+1:idxD(k+1)];
|
|
Dk = spconvert([dd(idx2,2:4); len,len,0]);
|
|
elseif (size(dd,2) == 1);
|
|
Dk = spdiags(dd(idx),0,len,len);
|
|
end
|
|
Ak = Vk*Dk*Vk';
|
|
end
|
|
for tt = 1:numblk
|
|
if (numblk > 1)
|
|
idx = [ss(tt)+1: ss(tt+1)];
|
|
Aksub = full(Ak(idx,idx));
|
|
else
|
|
Aksub = Ak;
|
|
end
|
|
tmp = Aksub(:);
|
|
nzidx = find(tmp);
|
|
len = length(nzidx);
|
|
II(count+[1:len],1) = idxstart(tt)+nzidx;
|
|
JJ(count+[1:len],1) = k*ones(length(nzidx),1);
|
|
VV(count+[1:len],1) = tmp(nzidx);
|
|
count = count + len;
|
|
end
|
|
end
|
|
II = II(1:count);
|
|
JJ = JJ(1:count);
|
|
VV = VV(1:count);
|
|
At = [At; spconvert([II,JJ,VV; sum(pblk{2}.*pblk{2}), mm, 0])];
|
|
Cp = CC{p};
|
|
ctmp = [];
|
|
for tt = 1:numblk
|
|
if (numblk > 1)
|
|
idx = [ss(tt)+1: ss(tt+1)];
|
|
Csub = full(Cp(idx,idx));
|
|
else
|
|
Csub = Cp;
|
|
end
|
|
ctmp = [ctmp; Csub(:)];
|
|
end
|
|
c = [c; ctmp];
|
|
end
|
|
end
|
|
%%**********************************************************
|