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

91 lines
3.2 KiB
Mathematica
Raw Normal View History

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