Dynamic-Calibration/utils/YALMIP-master/extras/@ncvar/sign.m

76 lines
2.5 KiB
Matlab
Executable File

function varargout = sign(varargin)
%SIGN (overloaded)
%% ***************************************************
% This file defines a nonlinear operator for YALMIP
%
% It can take three different inputs
% For DOUBLE inputs, it returns standard double values
% For SDPVAR inputs, it generates an internal variable
%
% When first input is 'model' it returns the graph
% in the first output and structure describing some
% properties of the operator.
%% ***************************************************
switch class(varargin{1})
case 'double' % What is the numerical value of this argument (needed for displays etc)
% SHOULD NEVER HAPPEN, THIS SHOULD BE CAUGHT BY BUILT-IN
error('Overloaded SDPVAR/NORM CALLED WITH DOUBLE. Report error')
case 'sdpvar' % Overloaded operator for SDPVAR objects. Pass on args and save them.
if length(varargin{1}) == 1
varargout{1} = yalmip('addextendedvariable',mfilename,varargin{1});
else
y = [];
n = size(varargin{1},1);
m = size(varargin{1},2);
varargin{1} = reshape(varargin{1},n*m,1);
for i = 1:prod(size(varargin{1}))
inparg = extsubsref(varargin{1},i);
if isa(inparg,'double')
y = sign(inparg);
else
y = [y yalmip('addextendedvariable',mfilename,inparg)];
end
end
y = reshape(y,n,m);
varargout{1} = y;
end
case 'char' % YALMIP sends 'model' when it wants the epigraph or hypograph
switch varargin{1}
case 'graph'
t = varargin{2};
X = varargin{3};
% No linear model available
varargout{1} = [];
varargout{2} = [];
varargout{3} = [];
case 'milp'
t = varargin{2};
X = varargin{3};
p = varargin{4};
d = binvar(1,1);
[M,m] = derivebounds(X);
F = ([]);
F = (X > d*m) + (-2*d+1 <= t <= 1);
F = (X < (1-d)*M) + (-1 <= t <= -1 + 2*(1-d));
varargout{1} = F;
varargout{2} = struct('convexity','milp','monotonicity','milp','definiteness','positive');
varargout{3} = X;
otherwise
error('SDPVAR/NORM called with CHAR argument?');
end
otherwise
error('Strange type on first argument in SDPVAR/NORM');
end