119 lines
4.5 KiB
Mathematica
119 lines
4.5 KiB
Mathematica
|
|
%%*****************************************************************
|
||
|
|
%% NTrhsfun: compute the right-hand side vector of the
|
||
|
|
%% Schur complement equation for the NT direction.
|
||
|
|
%%*****************************************************************
|
||
|
|
%% SDPT3: version 4.0
|
||
|
|
%% Copyright (c) 1997 by
|
||
|
|
%% Kim-Chuan Toh, Michael J. Todd, Reha H. Tutuncu
|
||
|
|
%% Last Modified: 16 Sep 2004
|
||
|
|
%%*****************************************************************
|
||
|
|
|
||
|
|
function [rhs,EinvRc,hRd] = NTrhsfun(blk,At,par,X,Z,rp,Rd,sigmu,hRd,dX,dZ);
|
||
|
|
|
||
|
|
spdensity = par.spdensity;
|
||
|
|
m = length(rp);
|
||
|
|
if (nargin > 8)
|
||
|
|
corrector = 1;
|
||
|
|
else
|
||
|
|
corrector = 0;
|
||
|
|
hRd = zeros(m,1);
|
||
|
|
end
|
||
|
|
hEinvRc = zeros(m,1);
|
||
|
|
EinvRc = cell(size(blk,1),1);
|
||
|
|
rhsfree = [];
|
||
|
|
%%
|
||
|
|
for p = 1:size(blk,1)
|
||
|
|
pblk = blk(p,:);
|
||
|
|
n = sum(pblk{2}); numblk = length(pblk{2});
|
||
|
|
if strcmp(pblk{1},'l')
|
||
|
|
if iscell(sigmu)
|
||
|
|
EinvRc{p} = sigmu{p}./Z{p} -X{p};
|
||
|
|
else
|
||
|
|
EinvRc{p} = sigmu./Z{p} -X{p};
|
||
|
|
end
|
||
|
|
Rq = sparse(n,1);
|
||
|
|
if (corrector) & (norm(par.parbarrier{p})==0)
|
||
|
|
Rq = dX{p}.*dZ{p}./Z{p};
|
||
|
|
else
|
||
|
|
tmp = par.dd{p}.*Rd{p};
|
||
|
|
tmp2 = mexMatvec(At{p},tmp,1);
|
||
|
|
hRd = hRd + tmp2;
|
||
|
|
end
|
||
|
|
EinvRc{p} = EinvRc{p} - Rq;
|
||
|
|
tmp2 = mexMatvec(At{p},EinvRc{p},1);
|
||
|
|
hEinvRc = hEinvRc + tmp2;
|
||
|
|
elseif strcmp(pblk{1},'q')
|
||
|
|
if iscell(sigmu)
|
||
|
|
EinvRc{p} = qops(pblk,-sigmu{p}./(par.gamz{p}.*par.gamz{p}),Z{p},4) -X{p};
|
||
|
|
else
|
||
|
|
EinvRc{p} = qops(pblk,-sigmu./(par.gamz{p}.*par.gamz{p}),Z{p},4) -X{p};
|
||
|
|
end
|
||
|
|
Rq = sparse(n,1);
|
||
|
|
if (corrector) & (norm(par.parbarrier{p})==0)
|
||
|
|
w = sqrt(par.gamz{p}./par.gamx{p});
|
||
|
|
hdx = qops(pblk,w,par.ff{p},5,dX{p});
|
||
|
|
hdz = qops(pblk,w,par.ff{p},6,dZ{p});
|
||
|
|
hdxdz = Arrow(pblk,hdx,hdz);
|
||
|
|
vv = qops(pblk,w,par.ff{p},5,X{p});
|
||
|
|
Vihdxdz = Arrow(pblk,vv,hdxdz,1);
|
||
|
|
Rq = qops(pblk,w,par.ff{p},6,Vihdxdz);
|
||
|
|
else
|
||
|
|
tmp = par.dd{p}.*Rd{p} + qops(pblk,qops(pblk,Rd{p},par.ee{p},1),par.ee{p},3);
|
||
|
|
tmp2 = mexMatvec(At{p},tmp,1);
|
||
|
|
hRd = hRd + tmp2;
|
||
|
|
end
|
||
|
|
EinvRc{p} = EinvRc{p} - Rq;
|
||
|
|
tmp2 = mexMatvec(At{p},EinvRc{p},1);
|
||
|
|
hEinvRc = hEinvRc + tmp2;
|
||
|
|
elseif strcmp(pblk{1},'s')
|
||
|
|
n2 = pblk{2}.*(pblk{2}+1)/2;
|
||
|
|
if iscell(sigmu)
|
||
|
|
%%ss = [0,cumsum(pblk{2})];
|
||
|
|
%%sigmuvec = zeros(n,1);
|
||
|
|
%%for k = 1:length(pblk{2});
|
||
|
|
%% sigmuvec(ss(k)+1:ss(k+1)) = sigmu{p}(k)*ones(pblk{2}(k),1);
|
||
|
|
%%end
|
||
|
|
sigmuvec = mexexpand(pblk{2},sigmu{p});
|
||
|
|
tmp = spdiags(sigmuvec./par.sv{p} -par.sv{p},0,n,n);
|
||
|
|
else
|
||
|
|
tmp = spdiags(sigmu./par.sv{p} -par.sv{p},0,n,n);
|
||
|
|
end
|
||
|
|
EinvRc{p} = Prod3(pblk,par.G{p}',tmp,par.G{p},1);
|
||
|
|
Rq = sparse(n,n);
|
||
|
|
if (corrector) & (norm(par.parbarrier{p})==0)
|
||
|
|
hdZ = Prod3(pblk,par.G{p},dZ{p},par.G{p}',1);
|
||
|
|
hdX = spdiags(qops(pblk,par.parbarrier{p}',1./par.sv{p},3)-par.sv{p},0,n,n)-hdZ;
|
||
|
|
tmp = Prod2(pblk,hdX,hdZ,0);
|
||
|
|
tmp = 0.5*(tmp+tmp');
|
||
|
|
if (numblk == 1)
|
||
|
|
d = par.sv{p};
|
||
|
|
e = ones(pblk{2},1);
|
||
|
|
Rq = 2*tmp./(d*e'+e*d');
|
||
|
|
if (nnz(Rq) <= spdensity*n2); Rq = sparse(Rq); end
|
||
|
|
else
|
||
|
|
Rq = sparse(n,n);
|
||
|
|
ss = [0, cumsum(pblk{2})];
|
||
|
|
for i = 1:numblk
|
||
|
|
pos = [ss(i)+1 : ss(i+1)];
|
||
|
|
d = par.sv{p}(pos); e = ones(length(pos),1);
|
||
|
|
Rq(pos,pos) = 2*tmp(pos,pos)./(d*e' + e*d');
|
||
|
|
end
|
||
|
|
end
|
||
|
|
Rq = Prod3(pblk,par.G{p}',Rq,par.G{p},1);
|
||
|
|
else
|
||
|
|
tmp = Prod3(pblk,par.W{p},Rd{p},par.W{p},1,par.nzlistAy{p});
|
||
|
|
tmp2 = AXfun(pblk,At(p,:),par.permA(p,:),{tmp});
|
||
|
|
hRd = hRd + tmp2;
|
||
|
|
end
|
||
|
|
EinvRc{p} = EinvRc{p} - Rq;
|
||
|
|
tmp2 = AXfun(pblk,At(p,:),par.permA(p,:),EinvRc(p));
|
||
|
|
hEinvRc = hEinvRc + tmp2;
|
||
|
|
elseif strcmp(pblk{1},'u')
|
||
|
|
rhsfree = [rhsfree; Rd{p}];
|
||
|
|
end
|
||
|
|
end
|
||
|
|
%%
|
||
|
|
rhs = rp + hRd - hEinvRc;
|
||
|
|
rhs = full([rhs; rhsfree]);
|
||
|
|
%%*******************************************************************
|