📄 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.22 2005/07/18 15:01:31 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.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 =[];
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
spaces = [' '];
switch varargin{1}
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;
while i<=length(internal_sdpvarstate.ExtendedMap)
if isequal(varargin{2},internal_sdpvarstate.ExtendedMap(i).fcn) & isequal({varargin{3:end}}, internal_sdpvarstate.ExtendedMap(i).arg)
varargout{1} = internal_sdpvarstate.ExtendedMap(i).var;
return
end
i = i + 1;
end
end
switch varargin{2}
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);
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
internal_sdpvarstate.extVariables = [internal_sdpvarstate.extVariables getvariables(y)];
y = reshape(y,size(X,1),size(X,2));
% case {'eig'}
% % EIG is a bit special since we need one
% % new variable for each eigenvalue...
% X = varargin{3:end};
% y = sdpvar(length(X),1);
% for i = 1:length(X)
% yi = y(i);
% internal_sdpvarstate.ExtendedMap(end+1).fcn = 'yeig';
% internal_sdpvarstate.ExtendedMap(end).arg = {X(i),i};
% internal_sdpvarstate.ExtendedMap(end).var = yi;
% end
% internal_sdpvarstate.extVariables = [internal_sdpvarstate.extVariables getvariables(y)];
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
varargout{1} = y;
return
case 'extvariables'
varargout{1} = internal_sdpvarstate.extVariables;
case 'logicextvariables'
logicextvariables = [];
for i = 1:length(internal_sdpvarstate.ExtendedMap)
if ismember(internal_sdpvarstate.ExtendedMap(i).fcn,{'or','and'})
logicextvariables = [logicextvariables internal_sdpvarstate.extVariables(i)];
end
end
varargout{1} = logicextvariables;
case 'extstruct'
found = 0;
varargout{1} = [];
i = 1;
while ~found & i <=length(internal_sdpvarstate.ExtendedMap)
if varargin{2} == getvariables(internal_sdpvarstate.ExtendedMap(i).var)
found = 1;
varargout{1} = internal_sdpvarstate.ExtendedMap(i);
end
i = i + 1;
end
case 'rankvariables'
i = 1;
rankvariables = [];
for i = 1:length(internal_sdpvarstate.ExtendedMap)
if isequal('rank',internal_sdpvarstate.ExtendedMap(i).fcn)
rankvariables = [rankvariables getvariables(internal_sdpvarstate.ExtendedMap(i).var)];
end
end
varargout{1} = rankvariables;
case 'dualrankvariables'
i = 1;
rankvariables = [];
for i = 1:length(internal_sdpvarstate.ExtendedMap)
if isequal('dualrank',internal_sdpvarstate.ExtendedMap(i).fcn)
rankvariables = [rankvariables getvariables(internal_sdpvarstate.ExtendedMap(i).var)];
end
end
varargout{1} = rankvariables;
case 'lmiid'
if not(isempty(internal_setstate.LMIid))
internal_setstate.LMIid = internal_setstate.LMIid+1;
varargout{1}=internal_setstate.LMIid;
else
internal_setstate.LMIid=1;
varargout{1}=internal_setstate.LMIid;
end
case 'setnonlinearvariables'
error('Internal error (ref. setnonlinearvariables). Report please.')
case {'clear'}
%sdpvar('clear')
W = evalin('caller','whos');
for i = 1:size(W,1)
if strcmp(W(i).class,'sdpvar') | strcmp(W(i).class,'lmi')
evalin('caller', ['clear ' W(i).name ';']);
end
end
internal_setstate.LMIid = 0;
internal_setstate.duals_index = [];
internal_setstate.duals_data = [];
internal_setstate.duals_associated_index = [];
internal_setstate.duals_associated_data = [];
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.monomtable = spalloc(0,0,0);
internal_sdpvarstate.hashedmonomtable = []; % Polynomial powers table
internal_sdpvarstate.hash = []; % Polynomial powers table
internal_sdpvarstate.boundlist = [];
internal_sdpvarstate.variabletype = spalloc(0,0,0);
internal_sdpvarstate.intVariables = [];
internal_sdpvarstate.binVariables = [];
internal_sdpvarstate.uncVariables = [];
internal_sdpvarstate.parVariables = [];
internal_sdpvarstate.extVariables = [];
internal_sdpvarstate.internalconstraints = [];
internal_sdpvarstate.ExtendedMap = [];
internal_sdpvarstate.optSolution.info = 'Initialized by YALMIP';
internal_sdpvarstate.optSolution.variables = [];
internal_sdpvarstate.optSolution.optvar =[];
internal_sdpvarstate.optSolution.values =[];
case 'cleardual'
if nargin==1
internal_setstate.duals_index = [];
internal_setstate.duals_data = [];
internal_setstate.duals_associated_index = [];
internal_setstate.duals_associated_data = [];
else
if ~isempty(internal_setstate.duals_index)
internal_setstate.lmiid = varargin{2};
for i = 1:length(varargin{2})
j = find(internal_setstate.duals_index==internal_setstate.lmiid(i));
if ~isempty(j)
internal_setstate.duals_index = internal_setstate.duals_index([1:1:j-1 j+1:1:length(internal_setstate.duals_index)]);
internal_setstate.duals_data = {internal_setstate.duals_data{[1:1:j-1 j+1:1:length(internal_setstate.duals_data)]}};
end
end
end
end
case 'associatedual'
internal_setstate.duals_associated_index = [internal_setstate.duals_associated_index varargin{2}];
internal_setstate.duals_associated_data{end+1} = varargin{3};
case 'setallsolution'
internal_sdpvarstate.optSolution.optvar = varargin{2}.optvar;
internal_sdpvarstate.optSolution.variables = varargin{2}.variables;
internal_sdpvarstate.optSolution.values = [];
return
case 'setvalues'
internal_sdpvarstate.optSolution.values = varargin{2};
case 'setsolution'
if isempty(internal_sdpvarstate.optSolution.variables)
internal_sdpvarstate.optSolution = varargin{2};
else
% Just save some stuff first
newSolution = varargin{2};
oldSolution = internal_sdpvarstate.optSolution;
optSolution = varargin{2};
keep_these = find(~ismember(oldSolution.variables,newSolution.variables));
internal_sdpvarstate.optSolution.optvar = [oldSolution.optvar(keep_these);newSolution.optvar(:)];
internal_sdpvarstate.optSolution.variables = [oldSolution.variables(keep_these);newSolution.variables(:)];
end
% clear evaluated values (only used cache-wise)
internal_sdpvarstate.optSolution.values = [];
return
case 'getsolution'
varargout{1} = internal_sdpvarstate.optSolution;
return
case 'setdual'
internal_setstate.duals_index = varargin{2};
internal_setstate.duals_data = varargin{3};
if ~isempty(internal_setstate.duals_associated_index)
if ~isempty(intersect(internal_setstate.duals_index,internal_setstate.duals_associated_index))
for i = 1:length(internal_setstate.duals_index)
itshere = find(internal_setstate.duals_associated_index==internal_setstate.duals_index(i));
if ~isempty(itshere)
assign(internal_setstate.duals_associated_data{itshere},internal_setstate.duals_data{i});
end
end
end
end
case 'dual'
if isempty(internal_setstate.duals_index)
varargout{1}=[];
else
LMIid = varargin{2};
index_to_dual = find(LMIid==internal_setstate.duals_index);
if isempty(index_to_dual)
varargout{1}=[];
else
varargout{1} = internal_setstate.duals_data{index_to_dual};
end
end
case 'clearsos'
if nargin==1
internal_sdpvarstate.sos_index = [];
internal_sdpvarstate.sos_data = [];
internal_sdpvarstate.sos_ParV = [];
internal_sdpvarstate.sos_Q = [];
internal_sdpvarstate.sos_v = [];
end
case 'setsos'
if ~isempty(internal_sdpvarstate.sos_index)
where = find(internal_sdpvarstate.sos_index==varargin{2});
if ~isempty(where)
internal_sdpvarstate.sos_index(where) = varargin{2};
internal_sdpvarstate.sos_data{where} = varargin{3};
internal_sdpvarstate.sos_ParV{where} = varargin{4};
internal_sdpvarstate.sos_Q{where} = varargin{5};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -