Dynamic-Calibration/utils/SDPT3-4.0/Examples/randinfsdp.m

265 lines
8.3 KiB
Mathematica
Raw Normal View History

2019-12-18 11:25:45 +00:00
%%*******************************************************************
%% randinfsdp.m : creates random infeasible SDP problems with various block
%% diagonal structures.
%%
%% [blk,Avec,C,b,X0,y0,Z0] =
%% randinfsdp(dense_blk,sparse_blk,diag_blk,m,infeas,solve);
%%
%% E.g.
%% randinfsdp([32 20],[10 5],100,10,infeas,solve);
%%
%% dense_blk : for generating dense blocks, where
%% dense_blk(i) is the dimension of the ith block
%% sparse_blk: for generating a sparse block of small subblocks, where
%% sparse_blk(i) is the size of the ith subblock.
%% diag_blk: for generating a column vector of length specified by
%% diag_blk (this corresponds to a diagonal block).
%% infeas = 1 if want primal infeasible pair of problems
%% = 2 if want dual infeasible pair of problems
%% solve = 0 just to initialize
%% = 1 if want to solve the problem.
%%*****************************************************************
%% SDPT3: version 4.0
%% Copyright (c) 1997 by
%% Kim-Chuan Toh, Michael J. Todd, Reha H. Tutuncu
%% Last Modified: 16 Sep 2004
%%*****************************************************************
function [blk,Avec,C,b,X0,y0,Z0] = ...
randinfsdp(dense_blk,sparse_blk,diag_blk,m,infeas,solve);
if nargin < 6; solve = 0; end;
if nargin < 5; error(' insufficient number of inputs '); end;
if all(infeas-[1 2]);
error(' infeas must be 1 or 2 ');
end
blk = [];
if ~isempty(dense_blk);
for k = 1:length(dense_blk);
blk{k,1} = 's'; blk{k,2} = dense_blk(k);
end;
end;
if ~isempty(sparse_blk);
if size(sparse_blk,1) > size(sparse_blk,2); sparse_blk = sparse_blk'; end;
tmp = size(blk,1);
blk{tmp+1,1} = 's';
blk{tmp+1,2} = sparse_blk;
end;
if ~isempty(diag_blk);
tmp = size(blk,1);
blk{tmp+1,1} = 'l';
blk{tmp+1,2} = diag_blk;
end;
N = size(blk,1);
if (infeas == 1),
%%
%% primal infeasible
%%
%% generate infeasibility certificate Zi and Z0
%%
tmp_sp = sparse(sum(sparse_blk));
for L = 1:2,
T = [];
if ~isempty(dense_blk);
for k = 1:length(dense_blk);
n = dense_blk(k);
tmp = randn(n);
tmp = tmp*tmp';
tmp = 0.5*(tmp + tmp');
%mineig = min(real(eig(tmp)));
%if (mineig < 0); tmp = tmp - 1.1*mineig*eye(n); end;
T{k,1} = tmp;
end;
end;
if ~isempty(sparse_blk);
for k = 1:length(sparse_blk);
n = sparse_blk(k);
pos = [sum(sparse_blk(1:k-1))+1 : sum(sparse_blk(1:k))];
tmp = randn(n);
tmp = tmp*tmp';
tmp = 0.5*(tmp + tmp');
%mineig = min(real(eig(tmp)));
%if (mineig < 0); tmp = tmp - 1.1*mineig*eye(n); end;
tmp_sp(pos,pos) = sparse(tmp);
end;
T{size(T,1)+1,1} = tmp_sp;
end;
if ~isempty(diag_blk);
tmp = randn(diag_blk,1);
tmp = tmp.*tmp;
%mineig = min(tmp);
%if (mineig < 0); tmp = tmp - 1.1*mineig*ones(diag_blk,1); end;
T{size(T,1)+1,1} = tmp;
end;
if (L == 1); Zi = T; else; Z0 = T; end;
end;
%%
%% set up the matrices Ak and b
%%
A = cell(N,m);
Ak_sp = sparse(sum(sparse_blk),sum(sparse_blk));
for k = 1:m;
Ak = [];
if ~isempty(dense_blk);
for j = 1:length(dense_blk);
tmp = randn(dense_blk(j)); tmp = 0.5*(tmp+tmp');
Ak{j,1} = tmp;
end;
end;
if ~isempty(sparse_blk);
for j = 1:length(sparse_blk);
n = sparse_blk(j);
tmp = randn(n); tmp = 0.5*(tmp+tmp');
pos = [sum(sparse_blk(1:j-1))+1 : sum(sparse_blk(1:j))];
Ak_sp(pos,pos) = tmp;
end;
Ak{size(Ak,1)+1,1} = Ak_sp;
end;
if ~isempty(diag_blk);
Ak{size(Ak,1)+1,1} = randn(diag_blk,1);
end;
A(:,k) = Ak;
end;
y = ones(m,1);
SAZm = ops(ops(Zi,'+',Asum(blk,A,y)),'/',m);
SAZm = ops(ops(SAZm,'+',ops(SAZm,'transpose')),'*',0.5);
yi = randn(m,1);
for k = 1:m,
Ak = A(:,k);
Ak = ops(ops(Ak,'-',SAZm),'/',yi(k));
Ak = ops(ops(Ak,'+',ops(Ak,'transpose')),'*',0.5);
A(:,k) = Ak;
end;
b = randn(m,1);
if (b'*yi < 0), b = -b; end;
y0 = randn(m,1);
C = ops(Z0,'+',Asum(blk,A,y0));
C = ops(ops(C,'+',ops(C,'transpose')),'*',0.5);
%%
%% (yi,Zi) is a primal infeasibility certificate
%%
elseif (infeas == 2),
%%
%% dual infeasible
%%
%% generate infeasibility certificate Xi, positive definite X0, and C
%%
tmp_sp_Xi = sparse(sum(sparse_blk));
tmp_sp_X0 = sparse(sum(sparse_blk));
tmp_sp_C = sparse(sum(sparse_blk));
Xi = [];
X0 = [];
C = [];
if ~isempty(dense_blk);
for k = 1:length(dense_blk);
n = dense_blk(k);
tmp = randn(n);
tmp = tmp*tmp';
tmp = 0.5*(tmp + tmp');
%mineig = min(real(eig(tmp)));
%if (mineig < 0); tmp = tmp - 1.1*mineig*eye(n); end;
Xi{k,1} = tmp;
tmp = randn(n);
tmp = tmp*tmp';
tmp = 0.5*(tmp + tmp');
%mineig = min(real(eig(tmp)));
%if (mineig < 0); tmp = tmp - 1.1*mineig*eye(n); end;
X0{k,1} = tmp;
tmp = randn(n); tmp = 0.5*(tmp + tmp');
C{k,1} = tmp;
end;
end;
if ~isempty(sparse_blk);
for k = 1:length(sparse_blk);
n = sparse_blk(k);
pos = [sum(sparse_blk(1:k-1))+1 : sum(sparse_blk(1:k))];
tmp = randn(n);
tmp = tmp*tmp';
tmp = 0.5*(tmp + tmp');
%mineig = min(real(eig(tmp)));
%if (mineig < 0); tmp = tmp - 1.1*mineig*eye(n); end;
tmp_sp_Xi(pos,pos) = sparse(tmp);
tmp = randn(n);
tmp = tmp*tmp';
tmp = 0.5*(tmp + tmp');
%mineig = min(real(eig(tmp)));
%if (mineig < 0); tmp = tmp - 1.1*mineig*eye(n); end;
tmp_sp_X0(pos,pos) = sparse(tmp);
tmp = randn(n); tmp = 0.5*(tmp + tmp');
tmp_sp_C(pos,pos) = sparse(tmp);
end;
Xi{size(Xi,1)+1,1} = tmp_sp_Xi;
X0{size(X0,1)+1,1} = tmp_sp_X0;
C{size(C,1)+1,1} = tmp_sp_C;
end;
if ~isempty(diag_blk);
n = diag_blk;
tmp = randn(n,1);
tmp = tmp.*tmp;
%mineig = min(tmp);
%if (mineig < 0); tmp = tmp - 1.1*mineig*ones(n,1); end;
Xi{size(X0,1)+1,1} = tmp;
tmp = randn(n,1);
tmp = tmp.*tmp;
%mineig = min(tmp);
%if (mineig < 0); tmp = tmp - 1.1*mineig*ones(n,1); end;
X0{size(X0,1)+1,1} = tmp;
tmp = randn(n,1);
C{size(C,1)+1,1} = tmp;
end;
%%
%% set up the matrices Ak and b
%%
trXX = blktrace(blk,Xi,Xi);
A = cell(N,m);
Ak_sp = sparse(sum(sparse_blk),sum(sparse_blk));
b = ones(m,1);
for k = 1:m;
Ak = [];
if ~isempty(dense_blk);
for j = 1:length(dense_blk);
n = dense_blk(j);
Aj = randn(n);
Ak{j,1} = (Aj + Aj')/2;
end;
end;
if ~isempty(sparse_blk);
for j = 1:length(sparse_blk);
pos = [sum(sparse_blk(1:j-1))+1 : sum(sparse_blk(1:j))];
n = sparse_blk(j);
Aj = randn(n);
Ak_sp(pos,pos) = (Aj + Aj')/2;
end;
Ak{size(Ak,1)+1,1} = Ak_sp;
end;
if ~isempty(diag_blk);
n = diag_blk;
Ak{size(Ak,1)+1,1} = randn(n,1);
end;
trAX = blktrace(blk,Ak,Xi);
Ak = ops(Ak,'-',ops(Xi,'*',(trAX/trXX)));
Ak = ops(ops(Ak,'+',ops(Ak,'transpose')),'*',0.5);
A(:,k) = Ak;
b(k) = blktrace(blk,Ak,X0);
end;
if (blktrace(blk,C,Xi) > 0), C = ops(C,'*',-1); end;
%%
%% Xi is a dual infeasibility certificate
%%
end;
%%
%% infeasible initial iterate
%%
Avec = svec(blk,A,ones(size(blk,1),1));
[X0,y0,Z0] = infeaspt(blk,Avec,C,b);
%%
if solve;
[obj,X,y,Z] = sqlp(blk,Avec,C,b,[],X0,y0,Z0);
end;
%%=================================================