Dynamic-Calibration/utils/YALMIP-master/solvers/callmaxdet.m

226 lines
6.5 KiB
Mathematica
Raw Normal View History

2019-12-18 11:25:45 +00:00
function output = callmaxdet(interfacedata);
[F_struc,F_blksz,G_struc,G_blksz] = sedumi2maxdet(interfacedata.F_struc,interfacedata.K);
c = interfacedata.c;
options = interfacedata.options;
x0 = interfacedata.x0;
onlyfeasible = (nnz(c)==0) & isempty(G_blksz);
if isempty(G_blksz)
G_blksz = 1;
G_struc = [1 zeros(1,length(c))];
else
end
if isempty(F_blksz)
x = zeros(length(c),1)+NaN;
problem = 11;
infostr = yalmiperror(problems,'MAXDET failed since there are no inequality constraints in F(x)');
solveroutput = [];
solvertime = 0;
D_struc = [];
end
problem = 0;
solvertimephase1=0;
D_struc = [];
if isempty(x0)
solvertimephase1 = tic;
showprogress('Calling MAXDET/phase1',options.showprogress);
[x0,z0,w0,problem,infostr,solveroutput] = callmaxdetphase1(full(F_struc),full(F_blksz), full(G_struc),full(G_blksz), full(c), options);
solvertimephase1 = toc(solvertimephase1);
end
if (problem~=0) | (onlyfeasible==1)
if isempty(x0)
x = repmat(nan,length(c),1);
else
x = x0;
end
solvertime = solvertimephase1;
else
z0=zeros(size(F_struc,1),1);
w0=zeros(size(G_struc,1),1);
solvertime = tic;
showprogress('Calling MAXDET',options.showprogress);
if options.verbose==0
evalc('[x,Z,W,ul,hist,infostr]=maxdet(full(F_struc),F_blksz,full(G_struc), G_blksz,c'',x0,z0,w0,options.maxdet.AbsTol,options.maxdet.RelTol,options.maxdet.gam,options.maxdet.NTiters);');
else
[x,Z,W,ul,hist,infostr]=maxdet(full(F_struc),F_blksz,full(G_struc), G_blksz,c',x0,z0,w0,options.maxdet.AbsTol,options.maxdet.RelTol,options.maxdet.gam,options.maxdet.NTiters);
end
solvertime = toc(solvertime)+solvertimephase1;
D_struc = [Z;W];
if options.savesolveroutput
solveroutput.x = x;
solveroutput.Z = Z;
solveroutput.W = W;
solveroutput.ul = ul;
solveroutput.hist = hist;
solveroutput.infostr = infostr;
else
solveroutput = [];
end
switch infostr
case {'target reached','relative accuracy reached','absolute accuracy reached','absolute tolerance reached','relative tolerance reached'}
problem = 0;
case 'maximum Newton iteration exceeded'
problem = 3;
otherwise
problem = 1;
end
infostr = yalmiperror(problem,'MAXDET');
end
% Standard interface
output = createOutputStructure(x,D_struc,[],problem,infostr,[],solveroutput,solvertime);
function [x0,z0,w0,problem,infostr,solveroutput] = callmaxdetphase1(F_struc,F_blksz, G_struc,G_blksz, c, options);
% Author Johan L<EFBFBD>fberg
% $Id: callmaxdet.m,v 1.6 2006-12-18 14:42:28 joloef Exp $
try
if options.verbose==0
evalc('[x0,z0,w0,ul] = phase1(full(F_struc),F_blksz,full(G_struc), G_blksz,options.maxdet.gam,options.maxdet.AbsTol,options.maxdet.RelTol,options.maxdet.NTiters);');
else
[x0,z0,w0,ul] = phase1(full(F_struc),F_blksz,full(G_struc), G_blksz,options.maxdet.gam,options.maxdet.AbsTol,options.maxdet.RelTol,options.maxdet.NTiters);
end
if ul(1)<0
problem = 0;
elseif ul(2)>=0
problem = 1;
else
problem = 8;
end
% % Problems currently detected outside
% problem = (ul(1)>0);
% In case of problems, phase1 outputs the extended vector instead
% of last primal iterate
if problem
x0 = x0(1:length(c));
end
catch
problem = 9;
x0 = [];
z0 = [];
w0 = [];
ul = [];
end
infostr = yalmiperror(problem,'MAXDET/phase1');
if options.savesolveroutput
solveroutput.x = x0;
solveroutput.Z = z0;
solveroutput.W = w0;
solveroutput.ul = ul;
solveroutput.infostr = infostr;
else
solveroutput = [];
end
% CODE TAKEN DIRECTLY FROM MAXDET/PHASE1
% THE REASON FOR HAVING A COPY HERE IS THAT
% A FILE NAMED PHASE1 EXIST FOR SP ALSO
%MAXDET, version ALPHA, April 1996.
%COPYRIGHT 1996 SHAO-PO WU, LIEVEN VANDENBERGHE AND STEPHEN BOYD
%Permission to use, copy, modify, and distribute this software for
%any purpose without fee is hereby granted, provided that this entire
%notice is included in all copies of any software which is or includes
%a copy or modification of this software and in all copies of the
%supporting documentation for such software.
%This software is being provided "as is", without any express or
%implied warranty. In particular, the authors do not make any
%representation or warranty of any kind concerning the merchantability
%of this software or its fitness for any particular purpose.
function [x,Z,W,ul] = phase1(F,F_blkszs,G,G_blkszs,gam,abstol,reltol,NTiters);
m = size(F,2)-1;
if (m ~= size(G,2)-1)
error('F and G must have the same number of columns.');
end
if (size(F,1) ~= sum(F_blkszs.^2))
error('Dimensions of F do not match F_blkszs.');
end;
if (size(G,1) ~= sum(G_blkszs.^2))
error('Dimensions of G do not match G_blkszs.');
end;
% mineigF is the smallest eigenvalue of F_0
mineigF = 0.0;
k=0; for n=F_blkszs,
mineigF = min(mineigF, min(eig(reshape(F(k+[1:n*n],1),n,n))));
k=k+n*n; % k = sum n_i*n_i
end;
% mineigG is the smallest eigenvalue of G_0
mineigG = 0.0;
k=0; for n=G_blkszs,
mineigG = min(mineigG, min(eig(reshape(G(k+[1:n*n],1),n,n))));
k=k+n*n; % k = sum n_i*n_i
end;
% eyeF is the identity
eyeF = zeros(size(F,1),1);
k=0; for n=F_blkszs,
eyeF(k+[1:n*n]) = reshape(eye(n),n*n,1); % identity
k=k+n*n; % k = sum n_i*n_i
end;
% eyeG is the identity
eyeG = zeros(size(G,1),1);
k=0; for n=G_blkszs,
eyeG(k+[1:n*n]) = reshape(eye(n),n*n,1); % identity
k=k+n*n; % k = sum n_i*n_i
end;
% initial x0
x0 = [zeros(m,1); max(-1.1*min(mineigF,mineigG), 1)];
% linear objective
c = [zeros(m,1); 1];
% call maxdet
[x,Z,W,ul,hist,infostr]=maxdet([F,eyeF; G,eyeG],...
[F_blkszs(:)',G_blkszs(:)'],...
[1 zeros(1,m+1)],1,c,x0,...
zeros(size(F,1)+size(G,1),1),0,...
abstol,reltol,gam,NTiters);
% prepare output
x = x(1:m);
W = Z(size(F,1)+1:size(F,1)+size(G,1));
Z = Z(1:size(F,1));
%if ul(1)<0
% infostr = 'feasible';
%elseif ul(2)>=0
% infostr = 'infeasible';
%else
% infostr = 'feasibility cannot be determined';
%end
function [F_struc,blksz] = deblock(F_struc,blksz);
X = any(F_struc(end-blksz^2+1:end,:),2);
X = reshape(X,blksz,blksz);
[v,dummy,r,dummy2]=dmperm(X);
blks = diff(r);
logt = F_struc;
newlogt = [];
for i = 1:size(logt,2)
temp = reshape(logt(:,i),blksz,blksz);
temp = temp(v,v);
newlogt = [newlogt temp(:)];
end
logt = newlogt;
pattern = [];
for i = 1:length(blks)
pattern = blkdiag(pattern,ones(blks(i)));
end
F_struc = logt(find(pattern),:);
blksz = blks;