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

79 lines
2.3 KiB
Matlab
Executable File

%%********************************************************************
%% scaling: scale the SDP data so that A_k,C,b have unit norm.
%%
%% [At,C,b,normA,normC,normb,X0,y0,Z0] = scaling(blk,At,C,b,X0,y0,Z0);
%%
%% The linear objective function value is unchanged under
%% the scaling.
%%*****************************************************************
%% SDPT3: version 4.0
%% Copyright (c) 1997 by
%% Kim-Chuan Toh, Michael J. Todd, Reha H. Tutuncu
%% Last Modified: 16 Sep 2004
%%*****************************************************************
function [At,C,b,normA,normC,normb,X0,y0,Z0] = scaling(blk,At,C,b,X0,y0,Z0);
m = length(b);
numblk = size(blk,1);
normA = cell(numblk,1);
for p = 1:numblk
pblk = blk(p,:);
if strcmp(pblk{1},'s')
m1 = size(At{p,1},2);
if (m1 > 0)
normAp2 = sum(sum(At{p,1}.*At{p,1}));
else
normAp2 = 0;
end
if (length(pblk) > 2) %% for low rank constraints
dd = At{p,3};
m2 = m-m1;
ss = [0,cumsum(pblk{3})];
for k=1:m2
idx = [ss(k)+1:ss(k+1)];
V = At{p,2}(:,idx);
ii = dd(idx,1)-ss(k); %% undo cumulative indexing
jj = dd(idx,2)-ss(k);
len = pblk{3}(k);
D = spconvert([ii,jj,dd(idx,3); len,len,0]);
tmp = V'*V*D;
normAp2 = normAp2 + sum(sum(tmp.*tmp'));
end
end
else
normAp2 = sum(sum(At{p,1}.*At{p,1}));
end
normAp = sqrt(normAp2);
normA{p} = max(1,sqrt(normAp));
end
%%
normb = max(1,norm(b));
normC = 0;
for p = 1:numblk
normC = max(normC,norm(C{p},'fro'));
end
normC = max(1,normC);
%%
for p = 1:numblk
pblk = blk(p,:);
if strcmp(pblk{1},'s')
m1 = size(At{p,1},2);
m2 = m - m1;
At{p,1} = At{p,1}/normA{p};
if (m2 > 0) %% for low rank constaints
At{p,3}(:,3) = At{p,3}(:,3)/normA{p};
end
else
At{p,1} = At{p,1}/normA{p};
end
C{p} = C{p}/(normC*normA{p});
if (nargin == 7)
X0{p} = X0{p}*normA{p};
Z0{p} = Z0{p}/(normC*normA{p});
end
end
b = b/normb;
%%********************************************************************