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

69 lines
2.0 KiB
Mathematica
Raw Normal View History

2019-12-18 11:25:45 +00:00
%%*******************************************************
%% thetaproblem: Lovasz theta number.
%%
%% (primal) min Tr C*X
%% s.t. X(i,j) = 0 if (i,j) is an edge of G,
%% Tr(X) = 1.
%% b = e1,
%% C = -ones(n),
%% A1 = eye(n), Ak = ei*ej' + ej*ei', if (i,j) is an edge.
%%-------------------------------------------------------
%%
%% [blk,Avec,C,b,X0,y0,Z0,objval,X] = thetaproblem(G,feas,solve);
%%
%% G: adjacency matrix of a graph.
%% feas = 1 if want feasible starting point
%% = 0 if otherwise.
%% solve = 0 just to initialize
%% = 1 if want to solve the problem.
%%
%% See graph.m --- generate random adjacency matrix.
%%*****************************************************************
%% 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,objval,X] = thetaproblem(G,feas,solve);
if (nargin < 2); feas = 0; end
if (nargin < 3); solve = 0; end
if isempty(feas); feas = 0; end
if ~isreal(G); error('only real G allowed'); end;
n = length(G);
m = sum(sum(triu(G,1))) + 1;
e1 = [1 zeros(1,m-1)]';
C{1} = -ones(n);
b = e1;
blk{1,1} = 's'; blk{1,2} = n;
A = cell(1,m); A{1} = speye(n);
cnt = 2;
for i = 1:n
idx = find(G(i,i+1:n));
idx = idx+i; %% adjust index.
for j = 1:length(idx)
A{1,cnt} = sparse([i idx(j)],[idx(j) i],[1 1],n,n);
cnt = cnt + 1;
end
end
Avec = svec(blk,A,ones(size(blk,1),1));
if (feas == 1)
y0 = -2*n*e1;
Z0 = 2*n*eye(n)+C{1};
X0 = eye(n)/n;
elseif (feas == 0);
[X0,y0,Z0] = infeaspt(blk,Avec,C,b);
end
if (solve)
[obj,X,y,Z] = sqlp(blk,Avec,C,b,[],X0,y0,Z0);
objval = obj(1);
else
objval = []; X = [];
end
%%=======================================================