Dynamic-Calibration/utils/SDPT3-4.0/Solver/Oldmfiles/validate_old.m

169 lines
6.4 KiB
Mathematica
Raw Normal View History

2019-12-18 11:25:45 +00:00
%%***********************************************************************
%% validate: validate data
%%
%% [blk,At,C,dim,numblk,X0,Z0] = validate(blk,At,C,b,X0,y0,Z0);
%%
%% SDPT3: version 3.1
%% Copyright (c) 1997 by
%% K.C. Toh, M.J. Todd, R.H. Tutuncu
%% Last Modified: 16 Sep 2004
%%***********************************************************************
function [blk,At,C,dim,numblk,X0,Z0] = validate(blk,At,C,b,X0,y0,Z0);
global spdensity smallblkdim
if isempty(spdensity); spdensity = 0.5; end;
%%
if ~iscell(blk);
error('validate: blk must be a cell array'); end;
if (size(blk,2) < 2)
error('validate: blk must be a cell array with at least 2 columns');
end
if ~iscell(At) | ~iscell(C);
error('validate: At, C must be cell arrays'); end;
if (size(At,1) ~= size(blk,1)) | (size(C,1) ~= size(blk,1))
error('validate: size of At or C are not compatible with blk'); end;
if (nargin == 7)
if ~iscell(X0) | ~iscell(Z0);
error('validate: X0, Z0 must be cell arrays');
end
if (min(size(X0))~=1 | min(size(Z0))~=1);
error('validate: 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;
end
%%
%%
m = length(b); numblk = size(blk,1);
for p=1:size(blk,1)
pblk = blk(p,:);
n = sum(pblk{2});
numblk = length(pblk{2});
if strcmp(pblk{1},'s');
m1 = size(At{p,1},2);
n2 = sum(pblk{2}.*pblk{2}); n22 = sum(pblk{2}.*(pblk{2}+1))/2;
if ~all(size(C{p}) == n)
error('validate: blk and C are not compatible'); end;
if (norm(C{p}-C{p}',inf) > 1e-13);
error('validate: C is not symmetric'); end;
if (size(At{p,1}) == [m1, n22] & m1~=n22);
At{p,1} = At{p,1}'; end
if (~isempty(At{p,1})) & (size(At{p,1},1) ~= n22)
error('validate: blk and At not compatible'); end;
if (nnz(At{p,1}) < spdensity*n22*m1)
if ~issparse(At{p,1}); At{p,1} = sparse(At{p,1}); end
end
if (length(pblk) > 2)
smallblkdim = 0;
if (length(At(p,:)) > 2)
if (min(size(At{p,3})) > 1)
error(' low rank structure in At{p,3} not specified correctly')
else
if (size(At{p,3},1) < size(At{p,3},2)); At{p,3} = At{p,3}'; end
end
if (sum(pblk{3}) ~= length(At{p,3}))
error(' low rank structure specified in blk and At not compatible')
end
end
if (sum(pblk{3}) ~= size(At{p,2},2))
error(' low rank structure specified in blk and At not compatible')
end
if (size(pblk{1,3},2) < size(pblk{1,3},1))
blk{p,3} = blk{p,3}';
end
end
if (nnz(C{p}) < spdensity*n2) | (numblk > 1);
if ~issparse(C{p}); C{p} = sparse(C{p}); end;
else
if issparse(C{p}); C{p} = full(C{p}); end;
end
if (nargin == 7)
if ~all(size(X0{p}) == n) | ~all(size(Z0{p}) == n);
error('validate: blk and X0,Z0 are not compatible'); end;
if (length(y0) ~= m);
error('validate: length of b and y0 not compatible'); end;
if (norm([X0{p}-X0{p}' Z0{p}-Z0{p}'],inf) > 2e-13);
error('validate: 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;
end
elseif strcmp(pblk{1},'q') | strcmp(pblk{1},'l') | strcmp(pblk{1},'u');
if (size(C{p},2) ~= 1);
error(['validate: ',num2str(p),'-th block of C must be column vectors']);
end;
if (size(C{p},1) ~= n);
error(['validate: blk and C are not compatible']);
end;
if (size(At{p,1}) == [m n] & m~=n);
At{p,1} = At{p,1}'; end
if ~all(size(At{p,1}) == [n,m]);
error('validate: blk and At not compatible'); end;
if ~issparse(At{p,1});
At{p,1} = sparse(At{p,1}); end;
if (nnz(C{p}) < spdensity*n);
if ~issparse(C{p}); C{p} = sparse(C{p}); end;
else
if issparse(C{p}); C{p} = full(C{p}); end;
end;
if (nargin == 7)
if ~all([size(X0{p},2) size(Z0{p},2)]==1);
error(['validate: ',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: 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},'u')
Z0{p} = sparse(n,1);
end
end
else
error(' blk: some fields are not specified correctly');
end
end
%%
%%-----------------------------------------
%% problem dimension
%%-----------------------------------------
%%
dim = zeros(1,4); numblk = zeros(1,2);
for p = 1:size(blk,1)
pblk = blk(p,:);
if strcmp(pblk{1},'s')
dim(1) = dim(1) + sum(pblk{2});
numblk(1) = numblk(1) + length(pblk{2});
nn(p) = sum(pblk{2});
elseif strcmp(pblk{1},'q')
dim(2) = dim(2) + sum(pblk{2});
numblk(2) = numblk(2) + length(pblk{2});
nn(p) = length(pblk{2});
elseif strcmp(pblk{1},'l')
dim(3) = dim(3) + sum(pblk{2});
nn(p) = sum(pblk{2});
elseif strcmp(pblk{1},'u')
dim(4) = dim(4) + sum(pblk{2});
nn(p) = sum(pblk{2});
end
end
%%
%%***********************************************************************