62 lines
1.4 KiB
Matlab
Executable File
62 lines
1.4 KiB
Matlab
Executable File
function varargout = lmixor(varargin)
|
|
%XOR (overloaded)
|
|
|
|
% Models XOR using a nonlinear operator definition
|
|
switch class(varargin{1})
|
|
case 'char'
|
|
z = varargin{2};
|
|
|
|
allextvars = yalmip('extvariables');
|
|
X = {};
|
|
for i = 3:nargin
|
|
Xtemp = expandxor(varargin{i},allextvars);
|
|
for j = 1:length(Xtemp)
|
|
X{end + 1} = Xtemp{j};
|
|
end
|
|
end
|
|
|
|
F = ([]);
|
|
x = binvar(length(X),1);
|
|
|
|
for i = 1:length(X)
|
|
F = F + (implies_internal(extsubsref(x,i),X{i}));
|
|
end
|
|
|
|
varargout{1} = F + (sum(x) == 1);
|
|
varargout{2} = struct('convexity','none','monotonicity','none','definiteness','none','extra','marker','model','integer');
|
|
varargout{3} = recover(depends(F));
|
|
|
|
case {'lmi'}
|
|
x = varargin{1};
|
|
y = varargin{2};
|
|
varargout{1} = (yalmip('define','lmior',varargin{:}) == 1);
|
|
|
|
otherwise
|
|
end
|
|
|
|
function x = expandxor(x,allextvars)
|
|
|
|
if length(getvariables(x))>1
|
|
x = {x};
|
|
return;
|
|
end
|
|
|
|
xmodel = yalmip('extstruct',getvariables(x));
|
|
|
|
if ~isempty(xmodel) & isequal(xmodel.fcn,'lmior')
|
|
x1 = xmodel.arg{1};
|
|
x2 = xmodel.arg{2};
|
|
if ismembc(getvariables(x1),allextvars)
|
|
x1 = expandxor(x1,allextvars);
|
|
else
|
|
x1 = {x1};
|
|
end
|
|
if ismembc(getvariables(x2),allextvars)
|
|
x2 = expandxor(x2,allextvars);
|
|
else
|
|
x2 = {x2};
|
|
end
|
|
x = {x1{:},x2{:}};
|
|
else
|
|
x = {x};
|
|
end |