125 lines
3.6 KiB
Mathematica
125 lines
3.6 KiB
Mathematica
|
|
%%*****************************************************************
|
||
|
|
%% convertcmpsdp: convert SDP with complex data into one
|
||
|
|
%% with real data by converting
|
||
|
|
%%
|
||
|
|
%% C - sum_{k=1}^m yk*Ak psd
|
||
|
|
%% to
|
||
|
|
%% [CR,-CI] - sum ykR*[AkR,-AkI] psd
|
||
|
|
%% [CI, CR] [AkI, AkR]
|
||
|
|
%%
|
||
|
|
%% ykI = 0 for k = 1:m
|
||
|
|
%%
|
||
|
|
%% [bblk,AAt,CC,bb] = convertcmpsdp(blk,A,C,b);
|
||
|
|
%%*****************************************************************
|
||
|
|
%% SDPT3: version 4.0
|
||
|
|
%% Copyright (c) 1997 by
|
||
|
|
%% K.C. Toh, M.J. Todd, R.H. Tutuncu
|
||
|
|
%% Last Modified: 16 Sep 2004
|
||
|
|
%%*****************************************************************
|
||
|
|
|
||
|
|
function [bblk,AAt,CC,bb,iscmp] = convertcmpsdp(blk,A,C,b);
|
||
|
|
|
||
|
|
m = length(b);
|
||
|
|
[pp,mm] = size(A);
|
||
|
|
if (pp ~= size(blk,1))
|
||
|
|
error('blk and A not compatible');
|
||
|
|
end
|
||
|
|
numblk = size(blk,1);
|
||
|
|
iscmp = zeros(numblk,m+1);
|
||
|
|
for p = 1:size(blk,1)
|
||
|
|
pblk = blk(p,:);
|
||
|
|
len = size(A(p),2);
|
||
|
|
for k = 1:len
|
||
|
|
if ~isempty(A{p,k})
|
||
|
|
iscmp(p,k) = 1-isreal(A{p,k});
|
||
|
|
end
|
||
|
|
end
|
||
|
|
iscmp(p,m+1) = 1-isreal(C{p});
|
||
|
|
end
|
||
|
|
iscmp = norm(iscmp,'fro');
|
||
|
|
%%
|
||
|
|
if (iscmp == 0)
|
||
|
|
%% data is real
|
||
|
|
bblk = blk; AAt = A; CC = C; bb = b;
|
||
|
|
return;
|
||
|
|
end
|
||
|
|
%%
|
||
|
|
bb = [real(b)];
|
||
|
|
bblk = cell(size(blk,1),2);
|
||
|
|
for p = 1:size(blk,1)
|
||
|
|
pblk = blk(p,:);
|
||
|
|
if (size(pblk{2},1) > size(pblk{2},2))
|
||
|
|
pblk{2} = pblk{2}';
|
||
|
|
end
|
||
|
|
if strcmp(pblk{1},'s')
|
||
|
|
ss = [0,cumsum(pblk{2})];
|
||
|
|
ss2 = [0,cumsum(2*pblk{2})];
|
||
|
|
n = sum(pblk{2});
|
||
|
|
n2 = sum(pblk{2}.*(pblk{2}+1))/2;
|
||
|
|
AR = cell(1,m); Ctmp = sparse(2*n,2*n);
|
||
|
|
if (size(A{p},1)==n2 & size(A{p},2)==m);
|
||
|
|
Atype = 1;
|
||
|
|
elseif (size(A(p),1)==1 & size(A(p),2)==1);
|
||
|
|
Atype = 2;
|
||
|
|
else
|
||
|
|
error('convertcmp: At is not properly coded');
|
||
|
|
end
|
||
|
|
for k = 0:m
|
||
|
|
if (k == 0)
|
||
|
|
Ak = C{p};
|
||
|
|
else
|
||
|
|
if (Atype == 1)
|
||
|
|
Ak = smat(pblk,A{p}(:,k),1);
|
||
|
|
elseif (Atype == 2)
|
||
|
|
Ak = A{p,k};
|
||
|
|
end
|
||
|
|
end
|
||
|
|
Atmp = sparse(2*n,2*n);
|
||
|
|
if (length(pblk{2}) == 1)
|
||
|
|
tmp = [real(Ak),-imag(Ak); imag(Ak), real(Ak)];
|
||
|
|
if (k==0)
|
||
|
|
Ctmp = tmp;
|
||
|
|
else
|
||
|
|
Atmp = tmp;
|
||
|
|
end
|
||
|
|
else
|
||
|
|
for j = 1:length(pblk{2})
|
||
|
|
idx = [ss(j)+1: ss(j+1)];
|
||
|
|
Akj = Ak(idx,idx);
|
||
|
|
tmp = [real(Akj),-imag(Akj); imag(Akj), real(Akj)];
|
||
|
|
idx2 = [ss2(j)+1: ss2(j+1)];
|
||
|
|
if (k==0)
|
||
|
|
Ctmp(idx2,idx2) = tmp;
|
||
|
|
else
|
||
|
|
Atmp(idx2,idx2) = tmp;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
if (k==0);
|
||
|
|
CC{p,1} = Ctmp;
|
||
|
|
else
|
||
|
|
AR{k} = Atmp;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
bblk{p,1} = 's'; bblk{p,2} = 2*pblk{2};
|
||
|
|
AAt(p,1) = svec(bblk(p,:),AR);
|
||
|
|
elseif strcmp(pblk{1},'q');
|
||
|
|
error('SOCP block with complex data is currently not allowed');
|
||
|
|
elseif strcmp(pblk{1},'l');
|
||
|
|
if isreal(A{p}) & isreal(C{p})
|
||
|
|
bblk(p,:) = blk(p,:);
|
||
|
|
AAt{p,1} = A{p}; CC{p,1} = C{p};
|
||
|
|
else
|
||
|
|
error('data for linear block must be real');
|
||
|
|
end
|
||
|
|
elseif strcmp(pblk{1},'u');
|
||
|
|
if isreal(A{p}) & isreal(C{p})
|
||
|
|
bblk(p,:) = blk(p,:);
|
||
|
|
AAt{p,1} = A{p}; CC{p,1} = C{p};
|
||
|
|
else
|
||
|
|
error('data for unrestricted block must be real');
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
%%*********************************************************
|