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

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

Added original make3d

File size: 6.5 KB
Line 
1function output = callfmincon(interfacedata)
2
3% Author Johan Löfberg
4% $Id: callfmincon.m,v 1.33 2006/09/13 12:39:17 joloef Exp $
5
6% Retrieve needed data
7options = interfacedata.options;
8F_struc = interfacedata.F_struc;
9c       = interfacedata.c;
10K       = interfacedata.K;
11x0      = interfacedata.x0;
12Q       = interfacedata.Q;
13lb      = interfacedata.lb;
14ub      = interfacedata.ub;
15monomtable = interfacedata.monomtable;
16
17switch options.verbose
18    case 0
19        options.fmincon.Display = 'off';
20    case 1
21        options.fmincon.Display = 'final';
22    otherwise
23        options.fmincon.Display = 'iter';
24end
25
26% Do some pre-calc to be used in calls from fmincon
27nonlinearindicies = find(interfacedata.variabletype~=0);
28nonlinearindicies = union(nonlinearindicies,interfacedata.evalVariables);
29linearindicies    = find(interfacedata.variabletype==0);
30linearindicies    = setdiff(linearindicies,nonlinearindicies);
31interfacedata.nonlinearindicies = nonlinearindicies;
32interfacedata.linearindicies    = linearindicies;
33
34% % % Move nonlinear bounds to constraints
35% if ~isempty(lb)
36%     finite = find(~isinf(lb(nonlinearindicies)));
37%     if ~isempty(finite)
38%         temp = F_struc(1:K.f,:);
39%         F_struc(1:K.f,:) = [];
40%         n = length(c);
41%
42%         for i = 1:length(finite)
43%             j = nonlinearindicies(i);
44%             F_struc = [-lb(j) sparse(1,j,1,1,n);F_struc];
45%         end
46%         K.l = K.l + length(finite);
47%         F_struc = [temp;F_struc];
48%         interfacedata.K = K;
49%         interfacedata.F_struc = F_struc;
50%     end
51% end
52% if ~isempty(ub)
53%     finite = find(~isinf(lb(nonlinearindicies)));
54%     if ~isempty(finite)
55%         temp = F_struc(1:K.f,:);
56%         F_struc(1:K.f,:) = [];
57%         n = length(c);
58%
59%         for i = 1:length(finite)
60%             j = nonlinearindicies(i);
61%             F_struc = [ub(j) -sparse(1,j,1,1,n);F_struc];
62%         end
63%         K.l = K.l + length(finite);
64%         F_struc = [temp;F_struc];
65%         interfacedata.K = K;
66%         interfacedata.F_struc = F_struc;
67%     end
68% end
69
70any_constraints = (K.s+K.f+K.l+K.q)>0;
71
72interfacedata.Anonlinineq = [];
73interfacedata.bnonlinineq = [];
74interfacedata.Anonlineq = [];
75interfacedata.bnonlineq = [];
76
77if K.f>0
78    Aeq = -interfacedata.F_struc(1:1:K.f,2:end);
79    beq = interfacedata.F_struc(1:1:interfacedata.K.f,1);
80       
81    nonlinear_equalities_indicies = find(any(Aeq(:,nonlinearindicies),2));
82    interfacedata.Anonlineq = Aeq(nonlinear_equalities_indicies,:);
83    interfacedata.bnonlineq = beq(nonlinear_equalities_indicies);
84       
85    Aeq(nonlinear_equalities_indicies,:) = [];
86    beq(nonlinear_equalities_indicies,:) = [];
87    Aeq(:,nonlinearindicies) = [];
88    interfacedata.F_struc(1:interfacedata.K.f,:) = [];
89    interfacedata.K.f = 0;   
90else
91    Aeq = [];
92    beq = [];
93end
94
95if interfacedata.K.l>0
96    A = -interfacedata.F_struc(1:interfacedata.K.l,2:end);
97    b = interfacedata.F_struc(1:interfacedata.K.l,1);
98         
99    nonlinear_inequalities_indicies = find(any(A(:,nonlinearindicies),2));
100       
101    interfacedata.Anonlinineq = A(nonlinear_inequalities_indicies,:);
102    interfacedata.bnonlinineq = b(nonlinear_inequalities_indicies);
103
104    A(nonlinear_inequalities_indicies,:) = [];
105    b(nonlinear_inequalities_indicies,:) = [];
106    A(:,nonlinearindicies) = [];
107   
108    interfacedata.F_struc(1:interfacedata.K.l,:) = [];
109    interfacedata.K.l = 0;   
110else
111    A = [];
112    b = [];
113end
114
115if isfield(options.fmincon,'LargeScale')
116    if isequal(options.fmincon.LargeScale,'off')
117        A = full(A);
118        b = full(b);
119        Aeq = full(Aeq);
120        beq = full(beq);
121    end
122end
123
124% This helps with robustness in bnb in some cases
125x0candidate = zeros(length(c),1);
126if ~isempty(lb) & ~isempty(lb)
127    bounded = find(~isinf(lb) & ~isinf(ub));
128    x0candidate(bounded) = (lb(bounded) + ub(bounded))/2;
129    bounded_below = find(~isinf(lb) & isinf(ub));
130    x0candidate(bounded_below) = lb(bounded_below) + 0.5;
131    bounded_above = find(~isinf(lb) & isinf(ub));
132    x0candidate(bounded_above) = lb(bounded_above) + 0.5;
133end
134   
135if isempty(x0)
136    x0 = x0candidate(linearindicies);
137else
138    if ~isempty(lb) & ~isempty(ub)
139        x0((x0 < lb) | (x0 > ub)) = x0candidate((x0 < lb) | (x0 > ub));
140    end
141    x0 = x0(linearindicies);
142end
143
144if ~isempty(lb)
145    lb = lb(linearindicies);
146end
147if ~isempty(ub)
148    ub = ub(linearindicies);
149end
150
151if options.savedebug
152    ops = options.fmincon;
153    save fmincondebug interfacedata A b Aeq beq x0 lb ub ops
154end
155
156showprogress('Calling FMINCON',options.showprogress);
157
158% Precalc for the callbacks
159params = setup_fmincon_params(interfacedata);
160if (params.SimpleQuadraticObjective | params.SimpleNonlinearObjective) & isempty(interfacedata.evalMap)
161    options.fmincon.GradObj = 'on';
162end
163params.linearconstraints =  isempty(params.interfacedata.evalMap) & isempty(params.interfacedata.Anonlinineq) & isempty(params.interfacedata.Anonlineq) & isequal( params.interfacedata.K.q,0) & isequal( params.interfacedata.K.s,0);
164params.nonlinearinequalities = ~isempty(params.interfacedata.Anonlinineq);
165params.nonlinearequalities = ~isempty(params.interfacedata.Anonlineq);
166
167solvertime = clock;
168[xout,fmin,flag,output,lambda] = fmincon('fmincon_fun',x0,A,b,Aeq,beq,lb,ub,'fmincon_con',options.fmincon,params);   
169solvertime = etime(clock,solvertime);
170
171if isempty(nonlinearindicies)
172    x = xout(:);
173else
174    x = zeros(length(c),1);
175    for i = 1:length(linearindicies)
176        x(linearindicies(i)) = xout(i);
177    end
178    x = x(1:length(c));
179end
180
181problem = 0;
182
183% Internal format for duals
184D_struc = [];
185
186% Check, currently not exhaustive...
187if flag==0
188    problem = 3;
189else
190    if flag>0
191        problem = 0;
192    else
193        if isempty(x)
194            x = repmat(nan,length(c),1);
195        end
196        if 0%any((A*x-b)>sqrt(eps)) | any( abs(Aeq*x-beq)>sqrt(eps))
197            problem = 1; % Likely to be infeasible
198        else
199            if c'*x<-1e10 % Likely unbounded
200                problem = 2;
201            else          % Probably convergence issues
202                problem = 5;
203            end
204        end
205    end
206end
207
208% Save all data sent to solver?
209if options.savesolverinput
210    solverinput.A = A;
211    solverinput.b = b;
212    solverinput.Aeq = Aq;
213    solverinput.beq = beq;
214    solverinput.options = options.fmincon;
215else
216    solverinput = [];
217end
218
219% Save all data from the solver?
220if options.savesolveroutput
221    solveroutput.x = x;
222    solveroutput.fmin = fmin;
223    solveroutput.flag = flag;
224    solveroutput.output=output;
225    solveroutput.lambda=lambda;
226else
227    solveroutput = [];
228end
229
230% Standard interface
231output = createoutput(x,D_struc,[],problem,'FMINCON',solverinput,solveroutput,solvertime);
Note: See TracBrowser for help on using the repository browser.