85 lines
2.5 KiB
Matlab
Executable File
85 lines
2.5 KiB
Matlab
Executable File
function varargout = implies(varargin)
|
|
%IMPLIES Logical implication
|
|
%
|
|
% IMPLIES(X,Y) creates a mixed integer representation of
|
|
% the constraint X --> Y, i.e. Y is true if X is true.
|
|
%
|
|
% Syntax
|
|
% F = implies(X,Y,tol)
|
|
%
|
|
% Input
|
|
% X : binary SDPVAR variable or a constraint
|
|
% Y : binary SDPVAR variable or a constraint
|
|
% tol: Optional threshhold for defining zero (see NOTE)
|
|
%
|
|
% Output
|
|
% F : SET object
|
|
%
|
|
% Examples
|
|
%
|
|
% binvar X Y; F = implies(X,Y);
|
|
% binvar X;sdpvar Y; F = [implies(X,Y>=5), -10 <= Y <= 100];
|
|
% binvar X;Y=sdpvar(3,1); F = [implies(X,[sum(Y);Y(2)]>=[5;0]), -1<= Y <= 10];
|
|
%
|
|
% Note
|
|
%
|
|
% All variables in the expressions have to be explicitly bounded somewhere
|
|
% in the model (implicit constraints are not sufficients such as [Y <= Z,...,Z<= 10]
|
|
%
|
|
% Using implies with X non-binary is highly sensitive numerically.
|
|
% The problem comes from the definition of 0 in a floating-point
|
|
% environment, and precision in the solver. To account for this,
|
|
% the user can supply a third argument to define a dead-zone around
|
|
% zero, i.e Implies(X<=0,Y) will be replaced with IMPLIES(X<=-tol,Y)
|
|
% Note, you typically need to tweak this number for your
|
|
% application/solver. By default, YALMIP uses tol = 0, which means you
|
|
% easily can get garbage... A positive number means YALMIP is cautious in
|
|
% terms of activating the condition, while a negative number means YALMIP
|
|
% will be aggressive in activating the condition.
|
|
%
|
|
% See also @SDPVAR/AND, @SDPVAR/OR, IFF
|
|
|
|
% There are some cases to take care of...
|
|
%
|
|
% X --> Y binary/binary : Implemented
|
|
% X --> Y binary/(LP,equality,sdp) Implemented
|
|
% X --> Y (LP,equality,sdp)/binary Not implemented
|
|
% X --> Y (LP,equality,sdp)/(LP,equality,sdp) Not implemented
|
|
|
|
X = varargin{1};
|
|
Y = varargin{2};
|
|
|
|
if isempty(X)
|
|
varargout{1} = [];
|
|
end
|
|
|
|
switch class(X)
|
|
|
|
case {'sdpvar','constraint','lmi'}
|
|
varargout{1} = setupMeta(lmi([]), mfilename,varargin{:});
|
|
|
|
case 'char'
|
|
varargout{1} = implies_internal(varargin{3:end});
|
|
|
|
case 'logical'
|
|
if length(X)==1
|
|
if X
|
|
varargout{1} = Y;
|
|
else
|
|
varargout{1} = [];
|
|
end
|
|
else
|
|
if length(X) == length(Y)
|
|
i = find(X);
|
|
if isempty(i)
|
|
varargout{1} = [];
|
|
else
|
|
varargout{1} = Y(i);
|
|
end
|
|
else
|
|
error('Size mismatch in input arguments');
|
|
end
|
|
end
|
|
end
|
|
|