88 lines
3.6 KiB
Mathematica
88 lines
3.6 KiB
Mathematica
|
|
function p = updateboundsfromupper(p,upper,ppoly);
|
||
|
|
if ~isinf(upper)
|
||
|
|
LU = [p.lb p.ub];
|
||
|
|
if nnz(p.c.*(p.ub-p.lb)) == 1 & nnz(p.Q)==0
|
||
|
|
i = find(p.c.*(p.ub-p.lb));
|
||
|
|
if p.c(i) > 0
|
||
|
|
% We are minimizing x(i), since an upper bound is UPPER
|
||
|
|
% this means c(i)*x(i) has to be < UPPER in optimal solution
|
||
|
|
p.ub(i) = min([p.ub(i) upper/p.c(i)]);
|
||
|
|
elseif p.c(i) < 0
|
||
|
|
% We are maximizing x(i), since an lower bound is -UPPER
|
||
|
|
% this means x(i) has to be > -UPPER in optimal solution
|
||
|
|
p.lb(i) = max([p.lb(i) -upper/abs(p.c(i))]);
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
if ~isempty(p.bilinears) & nnz(p.Q)==0
|
||
|
|
quad_v = find(p.bilinears(:,2) == p.bilinears(:,3));
|
||
|
|
quad_x = p.bilinears(quad_v,2);
|
||
|
|
quad_v = p.bilinears(quad_v,1);
|
||
|
|
i = find(p.c(quad_v)>0);
|
||
|
|
quad_v = quad_v(i);
|
||
|
|
quad_x = quad_x(i);
|
||
|
|
if ~isempty(quad_v) & ~any(isinf(p.lb(quad_x))) & ~any(isinf(p.ub(quad_x)))
|
||
|
|
% x'*D*x + c'*x + f + h(x) < U
|
||
|
|
D = diag(p.c(quad_v));
|
||
|
|
if all(diag(D)>0)
|
||
|
|
c = p.c(quad_x);
|
||
|
|
h = p.c;
|
||
|
|
h(quad_x) = 0;
|
||
|
|
h(quad_v) = 0;
|
||
|
|
% Complete
|
||
|
|
% (x + D^-0.5*c/2)'*D*(x + D^-0.5*c/2) - c'*D*c/4 + f + h(x) < U
|
||
|
|
xc = -(D^-1)*c/2;
|
||
|
|
rhs = upper - p.f - (h(h<0)'*p.ub(h<0) + h(h>=0)'*p.lb(h>=0)) + xc'*D*xc;
|
||
|
|
if rhs>0
|
||
|
|
D = D/rhs;
|
||
|
|
% (x-xc)'*D*(x-xc) <= 1
|
||
|
|
for i = 1:length(quad_x)
|
||
|
|
p.lb(quad_x(i)) = max(p.lb(quad_x(i)),xc(i) - 1/sqrt(D(i,i)));
|
||
|
|
p.ub(quad_x(i)) = min(p.ub(quad_x(i)),xc(i) + 1/sqrt(D(i,i)));
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
if ~isequal(LU,[p.lb p.ub])
|
||
|
|
p.changedbounds = 1;
|
||
|
|
end
|
||
|
|
|
||
|
|
% Some initial code for using inverse objective to derive bounds.
|
||
|
|
if nnz(p.Q)==0 && nnz(p.c)==1
|
||
|
|
[pos,~,val] = find(p.c);
|
||
|
|
if val == -1
|
||
|
|
fi = find(p.evalVariables == pos);
|
||
|
|
if ~isempty(fi)
|
||
|
|
% We're maximizing f(x)
|
||
|
|
if ~isempty(p.evalMap{fi}.properties.inverse)
|
||
|
|
if strcmp(p.evalMap{fi}.properties.definiteness,'positive')
|
||
|
|
if strcmp(p.evalMap{fi}.properties.monotonicity,'increasing')
|
||
|
|
if length(p.evalMap{fi}.arg)==2
|
||
|
|
lower = -upper;
|
||
|
|
p.lb(p.evalMap{fi}.variableIndex) = max([p.lb(p.evalMap{fi}.variableIndex) p.evalMap{fi}.properties.inverse(lower)]);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
if val == 1
|
||
|
|
fi = find(p.evalVariables == pos);
|
||
|
|
if ~isempty(fi)
|
||
|
|
% We're minimizing f(x)
|
||
|
|
if ~isempty(p.evalMap{fi}.properties.inverse)
|
||
|
|
if strcmp(p.evalMap{fi}.properties.definiteness,'positive')
|
||
|
|
if strcmp(p.evalMap{fi}.properties.monotonicity,'increasing')
|
||
|
|
if length(p.evalMap{fi}.arg)==2
|
||
|
|
p.ub(p.evalMap{fi}.variableIndex) = min([p.ub(p.evalMap{fi}.variableIndex) p.evalMap{fi}.properties.inverse(upper)]);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|