📄 catsdp.m
字号:
function [catstring,integer_variables,binary_variables,parametric_variables,quad_info] = catsdp(F,G,h,relax)
%catsdp Internal function: tries to determine the type of
%optimization problem
% Author Johan L鰂berg
% $Id: catsdp.m,v 1.11 2005/02/04 10:10:26 johanl Exp $
% Constraints
%
% Eigenvalue (CV)
% Semidefinite (CS)
% Sec. ord. cone (CC)
% Element-wise (CE)
% KYP (CK)
% Bilinear (CB)
% Polynomial (CP)
% Convex quadratic (CQ)
%
% Objective functions
%
% MAXDET (OM)
% Convex quadratic (OQ)
% Non-convex quad. (NQ)
% Polynomial (OP)
%
% Datatypes
%
% Complex (DX)
% Integer (DI)
% Binary (DB)
% Multi-parametric (MP)
Counter = size(F.clauses,2);
Ftype = zeros(Counter,1);
real_data = 1;
int_data = 0;
bin_data = 0;
par_data = 0;
poly_constraint = 0;
bilin_constraint = 0;
sigm_constraint = 0;
integer_variables = [];
binary_variables = [];
parametric_variables = [];
kyp_prob = 0;
integer_variables = yalmip('intvariables');
binary_variables = yalmip('binvariables');
for i = 1:Counter
if F.clauses{i}.type==7
integer_variables = union(integer_variables,getvariables(F.clauses{i}.data));
elseif F.clauses{i}.type==8
binary_variables = union(binary_variables,getvariables(F.clauses{i}.data));
elseif F.clauses{i}.type==13
parametric_variables = union(parametric_variables,getvariables(F.clauses{i}.data));
end
end
monomtable = yalmip('monomtable');
% Linear or implied linear from compund objects like max(x,y,z)=t implying
% t is linear is the final problem
temp = ((sum(abs(monomtable),2)==1) & (any(monomtable==1,2))) | any(isnan(monomtable),2);
linear_variables = find(temp);
nonlinear_variables = find(~temp);
sigmonial_variables = find(any(0>monomtable,2) | any(monomtable-fix(monomtable),2));
discrete_data = ~isempty(integer_variables) | ~isempty(binary_variables);
allvars = getvariables(F);
nononlinear = isempty(find(ismembc(nonlinear_variables,allvars)));
for i = 1:Counter
Ftype(i) = F.clauses{i}.type;
real_data = real_data & isreal(F.clauses{i}.data); %Complex
if discrete_data
int_data = int_data | any(ismember(getvariables(F.clauses{i}.data),integer_variables));
bin_data = bin_data | any(ismember(getvariables(F.clauses{i}.data),binary_variables));
par_data = par_data | any(ismember(getvariables(F.clauses{i}.data),parametric_variables));
end
if ~nononlinear%no_nonlinear_inF
vars = getvariables(F.clauses{i}.data);
% if ~isempty(nonlinear_variables)
%FIX : Verify logic on ismembc
%usednonlins = find(ismember(nonlinear_variables,vars));
usednonlins = find(ismembc(nonlinear_variables,vars));
if ~isempty(usednonlins)
usedsigmonials = find(ismember(sigmonial_variables,vars));
if ~isempty(usedsigmonials)
sigm_constraint = 1;
poly_constraint = 1;
else
deg = degree(F.clauses{i}.data);
bilin_constraint = bilin_constraint | (deg==2);
poly_constraint = poly_constraint | (deg>2);
end
end
% end
end
end
if relax
int_data = 0;
bin_data = 0;
poly_constraint = 0;
bilin_constraint = 0;
sigm_constraint = 0;
integer_variables = [];
binary_variables = [];
end
any_LMI = find(Ftype==1);
any_ELM = find(Ftype==2);
any_EQU = find(Ftype==3);
any_SOCC = find(Ftype==4);
any_ROTL = find(Ftype==5);
any_KYP = find(Ftype==9);
% **************************************************
% Element-wise, 2-cone, semidefinite, KYP constraint
% **************************************************
catstring = '';
if ~isempty(any_ELM)
catstring = ['CE' catstring];
end
if (~isempty(any_SOCC)) | (~isempty(any_ROTL))
catstring = ['CC' catstring];
end
if ~isempty(any_LMI)
catstring = ['CS' catstring];
end
if ~isempty(any_KYP)
catstring = ['CK' catstring];
end
if ~isempty(any_EQU)
catstring = ['C=' catstring];
end
% *******************************************
% Complex, integer, boolen variables
% *******************************************
if ~(real_data==1)
catstring = [catstring 'DX'];
end
d_x = depends(h);
int_obj = (~isempty(h) & any(ismember(d_x,yalmip('intvariables'))));
bin_obj = (~isempty(h) & any(ismember(d_x,yalmip('binvariables'))));
if (int_data) | int_obj
catstring = [catstring 'DI'];
end;
if bin_data | bin_obj
catstring = [catstring 'DB'];
end;
if ~(int_data | bin_data | int_obj | bin_obj)
integer_variables = [];
binary_variables = [];
end
if par_data
catstring = [catstring 'MP'];
end
% *******************************************
% Bilinear, Polynomial, Sigmonial constraints
% *******************************************
if poly_constraint & ~sigm_constraint
catstring = [catstring 'CP'];
end;
if bilin_constraint & ~sigm_constraint
catstring = [catstring 'CB'];
end
if sigm_constraint
catstring = [catstring 'CG'];
end
% *******************************************
% Objective function
% *******************************************
if ~isempty(G)
catstring = ['OM' catstring];
end
quad_info = [];
if (~isempty(h)) & ~is(h,'linear') &~relax
% if no_nonlinear_inF
% temp = (sum(abs(monomtable),2)==1) & (any(monomtable==1,2));
% linear_variables = find(temp);
% nonlinear_variables = find(~temp);
% sigmonial_variables = find(any(0>monomtable,2) | any(monomtable-fix(monomtable),2));
% end
if any(ismember(getvariables(h),sigmonial_variables))
catstring = ['OG' catstring];
else
[Q,c,f,x,info] = quaddecomp(h);
if info==0
[R,p]=chol(Q);
if p~=0
if min(eig(Q))>=-1e-10
p=0;
[U,S,V]=svd(Q);
i = find(diag(S)>1e-10);
R = sqrt(S(1:max(i),1:max(i)))*V(:,1:max(i))';
end
end
if p==0
catstring = ['OQ' catstring];
else
catstring = ['NQ' catstring];
end
quad_info.Q = Q;
quad_info.c = c;
quad_info.f = f;
quad_info.x = x;
quad_info.R = R;
quad_info.p = p;
else
% error
catstring = ['OP' catstring];
end
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -