[37] | 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); |
---|