📄 yalmip.m
字号:
function varargout = yalmip(varargin)
%YALMIP Returns various information about YALMIP
%
% YALMIP can be used to check version numbers and
% find the SDPVAR and SET objects available in workspace
%
% EXAMPLES
% [V,D] = YALMIP('version') % Returns version and release date
% YALMIP('nvars') % Returns total number of declared variables
% YALMIP('info') % Display basic info.
% YALMIP('solver','tag') % Sets the solver 'solvertag' (see sdpsettings) as default solver
%
% See also YALMIPTEST, YALMIPDEMO
% Author Johan L鰂berg
% $Id: yalmip.m,v 1.74 2006/12/08 10:11:40 joloef Exp $
persistent prefered_solver internal_sdpvarstate internal_setstate
if nargin==0
help yalmip
return
end
if isempty(internal_sdpvarstate)
internal_sdpvarstate.monomtable = spalloc(0,0,0); % Polynomial powers table
internal_sdpvarstate.hashedmonomtable = []; % Hashed polynomial powers table
internal_sdpvarstate.hash = [];
internal_sdpvarstate.boundlist = [];
internal_sdpvarstate.variabletype = spalloc(0,0,0); % Pre-calc linear/quadratic/polynomial/sigmonial
internal_sdpvarstate.intVariables = []; % ID of integer variables
internal_sdpvarstate.binVariables = []; % ID of binary variables
internal_sdpvarstate.uncVariables = []; % ID of uncertain variables (not used)
internal_sdpvarstate.parVariables = []; % ID of parametric variables (not used)
internal_sdpvarstate.extVariables = []; % ID of extended variables (for max,min,norm,sin, etc)
internal_sdpvarstate.logicVariables = []; % ID of extended logic variables (for or, nnz, alldifferent etc)
internal_sdpvarstate.evalVariables = []; % ID of variables that require nonlinear maps
internal_sdpvarstate.complexpair = [];
internal_sdpvarstate.internalconstraints = [];
internal_sdpvarstate.ExtendedMap = [];
internal_sdpvarstate.sosid = 0;
internal_sdpvarstate.sos_index = [];
internal_sdpvarstate.sos_data = [];
internal_sdpvarstate.sos_ParV = [];
internal_sdpvarstate.sos_Q = [];
internal_sdpvarstate.sos_v = [];
internal_sdpvarstate.optSolution.info = 'Initialized by YALMIP';
internal_sdpvarstate.optSolution.variables = [];
internal_sdpvarstate.optSolution.optvar =[];
internal_sdpvarstate.optSolution.values =[];
internal_sdpvarstate.nonCommutingTable = [];
end
if isempty(internal_setstate)
internal_setstate.LMIid = 0;
internal_setstate.duals_index = [];
internal_setstate.duals_data = [];
internal_setstate.duals_associated_index = [];
internal_setstate.duals_associated_data = [];
end
switch varargin{1}
case 'evalVariables'
varargout{1} = internal_sdpvarstate.evalVariables;
case 'monomtable'
varargout{1} = internal_sdpvarstate.monomtable;
if nargout == 2
varargout{2} = internal_sdpvarstate.variabletype;
elseif nargout == 4
varargout{2} = internal_sdpvarstate.variabletype;
varargout{3} = internal_sdpvarstate.hashedmonomtable;
varargout{4} = internal_sdpvarstate.hash;
end
%
% varargout{1} = internal_sdpvarstate.monomtable;
% if nargout >= 2
% varargout{2} = internal_sdpvarstate.variabletype;
% if nargout == 4
% varargout{3} = internal_sdpvarstate.hashedmonomtable;
% varargout{4} = internal_sdpvarstate.hash;
% end
% end
case 'setmonomtable'
% New monom table
internal_sdpvarstate.monomtable = varargin{2};
if nargin>=4
% User has up-dated the hash tables him self.
internal_sdpvarstate.hashedmonomtable=varargin{4};
internal_sdpvarstate.hash = varargin{5};
end
if size(internal_sdpvarstate.monomtable,2)>length(internal_sdpvarstate.hash)
need_new = size(internal_sdpvarstate.monomtable,1) - length(internal_sdpvarstate.hash);
internal_sdpvarstate.hash = [internal_sdpvarstate.hash ; 3*rand_hash(size(internal_sdpvarstate.monomtable,1),need_new,1)];
end
if size(internal_sdpvarstate.monomtable,1)>size(internal_sdpvarstate.hashedmonomtable,1)
% Need to add some hash values
need_new = size(internal_sdpvarstate.monomtable,1) - size(internal_sdpvarstate.hashedmonomtable,1);
internal_sdpvarstate.hashedmonomtable = [internal_sdpvarstate.hashedmonomtable;internal_sdpvarstate.monomtable(end-need_new+1:end,:)*internal_sdpvarstate.hash];
end
if nargin >= 3
internal_sdpvarstate.variabletype = varargin{3};
if length(internal_sdpvarstate.variabletype) ~=size(internal_sdpvarstate.monomtable,1)
error('ASSERT')
end
else
internal_sdpvarstate.variabletype = zeros(size(internal_sdpvarstate.monomtable,1),1)';
nonlinear = ~(sum(internal_sdpvarstate.monomtable,2)==1 & sum(internal_sdpvarstate.monomtable~=0,2)==1);
if ~isempty(nonlinear)
%mt = internal_sdpvarstate.monomtable;
internal_sdpvarstate.variabletype(nonlinear) = 3;
quadratic = sum(internal_sdpvarstate.monomtable,2)==2;
internal_sdpvarstate.variabletype(quadratic) = 2;
bilinear = max(internal_sdpvarstate.monomtable,[],2)<=1;
internal_sdpvarstate.variabletype(bilinear & quadratic) = 1;
sigmonial = any(0>internal_sdpvarstate.monomtable,2) | any(internal_sdpvarstate.monomtable-fix(internal_sdpvarstate.monomtable),2);
internal_sdpvarstate.variabletype(sigmonial) = 4;
end
end
%
% if length((internal_sdpvarstate.hash)) ~= length(unique(internal_sdpvarstate.hash))
% error('Report ASSERT HASH')
% end
%
%
% if any(sum( abs(internal_sdpvarstate.monomtable),2)==0)
% error('Report ASSERT HASH')
% end
case 'variabletype'
varargout{1} = internal_sdpvarstate.variabletype;
case 'addextendedvariable'
varargin{2} = strrep(varargin{2},'sdpvar/',''); % Clean due to different behaviour of the function mfilename in ML 5,6 and 7
% Is this operator variable already defined
if ~isempty(internal_sdpvarstate.ExtendedMap)
i = 1;
correct_operator = strcmp(varargin{2},{internal_sdpvarstate.ExtendedMap(:).fcn});
arg1 = varargin{2};
arg2 = {varargin{3:end}};
this_hash = create_trivial_hash(varargin{3});
for i = find(correct_operator)
if this_hash == internal_sdpvarstate.ExtendedMap(i).Hash
if isequal(arg2, internal_sdpvarstate.ExtendedMap(i).arg);
varargout{1} = internal_sdpvarstate.ExtendedMap(i).var;
return
end
end
end
else
this_hash = create_trivial_hash(varargin{3});
end
switch varargin{2}
case {'max'}
% MAX is a bit special since we need one
% new variable for each element...
% (can be implemented standard way, but this is better
% for performance, and since MAX is so common...
X = varargin{3:end};
[n,m] = size(X);
if min([n m]) == 1
y = sdpvar(1,1);
internal_sdpvarstate.ExtendedMap(end+1).fcn = varargin{2};
internal_sdpvarstate.ExtendedMap(end).arg = {varargin{3:end}};
internal_sdpvarstate.ExtendedMap(end).var = y;
internal_sdpvarstate.extVariables = [internal_sdpvarstate.extVariables getvariables(y)];
else
y = sdpvar(1,m);
for i = 1:m
internal_sdpvarstate.ExtendedMap(end+1).fcn = varargin{2};
internal_sdpvarstate.ExtendedMap(end).arg = {X(:,i)};
internal_sdpvarstate.ExtendedMap(end).var = y(i);
end
internal_sdpvarstate.extVariables = [internal_sdpvarstate.extVariables getvariables(y)];
end
case {'abs'}
% ABS is a bit special since we need one
% new variable for each element...
X = varargin{3:end};
y = sdpvar(numel(X),1);
if numel(X)==1
y = sdpvar(1,1);
internal_sdpvarstate.ExtendedMap(end+1).fcn = varargin{2};
internal_sdpvarstate.ExtendedMap(end).arg = {X};
internal_sdpvarstate.ExtendedMap(end).var = y;
else
for i = 1:numel(X)
yi = y(i);
internal_sdpvarstate.ExtendedMap(end+1).fcn = varargin{2};
internal_sdpvarstate.ExtendedMap(end).arg = {X(i)};
internal_sdpvarstate.ExtendedMap(end).var = yi;
end
end
internal_sdpvarstate.extVariables = [internal_sdpvarstate.extVariables getvariables(y)];
y = reshape(y,size(X,1),size(X,2));
otherwise
% This is the standard operators. INPUTS -> 1 scalar output
y = sdpvar(1,1);
internal_sdpvarstate.ExtendedMap(end+1).fcn = varargin{2};
internal_sdpvarstate.ExtendedMap(end).arg = {varargin{3:end}};
internal_sdpvarstate.ExtendedMap(end).var = y;
internal_sdpvarstate.extVariables = [internal_sdpvarstate.extVariables getvariables(y)];
end
internal_sdpvarstate.ExtendedMap(end).Hash = this_hash;
varargout{1} = y;
return
case 'addEvalVariable'
% This code essentially the same as the addextended code. The only
% difference is that we have to remove the last element in the
% saved argument list when we compare to the current argument,
% since we always append an extra argument to the argument list in
% order to convert f(a'x+b) to f(z), z==a'x+b
varargin{2} = strrep(varargin{2},'sdpvar/','');
this_hash = create_trivial_hash(varargin{3});
% Is this operator variable already defined
if ~isempty(internal_sdpvarstate.ExtendedMap)
i = 1;
while i<=length(internal_sdpvarstate.ExtendedMap)
if isequal(varargin{2},internal_sdpvarstate.ExtendedMap(i).fcn) & isequal({varargin{3:end}}, {internal_sdpvarstate.ExtendedMap(i).arg{1:end-1}})
varargout{1} = internal_sdpvarstate.ExtendedMap(i).var;
return
end
i = i + 1;
end
end
% This is the standard operators. INPUTS -> 1 scalar output
y = sdpvar(1,1); % Models the function y=f(arg)
% z = sdpvar(1,1); % Standard format y=f(z),z==arg
z = sdpvar(size(varargin{3},1),size(varargin{3},2),'full'); % Standard format y=f(z),z==arg
internal_sdpvarstate.ExtendedMap(end+1).fcn = varargin{2};
internal_sdpvarstate.ExtendedMap(end).arg = {varargin{3:end},z};
internal_sdpvarstate.ExtendedMap(end).var = y;
internal_sdpvarstate.ExtendedMap(end).Hash = this_hash;
internal_sdpvarstate.extVariables = [internal_sdpvarstate.extVariables getvariables(y)];
internal_sdpvarstate.evalVariables = [internal_sdpvarstate.evalVariables getvariables(y)];
varargout{1} = y;
return
case 'extvariables'
varargout{1} = internal_sdpvarstate.extVariables;
case 'extstruct'
if nargin == 1
varargout{1} = internal_sdpvarstate.ExtendedMap;
elseif length(varargin{2})==1
found = 0;
varargout{1} = [];
i = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -