%%*****************************************************************
%% 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 
%%***********************************************************************
