1 | function p = presolve_bounds_from_equalities(p) |
---|
2 | if p.K.f >0 |
---|
3 | for j = 1:p.K.f |
---|
4 | % Simple x == y |
---|
5 | done = 0; |
---|
6 | if p.F_struc(j,1)==0 |
---|
7 | [row,col,val] = find(p.F_struc(j,:)); |
---|
8 | if length(row) == 2 |
---|
9 | if val(1) == -val(2) |
---|
10 | p.lb(col(1)-1) = max(p.lb(col(1)-1),p.lb(col(2)-1)); |
---|
11 | p.lb(col(2)-1) = max(p.lb(col(1)-1),p.lb(col(2)-1)); |
---|
12 | p.ub(col(1)-1) = min(p.ub(col(1)-1),p.ub(col(2)-1)); |
---|
13 | p.ub(col(2)-1) = min(p.ub(col(1)-1),p.ub(col(2)-1)); |
---|
14 | done = 1; |
---|
15 | elseif val(1) == val(2) |
---|
16 | p.lb(col(1)-1) = max(p.lb(col(1)-1),-p.ub(col(2)-1)); |
---|
17 | p.lb(col(2)-1) = max(-p.ub(col(1)-1),p.lb(col(2)-1)); |
---|
18 | p.ub(col(1)-1) = min(p.ub(col(1)-1),-p.lb(col(2)-1)); |
---|
19 | p.ub(col(2)-1) = min(-p.lb(col(1)-1),p.ub(col(2)-1)); |
---|
20 | done = 1; |
---|
21 | end |
---|
22 | end |
---|
23 | end |
---|
24 | if ~done |
---|
25 | b = p.F_struc(j,1); |
---|
26 | a = p.F_struc(j,2:end); |
---|
27 | ap = a.*(a>0); |
---|
28 | am = a.*(a<0); |
---|
29 | for k = find(a) |
---|
30 | L = p.lb; |
---|
31 | U = p.ub; |
---|
32 | L(k) = 0; |
---|
33 | U(k) = 0; |
---|
34 | if a(k) > 0 & (p.ub(k)-p.lb(k)) > 1e-8 |
---|
35 | newlower = (-b - ap*U - am*L)/a(k); |
---|
36 | newupper = (-b - am*U - ap*L)/a(k); |
---|
37 | p.ub(k) = min(p.ub(k),newupper); |
---|
38 | p.lb(k) = max(p.lb(k),newlower); |
---|
39 | end |
---|
40 | end |
---|
41 | b = -p.F_struc(j,1); |
---|
42 | a = -p.F_struc(j,2:end); |
---|
43 | ap = a.*(a>0); |
---|
44 | am = a.*(a<0); |
---|
45 | for k = find(a) |
---|
46 | L = p.lb; |
---|
47 | U = p.ub; |
---|
48 | L(k) = 0; |
---|
49 | U(k) = 0; |
---|
50 | if a(k) > 0 & (p.ub(k)-p.lb(k)) > 1e-8 |
---|
51 | newlower = (-b - ap*U - am*L)/a(k); |
---|
52 | newupper = (-b - am*U - ap*L)/a(k); |
---|
53 | p.ub(k) = min(p.ub(k),newupper); |
---|
54 | p.lb(k) = max(p.lb(k),newlower); |
---|
55 | end |
---|
56 | end |
---|
57 | end |
---|
58 | end |
---|
59 | end |
---|
60 | close = find(abs(p.lb - p.ub) < 1e-12); |
---|
61 | p.lb(close) = (p.lb(close)+p.ub(close))/2; |
---|
62 | p.ub(close) = p.lb(close); |
---|