62 lines
2.5 KiB
Mathematica
62 lines
2.5 KiB
Mathematica
|
|
%%*****************************************************************
|
||
|
|
%% HSDsqlpCpert: perturb C.
|
||
|
|
%%*****************************************************************
|
||
|
|
%% SDPT3: version 4.0
|
||
|
|
%% Copyright (c) 1997 by
|
||
|
|
%% Kim-Chuan Toh, Michael J. Todd, Reha H. Tutuncu
|
||
|
|
%% Last Modified: 16 Sep 2004
|
||
|
|
%%*****************************************************************
|
||
|
|
|
||
|
|
function [At,Cpert] = HSDsqlpCpert(blk,At,par,C,X,Cpert,runhist)
|
||
|
|
|
||
|
|
iter = length(runhist.pinfeas);
|
||
|
|
prim_infeas = runhist.pinfeas(iter);
|
||
|
|
dual_infeas = runhist.dinfeas(iter);
|
||
|
|
relgap = runhist.relgap(iter);
|
||
|
|
infeas = runhist.infeas(iter);
|
||
|
|
theta = runhist.theta(iter);
|
||
|
|
%%
|
||
|
|
Cpertold = Cpert;
|
||
|
|
err = max(relgap,infeas);
|
||
|
|
for p = 1:size(blk,1)
|
||
|
|
pblk = blk(p,:);
|
||
|
|
n = sum(pblk{2});
|
||
|
|
tmp = max(1,norm(C{p},'fro'))/sqrt(n);
|
||
|
|
if (err < 1e-6)
|
||
|
|
if (norm(X{p},'fro') < 1e2); const=0.2; else; const=0.3; end
|
||
|
|
Cpert(p) = max(const*Cpert(p),1e-10*tmp);
|
||
|
|
elseif (err < 1e-2)
|
||
|
|
if (norm(X{p},'fro') < 1e2); const=0.4; else; const=0.5; end
|
||
|
|
Cpert(p) = max(const*Cpert(p),1e-8*tmp);
|
||
|
|
else
|
||
|
|
Cpert(p) = max(0.9*Cpert(p),1e-6*tmp);
|
||
|
|
end
|
||
|
|
Cpert = min(Cpert,Cpertold);
|
||
|
|
if (prim_infeas < min([0.1*dual_infeas, 1e-7*runhist.pinfeas(1)])) ...
|
||
|
|
& (iter > 1 & dual_infeas > 0.8*runhist.dinfeas(iter-1) & relgap < 1e-4)
|
||
|
|
Cpert(p) = 0.5*Cpert(p);
|
||
|
|
elseif (dual_infeas < min([0.1*prim_infeas, 1e-7*runhist.dinfeas(1)])) ...
|
||
|
|
& (iter > 1 & prim_infeas > 0.8*runhist.pinfeas(iter-1) & relgap < 1e-4)
|
||
|
|
Cpert(p) = 0.5*Cpert(p);
|
||
|
|
elseif (max(relgap,1e-2*infeas) < 1e-6 & relgap < 0.1*infeas)
|
||
|
|
Cpert(p) = 0.5*Cpert(p);
|
||
|
|
end
|
||
|
|
if (prim_infeas < min([1e-4*dual_infeas,1e-7]) & theta < 1e-6) ...
|
||
|
|
| (prim_infeas < 1e-4 & theta < 1e-10)
|
||
|
|
Cpert(p) = 0.1*Cpert(p);
|
||
|
|
elseif (dual_infeas < min([1e-4*prim_infeas,1e-7]) & theta < 1e-6) ...
|
||
|
|
| (dual_infeas < 1e-4 & theta < 1e-10)
|
||
|
|
Cpert(p) = 0.1*Cpert(p);
|
||
|
|
elseif (iter > 1 & theta > 0.9*runhist.theta(iter-1) & infeas < 1e-3)
|
||
|
|
Cpert(p) = 0.1*Cpert(p);
|
||
|
|
end
|
||
|
|
if strcmp(pblk{1},'s')
|
||
|
|
Cnew = C{p} + Cpert(p)*speye(n);
|
||
|
|
At{p}(:,par.invpermA(p,end-1)) = -svec(pblk,Cnew,1);
|
||
|
|
else
|
||
|
|
Cnew = C{p} + Cpert(p)*ones(n,1);
|
||
|
|
At{p}(:,par.invpermA(p,end-1)) = -Cnew;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
%%*****************************************************************************
|