136 lines
5.4 KiB
Matlab
Executable File
136 lines
5.4 KiB
Matlab
Executable File
%%******************************************************************
|
|
%% infeaspt: generate an initial point for sdp.m
|
|
%%
|
|
%% [X0,y0,Z0] = infeaspt(blk,At,C,b,options,scalefac);
|
|
%%
|
|
%% options = 1 if want X0,Z0 to be scaled identity matrices
|
|
%% = 2 if want X0,Z0 to be scalefac*(identity matrices).
|
|
%%*****************************************************************
|
|
%% SDPT3: version 4.0
|
|
%% Copyright (c) 1997 by
|
|
%% Kim-Chuan Toh, Michael J. Todd, Reha H. Tutuncu
|
|
%% Last Modified: 16 Sep 2004
|
|
%%*****************************************************************
|
|
|
|
function [X0,y0,Z0] = infeaspt(blk,At,C,b,options,scalefac);
|
|
%%
|
|
if (nargin < 5); options = 1; end;
|
|
if (options == 1); scalefac = []; end;
|
|
if (options == 2) & (nargin < 6); scalefac = 1000; end;
|
|
if (scalefac <= 0); error('scalefac must a positive number'); end;
|
|
%%
|
|
if ~iscell(At); At = {At}; end;
|
|
if ~iscell(C); C = {C}; end;
|
|
m = length(b);
|
|
if all(size(At) == [size(blk,1) m]);
|
|
convertyes = zeros(size(blk,1),1);
|
|
for p = 1:size(blk,1)
|
|
if strcmp(blk{p,1},'s') & all(size(At{p,1}) == sum(blk{p,2}))
|
|
convertyes(p) = 1;
|
|
end
|
|
end
|
|
if any(convertyes)
|
|
At = svec(blk,At,ones(size(blk,1),1));
|
|
end
|
|
end;
|
|
%%
|
|
%%[blk,At,C,b] = validate(blk,At,C,b);
|
|
%%
|
|
X0 = cell(size(C)); Z0 = cell(size(C));
|
|
m = length(b);
|
|
for p = 1:size(blk,1);
|
|
pblk = blk(p,:);
|
|
blktmp = pblk{2};
|
|
n = length(C{p});
|
|
y0 = zeros(m,1);
|
|
b2 = 1 + abs(b');
|
|
if (options == 1);
|
|
if strcmp(pblk{1},'s');
|
|
normAni = [];
|
|
X0{p} = sparse(n,n); Z0{p} = sparse(n,n);
|
|
ss = [0, cumsum(blktmp)];
|
|
tt = [0, cumsum(blktmp.*(blktmp+1)/2)];
|
|
for i = 1:length(pblk{2})
|
|
if ~isempty(At{p,1})
|
|
pos = [tt(i)+1 : tt(i+1)];
|
|
Ai = At{p,1}(pos,:);
|
|
normAni = 1+sqrt(sum(Ai.*Ai));
|
|
end
|
|
if (length(At(p,:)) >= 2) %% for low rank constraints
|
|
dd = At{p,3};
|
|
qq = [0, cumsum(pblk{3})]; normtmp = ones(1,length(pblk{3}));
|
|
idxD = [0; find(diff(dd(:,1))); size(dd,1)];
|
|
for k = 1:length(pblk{3})
|
|
idx = [qq(k)+1 : qq(k+1)];
|
|
idx2 = [idxD(k)+1: idxD(k+1)];
|
|
Ak = At{p,2}(:,idx);
|
|
ii = dd(idx2,2)-qq(k); %% undo cumulative indexing
|
|
jj = dd(idx2,3)-qq(k);
|
|
len = pblk{3}(k);
|
|
Dk = spconvert([ii,jj,dd(idx2,4); len,len,0]);
|
|
tmp = Ak'*Ak*Dk;
|
|
normtmp(1,k) = 1+sqrt(sum(sum(tmp.*tmp')));
|
|
end
|
|
normAni = [normAni, normtmp];
|
|
end
|
|
pos = [ss(i)+1 : ss(i+1)]; ni = length(pos);
|
|
tmp = C{p}(pos,pos);
|
|
normCni = 1+sqrt(sum(sum(tmp.*tmp)));
|
|
const = 10; %%--- old: const = 1;
|
|
constX = max([const,sqrt(ni),ni*(b2./normAni)]);
|
|
constZ = max([const,sqrt(ni),normAni,normCni]);
|
|
X0{p}(pos,pos) = constX*spdiags(1+1e-10*randmat(ni,1,0,'u'),0,ni,ni);
|
|
Z0{p}(pos,pos) = constZ*spdiags(1+1e-10*randmat(ni,1,0,'u'),0,ni,ni);
|
|
end
|
|
elseif strcmp(pblk{1},'q');
|
|
s = 1+[0, cumsum(blktmp)];
|
|
len = length(blktmp);
|
|
normC = 1+norm(C{p});
|
|
normA = 1+sqrt(sum(At{p,1}.*At{p,1}));
|
|
idenqX = zeros(sum(blktmp),1);
|
|
idenqZ = zeros(sum(blktmp),1);
|
|
idenqX(s(1:len)) = max([1,b2./normA])*sqrt(blktmp') ;
|
|
idenqZ(s(1:len)) = max([sqrt(blktmp); max([normA,normC])*ones(1,len)])';
|
|
idenqX(s(1:len)) = idenqX(s(1:len)).*(1+1e-10*randmat(len,1,0,'u'));
|
|
idenqZ(s(1:len)) = idenqZ(s(1:len)).*(1+1e-10*randmat(len,1,0,'u'));
|
|
X0{p} = idenqX;
|
|
Z0{p} = idenqZ;
|
|
elseif strcmp(pblk{1},'l');
|
|
normC = 1+norm(C{p});
|
|
normA = 1+sqrt(sum(At{p,1}.*At{p,1}));
|
|
const = 10; %%--- old: const =1;
|
|
constX = max([const,sqrt(n),sqrt(n)*b2./normA]);
|
|
constZ = max([const,sqrt(n),normA,normC]);
|
|
X0{p} = constX*(1+1e-10*randmat(n,1,0,'u'));
|
|
Z0{p} = constZ*(1+1e-10*randmat(n,1,0,'u'));
|
|
elseif strcmp(pblk{1},'u');
|
|
X0{p} = sparse(n,1);
|
|
Z0{p} = sparse(n,1);
|
|
else
|
|
error(' blk: some fields not specified correctly');
|
|
end;
|
|
elseif (options == 2);
|
|
if strcmp(pblk{1},'s');
|
|
n = sum(blktmp);
|
|
X0{p} = scalefac*spdiags(1+1e-10*randmat(n,1,0,'u'),0,n,n);
|
|
Z0{p} = scalefac*spdiags(1+1e-10*randmat(n,1,0,'u'),0,n,n);
|
|
elseif strcmp(pblk{1},'q');
|
|
s = 1+[0, cumsum(blktmp)];
|
|
len = length(blktmp);
|
|
idenq = zeros(sum(blktmp),1);
|
|
idenq(s(1:len)) = 1+1e-10*randmat(len,1,0,'u');
|
|
X0{p} = scalefac*idenq;
|
|
Z0{p} = scalefac*idenq;
|
|
elseif strcmp(pblk{1},'l');
|
|
X0{p} = scalefac*(1+1e-10*randmat(n,1,0,'u'));
|
|
Z0{p} = scalefac*(1+1e-10*randmat(n,1,0,'u'));
|
|
elseif strcmp(pblk{1},'u');
|
|
X0{p} = sparse(n,1);
|
|
Z0{p} = sparse(n,1);
|
|
else
|
|
error(' blk: some fields not specified correctly');
|
|
end
|
|
end
|
|
end
|
|
%%********************************************************************
|