Apollo  6.0
Open source self driving car software
dual_variable_warm_start_ipopt_qp_interface.h
Go to the documentation of this file.
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 
29 #include <coin/IpTNLP.hpp>
30 #include <coin/IpTypes.hpp>
31 
32 #include "Eigen/Dense"
33 
34 #include "modules/common/configs/proto/vehicle_config.pb.h"
36 #include "modules/planning/proto/planner_open_space_config.pb.h"
37 
38 // #define tag_f 1
39 // #define tag_g 2
40 #define tag_L 3
41 // #define HPOFF
42 
43 namespace apollo {
44 namespace planning {
45 
46 class 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 
55  virtual ~DualVariableWarmStartIPOPTQPInterface() = default;
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 
175 } // namespace planning
176 } // namespace apollo
bool eval_g(int n, const double *x, bool new_x, int m, double *g) override
bool eval_f(int n, const double *x, bool new_x, double &obj_value) override
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 PlannerOpenSpaceConfig &planner_open_space_config)
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
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
Planning module main class. It processes GPS and IMU as input, to generate planning info...
Definition: dual_variable_warm_start_ipopt_qp_interface.h:46
bool eval_jac_g(int n, const double *x, bool new_x, int m, int nele_jac, int *iRow, int *jCol, double *values) override
void get_optimization_results(Eigen::MatrixXd *l_warm_up, Eigen::MatrixXd *n_warm_up) const
bool eval_grad_f(int n, const double *x, bool new_x, double *grad_f) override
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
void generate_tapes(int n, int m, int *nnz_h_lag)
bool get_nlp_info(int &n, int &m, int &nnz_jac_g, int &nnz_h_lag, IndexStyleEnum &index_style) override
bool get_bounds_info(int n, double *x_l, double *x_u, int m, double *g_l, double *g_u) override
bool eval_obj(int n, const T *x, T *obj_value)
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
bool eval_constraints(int n, const T *x, int m, T *g)
void check_solution(const Eigen::MatrixXd &l_warm_up, const Eigen::MatrixXd &n_warm_up)