source: proiecte/pmake3d/make3d_original/Make3dSingleImageStanford_version0.1/third_party/opt/yalmip/extras/@ncvar/nonlineartocone.m @ 37

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

Added original make3d

File size: 1.9 KB
Line 
1function [Fconv,info] = nonlineartocone(F)
2%NONLINEARTOCONE Convert nonlinear constraint to second order cone
3
4% Author Johan Löfberg
5% $Id: nonlineartocone.m,v 1.1 2006/08/10 18:00:21 joloef Exp $   
6
7if islinear(F)
8    Fconv = F;
9    info = 0;
10    return
11end
12
13[n,m]=size(F);
14if (n*m==1)
15    Fconv = [];
16    % Involved in polynomial constraints
17    sqrList = yalmip('nonlinearvariables');
18    h = sort(unique(sqrList));
19    % % SDP relaxation
20    for i = 1:size(sqrList,1)
21        left_index = find(h==sqrList(i,1));
22        x1_index = find(h==sqrList(i,2));
23        x2_index = find(h==sqrList(i,3));
24        Z{i}=zeros(length(h),length(h));
25        if x1_index==x2_index
26            Z{i}(x2_index,x1_index) = 1;
27        else
28            Z{i}(x1_index,x2_index) = 0.5;
29            Z{i}(x2_index,x1_index) = 0.5;
30        end
31    end
32    vars = getvariables(F);
33    base = getbase(F);
34    nonlinvars = find(ismember(vars,sqrList(:,1)));
35    linvars = find(~ismember(vars,sqrList(:,1)));
36    % Construct quadratic
37    Q = zeros(length(h));
38    for i = 1:length(nonlinvars)
39        indexinlist = find(vars(nonlinvars(i))==sqrList(:,1));
40        indexinh = find(vars(nonlinvars(i))==h);
41        Q = Q-Z{indexinlist}*base(1+find(h(indexinh)==vars));
42    end
43    used = find(any(Q));
44    [B,r] = chol(Q(used,used));
45    if r==0
46        linear = base(1);
47        if ~isempty(linvars)
48            linear = linear+base(1+find(ismember(linvars,vars)))*recover(linvars);
49        end
50        ConesAxb=[2*B*recover(h(used));1-linear];
51        Conescxd=1+linear;
52        Fconv = cone(ConesAxb,Conescxd);
53        info = 0;
54    else
55        Fconv = F;
56        if nargout == 2
57            info = 1;
58        else
59            warning('Cannot re-write to second order cone constraint');
60        end
61    end
62else
63    if nargout == 2
64        Fconv = F;
65        info = 1;
66    else
67        error('nonlineartocone can only be applied to scalar inequalities')
68    end
69end
Note: See TracBrowser for help on using the repository browser.