source: proiecte/pmake3d/make3d_original/Make3dSingleImageStanford_version0.1/third_party/opt/yalmip/solvers/callkypd.m @ 37

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

Added original make3d

File size: 4.1 KB
Line 
1function diagnostic = callkypd(F,h,options)
2
3% Author Johan Löfberg
4% $Id: callkypd.m,v 1.6 2005/02/04 10:10:28 johanl Exp $
5
6
7kyps = is(F,'kyp');
8if all(kyps)
9    kypConstraints = F;
10    otherConstraints = lmi;
11else
12    kypConstraints   = F(find(kyps));
13    otherConstraints = F(find(~kyps));
14end
15
16% Trivial case
17if length(kypConstraints) == 0
18    if ~isempty(options)
19        options.solver = '';
20    else
21        options = sdpsettings;
22    end
23    diagnostic = solvesdp(F,h,options)
24    return;
25end
26
27p_variables = [];
28x_variables = [];
29for i = 1:length(kypConstraints)
30    [A{i},B{i},P{i},M{i},negated{i}] = extractkyp(sdpvar(kypConstraints(i)));
31    if ~isa(P{i},'sdpvar') | ~isempty(intersect(p_variables,getvariables(P{i})))
32        diagnostic.solvertime = 0;
33        diagnostic.problem = -4;
34        diagnostic.info = yalmiperror(-4);   
35        return;
36    end
37    P_base = getbase(P{i});
38    [n,m] = size(P{i});
39    if (n~=m) | (nnz(P_base)~=n*n) | (sum(sum(P_base))~=n*n)
40        diagnostic.solvertime = 0;
41        diagnostic.problem = -4;
42        diagnostic.info = yalmiperror(-4);   
43        return;       
44    end
45    p_variables = [p_variables getvariables(P{i})];
46    x_variables = [x_variables getvariables(M{i})];
47end
48
49if intersect(p_variables,getvariables(h))
50    diagnostic.solvertime = 0;
51    diagnostic.problem = -4;
52    diagnostic.info = yalmiperror(-4);   
53    return;
54end
55
56start = length(A);k = 1;
57for i = 1:length(otherConstraints)
58    if is(otherConstraints(i),'lmi')
59        A{k+start}=[];
60        B{k+start}=[];
61        P{k+start}=[];
62        M{k+start} = sdpvar(otherConstraints(i));
63        x_variables = [x_variables getvariables(M{k+start})];
64        k = k + 1;
65    elseif is(otherConstraints(i),'elementwise')
66        X = sdpvar(otherConstraints(i));
67        for ii = 1:size(X,1)
68            for jj = 1:size(X,2)
69                A{k+start}=[];
70                B{k+start}=[];
71                P{k+start}=[];
72                M{k+start} = X(ii,jj);
73                x_variables = [x_variables getvariables(X(ii,jj))];
74                k = k + 1;
75            end
76        end
77    end
78end
79
80% Objective function variables
81x_variables = unique([x_variables getvariables(h)]);
82
83% Are P and x independent
84if ~isempty(intersect(p_variables,x_variables))
85    error
86end
87
88% Generate the M-matrices
89for i = 1:length(M)
90    m_variables = getvariables(M{i});
91    n = length(M{i});
92    M0{i} = getbasematrix(M{i},0);
93    for j = 1:length(x_variables)
94        Mi{i,j} = getbasematrix(M{i},x_variables(j));
95    end
96end
97
98c = zeros(length(x_variables),1);
99if ~isempty(h)
100    for i = 1:length(x_variables)
101        c(i) = getbasematrix(h,x_variables(i));
102    end
103end
104
105for i = 1:length(M)
106    matrixinfo.n(i) = length(A{i});
107    matrixinfo.nm(i) = length(M{i});
108end
109
110matrixinfo.K  = length(x_variables);
111matrixinfo.c  = c;
112matrixinfo.N  = length(A);
113matrixinfo.A  = A;
114matrixinfo.B  = B;
115matrixinfo.M0 = M0;
116matrixinfo.M  = Mi;
117matrixinfo.A  = A;
118
119try
120    solvertime = clock;
121    [u,Popt,xopt,Zopt] = kypd_solver(matrixinfo,options);
122    solvertime = etime(clock,solvertime);
123   
124    % SAVE PRIMALS
125    setsdpvar(recover(x_variables),xopt);
126    for i = 1:length(kypConstraints)
127        if negated{i}
128            setsdpvar(P{i},-Popt{i});
129        else
130            setsdpvar(P{i},Popt{i});
131        end
132    end
133   
134    % SAVE DUALS
135    lmi_index = [];
136    j = 1;
137    for i = 1:length(kypConstraints)
138        %W = struct(kypConstraints(i));lmiid = W.LMIid;
139        lmiid = getlmiid(kypConstraints(i));       
140        lmi_index = [lmi_index;lmiid];
141        duals{j}=Zopt{j};j = j+1;
142    end
143    for i = 1:length(otherConstraints)
144        %W = struct(otherConstraints(i));lmiid = W.LMIid;
145        lmiid = getlmiid(otherConstraints(i));       
146        lmi_index = [lmi_index;lmiid];
147        duals{j}=Zopt{j};j = j+1;
148    end       
149    yalmip('setdual',lmi_index,duals);
150   
151    diagnostic.solvertime = solvertime;
152    diagnostic.info = yalmiperror(0,'KYPD');
153    diagnostic.problem = 0;
154catch
155    solvertime = etime(clock,solvertime);   
156    diagnostic.solvertime = solvertime;
157    diagnostic.info = yalmiperror(9,'KYPD');
158    diagnostic.problem = 9;
159end
160
161
162
163
164
165
166
167
168
169
Note: See TracBrowser for help on using the repository browser.