Dynamic-Calibration/utils/YALMIP-master/extras/sdpt3struct2sdpt3block.m

75 lines
1.8 KiB
Mathematica
Raw Normal View History

2019-12-18 11:25:45 +00:00
function [C,A,b,blk] = sdpt3struct2sdpt3block(F_struc,c,K)
%SDPT3STRUCT2SDPT3BLOCK Internal function to convert data to SDPT3 format
nvars = size(F_struc,2)-1;
block = 1;
top = 1;
block = 1;
blksz = 100;
if K.l>0
blk{block,1} = 'l';
blk{block,2} = K.l;
C{block,1} = sparse(F_struc(top:top+K.l-1,1));
for var_index = 1:nvars
A{block,var_index} = -sparse(F_struc(top:top+K.l-1,var_index+1));
end
block = block+1;
top = top+sum(K.l);
end
if K.q>0
blk{block,1} = 'q';
blk{block,2} = K.q;
C{block,1} = sparse(F_struc(top:top+sum(K.q)-1,1));
for var_index = 1:nvars
A{block,var_index} = -sparse(F_struc(top:top+sum(K.q)-1,var_index+1));
end
block = block+1;
top = top+sum(K.q);
end
if K.s>0
constraints = 1;
while constraints<=length(K.s)
n = K.s(constraints);
Cvec = F_struc(top:top+n^2-1,1);
C{block,1} = reshape(Cvec,n,n);
for var_index = 1:nvars
Avec = -F_struc(top:top+n^2-1,var_index+1);
A{block,var_index} = reshape(Avec,n,n);
end
blk{block,1} = 's';
blk{block,2} = n;
top = top+n^2;
constraints = constraints+1;
sum_n = n;
while (sum_n<blksz) & (constraints<=length(K.s))
n = K.s(constraints);
Cvec = F_struc(top:top+n^2-1,1);
C{block,1} = blkdiag(C{block,1},reshape(Cvec,n,n));
[n1,m1] = size(A{block,var_index});
[n2,m2] = size(reshape(-F_struc(top:top+n^2-1,1+1),n,n));
Z = spalloc(n1,m2,0);
for var_index = 1:nvars
Avec = -F_struc(top:top+n^2-1,var_index+1);
A{block,var_index} = [A{block,var_index} Z;Z' reshape(Avec,n,n)];
end
blk{block,2} = [blk{block,2} n];
top = top+n^2;
sum_n = sum_n+n;
constraints = constraints+1;
end
block = block+1;
end
end
% And we solve dual...
b = -c(:);
% blkdiag with 2 sparse blocks
function y = blkdiag(x1,x2)
[n1,m1] = size(x1);
[n2,m2] = size(x2);
Z = spalloc(n1,m2,0);
y = [x1 Z;Z' x2];