Apollo 10.0
自动驾驶开放平台
dual_variable_warm_start_ipopt_qp_interface.h
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2018 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
16
17/*
18 * @file
19 */
20
21#pragma once
22
23#include <limits>
24#include <vector>
25
26#include <adolc/adolc.h>
27#include <adolc/adolc_sparse.h>
28#include <coin/IpTNLP.hpp>
29#include <coin/IpTypes.hpp>
30
31#include "Eigen/Dense"
32
33#include "modules/common_msgs/config_msgs/vehicle_config.pb.h"
34#include "modules/planning/planning_open_space/proto/planner_open_space_config.pb.h"
35
37
38// #define tag_f 1
39// #define tag_g 2
40#define tag_L 3
41// #define HPOFF
42
43namespace apollo {
44namespace planning {
45
46class DualVariableWarmStartIPOPTQPInterface : public Ipopt::TNLP {
47 public:
49 size_t horizon, double ts, const Eigen::MatrixXd& ego,
50 const Eigen::MatrixXi& obstacles_edges_num, const size_t obstacles_num,
51 const Eigen::MatrixXd& obstacles_A, const Eigen::MatrixXd& obstacles_b,
52 const Eigen::MatrixXd& xWS,
53 const PlannerOpenSpaceConfig& planner_open_space_config);
54
56
57 void get_optimization_results(Eigen::MatrixXd* l_warm_up,
58 Eigen::MatrixXd* n_warm_up) const;
59
60 void check_solution(const Eigen::MatrixXd& l_warm_up,
61 const Eigen::MatrixXd& n_warm_up);
62
64 bool get_nlp_info(int& n, int& m, int& nnz_jac_g, int& nnz_h_lag,
65 IndexStyleEnum& index_style) override;
66
68 bool get_bounds_info(int n, double* x_l, double* x_u, int m, double* g_l,
69 double* g_u) override;
70
72 bool get_starting_point(int n, bool init_x, double* x, bool init_z,
73 double* z_L, double* z_U, int m, bool init_lambda,
74 double* lambda) override;
75
77 bool eval_f(int n, const double* x, bool new_x, double& obj_value) override;
78
80 bool eval_grad_f(int n, const double* x, bool new_x, double* grad_f) override;
81
83 bool eval_g(int n, const double* x, bool new_x, int m, double* g) override;
84
89 bool eval_jac_g(int n, const double* x, bool new_x, int m, int nele_jac,
90 int* iRow, int* jCol, double* values) override;
91
97 bool eval_h(int n, const double* x, bool new_x, double obj_factor, int m,
98 const double* lambda, bool new_lambda, int nele_hess, int* iRow,
99 int* jCol, double* values) override;
100
104 void finalize_solution(Ipopt::SolverReturn status, int n, const double* x,
105 const double* z_L, const double* z_U, int m,
106 const double* g, const double* lambda,
107 double obj_value, const Ipopt::IpoptData* ip_data,
108 Ipopt::IpoptCalculatedQuantities* ip_cq) override;
109
110 //*************** start ADOL-C part ***********************************
112 template <class T>
113 bool eval_obj(int n, const T* x, T* obj_value);
114
116 template <class T>
117 bool eval_constraints(int n, const T* x, int m, T* g);
118
120 void generate_tapes(int n, int m, int* nnz_h_lag);
121 //*************** end ADOL-C part ***********************************
122
123 private:
124 int num_of_variables_;
125 int num_of_constraints_;
126 int horizon_;
127 double ts_;
128 Eigen::MatrixXd ego_;
129 int lambda_horizon_ = 0;
130 int miu_horizon_ = 0;
131 int dual_formulation_horizon_ = 0;
132
133 Eigen::MatrixXd l_warm_up_;
134 Eigen::MatrixXd n_warm_up_;
135 double wheelbase_;
136
137 double w_ev_;
138 double l_ev_;
139 std::vector<double> g_;
140 double offset_;
141 Eigen::MatrixXi obstacles_edges_num_;
142 int obstacles_num_;
143 int obstacles_edges_sum_;
144
145 // lagrangian l start index
146 int l_start_index_ = 0;
147
148 // lagrangian n start index
149 int n_start_index_ = 0;
150
151 // lagrangian d start index
152 int d_start_index_ = 0;
153
154 // obstacles_A
155 Eigen::MatrixXd obstacles_A_;
156
157 // obstacles_b
158 Eigen::MatrixXd obstacles_b_;
159
160 // states of warm up stage
161 Eigen::MatrixXd xWS_;
162
163 double min_safety_distance_;
164
165 //*************** start ADOL-C part ***********************************
166 double* obj_lam;
167 unsigned int* rind_L; /* row indices */
168 unsigned int* cind_L; /* column indices */
169 double* hessval; /* values */
170 int nnz_L;
171 int options_L[4];
172 //*************** end ADOL-C part ***********************************
173
174// park generic
175 public:
177 size_t horizon, double ts, const Eigen::MatrixXd& ego,
178 const Eigen::MatrixXi& obstacles_edges_num, const size_t obstacles_num,
179 const Eigen::MatrixXd& obstacles_A, const Eigen::MatrixXd& obstacles_b,
180 const Eigen::MatrixXd& xWS,
181 const DualVariableWarmStartConfig& dual_variable_warm_start_config);
182};
183
184} // namespace planning
185} // namespace apollo
bool eval_h(int n, const double *x, bool new_x, double obj_factor, int m, const double *lambda, bool new_lambda, int nele_hess, int *iRow, int *jCol, double *values) override
Method to return: 1) The structure of the hessian of the lagrangian (if "values" is nullptr) 2) The v...
void generate_tapes(int n, int m, int *nnz_h_lag)
Method to generate the required tapes
bool eval_g(int n, const double *x, bool new_x, int m, double *g) override
Method to return the constraint residuals
bool get_bounds_info(int n, double *x_l, double *x_u, int m, double *g_l, double *g_u) override
Method to return the bounds for my problem
DualVariableWarmStartIPOPTQPInterface(size_t horizon, double ts, const Eigen::MatrixXd &ego, const Eigen::MatrixXi &obstacles_edges_num, const size_t obstacles_num, const Eigen::MatrixXd &obstacles_A, const Eigen::MatrixXd &obstacles_b, const Eigen::MatrixXd &xWS, const DualVariableWarmStartConfig &dual_variable_warm_start_config)
bool eval_grad_f(int n, const double *x, bool new_x, double *grad_f) override
Method to return the gradient of the objective
void finalize_solution(Ipopt::SolverReturn status, int n, const double *x, const double *z_L, const double *z_U, int m, const double *g, const double *lambda, double obj_value, const Ipopt::IpoptData *ip_data, Ipopt::IpoptCalculatedQuantities *ip_cq) override
This method is called when the algorithm is complete so the TNLP can store/write the solution
bool eval_f(int n, const double *x, bool new_x, double &obj_value) override
Method to return the objective value
bool eval_constraints(int n, const T *x, int m, T *g)
Template to compute constraints
bool eval_jac_g(int n, const double *x, bool new_x, int m, int nele_jac, int *iRow, int *jCol, double *values) override
Method to return: 1) The structure of the jacobian (if "values" is nullptr) 2) The values of the jaco...
void get_optimization_results(Eigen::MatrixXd *l_warm_up, Eigen::MatrixXd *n_warm_up) const
bool get_nlp_info(int &n, int &m, int &nnz_jac_g, int &nnz_h_lag, IndexStyleEnum &index_style) override
Method to return some info about the nlp
void check_solution(const Eigen::MatrixXd &l_warm_up, const Eigen::MatrixXd &n_warm_up)
bool get_starting_point(int n, bool init_x, double *x, bool init_z, double *z_L, double *z_U, int m, bool init_lambda, double *lambda) override
Method to return the starting point for the algorithm
bool eval_obj(int n, const T *x, T *obj_value)
Template to return the objective value
Planning module main class.
class register implement
Definition arena_queue.h:37