Dynamic-Calibration/utils/YALMIP-master/modules/sos/newtonpolytope.m

76 lines
2.0 KiB
Matlab
Executable File

function keep = newtonpolytope(exponent_m,exponent_p)
%NEWTONPOLYTOPE Internal function to remove monimials in SOS programs using Newton polytope
% Author Johan Löfberg
% $Id: newtonpolytope.m,v 1.1 2006-03-30 13:27:20 joloef Exp $
% WARNING : THIS CODE SUCKS AND IS ONLY USED AS A BACK UP PLAN
% IF EVERYTHING ELSE FAILS (CRASHING LP SOLVERS ETC)
% *************************************
% TRY TO CALCULATE CONVEX HULL
% *************************************
try
cnvhull = convhulln(full(exponent_p));
catch
keep = 1:size(exponent_m,1);
return
end
% ***************************************
% GET THE UNIQUE POINTS OF IN CONVEX HULL
% ***************************************
unique_points = unique(cnvhull);
% ***************************************
% CALCULATE A POINT IN INTERIOR
% ***************************************
p_c = sum(exponent_p(unique_points,:),1)'/length(unique_points);
% ***************************************
% CALCULATE HYPER-PLANES Ai^T(x-bi)=0
% ***************************************
j = 1;
A = [];
for i = 1:size(cnvhull,1)
X = exponent_p(cnvhull(i,:),:)';
y = X(:,1);
dX = X(:,2:end)-repmat(X(:,1),1,size(X,2)-1);
Atemp = null(full(dX'));
% Is this a full-dimensional facet
if size(Atemp,2)==1
direction = (p_c-y)'*Atemp;
if direction > 0
A{j}=-Atemp;
else
A{j}=Atemp;
end
b{j}=y;
j=j+1;
end
end
% ***************************************
% CHECK IF MONOMIAL IS IN NEWTON POLYTOPE
% ***************************************
if ~isempty(A)
keep = [];
for j = 1:size(exponent_m,1)
inside = 1;
y = exponent_m(j,:)';
if isempty(findrows(exponent_p,y)) % Numerically safe on border
i = 1;
while inside & (i<=length(A))
inside = inside & ((A{i}'*(y-b{i}))<=1e-9);
i = i+1;
end
end
if inside
keep = [keep j];
end
end
else
keep = 1:size(exponent_m,1);
end