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

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

Added original make3d

File size: 6.6 KB
Line 
1function output = callipoptmex(interfacedata)
2
3% Author Johan Löfberg
4% $Id: callipoptmex.m,v 1.4 2006/03/31 07:25:25 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
17% Do some pre-calc to be used in calls from ipopt
18temp = sum(interfacedata.monomtable,2)>1;
19temp = (sum(interfacedata.monomtable,2)==1 & sum(interfacedata.monomtable~=0,2)==1);
20nonlinearindicies = find(full(~temp));
21linearindicies = find(full(temp));
22
23% Extract gradient info
24%Gradients = F_struc(K.l+K.f+1:1:end,:);
25%F_struc(K.l+K.f+1:end,:) = [];
26
27% Bounds explictly supplied?
28if isempty(lb) | all(isinf(lb))
29    %No, extract from model
30    if K.l > 0
31        b = F_struc(K.f+1:K.l+K.f,1);
32        A = -F_struc(K.f+1:K.l+K.f,2:end);
33        [lower,upper,bound_rows] = find_variable_bounds(A,b,[],[]);
34        lb(linearindicies) = lower(linearindicies);
35        ub(linearindicies) = upper(linearindicies);
36        bound_rows = bound_rows(find(~any(A(bound_rows,nonlinearindicies),2)));
37        F_struc(K.f + bound_rows,:) = [];
38        K.l = K.l - length(bound_rows);
39    end
40end
41
42% Introduce new variables to handle additional inequalties
43originalNvariables = length(c);
44originalLinear = linearindicies;
45nnew = 0;
46if K.l
47    F_struc = [F_struc [zeros(K.f,K.l);-eye(K.l)]];
48    lb(originalNvariables+1:originalNvariables+K.l) = 0;
49    ub(originalNvariables+1:originalNvariables+K.l) = inf;
50    c(originalNvariables+1:originalNvariables+K.l) = 0;
51    Q = blkdiag(Q,spalloc(K.l,K.l,0));
52    monomtable = blkdiag(monomtable,eye(K.l));
53    linearindicies = [linearindicies(:)' (originalNvariables+1):(originalNvariables+K.l)]';
54    nnew = K.l;
55    K.f = K.f + K.l;
56    K.l = 0;
57end
58newinterfacedata = interfacedata;
59newinterfacedata.monomtable = monomtable;
60newinterfacedata.c = c;
61newinterfacedata.Q = Q;
62newinterfacedata.linearindicies = linearindicies;
63newinterfacedata.nonlinearindicies = nonlinearindicies;
64newinterfacedata.c = c;
65newinterfacedata.K = K;
66newinterfacedata.F_struc = F_struc;
67
68
69
70% Ok, now we have a model in IPOPTs prefered format
71
72if isempty(x0)
73    x0 = [];
74%    x0 = zeros(length(linearindicies),1);
75else
76    x0 = [];
77%    x0 = x0(linearindicies);
78end
79
80if ~isempty(lb)
81    lb = lb(linearindicies);
82end
83if ~isempty(ub)
84    ub = ub(linearindicies);
85end
86
87if options.savedebug
88    ops = options.ipopt;
89    save ipoptdebug interfacedata A b Aeq beq x0 lb ub ops
90end
91
92functiondata.nonlinearindicies = nonlinearindicies;
93functiondata.linearindicies = linearindicies;
94functiondata.monomtable = monomtable;
95functionGradientdata.nonlinearindicies = nonlinearindicies;
96functionGradientdata.linearindicies = linearindicies;
97functionGradientdata.monomtable = monomtable;
98functionHessiandata.nonlinearindicies = nonlinearindicies;
99functionHessiandata.linearindicies = linearindicies;
100functionHessiandata.monomtable = monomtable;
101
102constraintdata.nonlinearindicies = nonlinearindicies;
103constraintdata.linearindicies = linearindicies;
104constraintdata.monomtable = monomtable;
105constraintGradientdata.nonlinearindicies = nonlinearindicies;
106constraintGradientdata.linearindicies = linearindicies;
107constraintGradientdata.monomtable = monomtable;
108constraintHessiandata.nonlinearindicies = nonlinearindicies;
109constraintHessiandata.linearindicies = linearindicies;
110constraintHessiandata.monomtable = monomtable;
111
112functiondata.F_struc = [interfacedata.f c(:)'];
113constraintdata.F_struc = F_struc(1:K.l+K.f,:);
114
115start = 1;
116start = start+originalNvariables;
117datasaver(functiondata,[],[],constraintdata,[],[])
118
119i_lb = find(~isinf(lb));
120val_lb = lb(i_lb);
121i_ub = find(~isinf(ub));
122val_ub = ub(i_ub);
123
124NoEquCons = K.f;
125StartPoint = zeros(length(lb),1);
126
127solvertime = clock;
128switch options.verbose
129    case 1
130%        [xout,ObjFinal,mlb,mub,lambda,info,XInfo,ObjInfo] = Ipopt('ipopt_fun','ipopt_con','fd','fd','fd', NoEquCons, StartPoint, i_lb, val_lb,  i_ub,val_ub,setup_fmincon_params(newinterfacedata));%,'print',-1,'IPRINT',-1);
131        [xout,ObjFinal,mlb,mub,lambda,info,XInfo,ObjInfo] = Ipopt('ipopt_fun','ipopt_con','fmincon_fungrad','fd','fmincon_funhessian', NoEquCons, StartPoint, i_lb, val_lb,  i_ub,val_ub,setup_fmincon_params(newinterfacedata));%,'print',1,'IPRINT',0);
132    otherwise
133        [xout,ObjFinal,mlb,mub,lambda,info,XInfo,ObjInfo] = Ipopt('ipopt_fun','ipopt_con','fmincon_fungrad','fd','fmincon_funhessian', NoEquCons, StartPoint, i_lb, val_lb,  i_ub,val_ub,setup_fmincon_params(newinterfacedata));%,'print',1,'IPRINT',0);
134%         [xout,ObjFinal,mlb,mub,lambda,info,XInfo,ObjInfo] =
135%         Ipopt('ipopt_fun','ipopt_con','fd','fd','fd', NoEquCons, StartPoint, i_lb, val_lb,  i_ub,val_ub,setup_fmincon_params(newinterfacedata));
136end
137       
138solvertime = etime(clock,solvertime);
139
140% get rid of slaxks
141xout = xout(1:length(originalLinear));
142linearindicies = originalLinear;
143
144% Put the linear variables in place
145if isempty(nonlinearindicies)
146    x = xout(:);
147else
148    x = zeros(length(interfacedata.c),1);
149    for i = 1:length(linearindicies)
150        x(linearindicies(i)) = xout(i);
151    end
152end
153
154problem = 0;
155
156% Internal format for duals
157D_struc = [];
158
159infostr = yalmiperror(problem,'IPOPT');
160
161% Save all data sent to solver?
162if options.savesolverinput
163
164else
165    solverinput = [];
166end
167
168% Save all data from the solver?
169if options.savesolveroutput
170    solveroutput.xout = x;
171    solveroutput.ObjFinal = ObjFinal;
172    solveroutput.mlb = mlb;
173    solveroutput.mub=mub;
174    solveroutput.lmbda=lambda;
175    solveroutput.info=info;
176    solveroutput.XInfo=ObjInfo;
177else
178    solveroutput = [];
179end
180
181% Standard interface
182output.Primal      = x;
183output.Dual        = D_struc;
184output.Slack       = [];
185output.problem     = problem;
186output.infostr     = infostr;
187output.solverinput = solverinput;
188output.solveroutput= solveroutput;
189output.solvertime  = solvertime;
190
191% Some pre-calc that is sent to function evaluations etc
192function constant_data = setup_fmincon_params(interfacedata)
193
194monomtable = interfacedata.monomtable;
195nonlinearindicies = interfacedata.nonlinearindicies;
196linearindicies = interfacedata.linearindicies;
197
198% actuallyused = any(interfacedata.F_struc(:,2:end),1);
199% if ~isempty(interfacedata.Anonlinineq)
200%     actuallyused =  actuallyused | any(interfacedata.Anonlinineq,1);
201% end
202% if ~isempty(interfacedata.Anonlineq)
203%     actuallyused =  actuallyused | any(interfacedata.Anonlineq,1);
204% end
205% nonlinearindicies = intersect(nonlinearindicies,find(actuallyused));
206
207constant_data.interfacedata = interfacedata;
208constant_data.monomtable = monomtable;
209constant_data.nonlinearindicies = nonlinearindicies;
210constant_data.linearindicies = linearindicies;
211
212
Note: See TracBrowser for help on using the repository browser.