[37] | 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 |
---|