Dynamic-Calibration/utils/YALMIP-master/extras/@lmi/Polyhedron.m

77 lines
2.3 KiB
Mathematica
Raw Normal View History

2019-12-18 11:25:45 +00:00
function [P,x] = polyhedron(X,options)
% polyhedron Converts constraint to MPT polyhedron object
%
% P = polyhedron(F)
% [P,x] = polyhedron(F)
%
% P : polyhedron object (Requires the Multi-parametric Toolbox)
% x : sdpvar object defining the variables in the polyhedron
% F : Constraint object with linear inequalities
if nargin < 2
options = sdpsettings;
elseif isempty(options)
options = sdpsettings;
end
[p,recoverdata,solver,diagnostic,F] = compileinterfacedata(X,[],[],[],options,0);
if p.K.q(1) > 0 | p.K.s(1) > 0 | any(p.variabletype)
error('Polyhedron can only be applied to MILP-representable constraints.')
end
if isempty(p.binary_variables) & isempty(p.integer_variables)
Aeq = -p.F_struc(1:p.K.f,2:end);
beq = p.F_struc(1:p.K.f,1);
A = -p.F_struc(p.K.f+1:end,2:end);
b = p.F_struc(p.K.f+1:end,1);
P = Polyhedron('A',A,'b',b,'Ae',Aeq,'be',beq);
x = recover(p.used_variables);
else
nBin = length(p.binary_variables);
[pBinary,removeEQ,removeLP] = extractOnly(p,p.binary_variables);
p.F_struc = [p.F_struc(removeEQ,:);p.F_struc(p.K.f+removeLP,:)];
p.K.f = length(removeEQ);
p.K.l = length(removeLP);
p.used_variables(p.binary_variables)=[];
x = recover(p.used_variables);
P = [];
for i = 0:2^nBin-1;
comb = dec2decbin(i,nBin);
if checkfeasiblefast(pBinary,comb(:),1e-6)
pi = p;
H = -p.F_struc(:,2:end);
K = p.F_struc(:,1);
K = K-H(:,p.binary_variables)*comb(:);
H(:,p.binary_variables)=[];
Aeq = H(1:p.K.f,:);
beq = H(1:p.K.f);
A = H(p.K.f+1:end,:);
b = K(p.K.f+1:end);
Pi = Polyhedron('A',A,'b',b,'Ae',Aeq,'be',beq);
P = [P Pi];
end
end
end
function pLP = extractLP(p);
pLP = p;
pLP.F_struc = pLP.F_struc(1:p.K.f+p.K.l,:);
pLP.K.q = 0;
pLP.K.s = 0;
function [pRed,removeEQ,removeLP] = extractOnly(p,these);
pRed = p;
p.F_struc(:,1+these) = 0;
removeEQ = find(any(p.F_struc(1:pRed.K.f,2:end),2));
removeLP = find(any(p.F_struc(1+pRed.K.f:end,2:end),2));
pRed.F_struc(pRed.K.f+removeLP,:)=[];
pRed.F_struc(removeEQ,:)=[];
pRed.K.f = pRed.K.f - length(removeEQ);
pRed.K.l = pRed.K.l - length(removeLP);
pRed.F_struc = pRed.F_struc(:,[1 1+these]);
pRed.lb = pRed.lb(these);
pRed.ub = pRed.ub(these);