47 {
48
50
51 DistanceApproachInterface* ptop = nullptr;
52
55 ptop = new DistanceApproachIPOPTInterface(
56 horizon, ts, ego, xWS, uWS, l_warm_up, n_warm_up, x0, xF, last_time_u,
57 XYbounds, obstacles_edges_num, obstacles_num, obstacles_A, obstacles_b,
58 planner_open_space_config_);
62 ptop = new DistanceApproachIPOPTFixedTsInterface(
63 horizon, ts, ego, xWS, uWS, l_warm_up, n_warm_up, x0, xF, last_time_u,
64 XYbounds, obstacles_edges_num, obstacles_num, obstacles_A, obstacles_b,
65 planner_open_space_config_);
68 ptop = new DistanceApproachIPOPTCUDAInterface(
69 horizon, ts, ego, xWS, uWS, l_warm_up, n_warm_up, x0, xF, last_time_u,
70 XYbounds, obstacles_edges_num, obstacles_num, obstacles_A, obstacles_b,
71 planner_open_space_config_);
75 ptop = new DistanceApproachIPOPTFixedDualInterface(
76 horizon, ts, ego, xWS, uWS, l_warm_up, n_warm_up, x0, xF, last_time_u,
77 XYbounds, obstacles_edges_num, obstacles_num, obstacles_A, obstacles_b,
78 planner_open_space_config_);
82 ptop = new DistanceApproachIPOPTRelaxEndInterface(
83 horizon, ts, ego, xWS, uWS, l_warm_up, n_warm_up, x0, xF, last_time_u,
84 XYbounds, obstacles_edges_num, obstacles_num, obstacles_A, obstacles_b,
85 planner_open_space_config_);
89 ptop = new DistanceApproachIPOPTRelaxEndSlackInterface(
90 horizon, ts, ego, xWS, uWS, l_warm_up, n_warm_up, s_warm_up, x0, xF,
91 last_time_u, XYbounds, obstacles_edges_num, obstacles_num, obstacles_A,
92 obstacles_b, planner_open_space_config_);
93 }
94
95 Ipopt::SmartPtr<Ipopt::TNLP> problem = ptop;
96
97
98 Ipopt::SmartPtr<Ipopt::IpoptApplication> app = IpoptApplicationFactory();
99
100 app->Options()->SetIntegerValue(
104 app->Options()->SetIntegerValue(
108 app->Options()->SetNumericValue(
112 app->Options()->SetIntegerValue(
116 app->Options()->SetNumericValue(
120 app->Options()->SetNumericValue(
121 "acceptable_constr_viol_tol",
125 app->Options()->SetNumericValue(
126 "min_hessian_perturbation",
130 app->Options()->SetNumericValue(
131 "jacobian_regularization_value",
135 app->Options()->SetStringValue(
136 "print_timing_statistics",
140 app->Options()->SetStringValue(
144 app->Options()->SetStringValue(
148 app->Options()->SetNumericValue(
152
153 Ipopt::ApplicationReturnStatus status = app->Initialize();
154 if (status != Ipopt::Solve_Succeeded) {
155 AERROR <<
"*** Distance Approach problem error during initialization!";
156 return false;
157 }
158
159 status = app->OptimizeTNLP(problem);
160
161 if (status == Ipopt::Solve_Succeeded ||
162 status == Ipopt::Solved_To_Acceptable_Level) {
163
164 Ipopt::Index iter_count = app->Statistics()->IterationCount();
165 ADEBUG <<
"*** The problem solved in " << iter_count <<
" iterations!";
166
167 Ipopt::Number final_obj = app->Statistics()->FinalObjective();
168 ADEBUG <<
"*** The final value of the objective function is " << final_obj
169 << '.';
170
172 } else {
173
174
175
176
177
178 std::unordered_map<int, std::string> failure_status = {
179 {0, "Solve_Succeeded"},
180 {1, "Solved_To_Acceptable_Level"},
181 {2, "Infeasible_Problem_Detected"},
182 {3, "Search_Direction_Becomes_Too_Small"},
183 {4, "Diverging_Iterates"},
184 {5, "User_Requested_Stop"},
185 {6, "Feasible_Point_Found"},
186 {-1, "Maximum_Iterations_Exceeded"},
187 {-2, "Restoration_Failed"},
188 {-3, "Error_In_Step_Computation"},
189 {-10, "Not_Enough_Degrees_Of_Freedom"},
190 {-11, "Invalid_Problem_Definition"},
191 {-12, "Invalid_Option"},
192 {-13, "Invalid_Number_Detected"},
193 {-100, "Unrecoverable_Exception"},
194 {-101, "NonIpopt_Exception_Thrown"},
195 {-102, "Insufficient_Memory"},
196 {-199, "Internal_Error"}};
197
198 if (!failure_status.count(static_cast<size_t>(status))) {
199 AINFO <<
"Solver ends with unknown failure code: "
200 << static_cast<int>(status);
201 } else {
202 AINFO <<
"Solver failure case: "
203 << failure_status[static_cast<size_t>(status)];
204 }
205 }
206
207 ptop->get_optimization_results(state_result, control_result, time_result,
208 dual_l_result, dual_n_result);
209
210 return status == Ipopt::Solve_Succeeded ||
211 status == Ipopt::Solved_To_Acceptable_Level;
212}
@ DISTANCE_APPROACH_IPOPT_CUDA
@ DISTANCE_APPROACH_IPOPT_RELAX_END
@ DISTANCE_APPROACH_IPOPT_FIXED_DUAL
@ DISTANCE_APPROACH_IPOPT_FIXED_TS
@ DISTANCE_APPROACH_IPOPT_RELAX_END_SLACK
@ DISTANCE_APPROACH_IPOPT
#define PERF_BLOCK_START()
optional DistanceApproachMode distance_approach_mode
optional IpoptConfig ipopt_config
optional int32 ipopt_max_iter
optional string ipopt_alpha_for_y
optional double ipopt_jacobian_regularization_value
optional string ipopt_recalc_y
optional double ipopt_acceptable_constr_viol_tol
optional string ipopt_print_timing_statistics
optional int32 ipopt_print_level
optional int32 mumps_mem_percent
optional double ipopt_tol
optional double mumps_pivtol
optional double ipopt_min_hessian_perturbation
optional double ipopt_mu_init
optional DistanceApproachConfig distance_approach_config