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

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

Added original make3d

File size: 3.5 KB
Line 
1function [Matrices,infeasible] = mpt_project_on_equality(Matrices)
2% Projects the whole mp(Q)LP problem on Aeq*U + Beq*x = beq
3infeasible = 0;
4if length(Matrices.beq) > 0
5       
6    [ii,jj,kk]=unique([Matrices.Aeq Matrices.Beq Matrices.beq],'rows');
7    Matrices.Aeq = Matrices.Aeq(jj,:);
8    Matrices.Beq = Matrices.Beq(jj,:);
9    Matrices.beq = Matrices.beq(jj,:);
10   
11    if nnz(Matrices.Aeq)==0 & nnz(Matrices.Beq)>0
12        % Lower dimensional in parametric space       
13        infeasible = 1;
14        return
15    end
16   
17   
18   
19    [Qh,Rh,e] = qr(full(Matrices.Aeq),0);
20    r = max(find(sum(abs(Rh),2)>1e-10));
21   
22   
23    % The dependent
24    v1 = e(1:r);
25    % The basis
26    v2 = e(r+1:end);
27
28    % H1u1+H2u2 = Mv + g
29    Aeq1 = Matrices.Aeq(:,v1);
30    Aeq2 = Matrices.Aeq(:,v2);
31
32    Aeqtilde = [-Aeq1\Aeq2;eye(size(Aeq2,2))];
33    Beqtilde = [-Aeq1\Matrices.Beq;zeros(size(Aeq2,2),size(Matrices.Beq,2))];
34    beqtilde = [Aeq1\Matrices.beq;zeros(size(Aeq2,2),1)];
35
36    if  any(any(isnan(Aeqtilde))) | any(any(isnan(Aeqtilde))) | any(any(isnan(Aeqtilde)))
37        infeasible = 1;       
38        return
39    end
40
41    s = 1:size(Matrices.Aeq,2);
42    p = zeros(1,length(s));
43    for i = 1:length(s)
44        pi = find(s(i)==e);
45        if ~isempty(pi)
46            p(i) = pi;
47        end
48    end
49    % This is what we would do in ML7.1
50    % [dummy,p] = ismember(1:size(Matrices.Aeq,2),e);
51       
52    S1 = Aeqtilde(p,:);
53    S2 = Beqtilde(p,:);
54    S3 = beqtilde(p,:);
55   
56    if  norm([Matrices.Aeq*S1 Matrices.Aeq*S2+Matrices.Beq Matrices.Aeq*S3-Matrices.beq],inf) > 1e-10
57        % Lower dimensional in parametric space 
58        % We basically have something like
59        % u     == 1
60        % u + x == 1
61        infeasible = 1;
62        return
63    end
64     
65    % New parameterization U = S1*z + S2*x + S3
66    M = Matrices;
67    Matrices.G = M.G*S1;
68    Matrices.E = M.E-M.G*S2;
69    Matrices.W = M.W-M.G*S3;   
70    Matrices.nu = size(Matrices.G,2);
71       
72    if Matrices.qp
73        Matrices.H  = S1'*M.H*S1;
74        Matrices.F  = M.F*S1+S2'*M.H*S1;
75        Matrices.Y = M.Y + S2'*M.H*S2+0.5*(M.F*S2+S2'*M.F');
76        Matrices.Cf = M.Cf*S1+S3'*M.H*S1;
77        Matrices.Cc = M.Cc + M.Cf*S3;
78        Matrices.Cx = M.Cx + S3'*M.F'+M.Cf*S2;
79    else
80        Matrices.H = M.H*S1;     
81        if isfield(Matrices,'D')
82            % Latest MPT does not fullify D
83            Matrices.D = full((Matrices.D'*S1)');
84        end
85    end
86
87    removable = find(sum(abs([Matrices.G Matrices.E Matrices.G]),2)<1e-12);
88    inconsistent = intersect(removable,find(Matrices.W<-1e-10));
89    if length(inconsistent)>0
90        infeasible = 1;   
91        return
92    end
93
94    if ~isempty(removable)
95        Matrices.G(removable,:) = [];
96        Matrices.E(removable,:) = [];
97        Matrices.W(removable,:) = [];
98    end
99
100    % Keep the bounds for the new basis only
101    Matrices.lb = [Matrices.lb(v2);Matrices.lb(end-size(Matrices.E,2)+1:end)];
102    Matrices.ub = [Matrices.ub(v2);Matrices.ub(end-size(Matrices.E,2)+1:end)];
103
104    % All equalities have been used
105    Matrices.Aeq = [];
106    Matrices.Beq = [];
107    Matrices.beq = [];
108
109    % This data is needed to recover original variables later
110    if isempty(Matrices.getback)
111        Matrices.getback.S1 = S1;
112        Matrices.getback.S2 = S2;
113        Matrices.getback.S3 = S3;
114    else
115        % This model has been reduced before, merge reductions
116        oldgetback = Matrices.getback;
117        Matrices.getback.S1 = oldgetback.S1*S1;
118        Matrices.getback.S2 = oldgetback.S1*S2 + oldgetback.S2;
119        Matrices.getback.S3 = oldgetback.S1*S3 + oldgetback.S3;
120    end
121end
122
Note: See TracBrowser for help on using the repository browser.