source: proiecte/pmake3d/make3d_original/Make3dSingleImageStanford_version0.1/third_party/opt/yalmip/modules/global/kktqp.m @ 37

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

Added original make3d

File size: 2.9 KB
Line 
1function output = kktqp(interfacedata)
2%KKTQP Solver for indefinite QP problems using binary optmization
3
4% Author Johan Löfberg
5% $Id: kktqp.m,v 1.1 2006/04/04 19:01:38 joloef Exp $
6
7% ********************************
8%% INITIALIZE DIAGNOSTICS IN YALMIP
9% ********************************
10K = interfacedata.K;
11b = interfacedata.F_struc(1+K.f:end,1);
12A = -interfacedata.F_struc(1+K.f:end,2:end);
13c = interfacedata.c;
14
15n = length(c);
16
17if ~all(isinf(interfacedata.lb))
18    if ~isempty(lb)
19        A = [A;-eye(n)];
20        b = [b;-interfacedata.lb]
21    end
22end
23if ~all(isinf(interfacedata.ub))
24    if ~isempty(ub)
25        A = [A;eye(n)];
26        b = [b;interfacedata.ub]       
27    end
28end
29
30% Lazy...
31P = polytope(A,b);
32[B,L,U] = bounding_box(P);
33[A,b] = double(P);
34
35% Formulation here assumes maximization...
36Q = -2*interfacedata.Q;
37c = -interfacedata.c;
38
39x = sdpvar(n,1);
40bounds(x,L,U);
41
42y = sdpvar(length(b),1);  % Duals
43dy = binvar(length(b),1); % indicater dual ==0
44ds = binvar(length(b),1); % indicater slack==0
45s = b-A*x; % slack
46
47% Derive bounds on primal slack
48[M,m] = derivebounds(s);
49
50% Let us try to derive bounds on the dauls
51% variables. Hmm...
52% Ugly, but let's just maximize/minimize linear
53% relaxations
54F = set(A'*y == Q*x + c) + set(s>0) + set(y>0);%KKT
55F = F + set(s < ds.*M);   % Big M, we know upper bound on s
56F = F + set(dy+ds <= 1);  % Complementary slackness
57F = F + set(0 <= sum(dy) <= n);
58
59% Find dis-joint constraints (silly way...)
60for i = 1:length(b)
61    j = findrows(abs(A),abs(A(i,:)));
62    if length(j)>1
63        S{i} = setdiff(j,i);
64    else
65        S{i} = [];
66    end
67end
68
69[a1,a2,a3,model] = export(F,-y(i),sdpsettings('relax',1));
70solvertime = clock;
71for i = 1:length(b)
72    if isempty(S{i})
73        model_ = model;
74        model_.c  = model_.c*0;
75        model_.c(n+i)  = -1;
76        sol = feval(model.solver.call,model_);
77    else
78        k = length(S{i});
79        Aeq = sparse(1:k,n+S{i},1,k,n+3*length(b));
80        beq = zeros(k,1);
81        model_ = model;
82        model_.F_struc = [beq Aeq;model.F_struc];
83        model_.K.f = model.K.f+k;
84        model_.c  = model_.c*0;
85        model_.c(n+i)  = -1;
86        sol = feval(model.solver.call,model_);
87    end
88    if sol.problem == 0
89        My(i,1) =  sol.Primal(n+i);
90    else
91        My(i,1) =  1e4;
92    end
93end
94
95F = F + set(y <= dy.*My);
96
97obj = -0.5*(c'*x+b'*y); % ==cost in optimal points
98sol = solvesdp(F,obj);
99
100
101% **********************************
102%% CREATE SOLUTION
103% **********************************
104output.problem = sol.problem;
105output.Primal      = double(x);
106output.Dual        = [];
107output.Slack       = [];
108output.infostr      = yalmiperror(output.problem,'KKTQP');
109output.solverinput  = 0;
110if interfacedata.options.savesolveroutput
111    output.solveroutput.solved_nodes = solved_nodes;
112    output.solveroutput.lower = lower;
113    output.solveroutput.upper = upper;   
114else
115    output.solveroutput =[];
116end
117output.solvertime = etime(clock,solvertime);
Note: See TracBrowser for help on using the repository browser.