108 lines
2.8 KiB
Mathematica
108 lines
2.8 KiB
Mathematica
|
|
function [Fimage,objimage,x,y] = imagemodel(F,obj,options)
|
||
|
|
% IMAGEMODEL Explicitely removes equality constraints from model.
|
||
|
|
%
|
||
|
|
% [Fi,hi,x,y] = imagemodel(F,h)
|
||
|
|
%
|
||
|
|
% Input
|
||
|
|
% F : Constraint in form F(x)>0, Ax=b
|
||
|
|
% h : objective function h(x)
|
||
|
|
%
|
||
|
|
% Output
|
||
|
|
% Fi : Constraints in form F(y)>0
|
||
|
|
% hi : objective function h(y)
|
||
|
|
% x : original variables
|
||
|
|
% z : old variables expressed in basis y
|
||
|
|
%
|
||
|
|
% To obtain a solution in the original variables x, use assign(x,double(y))
|
||
|
|
%
|
||
|
|
% Note that this reduction is automatically done when you call solvesdp and use
|
||
|
|
% a solver that cannot handle equality constraints. Hence, there is typically no
|
||
|
|
% reason to use this command, unless some further manipulations are going
|
||
|
|
% to be done.
|
||
|
|
%
|
||
|
|
% See also DUALIZE, PRIMALIZE
|
||
|
|
|
||
|
|
% Check for unsupported problems
|
||
|
|
F = flatten(F);
|
||
|
|
err = 0;
|
||
|
|
p1 = ~(isreal(F) & isreal(obj));
|
||
|
|
p2 = ~(islinear(F) & islinear(obj));
|
||
|
|
p3 = any(is(F,'integer')) | any(is(F,'binary'));
|
||
|
|
if p1 | p2 | p3
|
||
|
|
if nargout == 5
|
||
|
|
Fdual = lmi([]);objdual = [];y = []; X = []; t = []; err = 1;
|
||
|
|
else
|
||
|
|
problems = {'Cannot imagalize complex-valued problems','Cannot imagalize nonlinear problems','Cannot imagalize discrete problems'};
|
||
|
|
error(problems{min(find([p1 p2 p3]))});
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if nargin < 3
|
||
|
|
options = sdpsettings('solver','sedumi','remove',1);
|
||
|
|
else
|
||
|
|
options = sdpsettings(options,'remove',1);
|
||
|
|
end
|
||
|
|
|
||
|
|
if any(is(F,'equality'))
|
||
|
|
[model,recoverdata,solver,diagnostic,F] = compileinterfacedata(F,[],[],obj,options,0);
|
||
|
|
if ~isempty(model.F_struc)
|
||
|
|
model.F_struc(abs(model.F_struc) <= 1e-12)=0;
|
||
|
|
end
|
||
|
|
if isfield(diagnostic,'problem')
|
||
|
|
if diagnostic.problem == 1
|
||
|
|
warning('Problem is infeasible');
|
||
|
|
Fimage = [];
|
||
|
|
objimage = [];
|
||
|
|
x = [];
|
||
|
|
y = [];
|
||
|
|
return
|
||
|
|
end
|
||
|
|
end
|
||
|
|
if isempty(model)
|
||
|
|
Fimage = [];
|
||
|
|
objimage = [];
|
||
|
|
x = [];
|
||
|
|
y = [];
|
||
|
|
warning('Reduced problem does not have free variables. Optimal solution computed');
|
||
|
|
return
|
||
|
|
end
|
||
|
|
else
|
||
|
|
Fimage = F;
|
||
|
|
objimage = obj;
|
||
|
|
x = recover(unique([depends(obj) depends(F)]));
|
||
|
|
y = x;
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
y = sdpvar(length(model.c),1);
|
||
|
|
|
||
|
|
vecF = model.F_struc*[1;y];
|
||
|
|
K = model.K;
|
||
|
|
Fimage = lmi([]);
|
||
|
|
start = 1;
|
||
|
|
if model.K.l > 0
|
||
|
|
Fimage = Fimage + lmi(vecF(start:start+K.l-1) >= 0);
|
||
|
|
start = start + K.l;
|
||
|
|
end
|
||
|
|
|
||
|
|
if model.K.q(1) > 0
|
||
|
|
for i = 1:length(model.K.q)
|
||
|
|
z = vecF(start:start+K.q(i)-1)
|
||
|
|
Fimage = Fimage + lmi(cone(z(2:end),z(1)));
|
||
|
|
start = start + K.q(i);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if model.K.s(1)>0
|
||
|
|
for i = 1:length(model.K.s)
|
||
|
|
z = vecF(start:start+K.s(i)^2-1);
|
||
|
|
Fimage = Fimage + lmi(reshape(z,K.s(i),K.s(i)));
|
||
|
|
start = start + K.s(i)^2;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
objimage = model.c'*y+y'*model.Q*y+model.f;
|
||
|
|
|
||
|
|
x = recover(recoverdata.used_variables);
|
||
|
|
y = recoverdata.H*y+recoverdata.x_equ;
|