1 | function [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 | |
---|
11 | itslinear = islinear(F); |
---|
12 | if itslinear |
---|
13 | Fconv = F; |
---|
14 | no_changed = 0; |
---|
15 | return |
---|
16 | end |
---|
17 | |
---|
18 | itssigmonial = issigmonial(F); |
---|
19 | if itssigmonial |
---|
20 | Fconv = F; |
---|
21 | no_changed = 0; |
---|
22 | return |
---|
23 | end |
---|
24 | |
---|
25 | Fconv = lmi; |
---|
26 | no_changed = 0; |
---|
27 | for 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 |
---|
76 | end |
---|