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

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

Added original make3d

File size: 3.6 KB
Line 
1function [BlockedQ,residuals] = postprocesssos(BlockedA,Blockedb,BlockedQ,sparsityPattern,options);
2
3BlockedQ=applysparsity(BlockedQ,sparsityPattern);
4
5for passes = 1:1:options.sos.postprocess
6    for constraint = 1:length(BlockedQ)
7        mismatch = computeresiduals(BlockedA,Blockedb,BlockedQ,constraint);
8        [ii,jj ]= sort(abs(mismatch));
9        jj = flipud(jj);
10        for j = jj(:)'%1:size(BlockedA{constraint}{1},1)
11            if abs(mismatch(j))>0
12                for i = 1:length(BlockedA{constraint})
13                    n=sqrt(size(BlockedA{constraint}{i},2));
14                    Ai=reshape(BlockedA{constraint}{i}(j,:),n,n);
15                    nnzAi = nnz(Ai);
16                    if nnzAi>0
17                        dAi = Ai*mismatch(j)/nnzAi;
18                        Qi = BlockedQ{constraint}{i};
19                        %                        [R,p] = chol(BlockedQ{constraint}{i}-Ai*mismatch(j)/nnzAi);
20                        [R,p] = chol(Qi-dAi);
21                        if p
22                            %                           gevps=eig(BlockedQ{constraint}{i},full(Ai)*mismatch(j)/nnzAi);
23                            gevps=eig(Qi,full(dAi));
24                            gevps=gevps(gevps>=0);
25                            gevps=gevps(~isinf(gevps));
26                            if isempty(gevps)
27                                gevps=1;
28                            end
29                            lambda=max(0,min(1,min(gevps)));
30                            %                            [R,p] = chol(BlockedQ{constraint}{i}-Ai*lambda*mismatch(j)/nnzAi);
31                            [R,p] = chol(Qi-dAi*lambda);
32                        else
33                            lambda = 1;
34                        end
35                        %                        dAi = Ai*mismatch(j)/nnzAi;
36                        if ~p
37                            %                            BlockedQ{constraint}{i}=BlockedQ{constraint}{i}-Ai*lambda*mismatch(j)/nnzAi;
38                            BlockedQ{constraint}{i}=Qi-dAi*lambda;
39                            mismatch(j)=mismatch(j)*(1-lambda);
40                        else
41                            %lambda=1;
42                            while lambda>1e-4 & (p~=0)
43                                lambda=lambda/sqrt(2);
44                                %                                [R,p]= chol(BlockedQ{constraint}{i}-Ai*lambda*mismatch(j)/nnzAi);
45                                [R,p]= chol(Qi-dAi*lambda);
46                            end
47                            %                            if min(eig(BlockedQ{constraint}{i}-Ai*lambda*mismatch(j)/nnzAi))>=0
48                            if min(eig(Qi-dAi*lambda))>=0
49                                %    BlockedQ{constraint}{i}=BlockedQ{constraint}{i}-Ai*lambda*mismatch(j)/nnzAi;
50                                BlockedQ{constraint}{i}=Qi-dAi*lambda;
51                                mismatch(j)=mismatch(j)*(1-lambda);
52                            end
53                        end
54                    end
55                end
56            end
57        end
58    end
59end
60
61for constraint = 1:length(BlockedQ)
62    residuals(constraint,1) = norm(computeresiduals(BlockedA,Blockedb,BlockedQ,constraint),'inf');
63end
64
65function  mismatch = computeresiduals(BlockedA,Blockedb,BlockedQ,constraint);
66lhs=0;
67for k=1:length(BlockedA{constraint})
68    lhs=lhs+BlockedA{constraint}{k}*BlockedQ{constraint}{k}(:);
69end
70mismatch = lhs-Blockedb{constraint};
71
72function BlockedQ=applysparsity(BlockedQ,sparsityPattern);
73if ~isempty(sparsityPattern)
74
75    for i = 1:length(BlockedQ)
76        for j =  1:length(BlockedQ{i})
77            BlockedQ{i}{j}(sparsityPattern{i}{j}) = 0;
78        end
79    end
80end
81
Note: See TracBrowser for help on using the repository browser.