Dynamic-Calibration/utils/SDPT3-4.0/Solver/convertcmpsdp.m

125 lines
3.6 KiB
Mathematica
Raw Normal View History

2019-12-18 11:25:45 +00:00
%%*****************************************************************
%% 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
%%*********************************************************