source: proiecte/pmake3d/make3d_original/Make3dSingleImageStanford_version0.1/third_party/opt/yalmip/extras/convertquadratics.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 [Fconv,no_changed] = convertquadratics(F)
2%CONVERTQUADRATICS Internal function to extract quadratic constraints
3
4% Author Johan Löfberg
5% $Id: convertquadratics.m,v 1.11 2006/05/15 14:29:51 joloef Exp $
6
7% ******************************
8% LINEAR?
9% ******************************
10
11itslinear = islinear(F);
12if itslinear
13    Fconv = F;
14    no_changed = 0;
15    return
16end
17
18itssigmonial = issigmonial(F);
19if itssigmonial
20    Fconv = F;
21    no_changed = 0;
22    return
23end
24
25Fconv = lmi;
26no_changed = 0;
27for i = 1:1:length(F)
28    if is(F(i),'element-wise') & ~is(F(i),'linear') & ~is(F(i),'sigmonial')
29        % f-c'*x-x'*Q*x>0
30        fi = sdpvar(F(i));fi = fi(:);
31        for j = 1:length(fi)
32            [Q,c,f,x,info] = quaddecomp(fi(j));
33            if info==0
34                if nnz(Q)==0
35                    % Oh, linear,...
36                    Fconv = Fconv + set(fi(j));
37                else
38                    % Yes, quadratic, but convex?
39                    % Change sign definitions
40                    Q = -Q;
41                    c = -c;
42                    f = -f;
43                    % Semi-definite case when only part of x in Q
44                    % Occurs, e.g, in constraints like y'*Q*y < t
45                    used = find(any(Q));Qred=Q(:,used);Qred = Qred(used,:);xred = x(used);
46                    [R,p]=chol(Qred);
47                    if p
48                        % Safety check to account for low rank problems
49                        if all(eig(Qred)>=0)
50                            [u,s,v]=svd(Qred);
51                            r=find(diag(s)>1e-12);
52                            R=(u(:,r)*sqrt(s(r,r)))';
53                            p=0;
54                        end
55                    end
56                    if p==0
57                        % Write as second order cone
58                        d = -c'*x-f;
59                        if isa(d,'double') & d==1
60                            Fconv=Fconv + lmi(cone([2*R*xred],1+d));
61                        else
62                            Fconv=Fconv + lmi(cone([2*R*xred;1-d],1+d));
63                        end
64                        no_changed = no_changed + 1;
65                    else
66                        Fconv = Fconv + set(fi(j));
67                    end
68                end
69            else
70                Fconv = Fconv + set(fi(j));
71            end
72        end
73    else
74        Fconv = Fconv + F(i);
75    end
76end
Note: See TracBrowser for help on using the repository browser.