91 lines
3.2 KiB
Matlab
Executable File
91 lines
3.2 KiB
Matlab
Executable File
%%*****************************************************************
|
|
%% sqlpu2lblk: decide whether to convert ublk to lblk
|
|
%%*****************************************************************
|
|
%% SDPT3: version 4.0
|
|
%% Copyright (c) 1997 by
|
|
%% Kim-Chuan Toh, Michael J. Todd, Reha H. Tutuncu
|
|
%% Last Modified: 16 Sep 2004
|
|
%%*****************************************************************
|
|
|
|
function [blk,At,C,X,Z,ublk2lblk,ublkidx] = sqlpu2lblk(blk,At,C,X,Z,par,convertlen)
|
|
|
|
%%
|
|
ublk2lblk = zeros(size(blk,1),1);
|
|
ublkidx = cell(size(blk,1),2);
|
|
|
|
for p = 1:size(blk,1)
|
|
pblk = blk(p,:); n0 = sum(pblk{2});
|
|
if strcmp(pblk{1},'u') & (pblk{2} > 0)
|
|
ublk2lblk(p) = 1;
|
|
if (pblk{2} > convertlen); continue; end
|
|
AAt = At{p}*At{p}';
|
|
mexschurfun(AAt,1e-15*max(1,diag(AAt)));
|
|
indef = 0;
|
|
[L.R,indef,L.perm] = chol(AAt,'vector');
|
|
L.d = full(diag(L.R)).^2;
|
|
if (~indef) & (max(L.d)/min(L.d) < 1e6)
|
|
ublk2lblk(p) = 0;
|
|
msg = '*** no conversion for ublk';
|
|
if (par.printlevel); fprintf(' %s',msg); end
|
|
else
|
|
dd(L.perm,1) = abs(L.d);
|
|
idxN = find(dd < 1e-11*mean(L.d));
|
|
idxB = setdiff([1:n0]',idxN);
|
|
ddB = dd(idxB);
|
|
ddN = dd(idxN);
|
|
if ~isempty(ddN) & ~isempty(ddB) & (min(ddB)/max(ddN) < 10)
|
|
idxN = []; idxB = [1:n0]';
|
|
end
|
|
ublkidx{p,1} = n0; ublkidx{p,2} = idxN;
|
|
if ~isempty(idxN)
|
|
restol = 1e-8;
|
|
[W,resnorm] = findcoeff(At{p}',idxB,idxN);
|
|
resnorm(2) = norm(C{p}(idxN) - W'*C{p}(idxB));
|
|
if (max(resnorm) < restol)
|
|
feasible = 1;
|
|
blk{p,2} = length(idxB);
|
|
Atmp = At{p}';
|
|
At{p} = Atmp(:,idxB)';
|
|
C{p} = C{p}(idxB);
|
|
X{p} = X{p}(idxB); Z{p} = Z{p}(idxB);
|
|
msg = 'removed dependent columns in constraint matrix for ublk';
|
|
if (par.printlevel); fprintf('\n %s\n',msg); end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
%%***************************************************************************
|
|
%%***************************************************************************
|
|
%% findcoeff:
|
|
%%
|
|
%% [W,resnorm] = findcoeff(A,idXB,idXN);
|
|
%%
|
|
%% idXB = indices of independent columns of A.
|
|
%% idxN = indices of dependent columns of A.
|
|
%%
|
|
%% AB = A(:,idxB); AN = A(:,idxN) = AB*W
|
|
%%
|
|
%% SDPT3: version 3.0
|
|
%% Copyright (c) 1997 by
|
|
%% K.C. Toh, M.J. Todd, R.H. Tutuncu
|
|
%% Last modified: 2 Feb 01
|
|
%%***************************************************************************
|
|
|
|
function [W,resnorm] = findcoeff(A,idxB,idxN);
|
|
|
|
AB = A(:,idxB);
|
|
AN = A(:,idxN);
|
|
[m,n] = size(AB);
|
|
%%
|
|
%%-----------------------------------------
|
|
%% find W so that AN = AB*W
|
|
%%-----------------------------------------
|
|
%%
|
|
[L,U,P,Q] = lu(sparse(AB));
|
|
rhs = P*AN;
|
|
Lhat = L(1:n,:);
|
|
W = Q*( U \ (Lhat \ rhs(1:n,:)));
|
|
resnorm = norm(AN-AB*W,'fro')/max(1,norm(AN,'fro'));
|
|
%%***************************************************************************
|