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

115 lines
2.8 KiB
Mathematica
Raw Normal View History

2019-12-18 11:25:45 +00:00
%%*****************************************************************
%% SDPT3soln_SEDUMIsoln: convert SQLP solution in SDPT3 format to
%% SeDuMi format
%%
%% [xx,yy,zz] = SDPT3soln_SEDUMIsoln(blk,X,y,Z,perm);
%%
%% usage: load SEDUMI_data_file (containing say, A,b,c,K)
%% [blk,At,C,b,perm] = read_sedumi(A,b,c,K);
%% [obj,X,y,Z] = sdpt3(blk,At,C,b);
%% [xx,yy,zz] = SDPT3soln_SEDUMIsoln(blk,X,y,Z,perm);
%%*****************************************************************
%% SDPT3: version 4.0
%% Copyright (c) 1997 by
%% Kim-Chuan Toh, Michael J. Todd, Reha H. Tutuncu
%% Last Modified: 16 Sep 2004
%%*****************************************************************
function [xx,yy,zz] = SDPT3soln_SEDUMIsoln(blk,X,y,Z,perm);
yy = y;
xx = []; zz = [];
%%
%% extract unrestricted blk
%%
for p = 1:size(blk,1)
pblk = blk(p,:);
if strcmp(pblk{1},'u')
xx = [xx; X{p,1}];
zz = [zz; Z{p,1}];
end
end
%%
%% extract linear blk
%%
for p = 1:size(blk,1)
pblk = blk(p,:);
if strcmp(pblk{1},'l')
xx = [xx; X{p,1}];
zz = [zz; Z{p,1}];
end
end
%%
%% extract second order cone blk
%%
for p = 1:size(blk,1)
pblk = blk(p,:);
if strcmp(pblk{1},'q')
xx = [xx; X{p,1}];
zz = [zz; Z{p,1}];
end
end
%%
%% extract rotated cone blk
%%
for p = 1:size(blk,1)
pblk = blk(p,:);
if strcmp(pblk{1},'r')
xx = [xx; X{p,1}];
zz = [zz; Z{p,1}];
end
end
%%
%% extract semidefinite cone blk
%%
per = [];
len = 0;
for p = 1:size(blk,1)
pblk = blk(p,:);
if strcmp(pblk{1},'s')
sblk(p) = length(pblk{2});
per = [per, perm{p}];
len = len + sum(pblk{2}.*pblk{2});
end
end
sblk = sum(sblk);
cnt = 1;
Xsblk = cell(sblk,1); Zsblk = cell(sblk,1);
for p = 1:size(blk,1)
pblk = blk(p,:);
if strcmp(pblk{1},'s')
ss = [0,cumsum(pblk{2})];
numblk = length(pblk{2});
Xp = X{p,1};
Zp = Z{p,1};
xtmp = []; ztmp = [];
for tt = 1:numblk
if (numblk > 1)
idx = [ss(tt)+1: ss(tt+1)];
Xsblk{cnt} = full(Xp(idx,idx));
Zsblk{cnt} = full(Zp(idx,idx));
else
Xsblk{cnt} = Xp;
Zsblk{cnt} = Zp;
end
cnt = cnt + 1;
end
end
end
if ~isempty(per)
Xsblk(per) = Xsblk; Zsblk(per) = Zsblk;
xtmp = zeros(len,1); ztmp = zeros(len,1);
cnt = 0;
for p = 1:sblk
if strcmp(pblk{1},'s')
idx = [1:length(Xsblk{p})^2];
xtmp(cnt+idx) = Xsblk{p}(:);
ztmp(cnt+idx) = Zsblk{p}(:);
cnt = cnt + length(idx);
end
end
xx = [xx; xtmp];
zz = [zz; ztmp];
end
%%**********************************************************