%%***************************************************************** %% validate_startpoint: validate_startpoint starting point X0,y0,Z0 %%***************************************************************** %% SDPT3: version 4.0 %% Copyright (c) 1997 by %% Kim-Chuan Toh, Michael J. Todd, Reha H. Tutuncu %% Last Modified: 16 Sep 2004 %%***************************************************************** function [X0,Z0] = validate_startpoint(blk,X0,Z0,spdensity,iscmp); if (nargin < 5); iscmp = 0; end if (nargin < 4); spdensity = 0.4; end %% if ~iscell(X0) | ~iscell(Z0); error('validate_startpoint: X0, Z0 must be cell arrays'); end if (min(size(X0))~=1 | min(size(Z0))~=1); error('validate_startpoint: cell array X, Z can only have 1 column or row'); end if (size(X0,2) > size(X0,1)); X0 = X0'; end; if (size(Z0,2) > size(Z0,1)); Z0 = Z0'; end; for p = 1:size(blk,1) pblk = blk(p,:); n = sum(pblk{2}); n2 = sum(pblk{2}.*pblk{2}); numblk = length(pblk{2}); if strcmp(pblk{1},'s'); if (iscmp) X0{p} = [real(X0{p}),-imag(X0{p}); imag(X0{p}), real(X0{p})]; Z0{p} = [real(Z0{p}),-imag(Z0{p}); imag(Z0{p}), real(Z0{p})]; end if ~all(size(X0{p}) == n) | ~all(size(Z0{p}) == n); error('validate_startpoint: blk and X0,Z0 are not compatible'); end if (norm([X0{p}-X0{p}' Z0{p}-Z0{p}'],inf) > 2e-13); error('validate_startpoint: X0,Z0 not symmetric'); end if (nnz(X0{p}) < spdensity*n2) | (numblk > 1) ; if ~issparse(X0{p}); X0{p} = sparse(X0{p}); end; else if issparse(X0{p}); X0{p} = full(X0{p}); end; end if (nnz(Z0{p}) < spdensity*n2) | (numblk > 1); if ~issparse(Z0{p}); Z0{p} = sparse(Z0{p}); end; else if issparse(Z0{p}); Z0{p} = full(Z0{p}); end; end elseif strcmp(pblk{1},'q') | strcmp(pblk{1},'l') | strcmp(pblk{1},'u'); if ~all([size(X0{p},2) size(Z0{p},2)]==1); error(['validate_startpoint: ',num2str(p),... '-th block of X0,Z0 must be column vectors']); end if ~all([size(X0{p},1) size(Z0{p},1)]==n); error(['validate_startpoint: blk, and X0,Z0, are not compatible']); end if (nnz(X0{p}) < spdensity*n); if ~issparse(X0{p}); X0{p} = sparse(X0{p}); end; else if issparse(X0{p}); X0{p} = full(X0{p}); end; end if (nnz(Z0{p}) < spdensity*n); if ~issparse(Z0{p}); Z0{p} = sparse(Z0{p}); end; else if issparse(Z0{p}); Z0{p} = full(Z0{p}); end; end if strcmp(pblk{1},'l') & (any(X0{p} < 1e-12) | any(Z0{p} < 1e-12)) error(['X0 or Z0 is not in nonnegative cone']); end if strcmp(pblk{1},'q'); s = 1+[0, cumsum(pblk{2})]; len = length(pblk{2}); if any(X0{p}(s(1:len)) < 1e-12) | any(Z0{p}(s(1:len)) < 1e-12) error(['X0 or Z0 is not in socp cone']); end end end end %%***********************************************************************