30 lines
932 B
Mathematica
30 lines
932 B
Mathematica
|
|
function diagnostic = callstrul(F,h,options)
|
||
|
|
|
||
|
|
F_new = [];
|
||
|
|
|
||
|
|
for i = 1:length(F)
|
||
|
|
if ~is(F(i),'lmi')
|
||
|
|
F_new = F_new + F(i);
|
||
|
|
else
|
||
|
|
X = sdpvar(F(i));
|
||
|
|
[l,m,r]=factors(X);
|
||
|
|
if isempty(m)
|
||
|
|
F_new = F_new + F(i);
|
||
|
|
else
|
||
|
|
[L1,R1,A1,M1,negated_cont1,negated_disc1,epsilon1,delta1,numpos1,xindicies,Pindicies] = preprocess_constraint(X);
|
||
|
|
F_new = F_new + assignschur(F(i),'HKM_schur_LR_structure',L1,R1,A1,M1,negated_cont1,negated_disc1,epsilon1,delta1,numpos1,xindicies,Pindicies);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if nargin < 2
|
||
|
|
% Equalities are converted internally in SDPT3 to double-sided
|
||
|
|
% inequalities. This messes up our Schur compiler, hence we do it
|
||
|
|
% already outside SDPT3
|
||
|
|
options = sdpsettings('solver','sdpt3','removeequalities',-1);
|
||
|
|
else
|
||
|
|
options.solver = 'sdpt3';
|
||
|
|
options.removeequalities = -1;
|
||
|
|
end
|
||
|
|
diagnostic = solvesdp(F_new,h,options);
|