📄 yalmip.m
字号:
case 'getinternalsdpvarstate'
varargout{1} = internal_sdpvarstate; % Get internal state, called from saveobj
case 'setinternalsdpvarstate'
internal_sdpvarstate = varargin{2}; % Set internal state, called from loadobj
% Back-wards compability....
if ~isfield(internal_sdpvarstate,'extVariables')
internal_sdpvarstate.extVariables = [];
end
if ~isfield(internal_sdpvarstate,'ExtendedMap')
internal_sdpvarstate.ExtendedMap = [];
end
if ~isfield(internal_sdpvarstate,'variabletype')
internal_sdpvarstate.variabletype = ~(sum(internal_sdpvarstate.monomtable,2)==1 & sum(internal_sdpvarstate.monomtable~=0,2)==1);
end
if ~isfield(internal_sdpvarstate,'hash')
internal_sdpvarstate.hash=[];
internal_sdpvarstate.hashedmonomtable=[];
end
% Re-compute some stuff for safety
internal_sdpvarstate.variabletype = internal_sdpvarstate.variabletype(:)';
internal_sdpvarstate.variabletype = spalloc(size(internal_sdpvarstate.monomtable,1),1,0)';
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
[n,m] = size(internal_sdpvarstate.monomtable);
if n>m
internal_sdpvarstate.monomtable(n,n) = 0;
end
if size(internal_sdpvarstate.monomtable,2)>length(internal_sdpvarstate.hash)
% Need new hash-keys
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
case {'version','ver'}
varargout{1}=3;
if nargout==2
varargout{2} = '20061208';
end
case 'setintvariables'
internal_sdpvarstate.intVariables = varargin{2};
case 'intvariables'
varargout{1} = internal_sdpvarstate.intVariables;
case 'setbinvariables'
internal_sdpvarstate.binVariables = varargin{2};
case 'binvariables'
varargout{1} = internal_sdpvarstate.binVariables;
case 'setuncvariables'
internal_sdpvarstate.uncVariables = varargin{2};
case 'uncvariables'
varargout{1} = internal_sdpvarstate.uncVariables;
case 'setparvariables'
internal_sdpvarstate.parVariables = varargin{2};
case 'parvariables'
varargout{1} = internal_sdpvarstate.parVariables;
case 'nonCommutingTable'
if nargin == 2
internal_sdpvarstate.nonCommutingTable = varargin{2};
else
varargout{1} = internal_sdpvarstate.nonCommutingTable;
end
case 'nonlinearvariables'
error('Internal error (ref. nonlinear variables). Report!')
varargout{1} = internal_sdpvarstate.nonlinearvariables;
if nargout==2
varargout{2} = internal_sdpvarstate.nonlinearvariablesCompressed;
end
%
case {'addinternal'}
internal_sdpvarstate.internalconstraints{end+1} = varargin{1};
% case {'setnvars'}
% sdpvar('setnvars',varargin{2});
case {'nvars'}
varargout{1} = size(internal_sdpvarstate.monomtable,1);
% varargout{1} = sdpvar('nvars');
case {'info'}
[version,release] = yalmip('version');
currentversion = num2str(version(1));
i = 1;
while i<length(version)
i = i+1;
currentversion = [currentversion '.' num2str(version(i))];
end
info_str = ['- - - - YALMIP ' currentversion ' ' num2str(release) ' - - - -'];
disp(' ');
disp(char(repmat(double('*'),1,length(info_str))));
disp(info_str)
disp(char(repmat(double('*'),1,length(info_str))));
disp(' ');
disp(['Variable Size'])
spaces = [' '];
ws = evalin('caller','whos');
n = 0;
for i = 1:size(ws,1)
if strcmp(ws(i).class,'sdpvar')
n = n+1;
wsname = ws(i).name;
wssize = [num2str(ws(i).size(1)) 'x' num2str(ws(i).size(2))];
disp([wsname spaces(1:13-length(wsname)) wssize]);
end
end
if n == 0
disp('No SDPVAR objects found');
end
disp(' ');
disp(['LMI']);
n = 0;
for i = 1:size(ws,1)
if strcmp(ws(i).class,'lmi')
n = n+1;
wsname = ws(i).name;
disp([wsname]);
end
end
if n == 0
disp('No SET objects found');
end
case 'getbounds'
if ~isfield(internal_sdpvarstate,'boundlist')
internal_sdpvarstate.boundlist = inf*repmat([-1 1],size(internal_sdpvarstate.monomtable,1),1);
elseif isempty(internal_sdpvarstate.boundlist)
internal_sdpvarstate.boundlist = inf*repmat([-1 1],size(internal_sdpvarstate.monomtable,1),1);
end
indicies = varargin{2};
if max(indicies)>size(internal_sdpvarstate.boundlist,1)
need_new = max(indicies)-size(internal_sdpvarstate.boundlist,1);
internal_sdpvarstate.boundlist = [internal_sdpvarstate.boundlist;inf*repmat([-1 1],size(internal_sdpvarstate.monomtable,1),1)];
end
varargout{1} = internal_sdpvarstate.boundlist(indicies,:);
varargout{2} = internal_sdpvarstate.boundlist(indicies,:);
case 'setbounds'
if ~isfield(internal_sdpvarstate,'boundlist')
internal_sdpvarstate.boundlist = inf*repmat([-1 1],size(internal_sdpvarstate.monomtable,1),1);
elseif isempty(internal_sdpvarstate.boundlist)
internal_sdpvarstate.boundlist = inf*repmat([-1 1],size(internal_sdpvarstate.monomtable,1),1);
end
indicies = varargin{2};
if size(internal_sdpvarstate.boundlist,1)<min(indicies)
internal_sdpvarstate.boundlist = [internal_sdpvarstate.boundlist;repmat([-inf inf],max(indicies)-size(internal_sdpvarstate.boundlist,1),1)];
end
internal_sdpvarstate.boundlist(indicies,1) = -inf ;
internal_sdpvarstate.boundlist(indicies,2) = inf;
internal_sdpvarstate.boundlist(indicies(:),1) = varargin{3};
internal_sdpvarstate.boundlist(indicies(:),2) = varargin{4};
varargout{1}=0;
case 'logicextvariables'
logicextvariables = [];
for i = 1:length(internal_sdpvarstate.ExtendedMap)
% if ismember(internal_sdpvarstate.ExtendedMap(i).fcn,{'or','and'})
if isequal(internal_sdpvarstate.ExtendedMap(i).fcn,'or') | isequal(internal_sdpvarstate.ExtendedMap(i).fcn,'and')
logicextvariables = [logicextvariables internal_sdpvarstate.extVariables(i)];
end
end
varargout{1} = logicextvariables;
case 'logicVariables'
varargout{1} = internal_sdpvarstate.logicVariables;
case 'addlogicvariable'
% This code essentially the same as the addextended code. The only
% difference is that we keep track of logic variables in order to
% know when we have to collect bounds for the big-M relaxations.
varargin{2} = strrep(varargin{2},'sdpvar/','');
% 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);
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)];
internal_sdpvarstate.logicVariables = [internal_sdpvarstate.logicVariables getvariables(y)];
varargout{1} = y;
return
case 'solver'
if (nargin==2)
if isa(varargin{2},'char')
solver = varargin{2};
prefered_solver = solver;
else
error('Second argument should be a string with solver name');
end
else
if isempty(prefered_solver)
varargout{1}='';
else
varargout{1} = prefered_solver;
end
end
otherwise
if isa(varargin{1},'char')
disp(['The command ''' varargin{1} ''' is not valid in YALMIP.m']);
else
disp('The first argument should be a string');
end
end
function r = rand_hash(k,n,m);
s = rand('state');
rand('state',k)
r = rand(n,m);
rand('state',s);
function h = create_trivial_hash(x)
try
h = sum(getvariables(x)) + sum(sum(getbase(x)));
catch
h = 0;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -