102 lines
2.5 KiB
Mathematica
102 lines
2.5 KiB
Mathematica
|
|
function [dualUpper,L,U] = derivedualBoundsParameterFree(H,c,A,b,E,f,ops,parametricDomain)
|
||
|
|
|
||
|
|
if isempty(A)
|
||
|
|
dualUpper = [];
|
||
|
|
L = [];
|
||
|
|
U = [];
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
n = length(c);
|
||
|
|
m = length(b);
|
||
|
|
me = length(f);
|
||
|
|
|
||
|
|
x = sdpvar(n,1);
|
||
|
|
Lambda = sdpvar(m,1);
|
||
|
|
mu = sdpvar(me,1);
|
||
|
|
|
||
|
|
% Homogenization
|
||
|
|
alpha = sdpvar(1);
|
||
|
|
|
||
|
|
F = [];
|
||
|
|
|
||
|
|
% Start by computing primal lower bounds
|
||
|
|
if nargin < 7
|
||
|
|
ops = sdpsettings('verbose',0);
|
||
|
|
end
|
||
|
|
ops2 = ops;
|
||
|
|
ops2.verbose = max(0,ops.verbose-1);;
|
||
|
|
all_bounded = 1;
|
||
|
|
if ops.verbose
|
||
|
|
disp(['*Computing ' num2str(length(x)) ' primal bounds (required for dual bounds)']);
|
||
|
|
end
|
||
|
|
|
||
|
|
z = recover(unique([depends(c);depends(b)]));
|
||
|
|
xz = [x;z];
|
||
|
|
nz = length(z);
|
||
|
|
nTOT = n + length(z);
|
||
|
|
rhs = 0;
|
||
|
|
if ~isempty(b)
|
||
|
|
rhs = rhs + A'*Lambda;
|
||
|
|
end
|
||
|
|
if ~isempty(f)
|
||
|
|
rhs = rhs + E'*mu;
|
||
|
|
end
|
||
|
|
|
||
|
|
[c0,C] = deParameterize(c,z);
|
||
|
|
[b0,B] = deParameterize(b,z);
|
||
|
|
delta = binvar(length(b),1);
|
||
|
|
UpperBound = .1;
|
||
|
|
parametricDomainH = homogenize(sdpvar(parametricDomain),alpha) >= 0;
|
||
|
|
|
||
|
|
w1 = binvar(length(Lambda),1);
|
||
|
|
w2 = binvar(length(Lambda),1);
|
||
|
|
eta1 = sdpvar(length(Lambda),1);
|
||
|
|
eta2 = sdpvar(length(Lambda),1);
|
||
|
|
v = sdpvar(size(A,2),1);
|
||
|
|
Model = [parametricDomainH,H*x + alpha*c0 + C*z + rhs==0,
|
||
|
|
delta >= Lambda >= 0,
|
||
|
|
1-delta >= b0*alpha+B*z-A*x>=0,
|
||
|
|
sum(Lambda) >= alpha*UpperBound,
|
||
|
|
% sum(delta)<=1,
|
||
|
|
];
|
||
|
|
Model = [Model, Lambda + A*v + eta2-eta1 == 0,
|
||
|
|
0 <= eta1 <= w1, 0 <= delta - Lambda <= 1-w1,
|
||
|
|
0 <= eta2 <= w2, 0 <= Lambda <= 1-w2];
|
||
|
|
|
||
|
|
solvesdp(Model,-alpha)
|
||
|
|
while double(alpha) >= 1e-5
|
||
|
|
UpperBound = UpperBound*1.1;
|
||
|
|
Model = [parametricDomainH,H*x + alpha*c0 + C*z + rhs==0,
|
||
|
|
delta >= Lambda >= 0,
|
||
|
|
1-delta >= b0*alpha+B*z-A*x>=0,
|
||
|
|
sum(Lambda) >= alpha*UpperBound];
|
||
|
|
Model = [Model, Lambda + A*v + eta2-eta1 == 0,
|
||
|
|
0 <= eta1 <= w1, 0 <= delta - Lambda <= 1-w1,
|
||
|
|
0 <= eta2 <= w2, 0 <= Lambda <= 1-w2];
|
||
|
|
solvesdp(Model,-alpha);
|
||
|
|
end
|
||
|
|
|
||
|
|
dualUpper = min(U,UpperBound);
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
function [c0,C] = deParameterize(c,z);
|
||
|
|
n = length(c);
|
||
|
|
c0C = full(getbase(c));
|
||
|
|
c0 = c0C(:,1);
|
||
|
|
C = c0C(:,2:end);
|
||
|
|
if nnz(C)==0
|
||
|
|
C = spalloc(n,length(z),0);
|
||
|
|
else
|
||
|
|
if length(z)>0 & size(C,2) < length(z)
|
||
|
|
C = [];
|
||
|
|
for i = 1:length(z)
|
||
|
|
C = [C getbasematrix(c,getvariables(z(i)))];
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if isempty(C)
|
||
|
|
C = zeros(length(C),length(z));
|
||
|
|
end
|