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

54 lines
2.1 KiB
Matlab
Executable File

%%*****************************************************************
%% NTscaling: Compute NT scaling matrix
%%
%% compute SVD of Xchol*Zchol via eigenvalue decompostion of
%% Zchol * X * Zchol' = V * diag(sv2) * V'.
%% compute W satisfying W*Z*W = X.
%% W = G'*G, where G = diag(sqrt(sv)) * (invZchol*V)'
%% important to keep W symmertic.
%%*****************************************************************
%% SDPT3: version 4.0
%% Copyright (c) 1997 by
%% Kim-Chuan Toh, Michael J. Todd, Reha H. Tutuncu
%% Last Modified: 16 Sep 2004
%%*****************************************************************
function [W,G,sv,gamx,gamz,dd,ee,ff] = ...
NTscaling(blk,X,Z,Zchol,invZchol);
numblk = size(blk,1);
W = cell(numblk,1); G = cell(numblk,1); sv = cell(numblk,1);
gamx = cell(numblk,1); gamz = cell(numblk,1);
dd = cell(numblk,1); ee = cell(numblk,1); ff = cell(numblk,1);
%%
for p = 1:size(blk,1)
pblk = blk(p,:);
numblk = length(pblk{2});
n = sum(pblk{2});
if strcmp(pblk{1},'l')
dd{p} = X{p}./Z{p}; %% do not add perturbation, it badly affects cre-a
elseif strcmp(pblk{1},'q');
gamx{p} = sqrt(qops(pblk,X{p},X{p},2));
gamz{p} = sqrt(qops(pblk,Z{p},Z{p},2));
w2 = gamz{p}./gamx{p}; w = sqrt(w2);
dd{p} = qops(pblk,1./w2,ones(n,1),4);
tt = qops(pblk,1./w,Z{p},3) - qops(pblk,w,X{p},4);
gamtt = sqrt(qops(pblk,tt,tt,2));
ff{p} = qops(pblk,1./gamtt,tt,3);
ee{p} = qops(pblk,sqrt(2)./w,ff{p},4);
elseif strcmp(pblk{1},'s')
tmp = Prod2(pblk,Zchol{p},X{p},0);
tmp = Prod2(pblk,tmp,Zchol{p}',1);
[sv2,V] = blkeig(pblk,tmp);
sv2 = max(1e-20,sv2);
sv{p} = sqrt(sv2);
tmp = Prod2(pblk,invZchol{p},V);
G{p} = Prod2(pblk,spdiags(sqrt(sv{p}),0,n,n),tmp');
W{p} = Prod2(pblk,G{p}',G{p},1);
end
end
%%**********************************************************************