function varargout = SIGN(varargin) %SIGN (overloaded) switch class(varargin{1}) case 'double' error('Overloaded SDPVAR/SIGN CALLED WITH DOUBLE. Report error') case 'sdpvar' varargout{1} = InstantiateElementWise(mfilename,varargin{:}); case 'char' switch varargin{1} case {'graph','exact'} t = varargin{2}; X = varargin{3}; d1 = binvar(1); d2 = binvar(1); d3 = binvar(1); [M,m] = derivebounds(X); if isequal(getbase(X),[0 1]) && ismember(getvariables(X),yalmip('tempintvariables')) % Numerically unstable case with integer X % d1: Negative <= -1 % d2: 0 % d3: Postive >= 1 F = [X >= m*d1, X <= M*d3, X <= (1-d1)*(M+1)-1,X >=(1-d3)*(m-1)+1, m*(1-d2) <= X <= M*(1-d2), t == -d1 + d3,d1+d2+d3==1]; else % Numerically unstable case with continuous X F = [X >= m*d1, X <= M*d3, X <= (1-d1)*M,X >=(1-d3)*m, m*(1-d2) <= X <= M*(1-d2), t == -d1 + d3,d1+d2+d3==1]; end varargout{1} = F; varargout{2} = struct('convexity','none','monotonicity','none','definiteness','none'); varargout{3} = X; otherwise error('SDPVAR/SIGN called with CHAR argument?'); end otherwise error('Strange type on first argument in SDPVAR/SIGN'); end