source: proiecte/pmake3d/make3d_original/Make3dSingleImageStanford_version0.1/third_party/opt/yalmip/modules/global/presolve_bounds_from_equalities.m @ 37

Last change on this file since 37 was 37, checked in by (none), 14 years ago

Added original make3d

File size: 2.3 KB
Line 
1function p = presolve_bounds_from_equalities(p)
2if 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
59end
60close = find(abs(p.lb - p.ub) < 1e-12);
61p.lb(close) = (p.lb(close)+p.ub(close))/2;
62p.ub(close) = p.lb(close);
Note: See TracBrowser for help on using the repository browser.