72 lines
1.9 KiB
Matlab
Executable File
72 lines
1.9 KiB
Matlab
Executable File
function [F,properties,arguments,fcn]=model(X,method,options,extstruct)
|
|
%MODEL Extracts nonlinear operator models
|
|
%
|
|
% [F,properties] = model(x)
|
|
%
|
|
% MODEL returns the constraints needed to model a variable related to an
|
|
% extended operator such as min, max, abs, norm, geomean, ...
|
|
%
|
|
% Examples :
|
|
%
|
|
% sdpvar x y;
|
|
% t = min(x,y);
|
|
% [F,properties] = epigraph(t)
|
|
% Gives (F = (t<=x) + (t<=y))
|
|
%
|
|
% sdpvar x y
|
|
% t = max(norm([x;y],1+y))
|
|
% [F,properties] = epigraph(t)
|
|
% Gives (F = (u<=t) + (1+y<=t))
|
|
% where u is the variable modelling norm([x;y])
|
|
|
|
extvar = getvariables(X);
|
|
arguments = cell(1,length(extvar));
|
|
properties = cell(1,length(extvar));
|
|
|
|
if nargin<2
|
|
method = 'graph';
|
|
end
|
|
|
|
if nargin < 3
|
|
options = [];
|
|
end
|
|
|
|
if nargin<4
|
|
extstruct = yalmip('extstruct',extvar);
|
|
elseif isempty(extstruct)
|
|
extstruct = yalmip('extstruct',extvar);
|
|
end
|
|
|
|
if isempty(extstruct)
|
|
error('This is not a nonlinear operator variable');
|
|
end
|
|
|
|
fcn = extstruct.fcn;
|
|
switch fcn
|
|
% *********************************************************************
|
|
% mpower, max, min are currently implmeneted in a non-standard way for
|
|
% both performance and technical reasons
|
|
% *********************************************************************
|
|
case 'mpower'
|
|
[F,properties,arguments] = mpower_internal(X,method,options,extstruct);
|
|
|
|
case 'max'
|
|
[F,properties,arguments] = max_internal(X,method,options,extstruct);
|
|
|
|
case 'min'
|
|
[F,properties,arguments] = min_internal(X,method,options,extstruct);
|
|
|
|
otherwise
|
|
try
|
|
[F,properties,arguments] = feval(extstruct.fcn,method,extstruct.var,extstruct.arg{:});
|
|
catch
|
|
error(['Failed when trying to create a model for the "' extstruct.fcn '" operator']);
|
|
end
|
|
end
|
|
% This field is not official, and currently only used in sort
|
|
if ~isfield(properties,'models')
|
|
properties.models = getvariables(extstruct.var);
|
|
end
|
|
|
|
|