parent
							
								
									edae2218d7
								
							
						
					
					
						commit
						17f066e2fe
					
				
				 53 changed files with 7368 additions and 9 deletions
			
			
		| @ -1,4 +1,4 @@ | |||||||
| acados/ | acados_repo/ | ||||||
| !x86_64/ | !x86_64/ | ||||||
| !larch64/ | !larch64/ | ||||||
| !aarch64/ | !aarch64/ | ||||||
|  | |||||||
| @ -0,0 +1,150 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_DENSE_QP_DENSE_QP_COMMON_H_ | ||||||
|  | #define ACADOS_DENSE_QP_DENSE_QP_COMMON_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // hpipm
 | ||||||
|  | #include "hpipm/include/hpipm_d_dense_qp.h" | ||||||
|  | #include "hpipm/include/hpipm_d_dense_qp_res.h" | ||||||
|  | #include "hpipm/include/hpipm_d_dense_qp_sol.h" | ||||||
|  | // acados
 | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | typedef struct d_dense_qp_dim dense_qp_dims; | ||||||
|  | typedef struct d_dense_qp dense_qp_in; | ||||||
|  | typedef struct d_dense_qp_sol dense_qp_out; | ||||||
|  | typedef struct d_dense_qp_res dense_qp_res; | ||||||
|  | typedef struct d_dense_qp_res_ws dense_qp_res_ws; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef QP_SOLVER_CONFIG_ | ||||||
|  | #define QP_SOLVER_CONFIG_ | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     void (*dims_set)(void *config_, void *dims_, const char *field, const int* value); | ||||||
|  |     acados_size_t (*opts_calculate_size)(void *config, void *dims); | ||||||
|  |     void *(*opts_assign)(void *config, void *dims, void *raw_memory); | ||||||
|  |     void (*opts_initialize_default)(void *config, void *dims, void *args); | ||||||
|  |     void (*opts_update)(void *config, void *dims, void *args); | ||||||
|  |     void (*opts_set)(void *config_, void *opts_, const char *field, void* value); | ||||||
|  |     acados_size_t (*memory_calculate_size)(void *config, void *dims, void *args); | ||||||
|  |     void *(*memory_assign)(void *config, void *dims, void *args, void *raw_memory); | ||||||
|  |     void (*memory_get)(void *config_, void *mem_, const char *field, void* value); | ||||||
|  |     acados_size_t (*workspace_calculate_size)(void *config, void *dims, void *args); | ||||||
|  |     int (*evaluate)(void *config, void *qp_in, void *qp_out, void *args, void *mem, void *work); | ||||||
|  |     void (*eval_sens)(void *config, void *qp_in, void *qp_out, void *opts, void *mem, void *work); | ||||||
|  | } qp_solver_config; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef QP_INFO_ | ||||||
|  | #define QP_INFO_ | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     double solve_QP_time; | ||||||
|  |     double condensing_time; | ||||||
|  |     double interface_time; | ||||||
|  |     double total_time; | ||||||
|  |     int num_iter; | ||||||
|  |     int t_computed; | ||||||
|  | } qp_info; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* config */ | ||||||
|  | //
 | ||||||
|  | acados_size_t dense_qp_solver_config_calculate_size(); | ||||||
|  | //
 | ||||||
|  | qp_solver_config *dense_qp_solver_config_assign(void *raw_memory); | ||||||
|  | 
 | ||||||
|  | /* dims */ | ||||||
|  | //
 | ||||||
|  | acados_size_t dense_qp_dims_calculate_size(); | ||||||
|  | //
 | ||||||
|  | dense_qp_dims *dense_qp_dims_assign(void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void dense_qp_dims_set(void *config_, void *dims_, const char *field, const int* value); | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | /* in */ | ||||||
|  | //
 | ||||||
|  | acados_size_t dense_qp_in_calculate_size(dense_qp_dims *dims); | ||||||
|  | //
 | ||||||
|  | dense_qp_in *dense_qp_in_assign(dense_qp_dims *dims, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | /* out */ | ||||||
|  | //
 | ||||||
|  | acados_size_t dense_qp_out_calculate_size(dense_qp_dims *dims); | ||||||
|  | //
 | ||||||
|  | dense_qp_out *dense_qp_out_assign(dense_qp_dims *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void dense_qp_out_get(dense_qp_out *out, const char *field, void *value); | ||||||
|  | 
 | ||||||
|  | /* res */ | ||||||
|  | //
 | ||||||
|  | acados_size_t dense_qp_res_calculate_size(dense_qp_dims *dims); | ||||||
|  | //
 | ||||||
|  | dense_qp_res *dense_qp_res_assign(dense_qp_dims *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | acados_size_t dense_qp_res_workspace_calculate_size(dense_qp_dims *dims); | ||||||
|  | //
 | ||||||
|  | dense_qp_res_ws *dense_qp_res_workspace_assign(dense_qp_dims *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void dense_qp_compute_t(dense_qp_in *qp_in, dense_qp_out *qp_out); | ||||||
|  | //
 | ||||||
|  | void dense_qp_res_compute(dense_qp_in *qp_in, dense_qp_out *qp_out, dense_qp_res *qp_res, dense_qp_res_ws *res_ws); | ||||||
|  | //
 | ||||||
|  | void dense_qp_res_compute_nrm_inf(dense_qp_res *qp_res, double res[4]); | ||||||
|  | 
 | ||||||
|  | /* misc */ | ||||||
|  | //
 | ||||||
|  | void dense_qp_stack_slacks_dims(dense_qp_dims *in, dense_qp_dims *out); | ||||||
|  | //
 | ||||||
|  | void dense_qp_stack_slacks(dense_qp_in *in, dense_qp_in *out); | ||||||
|  | //
 | ||||||
|  | void dense_qp_unstack_slacks(dense_qp_out *in, dense_qp_in *qp_out, dense_qp_out *out); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_DENSE_QP_DENSE_QP_COMMON_H_
 | ||||||
| @ -0,0 +1,94 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_DENSE_QP_DENSE_QP_HPIPM_H_ | ||||||
|  | #define ACADOS_DENSE_QP_DENSE_QP_HPIPM_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // hpipm
 | ||||||
|  | #include "hpipm/include/hpipm_d_dense_qp.h" | ||||||
|  | #include "hpipm/include/hpipm_d_dense_qp_ipm.h" | ||||||
|  | #include "hpipm/include/hpipm_d_dense_qp_sol.h" | ||||||
|  | // acados
 | ||||||
|  | #include "acados/dense_qp/dense_qp_common.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct dense_qp_hpipm_opts_ | ||||||
|  | { | ||||||
|  |     struct d_dense_qp_ipm_arg *hpipm_opts; | ||||||
|  | } dense_qp_hpipm_opts; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct dense_qp_hpipm_memory_ | ||||||
|  | { | ||||||
|  |     struct d_dense_qp_ipm_ws *hpipm_workspace; | ||||||
|  |     double time_qp_solver_call; | ||||||
|  |     int iter; | ||||||
|  | 
 | ||||||
|  | } dense_qp_hpipm_memory; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t dense_qp_hpipm_opts_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | void *dense_qp_hpipm_opts_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void dense_qp_hpipm_opts_initialize_default(void *config, void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void dense_qp_hpipm_opts_update(void *config, void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | acados_size_t dense_qp_hpipm_calculate_memory_size(void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void *dense_qp_hpipm_assign_memory(void *dims, void *opts_, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | acados_size_t dense_qp_hpipm_calculate_workspace_size(void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | int dense_qp_hpipm(void *config, void *qp_in, void *qp_out, void *opts_, void *mem_, void *work_); | ||||||
|  | //
 | ||||||
|  | void dense_qp_hpipm_eval_sens(void *config_, void *qp_in, void *qp_out, void *opts_, void *mem_, void *work_); | ||||||
|  | //
 | ||||||
|  | void dense_qp_hpipm_config_initialize_default(void *config_); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_DENSE_QP_DENSE_QP_HPIPM_H_
 | ||||||
| @ -0,0 +1,128 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_DENSE_QP_DENSE_QP_OOQP_H_ | ||||||
|  | #define ACADOS_DENSE_QP_DENSE_QP_OOQP_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include "acados/dense_qp/dense_qp_common.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | enum dense_qp_ooqp_termination_code | ||||||
|  | { | ||||||
|  |   DENSE_SUCCESSFUL_TERMINATION = 0, | ||||||
|  |   DENSE_NOT_FINISHED, | ||||||
|  |   DENSE_MAX_ITS_EXCEEDED, | ||||||
|  |   DENSE_INFEASIBLE, | ||||||
|  |   DENSE_UNKNOWN | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | typedef struct dense_qp_ooqp_opts_ | ||||||
|  | { | ||||||
|  |     int printLevel; | ||||||
|  |     int useDiagonalWeights;  // TODO(dimitris): implement option
 | ||||||
|  |     int fixHessian; | ||||||
|  |     int fixDynamics; | ||||||
|  |     int fixInequalities; | ||||||
|  | } dense_qp_ooqp_opts; | ||||||
|  | 
 | ||||||
|  | typedef struct dense_qp_ooqp_workspace_ | ||||||
|  | { | ||||||
|  |     double *x; | ||||||
|  |     double *gamma; | ||||||
|  |     double *phi; | ||||||
|  |     double *y; | ||||||
|  |     double *z; | ||||||
|  |     double *lambda; | ||||||
|  |     double *pi; | ||||||
|  |     double objectiveValue; | ||||||
|  | } dense_qp_ooqp_workspace; | ||||||
|  | 
 | ||||||
|  | typedef struct dense_qp_ooqp_memory_ | ||||||
|  | { | ||||||
|  |     int firstRun; | ||||||
|  |     int nx; | ||||||
|  |     int my; | ||||||
|  |     int mz; | ||||||
|  |     double *c; | ||||||
|  |     double *dQ; | ||||||
|  |     double *xlow; | ||||||
|  |     char *ixlow; | ||||||
|  |     double *xupp; | ||||||
|  |     char *ixupp; | ||||||
|  |     double *dA; | ||||||
|  |     double *bA; | ||||||
|  |     double *dC; | ||||||
|  |     double *clow; | ||||||
|  |     char *iclow; | ||||||
|  |     double *cupp; | ||||||
|  |     char *icupp; | ||||||
|  |     double time_qp_solver_call; | ||||||
|  |     int iter; | ||||||
|  | 
 | ||||||
|  | } dense_qp_ooqp_memory; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t dense_qp_ooqp_opts_calculate_size(void *config_, dense_qp_dims *dims); | ||||||
|  | //
 | ||||||
|  | void *dense_qp_ooqp_opts_assign(void *config_, dense_qp_dims *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void dense_qp_ooqp_opts_initialize_default(void *config_, dense_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void dense_qp_ooqp_opts_update(void *config_, dense_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | acados_size_t dense_qp_ooqp_memory_calculate_size(void *config_, dense_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void *dense_qp_ooqp_memory_assign(void *config_, dense_qp_dims *dims, void *opts_, | ||||||
|  |                                   void *raw_memory); | ||||||
|  | //
 | ||||||
|  | acados_size_t dense_qp_ooqp_workspace_calculate_size(void *config_, dense_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | int dense_qp_ooqp(void *config_, dense_qp_in *qp_in, dense_qp_out *qp_out, void *opts_, | ||||||
|  |                   void *memory_, void *work_); | ||||||
|  | //
 | ||||||
|  | void dense_qp_ooqp_destroy(void *mem_, void *work); | ||||||
|  | //
 | ||||||
|  | void dense_qp_ooqp_eval_sens(void *config_, void *qp_in, void *qp_out, void *opts_, void *mem_, void *work_); | ||||||
|  | //
 | ||||||
|  | void dense_qp_ooqp_config_initialize_default(void *config_); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_DENSE_QP_DENSE_QP_OOQP_H_
 | ||||||
| @ -0,0 +1,127 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_DENSE_QP_DENSE_QP_QORE_H_ | ||||||
|  | #define ACADOS_DENSE_QP_DENSE_QP_QORE_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // qore
 | ||||||
|  | #include "qore/QPSOLVER_DENSE/include/qpsolver_dense.h" | ||||||
|  | // acados
 | ||||||
|  | #include "acados/dense_qp/dense_qp_common.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | typedef struct dense_qp_qore_opts_ | ||||||
|  | { | ||||||
|  |     int nsmax;       // maximum size of Schur complement
 | ||||||
|  |     int print_freq;  // print frequency,
 | ||||||
|  |                      // prtfreq  < 0: disable printing;
 | ||||||
|  |                      // prtfreq == 0: print on each call and include working set changes;
 | ||||||
|  |                      // prtfreq  > 0: print on every prtfreq seconds, but do not include working set
 | ||||||
|  |                      // changes;
 | ||||||
|  |     int warm_start;  // warm start with updated matrices H and C
 | ||||||
|  |     int warm_strategy;  // 0: ramp-up from zero homotopy; 1: setup homotopy from the previous
 | ||||||
|  |                         // solution
 | ||||||
|  |     int hot_start;      // hot start with unchanged matrices H and C
 | ||||||
|  |     int max_iter;       // maximum number of iterations
 | ||||||
|  |     int compute_t;      // compute t in qp_out (to have correct residuals in NLP)
 | ||||||
|  | } dense_qp_qore_opts; | ||||||
|  | 
 | ||||||
|  | typedef struct dense_qp_qore_memory_ | ||||||
|  | { | ||||||
|  |     double *H; | ||||||
|  |     double *HH; | ||||||
|  |     double *g; | ||||||
|  |     double *gg; | ||||||
|  |     double *Zl; | ||||||
|  |     double *Zu; | ||||||
|  |     double *zl; | ||||||
|  |     double *zu; | ||||||
|  |     double *A; | ||||||
|  |     double *b; | ||||||
|  |     double *C; | ||||||
|  |     double *CC; | ||||||
|  |     double *Ct; | ||||||
|  |     double *CCt; | ||||||
|  |     double *d_lb0; | ||||||
|  |     double *d_ub0; | ||||||
|  |     double *d_lb; | ||||||
|  |     double *d_ub; | ||||||
|  |     double *d_lg; | ||||||
|  |     double *d_ug; | ||||||
|  |     double *d_ls; | ||||||
|  |     double *d_us; | ||||||
|  |     double *lb; | ||||||
|  |     double *ub; | ||||||
|  |     int *idxb; | ||||||
|  |     int *idxb_stacked; | ||||||
|  |     int *idxs; | ||||||
|  |     double *prim_sol; | ||||||
|  |     double *dual_sol; | ||||||
|  |     QoreProblemDense *QP; | ||||||
|  |     int num_iter; | ||||||
|  |     dense_qp_in *qp_stacked; | ||||||
|  |     double time_qp_solver_call; | ||||||
|  |     int iter; | ||||||
|  | 
 | ||||||
|  | } dense_qp_qore_memory; | ||||||
|  | 
 | ||||||
|  | acados_size_t dense_qp_qore_opts_calculate_size(void *config, dense_qp_dims *dims); | ||||||
|  | //
 | ||||||
|  | void *dense_qp_qore_opts_assign(void *config, dense_qp_dims *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void dense_qp_qore_opts_initialize_default(void *config, dense_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void dense_qp_qore_opts_update(void *config, dense_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | acados_size_t dense_qp_qore_memory_calculate_size(void *config, dense_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void *dense_qp_qore_memory_assign(void *config, dense_qp_dims *dims, void *opts_, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | acados_size_t dense_qp_qore_workspace_calculate_size(void *config, dense_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | int dense_qp_qore(void *config, dense_qp_in *qp_in, dense_qp_out *qp_out, void *opts_, void *memory_, void *work_); | ||||||
|  | //
 | ||||||
|  | void dense_qp_qore_eval_sens(void *config_, void *qp_in, void *qp_out, void *opts_, void *mem_, void *work_); | ||||||
|  | //
 | ||||||
|  | void dense_qp_qore_config_initialize_default(void *config); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_DENSE_QP_DENSE_QP_QORE_H_
 | ||||||
| @ -0,0 +1,127 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_DENSE_QP_DENSE_QP_QPOASES_H_ | ||||||
|  | #define ACADOS_DENSE_QP_DENSE_QP_QPOASES_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // blasfeo
 | ||||||
|  | #include "blasfeo/include/blasfeo_common.h" | ||||||
|  | 
 | ||||||
|  | // acados
 | ||||||
|  | #include "acados/dense_qp/dense_qp_common.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | typedef struct dense_qp_qpoases_opts_ | ||||||
|  | { | ||||||
|  |     double max_cputime;  // maximum cpu time in seconds
 | ||||||
|  |     int max_nwsr;        // maximum number of working set recalculations
 | ||||||
|  |     int warm_start;      // warm start with dual_sol in memory
 | ||||||
|  |     int use_precomputed_cholesky; | ||||||
|  |     int hotstart;  // this option requires constant data matrices! (eg linear MPC, inexact schemes
 | ||||||
|  |                    // with frozen sensitivities)
 | ||||||
|  |     int set_acado_opts;  // use same options as in acado code generation
 | ||||||
|  |     int compute_t;       // compute t in qp_out (to have correct residuals in NLP)
 | ||||||
|  |     double tolerance;  // terminationTolerance
 | ||||||
|  | } dense_qp_qpoases_opts; | ||||||
|  | 
 | ||||||
|  | typedef struct dense_qp_qpoases_memory_ | ||||||
|  | { | ||||||
|  |     double *H; | ||||||
|  |     double *HH; | ||||||
|  |     double *R; | ||||||
|  |     double *g; | ||||||
|  |     double *gg; | ||||||
|  |     double *Zl; | ||||||
|  |     double *Zu; | ||||||
|  |     double *zl; | ||||||
|  |     double *zu; | ||||||
|  |     double *A; | ||||||
|  |     double *b; | ||||||
|  |     double *d_lb0; | ||||||
|  |     double *d_ub0; | ||||||
|  |     double *d_lb; | ||||||
|  |     double *d_ub; | ||||||
|  |     double *C; | ||||||
|  |     double *CC; | ||||||
|  |     double *d_lg0; | ||||||
|  |     double *d_ug0; | ||||||
|  |     double *d_lg; | ||||||
|  |     double *d_ug; | ||||||
|  |     double *d_ls; | ||||||
|  |     double *d_us; | ||||||
|  |     int *idxb; | ||||||
|  |     int *idxb_stacked; | ||||||
|  |     int *idxs; | ||||||
|  |     double *prim_sol; | ||||||
|  |     double *dual_sol; | ||||||
|  |     void *QPB;       // NOTE(giaf): cast to QProblemB to use
 | ||||||
|  |     void *QP;        // NOTE(giaf): cast to QProblem to use
 | ||||||
|  |     double cputime;  // cputime of qpoases
 | ||||||
|  |     int nwsr;        // performed number of working set recalculations
 | ||||||
|  |     int first_it;    // to be used with hotstart
 | ||||||
|  |     dense_qp_in *qp_stacked; | ||||||
|  |     double time_qp_solver_call; // equal to cputime
 | ||||||
|  |     int iter; | ||||||
|  | 
 | ||||||
|  | } dense_qp_qpoases_memory; | ||||||
|  | 
 | ||||||
|  | acados_size_t dense_qp_qpoases_opts_calculate_size(void *config, dense_qp_dims *dims); | ||||||
|  | //
 | ||||||
|  | void *dense_qp_qpoases_opts_assign(void *config, dense_qp_dims *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void dense_qp_qpoases_opts_initialize_default(void *config, dense_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void dense_qp_qpoases_opts_update(void *config, dense_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | acados_size_t dense_qp_qpoases__memorycalculate_size(void *config, dense_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void *dense_qp_qpoases_memory_assign(void *config, dense_qp_dims *dims, void *opts_, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | acados_size_t dense_qp_qpoases_workspace_calculate_size(void *config, dense_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | int dense_qp_qpoases(void *config, dense_qp_in *qp_in, dense_qp_out *qp_out, void *opts_, void *memory_, void *work_); | ||||||
|  | //
 | ||||||
|  | void dense_qp_qpoases_eval_sens(void *config_, void *qp_in, void *qp_out, void *opts_, void *mem_, void *work_); | ||||||
|  | //
 | ||||||
|  | void dense_qp_qpoases_config_initialize_default(void *config_); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_DENSE_QP_DENSE_QP_QPOASES_H_
 | ||||||
| @ -0,0 +1,427 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// \defgroup ocp_nlp ocp_nlp
 | ||||||
|  | /// @{
 | ||||||
|  | /// @}
 | ||||||
|  | 
 | ||||||
|  | /// \defgroup ocp_nlp_solver ocp_nlp_solver
 | ||||||
|  | /// @{
 | ||||||
|  | /// @}
 | ||||||
|  | 
 | ||||||
|  | /// \ingroup ocp_nlp
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | /// \ingroup ocp_nlp_solver
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | /// \defgroup ocp_nlp_common ocp_nlp_common
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_NLP_OCP_NLP_COMMON_H_ | ||||||
|  | #define ACADOS_OCP_NLP_OCP_NLP_COMMON_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include "acados/ocp_nlp/ocp_nlp_constraints_common.h" | ||||||
|  | #include "acados/ocp_nlp/ocp_nlp_cost_common.h" | ||||||
|  | #include "acados/ocp_nlp/ocp_nlp_dynamics_common.h" | ||||||
|  | #include "acados/ocp_nlp/ocp_nlp_reg_common.h" | ||||||
|  | #include "acados/ocp_qp/ocp_qp_common.h" | ||||||
|  | #include "acados/ocp_qp/ocp_qp_xcond_solver.h" | ||||||
|  | #include "acados/sim/sim_common.h" | ||||||
|  | #include "acados/utils/external_function_generic.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * config | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct ocp_nlp_config | ||||||
|  | { | ||||||
|  |     int N;  // number of stages
 | ||||||
|  | 
 | ||||||
|  |     // solver-specific implementations of memory management functions
 | ||||||
|  |     acados_size_t (*opts_calculate_size)(void *config, void *dims); | ||||||
|  |     void *(*opts_assign)(void *config, void *dims, void *raw_memory); | ||||||
|  |     void (*opts_initialize_default)(void *config, void *dims, void *opts_); | ||||||
|  |     void (*opts_update)(void *config, void *dims, void *opts_); | ||||||
|  |     acados_size_t (*memory_calculate_size)(void *config, void *dims, void *opts_); | ||||||
|  |     void *(*memory_assign)(void *config, void *dims, void *opts_, void *raw_memory); | ||||||
|  |     acados_size_t (*workspace_calculate_size)(void *config, void *dims, void *opts_); | ||||||
|  |     void (*opts_set)(void *config_, void *opts_, const char *field, void* value); | ||||||
|  |     void (*opts_set_at_stage)(void *config_, void *opts_, size_t stage, const char *field, void* value); | ||||||
|  |     // evaluate solver // TODO rename into solve
 | ||||||
|  |     int (*evaluate)(void *config, void *dims, void *nlp_in, void *nlp_out, void *opts_, void *mem, void *work); | ||||||
|  |     void (*eval_param_sens)(void *config, void *dims, void *opts_, void *mem, void *work, | ||||||
|  |                             char *field, int stage, int index, void *sens_nlp_out); | ||||||
|  |     // prepare memory
 | ||||||
|  |     int (*precompute)(void *config, void *dims, void *nlp_in, void *nlp_out, void *opts_, void *mem, void *work); | ||||||
|  |     // initalize this struct with default values
 | ||||||
|  |     void (*config_initialize_default)(void *config); | ||||||
|  |     // general getter
 | ||||||
|  |     void (*get)(void *config_, void *dims, void *mem_, const char *field, void *return_value_); | ||||||
|  |     void (*opts_get)(void *config_, void *dims, void *opts_, const char *field, void *return_value_); | ||||||
|  |     void (*work_get)(void *config_, void *dims, void *work_, const char *field, void *return_value_); | ||||||
|  |     // config structs of submodules
 | ||||||
|  |     ocp_qp_xcond_solver_config *qp_solver; // TODO rename xcond_solver
 | ||||||
|  |     ocp_nlp_dynamics_config **dynamics; | ||||||
|  |     ocp_nlp_cost_config **cost; | ||||||
|  |     ocp_nlp_constraints_config **constraints; | ||||||
|  |     ocp_nlp_reg_config *regularize; | ||||||
|  | 
 | ||||||
|  | } ocp_nlp_config; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_config_calculate_size(int N); | ||||||
|  | //
 | ||||||
|  | ocp_nlp_config *ocp_nlp_config_assign(int N, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * dims | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | /// Structure to store dimensions/number of variables.
 | ||||||
|  | typedef struct ocp_nlp_dims | ||||||
|  | { | ||||||
|  |     void **cost; | ||||||
|  |     void **dynamics; | ||||||
|  |     void **constraints; | ||||||
|  |     ocp_qp_xcond_solver_dims *qp_solver;  // xcond solver instead ??
 | ||||||
|  |     ocp_nlp_reg_dims *regularize; | ||||||
|  | 
 | ||||||
|  |     int *nv;  // number of primal variables (states+controls+slacks)
 | ||||||
|  |     int *nx;  // number of differential states
 | ||||||
|  |     int *nu;  // number of inputs
 | ||||||
|  |     int *ni;  // number of two-sided inequality constraints: nb+ng+nh+ns
 | ||||||
|  |     int *nz;  // number of algebraic variables
 | ||||||
|  |     int *ns;  // number of slack variables
 | ||||||
|  |     int N;    // number of shooting nodes
 | ||||||
|  | } ocp_nlp_dims; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_dims_calculate_size(void *config); | ||||||
|  | //
 | ||||||
|  | ocp_nlp_dims *ocp_nlp_dims_assign(void *config, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | /// Sets the dimension of optimization variables
 | ||||||
|  | /// (states, constrols, algebraic variables, slack variables).
 | ||||||
|  | ///
 | ||||||
|  | /// \param config_ The configuration struct.
 | ||||||
|  | /// \param dims_ The dimension struct.
 | ||||||
|  | /// \param field The type of optimization variables, either nx, nu, nz, or ns.
 | ||||||
|  | /// \param value_array Number of variables for each stage.
 | ||||||
|  | void ocp_nlp_dims_set_opt_vars(void *config_, void *dims_, | ||||||
|  |                                const char *field, const void* value_array); | ||||||
|  | 
 | ||||||
|  | /// Sets the dimensions of constraints functions for a stage
 | ||||||
|  | /// (bounds on states, bounds on controls, equality constraints,
 | ||||||
|  | /// inequality constraints).
 | ||||||
|  | ///
 | ||||||
|  | /// \param config_ The configuration struct.
 | ||||||
|  | /// \param dims_ The dimension struct.
 | ||||||
|  | /// \param stage Stage number.
 | ||||||
|  | /// \param field The type of constraint/bound, either nbx, nbu, ng, or nh.
 | ||||||
|  | /// \param value_field Number of constraints/bounds for the given stage.
 | ||||||
|  | void ocp_nlp_dims_set_constraints(void *config_, void *dims_, int stage, | ||||||
|  |                                   const char *field, const void* value_field); | ||||||
|  | 
 | ||||||
|  | /// Sets the dimensions of the cost terms for a stage.
 | ||||||
|  | ///
 | ||||||
|  | /// \param config_ The configuration struct.
 | ||||||
|  | /// \param dims_ The dimension struct.
 | ||||||
|  | /// \param stage Stage number.
 | ||||||
|  | /// \param field Type of cost term, can be eiter ny.
 | ||||||
|  | /// \param value_field Number of cost terms/residuals for the given stage.
 | ||||||
|  | void ocp_nlp_dims_set_cost(void *config_, void *dims_, int stage, const char *field, | ||||||
|  |                            const void* value_field); | ||||||
|  | 
 | ||||||
|  | /// Sets the dimensions of the dynamics for a stage.
 | ||||||
|  | ///
 | ||||||
|  | /// \param config_ The configuration struct.
 | ||||||
|  | /// \param dims_ The dimension struct.
 | ||||||
|  | /// \param stage Stage number.
 | ||||||
|  | /// \param field TBD
 | ||||||
|  | /// \param value TBD
 | ||||||
|  | void ocp_nlp_dims_set_dynamics(void *config_, void *dims_, int stage, const char *field, | ||||||
|  |                                const void* value); | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * Inputs | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | /// Struct for storing the inputs of an OCP NLP solver
 | ||||||
|  | typedef struct ocp_nlp_in | ||||||
|  | { | ||||||
|  |     /// Length of sampling intervals/timesteps.
 | ||||||
|  |     double *Ts; | ||||||
|  | 
 | ||||||
|  |     /// Pointers to cost functions (TBC).
 | ||||||
|  |     void **cost; | ||||||
|  | 
 | ||||||
|  |     /// Pointers to dynamics functions (TBC).
 | ||||||
|  |     void **dynamics; | ||||||
|  | 
 | ||||||
|  |     /// Pointers to constraints functions (TBC).
 | ||||||
|  |     void **constraints; | ||||||
|  | 
 | ||||||
|  | } ocp_nlp_in; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_in_calculate_size_self(int N); | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_in_calculate_size(ocp_nlp_config *config, ocp_nlp_dims *dims); | ||||||
|  | //
 | ||||||
|  | ocp_nlp_in *ocp_nlp_in_assign_self(int N, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | ocp_nlp_in *ocp_nlp_in_assign(ocp_nlp_config *config, ocp_nlp_dims *dims, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * out | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct ocp_nlp_out | ||||||
|  | { | ||||||
|  |     struct blasfeo_dvec *ux;  // NOTE: this contains [u; x; s_l; s_u]! - rename to uxs?
 | ||||||
|  |     struct blasfeo_dvec *z;  // algebraic vairables
 | ||||||
|  |     struct blasfeo_dvec *pi;  // multipliers for dynamics
 | ||||||
|  |     struct blasfeo_dvec *lam;  // inequality mulitpliers
 | ||||||
|  |     struct blasfeo_dvec *t;  // slack variables corresponding to evaluation of all inequalities (at the solution)
 | ||||||
|  | 
 | ||||||
|  |     // NOTE: the inequalities are internally organized in the following order:
 | ||||||
|  |     // [ lbu lbx lg lh lphi ubu ubx ug uh uphi; lsbu lsbx lsg lsh lsphi usbu usbx usg ush usphi]
 | ||||||
|  | 
 | ||||||
|  |     int sqp_iter; | ||||||
|  |     int qp_iter; | ||||||
|  |     double inf_norm_res; | ||||||
|  |     double total_time; | ||||||
|  | 
 | ||||||
|  | } ocp_nlp_out; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_out_calculate_size(ocp_nlp_config *config, ocp_nlp_dims *dims); | ||||||
|  | //
 | ||||||
|  | ocp_nlp_out *ocp_nlp_out_assign(ocp_nlp_config *config, ocp_nlp_dims *dims, | ||||||
|  |                                 void *raw_memory); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * options | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | /// Globalization types
 | ||||||
|  | typedef enum | ||||||
|  | { | ||||||
|  |     FIXED_STEP, | ||||||
|  |     MERIT_BACKTRACKING, | ||||||
|  | } ocp_nlp_globalization_t; | ||||||
|  | 
 | ||||||
|  | typedef struct ocp_nlp_opts | ||||||
|  | { | ||||||
|  |     ocp_qp_xcond_solver_opts *qp_solver_opts; // xcond solver opts instead ???
 | ||||||
|  |     void *regularize; | ||||||
|  |     void **dynamics;     // dynamics_opts
 | ||||||
|  |     void **cost;         // cost_opts
 | ||||||
|  |     void **constraints;  // constraints_opts
 | ||||||
|  |     double step_length;  // step length in case of FIXED_STEP
 | ||||||
|  |     double levenberg_marquardt;  // LM factor to be added to the hessian before regularization
 | ||||||
|  |     int reuse_workspace; | ||||||
|  |     int num_threads; | ||||||
|  | 
 | ||||||
|  |     // TODO: move to separate struct?
 | ||||||
|  |     ocp_nlp_globalization_t globalization; | ||||||
|  |     double alpha_min; | ||||||
|  |     double alpha_reduction; | ||||||
|  | } ocp_nlp_opts; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_opts_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_opts_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_opts_initialize_default(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_opts_update(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_opts_set(void *config_, void *opts_, const char *field, void* value); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_opts_set_at_stage(void *config, void *opts, int stage, const char *field, void *value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * residuals | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct ocp_nlp_res | ||||||
|  | { | ||||||
|  |     struct blasfeo_dvec *res_stat;  // stationarity
 | ||||||
|  |     struct blasfeo_dvec *res_eq;  // dynamics
 | ||||||
|  |     struct blasfeo_dvec *res_ineq;  // inequality constraints
 | ||||||
|  |     struct blasfeo_dvec *res_comp;  // complementarity
 | ||||||
|  |     double inf_norm_res_stat; | ||||||
|  |     double inf_norm_res_eq; | ||||||
|  |     double inf_norm_res_ineq; | ||||||
|  |     double inf_norm_res_comp; | ||||||
|  |     acados_size_t memsize; | ||||||
|  | } ocp_nlp_res; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_res_calculate_size(ocp_nlp_dims *dims); | ||||||
|  | //
 | ||||||
|  | ocp_nlp_res *ocp_nlp_res_assign(ocp_nlp_dims *dims, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * memory | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct ocp_nlp_memory | ||||||
|  | { | ||||||
|  | //    void *qp_solver_mem; // xcond solver mem instead ???
 | ||||||
|  |     ocp_qp_xcond_solver_memory *qp_solver_mem; // xcond solver mem instead ???
 | ||||||
|  |     void *regularize_mem; | ||||||
|  |     void **dynamics;     // dynamics memory
 | ||||||
|  |     void **cost;         // cost memory
 | ||||||
|  |     void **constraints;  // constraints memory
 | ||||||
|  | 
 | ||||||
|  |     // residuals
 | ||||||
|  |     ocp_nlp_res *nlp_res; | ||||||
|  | 
 | ||||||
|  |     // qp in & out
 | ||||||
|  |     ocp_qp_in *qp_in; | ||||||
|  |     ocp_qp_out *qp_out; | ||||||
|  |     // QP stuff not entering the qp_in struct
 | ||||||
|  |     struct blasfeo_dmat *dzduxt; // dzdux transposed
 | ||||||
|  |     struct blasfeo_dvec *z_alg; // z_alg, output algebraic variables
 | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dvec *cost_grad; | ||||||
|  |     struct blasfeo_dvec *ineq_fun; | ||||||
|  |     struct blasfeo_dvec *ineq_adj; | ||||||
|  |     struct blasfeo_dvec *dyn_fun; | ||||||
|  |     struct blasfeo_dvec *dyn_adj; | ||||||
|  | 
 | ||||||
|  |     double cost_value; | ||||||
|  | 
 | ||||||
|  |     bool *set_sim_guess; // indicate if there is new explicitly provided guess for integration variables
 | ||||||
|  |     struct blasfeo_dvec *sim_guess; | ||||||
|  | 
 | ||||||
|  | 	int *sqp_iter; // pointer to iteration number
 | ||||||
|  | 
 | ||||||
|  | } ocp_nlp_memory; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_memory_calculate_size(ocp_nlp_config *config, ocp_nlp_dims *dims, ocp_nlp_opts *opts); | ||||||
|  | //
 | ||||||
|  | ocp_nlp_memory *ocp_nlp_memory_assign(ocp_nlp_config *config, ocp_nlp_dims *dims, | ||||||
|  |                                       ocp_nlp_opts *opts, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * workspace | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct ocp_nlp_workspace | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     void *qp_work; | ||||||
|  |     void **dynamics;     // dynamics_workspace
 | ||||||
|  |     void **cost;         // cost_workspace
 | ||||||
|  |     void **constraints;  // constraints_workspace
 | ||||||
|  | 
 | ||||||
|  | 	ocp_nlp_out *tmp_nlp_out; | ||||||
|  | 	ocp_nlp_out *weight_merit_fun; | ||||||
|  | 
 | ||||||
|  | } ocp_nlp_workspace; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_workspace_calculate_size(ocp_nlp_config *config, ocp_nlp_dims *dims, ocp_nlp_opts *opts); | ||||||
|  | //
 | ||||||
|  | ocp_nlp_workspace *ocp_nlp_workspace_assign(ocp_nlp_config *config, ocp_nlp_dims *dims, | ||||||
|  |                                 ocp_nlp_opts *opts, ocp_nlp_memory *mem, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * function | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_initialize_qp(ocp_nlp_config *config, ocp_nlp_dims *dims, ocp_nlp_in *in, | ||||||
|  |             ocp_nlp_out *out, ocp_nlp_opts *opts, ocp_nlp_memory *mem, ocp_nlp_workspace *work); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_approximate_qp_matrices(ocp_nlp_config *config, ocp_nlp_dims *dims, ocp_nlp_in *in, | ||||||
|  |              ocp_nlp_out *out, ocp_nlp_opts *opts, ocp_nlp_memory *mem, ocp_nlp_workspace *work); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_approximate_qp_vectors_sqp(ocp_nlp_config *config, ocp_nlp_dims *dims, ocp_nlp_in *in, | ||||||
|  |                  ocp_nlp_out *out, ocp_nlp_opts *opts, ocp_nlp_memory *mem, ocp_nlp_workspace *work); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_embed_initial_value(ocp_nlp_config *config, ocp_nlp_dims *dims, ocp_nlp_in *in, | ||||||
|  |                  ocp_nlp_out *out, ocp_nlp_opts *opts, ocp_nlp_memory *mem, ocp_nlp_workspace *work); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_update_variables_sqp(ocp_nlp_config *config, ocp_nlp_dims *dims, ocp_nlp_in *in, | ||||||
|  |            ocp_nlp_out *out, ocp_nlp_opts *opts, ocp_nlp_memory *mem, ocp_nlp_workspace *work, double alpha); | ||||||
|  | //
 | ||||||
|  | double ocp_nlp_line_search(ocp_nlp_config *config, ocp_nlp_dims *dims, ocp_nlp_in *in, | ||||||
|  |             ocp_nlp_out *out, ocp_nlp_opts *opts, ocp_nlp_memory *mem, ocp_nlp_workspace *work); | ||||||
|  | //
 | ||||||
|  | double ocp_nlp_evaluate_merit_fun(ocp_nlp_config *config, ocp_nlp_dims *dims, ocp_nlp_in *in, | ||||||
|  |           ocp_nlp_out *out, ocp_nlp_opts *opts, ocp_nlp_memory *mem, ocp_nlp_workspace *work); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_initialize_t_slacks(ocp_nlp_config *config, ocp_nlp_dims *dims, ocp_nlp_in *in, | ||||||
|  |             ocp_nlp_out *out, ocp_nlp_opts *opts, ocp_nlp_memory *mem, ocp_nlp_workspace *work); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_res_compute(ocp_nlp_dims *dims, ocp_nlp_in *in, ocp_nlp_out *out, | ||||||
|  |                          ocp_nlp_res *res, ocp_nlp_memory *mem); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_compute(ocp_nlp_config *config, ocp_nlp_dims *dims, ocp_nlp_in *in, | ||||||
|  |             ocp_nlp_out *out, ocp_nlp_opts *opts, ocp_nlp_memory *mem, ocp_nlp_workspace *work); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_NLP_OCP_NLP_COMMON_H_
 | ||||||
|  | /// @}
 | ||||||
|  | /// @}
 | ||||||
|  | /// @}
 | ||||||
| @ -0,0 +1,241 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// \addtogroup ocp_nlp
 | ||||||
|  | /// @{
 | ||||||
|  | /// \addtogroup ocp_nlp_constraints
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_NLP_OCP_NLP_CONSTRAINTS_BGH_H_ | ||||||
|  | #define ACADOS_OCP_NLP_OCP_NLP_CONSTRAINTS_BGH_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // acados
 | ||||||
|  | #include "acados/ocp_qp/ocp_qp_common.h" | ||||||
|  | #include "acados/ocp_nlp/ocp_nlp_constraints_common.h" | ||||||
|  | #include "acados/utils/external_function_generic.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * dims | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int nx; | ||||||
|  |     int nu; | ||||||
|  |     int nz; | ||||||
|  |     int nb;  // nbx + nbu
 | ||||||
|  |     int nbu; // number of input box constraints
 | ||||||
|  |     int nbx; // number of state box constraints
 | ||||||
|  |     int ng;  // number of general linear constraints
 | ||||||
|  |     int nh;  // number of nonlinear path constraints
 | ||||||
|  |     int ns;  // nsbu + nsbx + nsg + nsh
 | ||||||
|  |     int nsbu;  // number of softened input bounds
 | ||||||
|  |     int nsbx;  // number of softened state bounds
 | ||||||
|  |     int nsg;  // number of softened general linear constraints
 | ||||||
|  |     int nsh;  // number of softened nonlinear constraints
 | ||||||
|  |     int nbue; // number of input box constraints which are equality
 | ||||||
|  |     int nbxe; // number of state box constraints which are equality
 | ||||||
|  |     int nge;  // number of general linear constraints which are equality
 | ||||||
|  |     int nhe;  // number of nonlinear path constraints which are equality
 | ||||||
|  | } ocp_nlp_constraints_bgh_dims; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_constraints_bgh_dims_calculate_size(void *config); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_constraints_bgh_dims_assign(void *config, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_dims_initialize(void *config, void *dims, int nx, int nu, int nz, int nbx, | ||||||
|  |                                          int nbu, int ng, int nh, int dummy0, int ns); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_dims_get(void *config_, void *dims_, const char *field, int* value); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_dims_set(void *config_, void *dims_, | ||||||
|  |                                       const char *field, const int* value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * model | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int *idxb; | ||||||
|  |     int *idxs; | ||||||
|  |     int *idxe; | ||||||
|  |     struct blasfeo_dvec d;  // gathers bounds
 | ||||||
|  |     struct blasfeo_dmat DCt;  // general linear constraint matrix
 | ||||||
|  |             // lg <= [D, C] * [u; x] <= ug
 | ||||||
|  |     external_function_generic *nl_constr_h_fun;  // nonlinear: lh <= h(x,u) <= uh
 | ||||||
|  |     external_function_generic *nl_constr_h_fun_jac;  // nonlinear: lh <= h(x,u) <= uh
 | ||||||
|  |     external_function_generic *nl_constr_h_fun_jac_hess;  // nonlinear: lh <= h(x,u) <= uh
 | ||||||
|  | } ocp_nlp_constraints_bgh_model; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_constraints_bgh_model_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_constraints_bgh_model_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | int ocp_nlp_constraints_bgh_model_set(void *config_, void *dims_, | ||||||
|  |                          void *model_, const char *field, void *value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * options | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int compute_adj; | ||||||
|  |     int compute_hess; | ||||||
|  | } ocp_nlp_constraints_bgh_opts; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_constraints_bgh_opts_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_constraints_bgh_opts_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_opts_initialize_default(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_opts_update(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_opts_set(void *config, void *opts, char *field, void *value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * memory | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     struct blasfeo_dvec fun; | ||||||
|  |     struct blasfeo_dvec adj; | ||||||
|  |     struct blasfeo_dvec *ux;     // pointer to ux in nlp_out
 | ||||||
|  |     struct blasfeo_dvec *tmp_ux; // pointer to ux in tmp_nlp_out
 | ||||||
|  |     struct blasfeo_dvec *lam;    // pointer to lam in nlp_out
 | ||||||
|  |     struct blasfeo_dvec *tmp_lam;// pointer to lam in tmp_nlp_out
 | ||||||
|  |     struct blasfeo_dvec *z_alg;  // pointer to z_alg in ocp_nlp memory
 | ||||||
|  |     struct blasfeo_dmat *DCt;    // pointer to DCt in qp_in
 | ||||||
|  |     struct blasfeo_dmat *RSQrq;  // pointer to RSQrq in qp_in
 | ||||||
|  |     struct blasfeo_dmat *dzduxt; // pointer to dzduxt in ocp_nlp memory
 | ||||||
|  |     int *idxb;                   // pointer to idxb[ii] in qp_in
 | ||||||
|  |     int *idxs_rev;               // pointer to idxs_rev[ii] in qp_in
 | ||||||
|  |     int *idxe;                   // pointer to idxe[ii] in qp_in
 | ||||||
|  | } ocp_nlp_constraints_bgh_memory; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_constraints_bgh_memory_calculate_size(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_constraints_bgh_memory_assign(void *config, void *dims, void *opts, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | struct blasfeo_dvec *ocp_nlp_constraints_bgh_memory_get_fun_ptr(void *memory_); | ||||||
|  | //
 | ||||||
|  | struct blasfeo_dvec *ocp_nlp_constraints_bgh_memory_get_adj_ptr(void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_memory_set_ux_ptr(struct blasfeo_dvec *ux, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_memory_set_tmp_ux_ptr(struct blasfeo_dvec *tmp_ux, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_memory_set_lam_ptr(struct blasfeo_dvec *lam, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_memory_set_tmp_lam_ptr(struct blasfeo_dvec *tmp_lam, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_memory_set_DCt_ptr(struct blasfeo_dmat *DCt, void *memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_memory_set_RSQrq_ptr(struct blasfeo_dmat *RSQrq, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_memory_set_z_alg_ptr(struct blasfeo_dvec *z_alg, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_memory_set_dzduxt_ptr(struct blasfeo_dmat *dzduxt, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_memory_set_idxb_ptr(int *idxb, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_memory_set_idxs_rev_ptr(int *idxs_rev, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_memory_set_idxe_ptr(int *idxe, void *memory_); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * workspace | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     struct blasfeo_dmat tmp_nv_nv; | ||||||
|  |     struct blasfeo_dmat tmp_nz_nh; | ||||||
|  |     struct blasfeo_dmat tmp_nv_nh; | ||||||
|  |     struct blasfeo_dmat tmp_nz_nv; | ||||||
|  |     struct blasfeo_dmat hess_z; | ||||||
|  |     struct blasfeo_dvec tmp_ni; | ||||||
|  |     struct blasfeo_dvec tmp_nh; | ||||||
|  | } ocp_nlp_constraints_bgh_workspace; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_constraints_bgh_workspace_calculate_size(void *config, void *dims, void *opts); | ||||||
|  | 
 | ||||||
|  | /* functions */ | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_config_initialize_default(void *config); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_initialize(void *config, void *dims, void *model, void *opts, | ||||||
|  |                                     void *mem, void *work); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_update_qp_matrices(void *config_, void *dims, void *model_, | ||||||
|  |                                             void *opts_, void *memory_, void *work_); | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_compute_fun(void *config_, void *dims, void *model_, | ||||||
|  |                                             void *opts_, void *memory_, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_bounds_update(void *config_, void *dims, void *model_, | ||||||
|  |                                             void *opts_, void *memory_, void *work_); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_NLP_OCP_NLP_CONSTRAINTS_BGH_H_
 | ||||||
|  | /// @}
 | ||||||
|  | /// @}
 | ||||||
| @ -0,0 +1,221 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// \addtogroup ocp_nlp
 | ||||||
|  | /// @{
 | ||||||
|  | /// \addtogroup ocp_nlp_constraints
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_NLP_OCP_NLP_CONSTRAINTS_BGP_H_ | ||||||
|  | #define ACADOS_OCP_NLP_OCP_NLP_CONSTRAINTS_BGP_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // acados
 | ||||||
|  | #include "acados/ocp_qp/ocp_qp_common.h" | ||||||
|  | #include "acados/ocp_nlp/ocp_nlp_constraints_common.h" | ||||||
|  | #include "acados/utils/external_function_generic.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* dims */ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int nx; | ||||||
|  |     int nu; | ||||||
|  |     int nz; | ||||||
|  |     int nb;   // nbx + nbu
 | ||||||
|  |     int nbu; | ||||||
|  |     int nbx; | ||||||
|  |     int ng;   // number of general linear constraints
 | ||||||
|  |     int nphi; // dimension of convex outer part 
 | ||||||
|  |     int ns;   // nsbu + nsbx + nsg + nsphi
 | ||||||
|  |     int nsbu; // number of softened input bounds
 | ||||||
|  |     int nsbx; // number of softened state bounds
 | ||||||
|  |     int nsg;  // number of softened general linear constraints
 | ||||||
|  |     int nsphi;  // number of softened nonlinear constraints
 | ||||||
|  |     int nr;   // dimension of nonlinear function in convex_over_nonlinear constraint
 | ||||||
|  |     int nbue; // number of input box constraints which are equality
 | ||||||
|  |     int nbxe; // number of state box constraints which are equality
 | ||||||
|  |     int nge;  // number of general linear constraints which are equality
 | ||||||
|  |     int nphie;  // number of nonlinear path constraints which are equality
 | ||||||
|  | } ocp_nlp_constraints_bgp_dims; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_constraints_bgp_dims_calculate_size(void *config); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_constraints_bgp_dims_assign(void *config, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgp_dims_initialize(void *config, void *dims, int nx, int nu, int nz, 
 | ||||||
|  | 		int nbx, int nbu, int ng, int nphi, int nq, int ns); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgp_dims_get(void *config_, void *dims_, const char *field, int* value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* model */ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     //  ocp_nlp_constraints_bgp_dims *dims;
 | ||||||
|  |     int *idxb; | ||||||
|  |     int *idxs; | ||||||
|  |     int *idxe; | ||||||
|  |     struct blasfeo_dvec d; | ||||||
|  |     struct blasfeo_dmat DCt; | ||||||
|  |     external_function_generic *nl_constr_phi_o_r_fun_phi_jac_ux_z_phi_hess_r_jac_ux; | ||||||
|  |     external_function_generic *nl_constr_phi_o_r_fun; | ||||||
|  |     external_function_generic *nl_constr_r_fun_jac; | ||||||
|  | } ocp_nlp_constraints_bgp_model; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_constraints_bgp_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_constraints_bgp_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | int ocp_nlp_constraints_bgp_model_set(void *config_, void *dims_, | ||||||
|  |                          void *model_, const char *field, void *value); | ||||||
|  | 
 | ||||||
|  | /* options */ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int compute_adj; | ||||||
|  |     int compute_hess; | ||||||
|  | } ocp_nlp_constraints_bgp_opts; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_constraints_bgp_opts_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_constraints_bgp_opts_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgp_opts_initialize_default(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgp_opts_update(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgp_opts_set(void *config, void *opts, char *field, void *value); | ||||||
|  | 
 | ||||||
|  | /* memory */ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     struct blasfeo_dvec fun; | ||||||
|  |     struct blasfeo_dvec adj; | ||||||
|  |     struct blasfeo_dvec *ux;     // pointer to ux in nlp_out
 | ||||||
|  |     struct blasfeo_dvec *tmp_ux; // pointer to ux in tmp_nlp_out
 | ||||||
|  |     struct blasfeo_dvec *lam;    // pointer to lam in nlp_out
 | ||||||
|  |     struct blasfeo_dvec *tmp_lam;// pointer to lam in tmp_nlp_out
 | ||||||
|  |     struct blasfeo_dvec *z_alg;  // pointer to z_alg in ocp_nlp memory
 | ||||||
|  |     struct blasfeo_dmat *DCt;    // pointer to DCt in qp_in
 | ||||||
|  |     struct blasfeo_dmat *RSQrq;  // pointer to RSQrq in qp_in
 | ||||||
|  |     struct blasfeo_dmat *dzduxt; // pointer to dzduxt in ocp_nlp memory
 | ||||||
|  |     int *idxb;                   // pointer to idxb[ii] in qp_in
 | ||||||
|  |     int *idxs_rev;                   // pointer to idxs_rev[ii] in qp_in
 | ||||||
|  |     int *idxe;                   // pointer to idxe[ii] in qp_in
 | ||||||
|  | } ocp_nlp_constraints_bgp_memory; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_constraints_bgp_memory_calculate_size(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_constraints_bgp_memory_assign(void *config, void *dims, void *opts, | ||||||
|  |     void *raw_memory); | ||||||
|  | //
 | ||||||
|  | struct blasfeo_dvec *ocp_nlp_constraints_bgp_memory_get_fun_ptr(void *memory_); | ||||||
|  | //
 | ||||||
|  | struct blasfeo_dvec *ocp_nlp_constraints_bgp_memory_get_adj_ptr(void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgp_memory_set_ux_ptr(struct blasfeo_dvec *ux, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgp_memory_set_tmp_ux_ptr(struct blasfeo_dvec *tmp_ux, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgp_memory_set_lam_ptr(struct blasfeo_dvec *lam, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgp_memory_set_tmp_lam_ptr(struct blasfeo_dvec *tmp_lam, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgp_memory_set_DCt_ptr(struct blasfeo_dmat *DCt, void *memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgp_memory_set_z_alg_ptr(struct blasfeo_dvec *z_alg, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgp_memory_set_dzduxt_ptr(struct blasfeo_dmat *dzduxt, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgp_memory_set_idxb_ptr(int *idxb, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgp_memory_set_idxs_rev_ptr(int *idxs_rev, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgh_memory_set_idxe_ptr(int *idxe, void *memory_); | ||||||
|  | 
 | ||||||
|  | /* workspace */ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     struct blasfeo_dvec tmp_ni; | ||||||
|  |     struct blasfeo_dmat jac_r_ux_tran; | ||||||
|  |     struct blasfeo_dmat tmp_nr_nphi_nr; | ||||||
|  |     struct blasfeo_dmat tmp_nv_nr; | ||||||
|  |     struct blasfeo_dmat tmp_nv_nphi; | ||||||
|  |     struct blasfeo_dmat tmp_nz_nphi; | ||||||
|  | } ocp_nlp_constraints_bgp_workspace; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_constraints_bgp_workspace_calculate_size(void *config, void *dims, void *opts); | ||||||
|  | 
 | ||||||
|  | /* functions */ | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgp_config_initialize_default(void *config); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgp_initialize(void *config, void *dims, void *model, | ||||||
|  |         void *opts, void *mem, void *work); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgp_update_qp_matrices(void *config_, void *dims, | ||||||
|  |         void *model_, void *opts_, void *memory_, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgp_compute_fun(void *config_, void *dims, | ||||||
|  |         void *model_, void *opts_, void *memory_, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_constraints_bgp_bounds_update(void *config_, void *dims, void *model_, | ||||||
|  |         void *opts_, void *memory_, void *work_); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_NLP_OCP_NLP_CONSTRAINTS_BGP_H_
 | ||||||
|  | /// @}
 | ||||||
|  | /// @}
 | ||||||
| @ -0,0 +1,112 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// \ingroup ocp_nlp
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | /// \defgroup ocp_nlp_constraints ocp_nlp_constraints
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_NLP_OCP_NLP_CONSTRAINTS_COMMON_H_ | ||||||
|  | #define ACADOS_OCP_NLP_OCP_NLP_CONSTRAINTS_COMMON_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // acados
 | ||||||
|  | #include "acados/ocp_qp/ocp_qp_common.h" | ||||||
|  | #include "acados/utils/external_function_generic.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * config | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     acados_size_t (*dims_calculate_size)(void *config); | ||||||
|  |     void *(*dims_assign)(void *config, void *raw_memory); | ||||||
|  |     void (*dims_initialize)(void *config, void *dims, int nx, int nu, int nz, int nbx, int nbu, int ng, | ||||||
|  |                             int nh, int nq, int ns); | ||||||
|  |     acados_size_t (*model_calculate_size)(void *config, void *dims); | ||||||
|  |     void *(*model_assign)(void *config, void *dims, void *raw_memory); | ||||||
|  |     int (*model_set)(void *config_, void *dims_, void *model_, const char *field, void *value); | ||||||
|  |     acados_size_t (*opts_calculate_size)(void *config, void *dims); | ||||||
|  |     void *(*opts_assign)(void *config, void *dims, void *raw_memory); | ||||||
|  |     void (*opts_initialize_default)(void *config, void *dims, void *opts); | ||||||
|  |     void (*opts_update)(void *config, void *dims, void *opts); | ||||||
|  |     void (*opts_set)(void *config, void *opts, char *field, void *value); | ||||||
|  |     acados_size_t (*memory_calculate_size)(void *config, void *dims, void *opts); | ||||||
|  |     struct blasfeo_dvec *(*memory_get_fun_ptr)(void *memory); | ||||||
|  |     struct blasfeo_dvec *(*memory_get_adj_ptr)(void *memory); | ||||||
|  |     void (*memory_set_ux_ptr)(struct blasfeo_dvec *ux, void *memory); | ||||||
|  |     void (*memory_set_tmp_ux_ptr)(struct blasfeo_dvec *tmp_ux, void *memory); | ||||||
|  |     void (*memory_set_lam_ptr)(struct blasfeo_dvec *lam, void *memory); | ||||||
|  |     void (*memory_set_tmp_lam_ptr)(struct blasfeo_dvec *tmp_lam, void *memory); | ||||||
|  |     void (*memory_set_DCt_ptr)(struct blasfeo_dmat *DCt, void *memory); | ||||||
|  |     void (*memory_set_RSQrq_ptr)(struct blasfeo_dmat *RSQrq, void *memory); | ||||||
|  |     void (*memory_set_z_alg_ptr)(struct blasfeo_dvec *z_alg, void *memory); | ||||||
|  |     void (*memory_set_dzdux_tran_ptr)(struct blasfeo_dmat *dzduxt, void *memory); | ||||||
|  |     void (*memory_set_idxb_ptr)(int *idxb, void *memory); | ||||||
|  |     void (*memory_set_idxs_rev_ptr)(int *idxs_rev, void *memory); | ||||||
|  |     void (*memory_set_idxe_ptr)(int *idxe, void *memory); | ||||||
|  |     void *(*memory_assign)(void *config, void *dims, void *opts, void *raw_memory); | ||||||
|  |     acados_size_t (*workspace_calculate_size)(void *config, void *dims, void *opts); | ||||||
|  |     void (*initialize)(void *config, void *dims, void *model, void *opts, void *mem, void *work); | ||||||
|  |     void (*update_qp_matrices)(void *config, void *dims, void *model, void *opts, void *mem, void *work); | ||||||
|  |     void (*compute_fun)(void *config, void *dims, void *model, void *opts, void *mem, void *work); | ||||||
|  |     void (*bounds_update)(void *config, void *dims, void *model, void *opts, void *mem, void *work); | ||||||
|  |     void (*config_initialize_default)(void *config); | ||||||
|  |     // dimension setters
 | ||||||
|  |     void (*dims_set)(void *config_, void *dims_, const char *field, const int *value); | ||||||
|  |     void (*dims_get)(void *config_, void *dims_, const char *field, int* value); | ||||||
|  | } ocp_nlp_constraints_config; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_constraints_config_calculate_size(); | ||||||
|  | //
 | ||||||
|  | ocp_nlp_constraints_config *ocp_nlp_constraints_config_assign(void *raw_memory); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_NLP_OCP_NLP_CONSTRAINTS_COMMON_H_
 | ||||||
|  | /// @}
 | ||||||
|  | /// @}
 | ||||||
| @ -0,0 +1,109 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ///
 | ||||||
|  | /// \defgroup ocp_nlp_cost ocp_nlp_cost 
 | ||||||
|  | /// 
 | ||||||
|  | 
 | ||||||
|  | /// \addtogroup ocp_nlp_cost ocp_nlp_cost
 | ||||||
|  | /// @{
 | ||||||
|  | /// \addtogroup ocp_nlp_cost_common ocp_nlp_cost_common
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_NLP_OCP_NLP_COST_COMMON_H_ | ||||||
|  | #define ACADOS_OCP_NLP_OCP_NLP_COST_COMMON_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // acados
 | ||||||
|  | #include "acados/utils/external_function_generic.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * config | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     acados_size_t (*dims_calculate_size)(void *config); | ||||||
|  |     void *(*dims_assign)(void *config, void *raw_memory); | ||||||
|  |     void (*dims_initialize)(void *config, void *dims, int nx, int nu, int ny, int ns, int nz); | ||||||
|  |     void (*dims_set)(void *config_, void *dims_, const char *field, int *value); | ||||||
|  |     void (*dims_get)(void *config_, void *dims_, const char *field, int *value); | ||||||
|  |     acados_size_t (*model_calculate_size)(void *config, void *dims); | ||||||
|  |     void *(*model_assign)(void *config, void *dims, void *raw_memory); | ||||||
|  |     int (*model_set)(void *config_, void *dims_, void *model_, const char *field, void *value_); | ||||||
|  |     acados_size_t (*opts_calculate_size)(void *config, void *dims); | ||||||
|  |     void *(*opts_assign)(void *config, void *dims, void *raw_memory); | ||||||
|  |     void (*opts_initialize_default)(void *config, void *dims, void *opts); | ||||||
|  |     void (*opts_update)(void *config, void *dims, void *opts); | ||||||
|  |     void (*opts_set)(void *config, void *opts, const char *field, void *value); | ||||||
|  |     acados_size_t (*memory_calculate_size)(void *config, void *dims, void *opts); | ||||||
|  | 	double *(*memory_get_fun_ptr)(void *memory); | ||||||
|  |     struct blasfeo_dvec *(*memory_get_grad_ptr)(void *memory); | ||||||
|  |     void (*memory_set_ux_ptr)(struct blasfeo_dvec *ux, void *memory); | ||||||
|  |     void (*memory_set_tmp_ux_ptr)(struct blasfeo_dvec *tmp_ux, void *memory); | ||||||
|  |     void (*memory_set_z_alg_ptr)(struct blasfeo_dvec *z_alg, void *memory); | ||||||
|  |     void (*memory_set_dzdux_tran_ptr)(struct blasfeo_dmat *dzdux, void *memory); | ||||||
|  |     void (*memory_set_RSQrq_ptr)(struct blasfeo_dmat *RSQrq, void *memory); | ||||||
|  |     void (*memory_set_Z_ptr)(struct blasfeo_dvec *Z, void *memory); | ||||||
|  |     void *(*memory_assign)(void *config, void *dims, void *opts, void *raw_memory); | ||||||
|  |     acados_size_t (*workspace_calculate_size)(void *config, void *dims, void *opts); | ||||||
|  |     void (*initialize)(void *config_, void *dims, void *model_, void *opts_, void *mem_, void *work_); | ||||||
|  | 
 | ||||||
|  |     // computes the function value, gradient and hessian (approximation) of the cost function
 | ||||||
|  |     void (*update_qp_matrices)(void *config_, void *dims, void *model_, void *opts_, void *mem_, void *work_); | ||||||
|  |     // computes the cost function value (intended for globalization)
 | ||||||
|  |     void (*compute_fun)(void *config_, void *dims, void *model_, void *opts_, void *mem_, void *work_); | ||||||
|  |     void (*config_initialize_default)(void *config); | ||||||
|  | } ocp_nlp_cost_config; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_cost_config_calculate_size(); | ||||||
|  | //
 | ||||||
|  | ocp_nlp_cost_config *ocp_nlp_cost_config_assign(void *raw_memory); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_NLP_OCP_NLP_COST_COMMON_H_
 | ||||||
|  | /// @} 
 | ||||||
|  | /// @} 
 | ||||||
| @ -0,0 +1,187 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_NLP_OCP_NLP_COST_EXTERNAL_H_ | ||||||
|  | #define ACADOS_OCP_NLP_OCP_NLP_COST_EXTERNAL_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // blasfeo
 | ||||||
|  | #include "blasfeo/include/blasfeo_common.h" | ||||||
|  | 
 | ||||||
|  | // acados
 | ||||||
|  | #include "acados/ocp_nlp/ocp_nlp_cost_common.h" | ||||||
|  | #include "acados/utils/external_function_generic.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * dims | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int nx;  // number of states
 | ||||||
|  |     int nu;  // number of inputs
 | ||||||
|  |     int ns;  // number of slacks
 | ||||||
|  | } ocp_nlp_cost_external_dims; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_cost_external_dims_calculate_size(void *config); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_cost_external_dims_assign(void *config, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_external_dims_initialize(void *config, void *dims, int nx, | ||||||
|  |                                            int nu, int ny, int ns, int nz); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_external_dims_set(void *config_, void *dims_, const char *field, int* value); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_external_dims_get(void *config_, void *dims_, const char *field, int* value); | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * model | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     external_function_generic *ext_cost_fun;  // function
 | ||||||
|  |     external_function_generic *ext_cost_fun_jac_hess;  // function, gradient and hessian
 | ||||||
|  |     external_function_generic *ext_cost_fun_jac;  // function, gradient
 | ||||||
|  |     struct blasfeo_dvec Z; | ||||||
|  |     struct blasfeo_dvec z; | ||||||
|  |     struct blasfeo_dmat numerical_hessian;  // custom hessian approximation
 | ||||||
|  |     double scaling; | ||||||
|  | } ocp_nlp_cost_external_model; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_cost_external_model_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_cost_external_model_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * options | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int use_numerical_hessian;  // > 0 indicating custom hessian is used instead of CasADi evaluation
 | ||||||
|  | } ocp_nlp_cost_external_opts; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_cost_external_opts_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_cost_external_opts_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_external_opts_initialize_default(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_external_opts_update(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_external_opts_set(void *config, void *opts, const char *field, void *value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * memory | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     struct blasfeo_dvec grad;    // gradient of cost function
 | ||||||
|  |     struct blasfeo_dvec *ux;     // pointer to ux in nlp_out
 | ||||||
|  |     struct blasfeo_dvec *tmp_ux;     // pointer to tmp_ux in nlp_out
 | ||||||
|  |     struct blasfeo_dmat *RSQrq;  // pointer to RSQrq in qp_in
 | ||||||
|  |     struct blasfeo_dvec *Z;      // pointer to Z in qp_in
 | ||||||
|  |     struct blasfeo_dvec *z_alg;         ///< pointer to z in sim_out
 | ||||||
|  |     struct blasfeo_dmat *dzdux_tran;    ///< pointer to sensitivity of a wrt ux in sim_out
 | ||||||
|  | 	double fun;                         ///< value of the cost function
 | ||||||
|  | } ocp_nlp_cost_external_memory; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_cost_external_memory_calculate_size(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_cost_external_memory_assign(void *config, void *dims, void *opts, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | double *ocp_nlp_cost_external_memory_get_fun_ptr(void *memory_); | ||||||
|  | //
 | ||||||
|  | struct blasfeo_dvec *ocp_nlp_cost_external_memory_get_grad_ptr(void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_external_memory_set_RSQrq_ptr(struct blasfeo_dmat *RSQrq, void *memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_ls_memory_set_Z_ptr(struct blasfeo_dvec *Z, void *memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_external_memory_set_ux_ptr(struct blasfeo_dvec *ux, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_external_memory_set_tmp_ux_ptr(struct blasfeo_dvec *tmp_ux, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_external_memory_set_z_alg_ptr(struct blasfeo_dvec *z_alg, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_external_memory_set_dzdux_tran_ptr(struct blasfeo_dmat *dzdux_tran, void *memory_); | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * workspace | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     struct blasfeo_dmat tmp_nv_nv; | ||||||
|  |     struct blasfeo_dvec tmp_2ns;  // temporary vector of dimension 2*ns
 | ||||||
|  | } ocp_nlp_cost_external_workspace; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_cost_external_workspace_calculate_size(void *config, void *dims, void *opts); | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * functions | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_external_config_initialize_default(void *config); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_external_initialize(void *config_, void *dims, void *model_, | ||||||
|  |                                       void *opts_, void *mem_, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_external_update_qp_matrices(void *config_, void *dims, void *model_, | ||||||
|  |                                                void *opts_, void *memory_, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_external_compute_fun(void *config_, void *dims, void *model_, | ||||||
|  |                                        void *opts_, void *memory_, void *work_); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_NLP_OCP_NLP_COST_EXTERNAL_H_
 | ||||||
| @ -0,0 +1,259 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// \addtogroup ocp_nlp
 | ||||||
|  | /// @{
 | ||||||
|  | /// \addtogroup ocp_nlp_cost ocp_nlp_cost
 | ||||||
|  | /// @{
 | ||||||
|  | /// \addtogroup ocp_nlp_cost_ls ocp_nlp_cost_ls
 | ||||||
|  | /// \brief This module implements linear-least squares costs of the form
 | ||||||
|  | /// \f$\min_{x,u,z} \| V_x x + V_u u + V_z z - y_{\text{ref}}\|_W^2\f$.
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_NLP_OCP_NLP_COST_LS_H_ | ||||||
|  | #define ACADOS_OCP_NLP_OCP_NLP_COST_LS_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // blasfeo
 | ||||||
|  | #include "blasfeo/include/blasfeo_common.h" | ||||||
|  | 
 | ||||||
|  | // acados
 | ||||||
|  | #include "acados/ocp_nlp/ocp_nlp_cost_common.h" | ||||||
|  | #include "acados/utils/external_function_generic.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | //                                     dims                                   //
 | ||||||
|  | ////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int nx;  // number of states
 | ||||||
|  |     int nz;  // number of algebraic variables
 | ||||||
|  |     int nu;  // number of inputs
 | ||||||
|  |     int ny;  // number of outputs
 | ||||||
|  |     int ns;  // number of slacks
 | ||||||
|  | } ocp_nlp_cost_ls_dims; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ///  Calculate the size of the ocp_nlp_cost_ls_dims struct
 | ||||||
|  | ///
 | ||||||
|  | ///  \param[in] config_ structure containing configuration of ocp_nlp_cost
 | ||||||
|  | ///  module
 | ||||||
|  | ///  \param[out] []
 | ||||||
|  | ///  \return \c size of ocp_nlp_dims struct
 | ||||||
|  | acados_size_t ocp_nlp_cost_ls_dims_calculate_size(void *config); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ///  Assign memory pointed to by raw_memory to ocp_nlp-cost_ls dims struct 
 | ||||||
|  | ///
 | ||||||
|  | ///  \param[in] config structure containing configuration of ocp_nlp_cost 
 | ||||||
|  | ///  module
 | ||||||
|  | ///  \param[in] raw_memory pointer to memory location  
 | ||||||
|  | ///  \param[out] []
 | ||||||
|  | ///  \return dims
 | ||||||
|  | void *ocp_nlp_cost_ls_dims_assign(void *config, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ///  Initialize the dimensions struct of the 
 | ||||||
|  | ///  ocp_nlp-cost_ls component    
 | ||||||
|  | ///
 | ||||||
|  | ///  \param[in] config structure containing configuration ocp_nlp-cost_ls component 
 | ||||||
|  | ///  \param[in] nx number of states
 | ||||||
|  | ///  \param[in] nu number of inputs
 | ||||||
|  | ///  \param[in] ny number of residuals
 | ||||||
|  | ///  \param[in] ns number of slacks
 | ||||||
|  | ///  \param[in] nz number of algebraic variables
 | ||||||
|  | ///  \param[out] dims
 | ||||||
|  | ///  \return size
 | ||||||
|  | void ocp_nlp_cost_ls_dims_initialize(void *config, void *dims, int nx, | ||||||
|  |         int nu, int ny, int ns, int nz); | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_ls_dims_set(void *config_, void *dims_, const char *field, int* value); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_ls_dims_get(void *config_, void *dims_, const char *field, int* value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | //                                     model                                  //
 | ||||||
|  | ////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// structure containing the data describing the linear least-square cost 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     // slack penalty has the form z^T * s + .5 * s^T * Z * s
 | ||||||
|  |     struct blasfeo_dmat Cyt;            ///< output matrix: Cy * [u,x] = y; in transposed form
 | ||||||
|  |     struct blasfeo_dmat Vz;             ///< Vz in ls cost Vx*x + Vu*u + Vz*z
 | ||||||
|  |     struct blasfeo_dmat W;              ///< ls norm corresponding to this matrix
 | ||||||
|  |     struct blasfeo_dvec y_ref;          ///< yref
 | ||||||
|  |     struct blasfeo_dvec Z;              ///< diagonal Hessian of slacks as vector (lower and upper)
 | ||||||
|  |     struct blasfeo_dvec z;              ///< gradient of slacks as vector (lower and upper)
 | ||||||
|  |     double scaling; | ||||||
|  | } ocp_nlp_cost_ls_model; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_cost_ls_model_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_cost_ls_model_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | int ocp_nlp_cost_ls_model_set(void *config_, void *dims_, void *model_, | ||||||
|  |                               const char *field, void *value_); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | //                                   options                                  //
 | ||||||
|  | ////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int dummy; // struct can't be void
 | ||||||
|  | } ocp_nlp_cost_ls_opts; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_cost_ls_opts_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_cost_ls_opts_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_ls_opts_initialize_default(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_ls_opts_update(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_ls_opts_set(void *config, void *opts, const char *field, void *value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | //                                     memory                                 //
 | ||||||
|  | ////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// structure containing the memory associated with cost_ls component 
 | ||||||
|  | /// of the ocp_nlp module
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     struct blasfeo_dmat hess;           ///< hessian of cost function
 | ||||||
|  |     struct blasfeo_dmat W_chol;         ///< cholesky factor of weight matrix
 | ||||||
|  |     struct blasfeo_dvec res;            ///< ls residual r(x)
 | ||||||
|  |     struct blasfeo_dvec grad;           ///< gradient of cost function
 | ||||||
|  |     struct blasfeo_dvec *ux;            ///< pointer to ux in nlp_out
 | ||||||
|  |     struct blasfeo_dvec *tmp_ux;        ///< pointer to ux in tmp_nlp_out
 | ||||||
|  |     struct blasfeo_dvec *z_alg;         ///< pointer to z in sim_out
 | ||||||
|  |     struct blasfeo_dmat *dzdux_tran;    ///< pointer to sensitivity of a wrt ux in sim_out
 | ||||||
|  |     struct blasfeo_dmat *RSQrq;         ///< pointer to RSQrq in qp_in
 | ||||||
|  |     struct blasfeo_dvec *Z;             ///< pointer to Z in qp_in
 | ||||||
|  | 	double fun;                         ///< value of the cost function
 | ||||||
|  | } ocp_nlp_cost_ls_memory; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_cost_ls_memory_calculate_size(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_cost_ls_memory_assign(void *config, void *dims, void *opts, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | double *ocp_nlp_cost_ls_memory_get_fun_ptr(void *memory_); | ||||||
|  | //
 | ||||||
|  | struct blasfeo_dvec *ocp_nlp_cost_ls_memory_get_grad_ptr(void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_ls_memory_set_RSQrq_ptr(struct blasfeo_dmat *RSQrq, void *memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_ls_memory_set_Z_ptr(struct blasfeo_dvec *Z, void *memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_ls_memory_set_ux_ptr(struct blasfeo_dvec *ux, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_ls_memory_set_tmp_ux_ptr(struct blasfeo_dvec *tmp_ux, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_ls_memory_set_z_alg_ptr(struct blasfeo_dvec *z_alg, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_ls_memory_set_dzdux_tran_ptr(struct blasfeo_dmat *dzdux_tran, void *memory_); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | //                                 workspace                                  //
 | ||||||
|  | ////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     struct blasfeo_dmat tmp_nv_ny;   // temporary matrix of dimensions nv, ny
 | ||||||
|  |     struct blasfeo_dmat Cyt_tilde;   // updated Cyt (after z elimination)
 | ||||||
|  |     struct blasfeo_dmat dzdux_tran;  // derivatives of z wrt u and x (tran)
 | ||||||
|  |     struct blasfeo_dvec tmp_ny;      // temporary vector of dimension ny
 | ||||||
|  |     struct blasfeo_dvec tmp_2ns;     // temporary vector of dimension ny
 | ||||||
|  |     struct blasfeo_dvec tmp_nz;      // temporary vector of dimension nz
 | ||||||
|  |     struct blasfeo_dvec y_ref_tilde; // updated y_ref (after z elimination)
 | ||||||
|  | } ocp_nlp_cost_ls_workspace; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_cost_ls_workspace_calculate_size(void *config, void *dims, void *opts); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | //                                 functions                                  //
 | ||||||
|  | ////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_ls_config_initialize_default(void *config); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_ls_initialize(void *config_, void *dims, void *model_, void *opts_, | ||||||
|  |                                 void *mem_, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_ls_update_qp_matrices(void *config_, void *dims, void *model_, | ||||||
|  |                                         void *opts_, void *memory_, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_ls_compute_fun(void *config_, void *dims, void *model_, void *opts_, void *memory_, void *work_); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_NLP_OCP_NLP_COST_LS_H_
 | ||||||
|  | /// @}
 | ||||||
|  | /// @}
 | ||||||
|  | /// @}
 | ||||||
| @ -0,0 +1,210 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// \addtogroup ocp_nlp
 | ||||||
|  | /// @{
 | ||||||
|  | /// \addtogroup ocp_nlp_cost ocp_nlp_cost
 | ||||||
|  | /// @{
 | ||||||
|  | /// \addtogroup ocp_nlp_cost_nls ocp_nlp_cost_nls
 | ||||||
|  | /// \brief This module implements nonlinear-least squares costs of the form
 | ||||||
|  | /// \f$\min_{x,u} \| r(x,u) - y_{\text{ref}} \|_W^2\f$.
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_NLP_OCP_NLP_COST_NLS_H_ | ||||||
|  | #define ACADOS_OCP_NLP_OCP_NLP_COST_NLS_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // blasfeo
 | ||||||
|  | #include "blasfeo/include/blasfeo_common.h" | ||||||
|  | 
 | ||||||
|  | // acados
 | ||||||
|  | #include "acados/ocp_nlp/ocp_nlp_cost_common.h" | ||||||
|  | #include "acados/utils/external_function_generic.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * dims | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int nx;  // number of states
 | ||||||
|  |     int nu;  // number of inputs
 | ||||||
|  |     int ny;  // number of outputs
 | ||||||
|  |     int ns;  // number of slacks
 | ||||||
|  | } ocp_nlp_cost_nls_dims; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_cost_nls_dims_calculate_size(void *config); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_cost_nls_dims_assign(void *config, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_nls_dims_initialize(void *config, void *dims, int nx, int nu, int ny, int ns, int nz); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_nls_dims_set(void *config_, void *dims_, const char *field, int* value); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_nls_dims_get(void *config_, void *dims_, const char *field, int* value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * model | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     // nonliner function nls_y(x,u) replaces Cy * [x,u] in ls_cost
 | ||||||
|  |     // slack penalty has the form z^T * s + .5 * s^T * Z * s
 | ||||||
|  |     external_function_generic *nls_y_fun;  // evaluation of nls function
 | ||||||
|  |     external_function_generic *nls_y_fun_jac;  // evaluation nls function and jacobian
 | ||||||
|  |     external_function_generic *nls_y_hess;  // hessian*seeds of nls residuals
 | ||||||
|  |     struct blasfeo_dmat W;                //
 | ||||||
|  |     struct blasfeo_dvec y_ref; | ||||||
|  |     struct blasfeo_dvec Z;              // diagonal Hessian of slacks as vector
 | ||||||
|  |     struct blasfeo_dvec z;              // gradient of slacks as vector
 | ||||||
|  |     double scaling; | ||||||
|  | } ocp_nlp_cost_nls_model; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_cost_nls_model_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_cost_nls_model_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | int ocp_nlp_cost_nls_model_set(void *config_, void *dims_, void *model_, const char *field, void *value_); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * options | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     bool gauss_newton_hess;  // gauss-newton hessian approximation
 | ||||||
|  | } ocp_nlp_cost_nls_opts; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_cost_nls_opts_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_cost_nls_opts_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_nls_opts_initialize_default(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_nls_opts_update(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_nls_opts_set(void *config, void *opts, const char *field, void *value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * memory | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     struct blasfeo_dmat W_chol;  // cholesky factor of weight matrix
 | ||||||
|  |     struct blasfeo_dmat Jt;      // jacobian of nls fun
 | ||||||
|  |     struct blasfeo_dvec res;     // nls residual r(x)
 | ||||||
|  |     struct blasfeo_dvec grad;    // gradient of cost function
 | ||||||
|  |     struct blasfeo_dvec *ux;     // pointer to ux in nlp_out
 | ||||||
|  |     struct blasfeo_dvec *tmp_ux;     // pointer to ux in tmp_nlp_out
 | ||||||
|  |     struct blasfeo_dvec *z_alg;         ///< pointer to z in sim_out
 | ||||||
|  |     struct blasfeo_dmat *dzdux_tran;    ///< pointer to sensitivity of a wrt ux in sim_out
 | ||||||
|  |     struct blasfeo_dmat *RSQrq;  // pointer to RSQrq in qp_in
 | ||||||
|  |     struct blasfeo_dvec *Z;      // pointer to Z in qp_in
 | ||||||
|  | 	double fun;                         ///< value of the cost function
 | ||||||
|  | } ocp_nlp_cost_nls_memory; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_cost_nls_memory_calculate_size(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_cost_nls_memory_assign(void *config, void *dims, void *opts, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | double *ocp_nlp_cost_nls_memory_get_fun_ptr(void *memory_); | ||||||
|  | //
 | ||||||
|  | struct blasfeo_dvec *ocp_nlp_cost_nls_memory_get_grad_ptr(void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_nls_memory_set_RSQrq_ptr(struct blasfeo_dmat *RSQrq, void *memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_nls_memory_set_Z_ptr(struct blasfeo_dvec *Z, void *memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_nls_memory_set_ux_ptr(struct blasfeo_dvec *ux, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_nls_memory_set_tmp_ux_ptr(struct blasfeo_dvec *tmp_ux, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_nls_memory_set_z_alg_ptr(struct blasfeo_dvec *z_alg, void *memory_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_nls_memory_set_dzdux_tran_ptr(struct blasfeo_dmat *dzdux_tran, void *memory_); | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * workspace | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     struct blasfeo_dmat tmp_nv_ny; | ||||||
|  |     struct blasfeo_dmat tmp_nv_nv; | ||||||
|  |     struct blasfeo_dvec tmp_ny; | ||||||
|  |     struct blasfeo_dvec tmp_2ns;     // temporary vector of dimension ny
 | ||||||
|  | } ocp_nlp_cost_nls_workspace; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_cost_nls_workspace_calculate_size(void *config, void *dims, void *opts); | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * functions | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_nls_config_initialize_default(void *config); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_nls_initialize(void *config_, void *dims, void *model_, void *opts_, void *mem_, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_nls_update_qp_matrices(void *config_, void *dims, void *model_, void *opts_, void *memory_, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_cost_nls_compute_fun(void *config_, void *dims, void *model_, void *opts_, void *memory_, void *work_); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_NLP_OCP_NLP_COST_NLS_H_
 | ||||||
|  | /// @}
 | ||||||
|  | /// @}
 | ||||||
|  | /// @}
 | ||||||
| @ -0,0 +1,122 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// \ingroup ocp_nlp
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | /// \defgroup ocp_nlp_dynamics ocp_nlp_dynamics
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_NLP_OCP_NLP_DYNAMICS_COMMON_H_ | ||||||
|  | #define ACADOS_OCP_NLP_OCP_NLP_DYNAMICS_COMMON_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // blasfeo
 | ||||||
|  | #include "blasfeo/include/blasfeo_common.h" | ||||||
|  | 
 | ||||||
|  | // acados
 | ||||||
|  | #include "acados/sim/sim_common.h" | ||||||
|  | #include "acados/utils/external_function_generic.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * config | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     void (*config_initialize_default)(void *config); | ||||||
|  |     sim_config *sim_solver; | ||||||
|  |     /* dims */ | ||||||
|  |     acados_size_t (*dims_calculate_size)(void *config); | ||||||
|  |     void *(*dims_assign)(void *config, void *raw_memory); | ||||||
|  |     void (*dims_initialize)(void *config, void *dims, int nx, int nu, int nx1, int nu1, int nz); | ||||||
|  |     void (*dims_set)(void *config_, void *dims_, const char *field, int *value); | ||||||
|  |     void (*dims_get)(void *config_, void *dims_, const char *field, int* value); | ||||||
|  |     /* model */ | ||||||
|  |     acados_size_t (*model_calculate_size)(void *config, void *dims); | ||||||
|  |     void *(*model_assign)(void *config, void *dims, void *raw_memory); | ||||||
|  |     void (*model_set)(void *config_, void *dims_, void *model_, const char *field, void *value_); | ||||||
|  |     /* opts */ | ||||||
|  |     acados_size_t (*opts_calculate_size)(void *config, void *dims); | ||||||
|  |     void *(*opts_assign)(void *config, void *dims, void *raw_memory); | ||||||
|  |     void (*opts_initialize_default)(void *config, void *dims, void *opts); | ||||||
|  |     void (*opts_set)(void *config_, void *opts_, const char *field, void *value); | ||||||
|  |     void (*opts_update)(void *config, void *dims, void *opts); | ||||||
|  |     /* memory */ | ||||||
|  |     acados_size_t (*memory_calculate_size)(void *config, void *dims, void *opts); | ||||||
|  |     void *(*memory_assign)(void *config, void *dims, void *opts, void *raw_memory); | ||||||
|  |     struct blasfeo_dvec *(*memory_get_fun_ptr)(void *memory_); | ||||||
|  |     struct blasfeo_dvec *(*memory_get_adj_ptr)(void *memory_); | ||||||
|  |     void (*memory_set_ux_ptr)(struct blasfeo_dvec *ux, void *memory_); | ||||||
|  |     void (*memory_set_tmp_ux_ptr)(struct blasfeo_dvec *tmp_ux, void *memory_); | ||||||
|  |     void (*memory_set_ux1_ptr)(struct blasfeo_dvec *ux1, void *memory_); | ||||||
|  |     void (*memory_set_tmp_ux1_ptr)(struct blasfeo_dvec *tmp_ux1, void *memory_); | ||||||
|  |     void (*memory_set_pi_ptr)(struct blasfeo_dvec *pi, void *memory_); | ||||||
|  |     void (*memory_set_tmp_pi_ptr)(struct blasfeo_dvec *tmp_pi, void *memory_); | ||||||
|  |     void (*memory_set_BAbt_ptr)(struct blasfeo_dmat *BAbt, void *memory_); | ||||||
|  |     void (*memory_set_RSQrq_ptr)(struct blasfeo_dmat *RSQrq, void *memory_); | ||||||
|  |     void (*memory_set_dzduxt_ptr)(struct blasfeo_dmat *mat, void *memory_); | ||||||
|  |     void (*memory_set_sim_guess_ptr)(struct blasfeo_dvec *vec, bool *bool_ptr, void *memory_); | ||||||
|  |     void (*memory_set_z_alg_ptr)(struct blasfeo_dvec *vec, void *memory_); | ||||||
|  |     void (*memory_get)(void *config, void *dims, void *mem, const char *field, void* value); | ||||||
|  |     /* workspace */ | ||||||
|  |     acados_size_t (*workspace_calculate_size)(void *config, void *dims, void *opts); | ||||||
|  |     void (*initialize)(void *config_, void *dims, void *model_, void *opts_, void *mem_, void *work_); | ||||||
|  |     void (*update_qp_matrices)(void *config_, void *dims, void *model_, void *opts_, void *mem_, void *work_); | ||||||
|  |     void (*compute_fun)(void *config_, void *dims, void *model_, void *opts_, void *mem_, void *work_); | ||||||
|  |     int (*precompute)(void *config_, void *dims, void *model_, void *opts_, void *mem_, void *work_); | ||||||
|  | } ocp_nlp_dynamics_config; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_dynamics_config_calculate_size(); | ||||||
|  | //
 | ||||||
|  | ocp_nlp_dynamics_config *ocp_nlp_dynamics_config_assign(void *raw_memory); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_NLP_OCP_NLP_DYNAMICS_COMMON_H_
 | ||||||
|  | /// @}
 | ||||||
|  | /// @}
 | ||||||
| @ -0,0 +1,216 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// \addtogroup ocp_nlp
 | ||||||
|  | /// @{
 | ||||||
|  | /// \addtogroup ocp_nlp_dynamics
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_NLP_OCP_NLP_DYNAMICS_CONT_H_ | ||||||
|  | #define ACADOS_OCP_NLP_OCP_NLP_DYNAMICS_CONT_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // blasfeo
 | ||||||
|  | #include "blasfeo/include/blasfeo_common.h" | ||||||
|  | 
 | ||||||
|  | // acados
 | ||||||
|  | #include "acados/ocp_nlp/ocp_nlp_dynamics_common.h" | ||||||
|  | #include "acados/utils/external_function_generic.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | #include "acados_c/sim_interface.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * dims | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     void *sim; | ||||||
|  |     int nx;   // number of states at the current stage
 | ||||||
|  |     int nz;   // number of algebraic states at the current stage
 | ||||||
|  |     int nu;   // number of inputs at the current stage
 | ||||||
|  |     int nx1;  // number of states at the next stage
 | ||||||
|  |     int nu1;  // number of inputes at the next stage
 | ||||||
|  | } ocp_nlp_dynamics_cont_dims; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_dynamics_cont_dims_calculate_size(void *config); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_dynamics_cont_dims_assign(void *config, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_cont_dims_initialize(void *config, void *dims, int nx, int nu, int nx1, | ||||||
|  |                                            int nu1, int nz); | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_cont_dims_set(void *config_, void *dims_, const char *field, int* value); | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * options | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     void *sim_solver; | ||||||
|  |     int compute_adj; | ||||||
|  |     int compute_hess; | ||||||
|  | } ocp_nlp_dynamics_cont_opts; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_dynamics_cont_opts_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_dynamics_cont_opts_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_cont_opts_initialize_default(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_cont_opts_update(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_cont_opts_set(void *config, void *opts, const char *field, void* value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * memory | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     struct blasfeo_dvec fun; | ||||||
|  |     struct blasfeo_dvec adj; | ||||||
|  |     struct blasfeo_dvec *ux;            // pointer to ux in nlp_out at current stage
 | ||||||
|  |     struct blasfeo_dvec *tmp_ux;        // pointer to ux in tmp_nlp_out at current stage
 | ||||||
|  |     struct blasfeo_dvec *ux1;           // pointer to ux in nlp_out at next stage
 | ||||||
|  |     struct blasfeo_dvec *tmp_ux1;       // pointer to ux in tmp_nlp_out at next stage
 | ||||||
|  |     struct blasfeo_dvec *pi;            // pointer to pi in nlp_out at current stage
 | ||||||
|  |     struct blasfeo_dvec *tmp_pi;        // pointer to pi in tmp_nlp_out at current stage
 | ||||||
|  |     struct blasfeo_dmat *BAbt;          // pointer to BAbt in qp_in
 | ||||||
|  |     struct blasfeo_dmat *RSQrq;         // pointer to RSQrq in qp_in
 | ||||||
|  |     struct blasfeo_dvec *z_alg;         // pointer to output z at t = 0
 | ||||||
|  |     bool *set_sim_guess;                 // indicate if initialization for integrator is set from outside
 | ||||||
|  |     struct blasfeo_dvec *sim_guess;     // initializations for integrator
 | ||||||
|  |     // struct blasfeo_dvec *z;             // pointer to (input) z in nlp_out at current stage
 | ||||||
|  |     struct blasfeo_dmat *dzduxt;        // pointer to dzdux transposed
 | ||||||
|  |     void *sim_solver;                   // sim solver memory
 | ||||||
|  | } ocp_nlp_dynamics_cont_memory; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_dynamics_cont_memory_calculate_size(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_dynamics_cont_memory_assign(void *config, void *dims, void *opts, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | struct blasfeo_dvec *ocp_nlp_dynamics_cont_memory_get_fun_ptr(void *memory); | ||||||
|  | //
 | ||||||
|  | struct blasfeo_dvec *ocp_nlp_dynamics_cont_memory_get_adj_ptr(void *memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_cont_memory_set_ux_ptr(struct blasfeo_dvec *ux, void *memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_cont_memory_set_tmp_ux_ptr(struct blasfeo_dvec *tmp_ux, void *memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_cont_memory_set_ux1_ptr(struct blasfeo_dvec *ux1, void *memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_cont_memory_set_tmp_ux1_ptr(struct blasfeo_dvec *tmp_ux1, void *memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_cont_memory_set_pi_ptr(struct blasfeo_dvec *pi, void *memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_cont_memory_set_tmp_pi_ptr(struct blasfeo_dvec *tmp_pi, void *memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_cont_memory_set_BAbt_ptr(struct blasfeo_dmat *BAbt, void *memory); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * workspace | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     struct blasfeo_dmat hess; | ||||||
|  |     sim_in *sim_in; | ||||||
|  |     sim_out *sim_out; | ||||||
|  |     void *sim_solver;  // sim solver workspace
 | ||||||
|  | } ocp_nlp_dynamics_cont_workspace; | ||||||
|  | 
 | ||||||
|  | acados_size_t ocp_nlp_dynamics_cont_workspace_calculate_size(void *config, void *dims, void *opts); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * model | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     void *sim_model; | ||||||
|  |     // double *state_transition; // TODO
 | ||||||
|  |     double T;  // simulation time
 | ||||||
|  | } ocp_nlp_dynamics_cont_model; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_dynamics_cont_model_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_dynamics_cont_model_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_cont_model_set(void *config_, void *dims_, void *model_, const char *field, void *value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * functions | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_cont_config_initialize_default(void *config); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_cont_initialize(void *config_, void *dims, void *model_, void *opts, void *mem, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_cont_update_qp_matrices(void *config_, void *dims, void *model_, void *opts, void *mem, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_cont_compute_fun(void *config_, void *dims, void *model_, void *opts, void *mem, void *work_); | ||||||
|  | //
 | ||||||
|  | int ocp_nlp_dynamics_cont_precompute(void *config_, void *dims, void *model_, void *opts_, void *mem_, void *work_); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_NLP_OCP_NLP_DYNAMICS_CONT_H_
 | ||||||
|  | /// @}
 | ||||||
|  | /// @}
 | ||||||
| @ -0,0 +1,199 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// \addtogroup ocp_nlp
 | ||||||
|  | /// @{
 | ||||||
|  | /// \addtogroup ocp_nlp_dynamics
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_NLP_OCP_NLP_DYNAMICS_DISC_H_ | ||||||
|  | #define ACADOS_OCP_NLP_OCP_NLP_DYNAMICS_DISC_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // blasfeo
 | ||||||
|  | #include "blasfeo/include/blasfeo_common.h" | ||||||
|  | 
 | ||||||
|  | // acados
 | ||||||
|  | #include "acados/ocp_nlp/ocp_nlp_dynamics_common.h" | ||||||
|  | #include "acados/utils/external_function_generic.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * dims | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int nx;   // number of states at the current stage
 | ||||||
|  |     int nu;   // number of inputs at the current stage
 | ||||||
|  |     int nx1;  // number of states at the next stage
 | ||||||
|  |     int nu1;  // number of inputes at the next stage
 | ||||||
|  | } ocp_nlp_dynamics_disc_dims; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_dynamics_disc_dims_calculate_size(void *config); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_dynamics_disc_dims_assign(void *config, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_disc_dims_initialize(void *config, void *dims, int nx, int nu, int nx1, | ||||||
|  |                                            int nu1, int nz); | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_disc_dims_set(void *config_, void *dims_, const char *dim, int* value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * options | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int compute_adj; | ||||||
|  |     int compute_hess; | ||||||
|  | } ocp_nlp_dynamics_disc_opts; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_dynamics_disc_opts_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_dynamics_disc_opts_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_disc_opts_initialize_default(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_disc_opts_update(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | int ocp_nlp_dynamics_disc_precompute(void *config_, void *dims, void *model_, void *opts_, | ||||||
|  |                                         void *mem_, void *work_); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * memory | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     struct blasfeo_dvec fun; | ||||||
|  |     struct blasfeo_dvec adj; | ||||||
|  |     struct blasfeo_dvec *ux;     // pointer to ux in nlp_out at current stage
 | ||||||
|  |     struct blasfeo_dvec *tmp_ux; // pointer to ux in tmp_nlp_out at current stage
 | ||||||
|  |     struct blasfeo_dvec *ux1;    // pointer to ux in nlp_out at next stage
 | ||||||
|  |     struct blasfeo_dvec *tmp_ux1;// pointer to ux in tmp_nlp_out at next stage
 | ||||||
|  |     struct blasfeo_dvec *pi;     // pointer to pi in nlp_out at current stage
 | ||||||
|  |     struct blasfeo_dvec *tmp_pi; // pointer to pi in tmp_nlp_out at current stage
 | ||||||
|  |     struct blasfeo_dmat *BAbt;   // pointer to BAbt in qp_in
 | ||||||
|  |     struct blasfeo_dmat *RSQrq;  // pointer to RSQrq in qp_in
 | ||||||
|  | } ocp_nlp_dynamics_disc_memory; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_dynamics_disc_memory_calculate_size(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_dynamics_disc_memory_assign(void *config, void *dims, void *opts, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | struct blasfeo_dvec *ocp_nlp_dynamics_disc_memory_get_fun_ptr(void *memory); | ||||||
|  | //
 | ||||||
|  | struct blasfeo_dvec *ocp_nlp_dynamics_disc_memory_get_adj_ptr(void *memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_disc_memory_set_ux_ptr(struct blasfeo_dvec *ux, void *memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_disc_memory_set_tmp_ux_ptr(struct blasfeo_dvec *tmp_ux, void *memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_disc_memory_set_ux1_ptr(struct blasfeo_dvec *ux1, void *memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_disc_memory_set_tmp_ux1_ptr(struct blasfeo_dvec *tmp_ux1, void *memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_disc_memory_set_pi_ptr(struct blasfeo_dvec *pi, void *memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_disc_memory_set_tmp_pi_ptr(struct blasfeo_dvec *tmp_pi, void *memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_disc_memory_set_BAbt_ptr(struct blasfeo_dmat *BAbt, void *memory); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * workspace | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     struct blasfeo_dmat tmp_nv_nv; | ||||||
|  | } ocp_nlp_dynamics_disc_workspace; | ||||||
|  | 
 | ||||||
|  | acados_size_t ocp_nlp_dynamics_disc_workspace_calculate_size(void *config, void *dims, void *opts); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * model | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     external_function_generic *disc_dyn_fun; | ||||||
|  |     external_function_generic *disc_dyn_fun_jac; | ||||||
|  |     external_function_generic *disc_dyn_fun_jac_hess; | ||||||
|  | } ocp_nlp_dynamics_disc_model; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_dynamics_disc_model_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_dynamics_disc_model_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_disc_model_set(void *config_, void *dims_, void *model_, const char *field, void *value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * functions | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_disc_config_initialize_default(void *config); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_disc_initialize(void *config_, void *dims, void *model_, void *opts, void *mem, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_disc_update_qp_matrices(void *config_, void *dims, void *model_, void *opts, void *mem, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_dynamics_disc_compute_fun(void *config_, void *dims, void *model_, void *opts, void *mem, void *work_); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_NLP_OCP_NLP_DYNAMICS_DISC_H_
 | ||||||
|  | /// @}
 | ||||||
|  | /// @}
 | ||||||
| @ -0,0 +1,125 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// \ingroup ocp_nlp
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | /// \defgroup ocp_nlp_reg ocp_nlp_reg
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_NLP_OCP_NLP_REG_COMMON_H_ | ||||||
|  | #define ACADOS_OCP_NLP_OCP_NLP_REG_COMMON_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include "acados/ocp_qp/ocp_qp_common.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* dims */ | ||||||
|  | 
 | ||||||
|  | //typedef ocp_qp_dims ocp_nlp_reg_dims;
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int *nx; | ||||||
|  |     int *nu; | ||||||
|  |     int *nbu; | ||||||
|  |     int *nbx; | ||||||
|  |     int *ng; | ||||||
|  |     int N; | ||||||
|  | } ocp_nlp_reg_dims; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_reg_dims_calculate_size(int N); | ||||||
|  | //
 | ||||||
|  | ocp_nlp_reg_dims *ocp_nlp_reg_dims_assign(int N, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_reg_dims_set(void *config_, ocp_nlp_reg_dims *dims, int stage, char *field, int* value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* config */ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     /* dims */ | ||||||
|  |     acados_size_t (*dims_calculate_size)(int N); | ||||||
|  |     ocp_nlp_reg_dims *(*dims_assign)(int N, void *raw_memory); | ||||||
|  |     void (*dims_set)(void *config, ocp_nlp_reg_dims *dims, int stage, char *field, int *value); | ||||||
|  |     /* opts */ | ||||||
|  |     acados_size_t (*opts_calculate_size)(void); | ||||||
|  |     void *(*opts_assign)(void *raw_memory); | ||||||
|  |     void (*opts_initialize_default)(void *config, ocp_nlp_reg_dims *dims, void *opts); | ||||||
|  |     void (*opts_set)(void *config, ocp_nlp_reg_dims *dims, void *opts, char *field, void* value); | ||||||
|  |     /* memory */ | ||||||
|  |     acados_size_t (*memory_calculate_size)(void *config, ocp_nlp_reg_dims *dims, void *opts); | ||||||
|  |     void *(*memory_assign)(void *config, ocp_nlp_reg_dims *dims, void *opts, void *raw_memory); | ||||||
|  |     void (*memory_set)(void *config, ocp_nlp_reg_dims *dims, void *memory, char *field, void* value); | ||||||
|  |     void (*memory_set_RSQrq_ptr)(ocp_nlp_reg_dims *dims, struct blasfeo_dmat *mat, void *memory); | ||||||
|  |     void (*memory_set_rq_ptr)(ocp_nlp_reg_dims *dims, struct blasfeo_dvec *vec, void *memory); | ||||||
|  |     void (*memory_set_BAbt_ptr)(ocp_nlp_reg_dims *dims, struct blasfeo_dmat *mat, void *memory); | ||||||
|  |     void (*memory_set_b_ptr)(ocp_nlp_reg_dims *dims, struct blasfeo_dvec *vec, void *memory); | ||||||
|  |     void (*memory_set_idxb_ptr)(ocp_nlp_reg_dims *dims, int **idxb, void *memory); | ||||||
|  |     void (*memory_set_DCt_ptr)(ocp_nlp_reg_dims *dims, struct blasfeo_dmat *mat, void *memory); | ||||||
|  |     void (*memory_set_ux_ptr)(ocp_nlp_reg_dims *dims, struct blasfeo_dvec *vec, void *memory); | ||||||
|  |     void (*memory_set_pi_ptr)(ocp_nlp_reg_dims *dims, struct blasfeo_dvec *vec, void *memory); | ||||||
|  |     void (*memory_set_lam_ptr)(ocp_nlp_reg_dims *dims, struct blasfeo_dvec *vec, void *memory); | ||||||
|  |     /* functions */ | ||||||
|  |     void (*regularize_hessian)(void *config, ocp_nlp_reg_dims *dims, void *opts, void *memory); | ||||||
|  |     void (*correct_dual_sol)(void *config, ocp_nlp_reg_dims *dims, void *opts, void *memory); | ||||||
|  | } ocp_nlp_reg_config; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_reg_config_calculate_size(void); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_reg_config_assign(void *raw_memory); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* regularization help functions */ | ||||||
|  | void acados_reconstruct_A(int dim, double *A, double *V, double *d); | ||||||
|  | void acados_mirror(int dim, double *A, double *V, double *d, double *e, double epsilon); | ||||||
|  | void acados_project(int dim, double *A, double *V, double *d, double *e, double epsilon); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_NLP_OCP_NLP_REG_COMMON_H_
 | ||||||
|  | /// @}
 | ||||||
|  | /// @}
 | ||||||
| @ -0,0 +1,149 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// \addtogroup ocp_nlp
 | ||||||
|  | /// @{
 | ||||||
|  | /// \addtogroup ocp_nlp_reg
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_NLP_OCP_NLP_REG_CONVEXIFY_H_ | ||||||
|  | #define ACADOS_OCP_NLP_OCP_NLP_REG_CONVEXIFY_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // blasfeo
 | ||||||
|  | #include "blasfeo/include/blasfeo_common.h" | ||||||
|  | 
 | ||||||
|  | // acados
 | ||||||
|  | #include "acados/ocp_nlp/ocp_nlp_reg_common.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * dims | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | // use the functions in ocp_nlp_reg_common
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * options | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     double delta; | ||||||
|  |     double epsilon; | ||||||
|  | //    double gamma; // 0.0
 | ||||||
|  | } ocp_nlp_reg_convexify_opts; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_reg_convexify_opts_calculate_size(void); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_reg_convexify_opts_assign(void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_reg_convexify_opts_initialize_default(void *config_, ocp_nlp_reg_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_reg_convexify_opts_set(void *config_, ocp_nlp_reg_dims *dims, void *opts_, char *field, void* value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * memory | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct { | ||||||
|  |     double *R; | ||||||
|  |     double *V; // TODO move to workspace
 | ||||||
|  |     double *d; // TODO move to workspace
 | ||||||
|  |     double *e; // TODO move to workspace
 | ||||||
|  |     double *reg_hess; // TODO move to workspace
 | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dmat Q_tilde; | ||||||
|  |     struct blasfeo_dmat Q_bar; | ||||||
|  |     struct blasfeo_dmat BAQ; | ||||||
|  |     struct blasfeo_dmat L; | ||||||
|  |     struct blasfeo_dmat delta_eye; | ||||||
|  |     struct blasfeo_dmat St_copy; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dmat *original_RSQrq; | ||||||
|  |     struct blasfeo_dmat tmp_RSQ; | ||||||
|  | 
 | ||||||
|  | 	struct blasfeo_dvec tmp_nuxM; | ||||||
|  | 	struct blasfeo_dvec tmp_nbgM; | ||||||
|  | 
 | ||||||
|  | //    struct blasfeo_dvec grad;
 | ||||||
|  | //    struct blasfeo_dvec b2;
 | ||||||
|  | 
 | ||||||
|  |     // giaf's
 | ||||||
|  |     struct blasfeo_dmat **RSQrq;  // pointer to RSQrq in qp_in
 | ||||||
|  |     struct blasfeo_dvec **rq;  // pointer to rq in qp_in
 | ||||||
|  |     struct blasfeo_dmat **BAbt;  // pointer to BAbt in qp_in
 | ||||||
|  |     struct blasfeo_dvec **b;  // pointer to b in qp_in
 | ||||||
|  |     struct blasfeo_dmat **DCt;  // pointer to DCt in qp_in
 | ||||||
|  |     struct blasfeo_dvec **ux;  // pointer to ux in qp_out
 | ||||||
|  |     struct blasfeo_dvec **pi;  // pointer to pi in qp_out
 | ||||||
|  |     struct blasfeo_dvec **lam;  // pointer to lam in qp_out
 | ||||||
|  | 	int **idxb; // pointer to idxb in qp_in
 | ||||||
|  | 
 | ||||||
|  | } ocp_nlp_reg_convexify_memory; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_reg_convexify_calculate_memory_size(void *config, ocp_nlp_reg_dims *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_reg_convexify_assign_memory(void *config, ocp_nlp_reg_dims *dims, void *opts, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * workspace | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  |  // TODO
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * functions | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_reg_convexify_config_initialize_default(ocp_nlp_reg_config *config); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_NLP_OCP_NLP_REG_CONVEXIFY_H_
 | ||||||
|  | /// @}
 | ||||||
|  | /// @}
 | ||||||
| @ -0,0 +1,124 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// \addtogroup ocp_nlp
 | ||||||
|  | /// @{
 | ||||||
|  | /// \addtogroup ocp_nlp_reg
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_NLP_OCP_NLP_REG_MIRROR_H_ | ||||||
|  | #define ACADOS_OCP_NLP_OCP_NLP_REG_MIRROR_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // blasfeo
 | ||||||
|  | #include "blasfeo/include/blasfeo_common.h" | ||||||
|  | 
 | ||||||
|  | // acados
 | ||||||
|  | #include "acados/ocp_nlp/ocp_nlp_reg_common.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * dims | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | // use the functions in ocp_nlp_reg_common
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * options | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     double epsilon; | ||||||
|  | } ocp_nlp_reg_mirror_opts; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_reg_mirror_opts_calculate_size(void); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_reg_mirror_opts_assign(void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_reg_mirror_opts_initialize_default(void *config_, ocp_nlp_reg_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_reg_mirror_opts_set(void *config_, ocp_nlp_reg_dims *dims, void *opts_, char *field, void* value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * memory | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     double *reg_hess; // TODO move to workspace
 | ||||||
|  |     double *V; // TODO move to workspace
 | ||||||
|  |     double *d; // TODO move to workspace
 | ||||||
|  |     double *e; // TODO move to workspace
 | ||||||
|  | 
 | ||||||
|  |     // giaf's
 | ||||||
|  |     struct blasfeo_dmat **RSQrq;  // pointer to RSQrq in qp_in
 | ||||||
|  | } ocp_nlp_reg_mirror_memory; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_reg_mirror_memory_calculate_size(void *config, ocp_nlp_reg_dims *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_reg_mirror_memory_assign(void *config, ocp_nlp_reg_dims *dims, void *opts, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * workspace | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  |  // TODO
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * functions | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_reg_mirror_config_initialize_default(ocp_nlp_reg_config *config); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_NLP_OCP_NLP_REG_MIRROR_H_
 | ||||||
|  | /// @}
 | ||||||
|  | /// @}
 | ||||||
| @ -0,0 +1,120 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// \addtogroup ocp_nlp
 | ||||||
|  | /// @{
 | ||||||
|  | /// \addtogroup ocp_nlp_reg
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_NLP_OCP_NLP_REG_NOREG_H_ | ||||||
|  | #define ACADOS_OCP_NLP_OCP_NLP_REG_NOREG_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // blasfeo
 | ||||||
|  | #include "blasfeo/include/blasfeo_common.h" | ||||||
|  | 
 | ||||||
|  | // acados
 | ||||||
|  | #include "acados/ocp_nlp/ocp_nlp_reg_common.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * dims | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | // use the functions in ocp_nlp_reg_common
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * options | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int dummy; | ||||||
|  | } ocp_nlp_reg_noreg_opts; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_reg_noreg_opts_calculate_size(void); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_reg_noreg_opts_assign(void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_reg_noreg_opts_initialize_default(void *config_, ocp_nlp_reg_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_reg_noreg_opts_set(void *config_, ocp_nlp_reg_dims *dims, void *opts_, char *field, void* value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * memory | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int dummy; | ||||||
|  | } ocp_nlp_reg_noreg_memory; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_reg_noreg_memory_calculate_size(void *config, ocp_nlp_reg_dims *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_reg_noreg_memory_assign(void *config, ocp_nlp_reg_dims *dims, void *opts, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * workspace | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | // not needed
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * functions | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_reg_noreg_config_initialize_default(ocp_nlp_reg_config *config); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_NLP_OCP_NLP_REG_NOREG_H_
 | ||||||
|  | 
 | ||||||
|  | /// @}
 | ||||||
|  | /// @}
 | ||||||
| @ -0,0 +1,124 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// \addtogroup ocp_nlp
 | ||||||
|  | /// @{
 | ||||||
|  | /// \addtogroup ocp_nlp_reg
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_NLP_OCP_NLP_REG_PROJECT_H_ | ||||||
|  | #define ACADOS_OCP_NLP_OCP_NLP_REG_PROJECT_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // blasfeo
 | ||||||
|  | #include "blasfeo/include/blasfeo_common.h" | ||||||
|  | 
 | ||||||
|  | // acados
 | ||||||
|  | #include "acados/ocp_nlp/ocp_nlp_reg_common.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * dims | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | // use the functions in ocp_nlp_reg_common
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * options | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     double epsilon; | ||||||
|  | } ocp_nlp_reg_project_opts; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_reg_project_opts_calculate_size(void); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_reg_project_opts_assign(void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_reg_project_opts_initialize_default(void *config_, ocp_nlp_reg_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_reg_project_opts_set(void *config_, ocp_nlp_reg_dims *dims, void *opts_, char *field, void* value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * memory | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     double *reg_hess; // TODO move to workspace
 | ||||||
|  |     double *V; // TODO move to workspace
 | ||||||
|  |     double *d; // TODO move to workspace
 | ||||||
|  |     double *e; // TODO move to workspace
 | ||||||
|  | 
 | ||||||
|  |     // giaf's
 | ||||||
|  |     struct blasfeo_dmat **RSQrq;  // pointer to RSQrq in qp_in
 | ||||||
|  | } ocp_nlp_reg_project_memory; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_reg_project_memory_calculate_size(void *config, ocp_nlp_reg_dims *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_reg_project_memory_assign(void *config, ocp_nlp_reg_dims *dims, void *opts, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * workspace | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  |  // TODO
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * functions | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_reg_project_config_initialize_default(ocp_nlp_reg_config *config); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_NLP_OCP_NLP_REG_PROJECT_H_
 | ||||||
|  | /// @}
 | ||||||
|  | /// @}
 | ||||||
| @ -0,0 +1,135 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// \addtogroup ocp_nlp
 | ||||||
|  | /// @{
 | ||||||
|  | /// \addtogroup ocp_nlp_reg
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_NLP_OCP_NLP_REG_PROJECT_REDUC_HESS_H_ | ||||||
|  | #define ACADOS_OCP_NLP_OCP_NLP_REG_PROJECT_REDUC_HESS_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // blasfeo
 | ||||||
|  | #include "blasfeo/include/blasfeo_common.h" | ||||||
|  | 
 | ||||||
|  | // acados
 | ||||||
|  | #include "acados/ocp_nlp/ocp_nlp_reg_common.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * dims | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | // use the functions in ocp_nlp_reg_common
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * options | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     double thr_eig; | ||||||
|  |     double min_eig; | ||||||
|  |     double min_pivot; | ||||||
|  | 	int pivoting; | ||||||
|  | } ocp_nlp_reg_project_reduc_hess_opts; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_reg_project_reduc_hess_opts_calculate_size(void); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_reg_project_reduc_hess_opts_assign(void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_reg_project_reduc_hess_opts_initialize_default(void *config_, ocp_nlp_reg_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_reg_project_reduc_hess_opts_set(void *config_, ocp_nlp_reg_dims *dims, void *opts_, char *field, void* value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * memory | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     double *reg_hess; // TODO move to workspace
 | ||||||
|  |     double *V; // TODO move to workspace
 | ||||||
|  |     double *d; // TODO move to workspace
 | ||||||
|  |     double *e; // TODO move to workspace
 | ||||||
|  | 
 | ||||||
|  |     // giaf's
 | ||||||
|  |     struct blasfeo_dmat L; // TODO move to workspace
 | ||||||
|  |     struct blasfeo_dmat L2; // TODO move to workspace
 | ||||||
|  |     struct blasfeo_dmat L3; // TODO move to workspace
 | ||||||
|  |     struct blasfeo_dmat Ls; // TODO move to workspace
 | ||||||
|  |     struct blasfeo_dmat P; // TODO move to workspace
 | ||||||
|  |     struct blasfeo_dmat AL; // TODO move to workspace
 | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dmat **RSQrq;  // pointer to RSQrq in qp_in
 | ||||||
|  |     struct blasfeo_dmat **BAbt;  // pointer to RSQrq in qp_in
 | ||||||
|  | } ocp_nlp_reg_project_reduc_hess_memory; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_reg_project_reduc_hess_memory_calculate_size(void *config, ocp_nlp_reg_dims *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_reg_project_reduc_hess_memory_assign(void *config, ocp_nlp_reg_dims *dims, void *opts, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * workspace | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  |  // TODO
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * functions | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_reg_project_reduc_hess_config_initialize_default(ocp_nlp_reg_config *config); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_NLP_OCP_NLP_REG_PROJECT_REDUC_HESS_H_
 | ||||||
|  | /// @}
 | ||||||
|  | /// @}
 | ||||||
| @ -0,0 +1,171 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// \addtogroup ocp_nlp
 | ||||||
|  | /// @{
 | ||||||
|  | /// \addtogroup ocp_nlp_solver
 | ||||||
|  | /// @{
 | ||||||
|  | /// \addtogroup ocp_nlp_sqp ocp_nlp_sqp
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_NLP_OCP_NLP_SQP_H_ | ||||||
|  | #define ACADOS_OCP_NLP_OCP_NLP_SQP_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // acados
 | ||||||
|  | #include "acados/ocp_nlp/ocp_nlp_common.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * options | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     ocp_nlp_opts *nlp_opts; | ||||||
|  |     double tol_stat;     // exit tolerance on stationarity condition
 | ||||||
|  |     double tol_eq;       // exit tolerance on equality constraints
 | ||||||
|  |     double tol_ineq;     // exit tolerance on inequality constraints
 | ||||||
|  |     double tol_comp;     // exit tolerance on complementarity condition
 | ||||||
|  |     int max_iter; | ||||||
|  |     int ext_qp_res;      // compute external QP residuals (i.e. at SQP level) at each SQP iteration (for debugging)
 | ||||||
|  |     int qp_warm_start;   // qp_warm_start in all but the first sqp iterations
 | ||||||
|  |     bool warm_start_first_qp; // to set qp_warm_start in first iteration
 | ||||||
|  |     int rti_phase;       // only phase 0 at the moment 
 | ||||||
|  |     int print_level;     // verbosity
 | ||||||
|  |     int initialize_t_slacks;  // 0-false or 1-true
 | ||||||
|  | 
 | ||||||
|  | } ocp_nlp_sqp_opts; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_sqp_opts_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_sqp_opts_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_sqp_opts_initialize_default(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_sqp_opts_update(void *config, void *dims, void *opts); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_sqp_opts_set(void *config_, void *opts_, const char *field, void* value); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_sqp_opts_set_at_stage(void *config_, void *opts_, size_t stage, const char *field, void* value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * memory | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     // nlp memory
 | ||||||
|  |     ocp_nlp_memory *nlp_mem; | ||||||
|  | 
 | ||||||
|  |     double time_qp_sol; | ||||||
|  |     double time_qp_solver_call; | ||||||
|  |     double time_qp_xcond; | ||||||
|  |     double time_lin; | ||||||
|  |     double time_reg; | ||||||
|  |     double time_tot; | ||||||
|  |     double time_glob; | ||||||
|  |     double time_sim; | ||||||
|  |     double time_sim_la; | ||||||
|  |     double time_sim_ad; | ||||||
|  | 
 | ||||||
|  |     // statistics
 | ||||||
|  |     double *stat; | ||||||
|  |     int stat_m; | ||||||
|  |     int stat_n; | ||||||
|  | 
 | ||||||
|  |     int status; | ||||||
|  |     int sqp_iter; | ||||||
|  | 
 | ||||||
|  | } ocp_nlp_sqp_memory; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_sqp_memory_calculate_size(void *config, void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_sqp_memory_assign(void *config, void *dims, void *opts_, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * workspace | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     ocp_nlp_workspace *nlp_work; | ||||||
|  | 
 | ||||||
|  |     // temp QP in & out (to be used as workspace in param sens)
 | ||||||
|  |     ocp_qp_in *tmp_qp_in; | ||||||
|  |     ocp_qp_out *tmp_qp_out; | ||||||
|  | 
 | ||||||
|  |     // qp residuals
 | ||||||
|  |     ocp_qp_res *qp_res; | ||||||
|  |     ocp_qp_res_ws *qp_res_ws; | ||||||
|  | 
 | ||||||
|  | } ocp_nlp_sqp_workspace; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_sqp_workspace_calculate_size(void *config, void *dims, void *opts_); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * functions | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | int ocp_nlp_sqp(void *config, void *dims, void *nlp_in, void *nlp_out, | ||||||
|  |                 void *args, void *mem, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_sqp_config_initialize_default(void *config_); | ||||||
|  | //
 | ||||||
|  | int ocp_nlp_sqp_precompute(void *config_, void *dims_, void *nlp_in_, void *nlp_out_, | ||||||
|  |                 void *opts_, void *mem_, void *work_); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_NLP_OCP_NLP_SQP_H_
 | ||||||
|  | /// @}
 | ||||||
|  | /// @}
 | ||||||
|  | /// @}
 | ||||||
| @ -0,0 +1,172 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// \addtogroup ocp_nlp
 | ||||||
|  | /// @{
 | ||||||
|  | /// \addtogroup ocp_nlp_solver
 | ||||||
|  | /// @{
 | ||||||
|  | /// \addtogroup ocp_nlp_sqp_rti ocp_nlp_sqp_rti
 | ||||||
|  | /// @{
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_NLP_OCP_NLP_SQP_RTI_H_ | ||||||
|  | #define ACADOS_OCP_NLP_OCP_NLP_SQP_RTI_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // acados
 | ||||||
|  | #include "acados/ocp_nlp/ocp_nlp_common.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * options | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     ocp_nlp_opts *nlp_opts; | ||||||
|  |     int compute_dual_sol; | ||||||
|  |     int ext_qp_res;           // compute external QP residuals (i.e. at SQP level) at each SQP iteration (for debugging)
 | ||||||
|  |     int qp_warm_start;        // NOTE: this is not actually setting the warm_start! Just for compatibility with sqp.
 | ||||||
|  |     bool warm_start_first_qp; // to set qp_warm_start in first iteration
 | ||||||
|  |     int rti_phase;            // phase of RTI. Possible values 1 (preparation), 2 (feedback) 0 (both)
 | ||||||
|  |     int print_level;     // verbosity
 | ||||||
|  | 
 | ||||||
|  | } ocp_nlp_sqp_rti_opts; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_sqp_rti_opts_calculate_size(void *config_, void *dims_); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_sqp_rti_opts_assign(void *config_, void *dims_, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_sqp_rti_opts_initialize_default(void *config_, void *dims_, void *opts_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_sqp_rti_opts_update(void *config_, void *dims_, void *opts_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_sqp_rti_opts_set(void *config_, void *opts_, const char *field, void* value); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_sqp_rti_opts_set_at_stage(void *config_, void *opts_, size_t stage, | ||||||
|  |     const char *field, void* value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * memory | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     // nlp memory
 | ||||||
|  |     ocp_nlp_memory *nlp_mem; | ||||||
|  | 
 | ||||||
|  |     double time_qp_sol; | ||||||
|  |     double time_qp_solver_call; | ||||||
|  |     double time_qp_xcond; | ||||||
|  |     double time_lin; | ||||||
|  |     double time_reg; | ||||||
|  |     double time_tot; | ||||||
|  |     double time_glob; | ||||||
|  | 
 | ||||||
|  |     // statistics
 | ||||||
|  |     double *stat; | ||||||
|  |     int stat_m; | ||||||
|  |     int stat_n; | ||||||
|  | 
 | ||||||
|  |     int status; | ||||||
|  | 
 | ||||||
|  | } ocp_nlp_sqp_rti_memory; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_sqp_rti_memory_calculate_size(void *config_, void *dims_, void *opts_); | ||||||
|  | //
 | ||||||
|  | void *ocp_nlp_sqp_rti_memory_assign(void *config_, void *dims_, void *opts_, | ||||||
|  |     void *raw_memory); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * workspace | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     ocp_nlp_workspace *nlp_work; | ||||||
|  | 
 | ||||||
|  |     // temp QP in & out (to be used as workspace in param sens)
 | ||||||
|  |     ocp_qp_in *tmp_qp_in; | ||||||
|  |     ocp_qp_out *tmp_qp_out; | ||||||
|  | 
 | ||||||
|  |     // qp residuals
 | ||||||
|  |     ocp_qp_res *qp_res; | ||||||
|  |     ocp_qp_res_ws *qp_res_ws; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | } ocp_nlp_sqp_rti_workspace; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_nlp_sqp_rti_workspace_calculate_size(void *config_, void *dims_, void *opts_); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * functions | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | void ocp_nlp_sqp_rti_preparation_step(void *config_, void *dims_, | ||||||
|  |     void *nlp_in_, void *nlp_out_, void *opts, void *mem_, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_sqp_rti_feedback_step(void *config_, void *dims_, | ||||||
|  |     void *nlp_in_, void *nlp_out_, void *opts_, void *mem_, void *work_); | ||||||
|  | //
 | ||||||
|  | int ocp_nlp_sqp_rti(void *config_, void *dims_, void *nlp_in_, void *nlp_out_, | ||||||
|  |     void *opts_, void *mem_, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_nlp_sqp_rti_config_initialize_default(void *config_); | ||||||
|  | //
 | ||||||
|  | int ocp_nlp_sqp_rti_precompute(void *config_, void *dims_, | ||||||
|  |     void *nlp_in_, void *nlp_out_, void *opts_, void *mem_, void *work_); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_NLP_OCP_NLP_SQP_RTI_H_
 | ||||||
|  | /// @}
 | ||||||
|  | /// @}
 | ||||||
|  | /// @}
 | ||||||
| @ -0,0 +1,182 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_QP_OCP_QP_COMMON_H_ | ||||||
|  | #define ACADOS_OCP_QP_OCP_QP_COMMON_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // hpipm
 | ||||||
|  | #include "hpipm/include/hpipm_d_ocp_qp.h" | ||||||
|  | #include "hpipm/include/hpipm_d_ocp_qp_dim.h" | ||||||
|  | #include "hpipm/include/hpipm_d_ocp_qp_res.h" | ||||||
|  | #include "hpipm/include/hpipm_d_ocp_qp_sol.h" | ||||||
|  | // acados
 | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct d_ocp_qp_dim ocp_qp_dims; | ||||||
|  | typedef struct d_ocp_qp ocp_qp_in; | ||||||
|  | typedef struct d_ocp_qp_sol ocp_qp_out; | ||||||
|  | typedef struct d_ocp_qp_res ocp_qp_res; | ||||||
|  | typedef struct d_ocp_qp_res_ws ocp_qp_res_ws; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef QP_SOLVER_CONFIG_ | ||||||
|  | #define QP_SOLVER_CONFIG_ | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     void (*dims_set)(void *config_, void *dims_, int stage, const char *field, int* value); | ||||||
|  |     acados_size_t (*opts_calculate_size)(void *config, void *dims); | ||||||
|  |     void *(*opts_assign)(void *config, void *dims, void *raw_memory); | ||||||
|  |     void (*opts_initialize_default)(void *config, void *dims, void *opts); | ||||||
|  |     void (*opts_update)(void *config, void *dims, void *opts); | ||||||
|  |     void (*opts_set)(void *config_, void *opts_, const char *field, void* value); | ||||||
|  |     acados_size_t (*memory_calculate_size)(void *config, void *dims, void *opts); | ||||||
|  |     void *(*memory_assign)(void *config, void *dims, void *opts, void *raw_memory); | ||||||
|  |     void (*memory_get)(void *config_, void *mem_, const char *field, void* value); | ||||||
|  |     acados_size_t (*workspace_calculate_size)(void *config, void *dims, void *opts); | ||||||
|  |     int (*evaluate)(void *config, void *qp_in, void *qp_out, void *opts, void *mem, void *work); | ||||||
|  |     void (*eval_sens)(void *config, void *qp_in, void *qp_out, void *opts, void *mem, void *work); | ||||||
|  | } qp_solver_config; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     acados_size_t (*dims_calculate_size)(void *config, int N); | ||||||
|  |     void *(*dims_assign)(void *config, int N, void *raw_memory); | ||||||
|  |     void (*dims_set)(void *config, void *dims_, int stage, const char *field, int* value); | ||||||
|  |     void (*dims_get)(void *config, void *dims, const char *field, void* value); | ||||||
|  |     // TODO add config everywhere !!!!!
 | ||||||
|  |     acados_size_t (*opts_calculate_size)(void *dims); | ||||||
|  |     void *(*opts_assign)(void *dims, void *raw_memory); | ||||||
|  |     void (*opts_initialize_default)(void *dims, void *opts); | ||||||
|  |     void (*opts_update)(void *dims, void *opts); | ||||||
|  |     void (*opts_set)(void *opts_, const char *field, void* value); | ||||||
|  |     acados_size_t (*memory_calculate_size)(void *dims, void *opts); | ||||||
|  |     void *(*memory_assign)(void *dims, void *opts, void *raw_memory); | ||||||
|  |     void (*memory_get)(void *config, void *mem, const char *field, void* value); | ||||||
|  |     acados_size_t (*workspace_calculate_size)(void *dims, void *opts); | ||||||
|  |     int (*condensing)(void *qp_in, void *qp_out, void *opts, void *mem, void *work); | ||||||
|  |     int (*condensing_rhs)(void *qp_in, void *qp_out, void *opts, void *mem, void *work); | ||||||
|  |     int (*expansion)(void *qp_in, void *qp_out, void *opts, void *mem, void *work); | ||||||
|  | } ocp_qp_xcond_config; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// Struct containing metrics of the qp solver.
 | ||||||
|  | #ifndef QP_INFO_ | ||||||
|  | #define QP_INFO_ | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     double solve_QP_time; | ||||||
|  |     double condensing_time; | ||||||
|  |     double interface_time; | ||||||
|  |     double total_time; | ||||||
|  |     int num_iter; | ||||||
|  |     int t_computed; | ||||||
|  | } qp_info; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* config */ | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_solver_config_calculate_size(); | ||||||
|  | //
 | ||||||
|  | qp_solver_config *ocp_qp_solver_config_assign(void *raw_memory); | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_condensing_config_calculate_size(); | ||||||
|  | //
 | ||||||
|  | ocp_qp_xcond_config *ocp_qp_condensing_config_assign(void *raw_memory); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* dims */ | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_dims_calculate_size(int N); | ||||||
|  | //
 | ||||||
|  | ocp_qp_dims *ocp_qp_dims_assign(int N, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_dims_set(void *config_, void *dims, int stage, const char *field, int* value); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_dims_get(void *config_, void *dims, int stage, const char *field, int* value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* in */ | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_in_calculate_size(ocp_qp_dims *dims); | ||||||
|  | //
 | ||||||
|  | ocp_qp_in *ocp_qp_in_assign(ocp_qp_dims *dims, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* out */ | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_out_calculate_size(ocp_qp_dims *dims); | ||||||
|  | //
 | ||||||
|  | ocp_qp_out *ocp_qp_out_assign(ocp_qp_dims *dims, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | /* res */ | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_res_calculate_size(ocp_qp_dims *dims); | ||||||
|  | //
 | ||||||
|  | ocp_qp_res *ocp_qp_res_assign(ocp_qp_dims *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_res_workspace_calculate_size(ocp_qp_dims *dims); | ||||||
|  | //
 | ||||||
|  | ocp_qp_res_ws *ocp_qp_res_workspace_assign(ocp_qp_dims *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_res_compute(ocp_qp_in *qp_in, ocp_qp_out *qp_out, ocp_qp_res *qp_res, ocp_qp_res_ws *res_ws); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_res_compute_nrm_inf(ocp_qp_res *qp_res, double res[4]); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* misc */ | ||||||
|  | //
 | ||||||
|  | void ocp_qp_stack_slacks_dims(ocp_qp_dims *in, ocp_qp_dims *out); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_stack_slacks(ocp_qp_in *in, ocp_qp_in *out); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_compute_t(ocp_qp_in *qp_in, ocp_qp_out *qp_out); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_QP_OCP_QP_COMMON_H_
 | ||||||
| @ -0,0 +1,121 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_QP_OCP_QP_COMMON_FRONTEND_H_ | ||||||
|  | #define ACADOS_OCP_QP_OCP_QP_COMMON_FRONTEND_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include "acados/ocp_qp/ocp_qp_common.h" | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int N; | ||||||
|  |     int *nx; | ||||||
|  |     int *nu; | ||||||
|  |     int *nb; | ||||||
|  |     int *nc; | ||||||
|  |     double **A; | ||||||
|  |     double **B; | ||||||
|  |     double **b; | ||||||
|  |     double **Q; | ||||||
|  |     double **S; | ||||||
|  |     double **R; | ||||||
|  |     double **q; | ||||||
|  |     double **r; | ||||||
|  |     int **idxb; | ||||||
|  |     double **lb; | ||||||
|  |     double **ub; | ||||||
|  |     double **Cx; | ||||||
|  |     double **Cu; | ||||||
|  |     double **lc; | ||||||
|  |     double **uc; | ||||||
|  | } colmaj_ocp_qp_in; | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     double **x; | ||||||
|  |     double **u; | ||||||
|  |     double **pi; | ||||||
|  |     double **lam; | ||||||
|  | } colmaj_ocp_qp_out; | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     double **res_r; | ||||||
|  |     double **res_q; | ||||||
|  |     double **res_ls; | ||||||
|  |     double **res_us; | ||||||
|  |     double **res_b; | ||||||
|  |     double **res_d_lb; | ||||||
|  |     double **res_d_ub; | ||||||
|  |     double **res_d_lg; | ||||||
|  |     double **res_d_ug; | ||||||
|  |     double **res_d_ls; | ||||||
|  |     double **res_d_us; | ||||||
|  |     double **res_m_lb; | ||||||
|  |     double **res_m_ub; | ||||||
|  |     double **res_m_lg; | ||||||
|  |     double **res_m_ug; | ||||||
|  |     double **res_m_ls; | ||||||
|  |     double **res_m_us; | ||||||
|  |     double res_nrm_inf[4]; | ||||||
|  | } colmaj_ocp_qp_res; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t colmaj_ocp_qp_in_calculate_size(ocp_qp_dims *dims); | ||||||
|  | //
 | ||||||
|  | char *assign_colmaj_ocp_qp_in(ocp_qp_dims *dims, colmaj_ocp_qp_in **qp_in, void *ptr); | ||||||
|  | //
 | ||||||
|  | acados_size_t colmaj_ocp_qp_out_calculate_size(ocp_qp_dims *dims); | ||||||
|  | //
 | ||||||
|  | char *assign_colmaj_ocp_qp_out(ocp_qp_dims *dims, colmaj_ocp_qp_out **qp_out, void *ptr); | ||||||
|  | //
 | ||||||
|  | acados_size_t colmaj_ocp_qp_res_calculate_size(ocp_qp_dims *dims); | ||||||
|  | //
 | ||||||
|  | char *assign_colmaj_ocp_qp_res(ocp_qp_dims *dims, colmaj_ocp_qp_res **qp_res, void *ptr); | ||||||
|  | //
 | ||||||
|  | void convert_colmaj_to_ocp_qp_in(colmaj_ocp_qp_in *cm_qp_in, ocp_qp_in *qp_in); | ||||||
|  | //
 | ||||||
|  | void convert_ocp_qp_out_to_colmaj(ocp_qp_out *qp_out, colmaj_ocp_qp_out *cm_qp_out); | ||||||
|  | //
 | ||||||
|  | void convert_ocp_qp_res_to_colmaj(ocp_qp_res *qp_res, colmaj_ocp_qp_res *cm_qp_res); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_QP_OCP_QP_COMMON_FRONTEND_H_
 | ||||||
| @ -0,0 +1,117 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_QP_OCP_QP_FULL_CONDENSING_H_ | ||||||
|  | #define ACADOS_OCP_QP_OCP_QP_FULL_CONDENSING_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // hpipm
 | ||||||
|  | #include "hpipm/include/hpipm_d_ocp_qp_red.h" | ||||||
|  | // acados
 | ||||||
|  | #include "acados/dense_qp/dense_qp_common.h" | ||||||
|  | #include "acados/ocp_qp/ocp_qp_common.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     ocp_qp_dims *orig_dims; | ||||||
|  |     ocp_qp_dims *red_dims; // dims of reduced qp
 | ||||||
|  |     dense_qp_dims *fcond_dims; | ||||||
|  | } ocp_qp_full_condensing_dims; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct ocp_qp_full_condensing_opts_ | ||||||
|  | { | ||||||
|  |     struct d_cond_qp_arg *hpipm_cond_opts; | ||||||
|  |     struct d_ocp_qp_reduce_eq_dof_arg *hpipm_red_opts; | ||||||
|  | //    dense_qp_dims *fcond_dims;  // TODO(all): move to dims
 | ||||||
|  |     int cond_hess; // 0 cond only rhs, 1 cond hess + rhs
 | ||||||
|  |     int expand_dual_sol; // 0 primal sol only, 1 primal + dual sol
 | ||||||
|  |     int ric_alg; | ||||||
|  |     int mem_qp_in; // allocate qp_in in memory
 | ||||||
|  | } ocp_qp_full_condensing_opts; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct ocp_qp_full_condensing_memory_ | ||||||
|  | { | ||||||
|  |     struct d_cond_qp_ws *hpipm_cond_work; | ||||||
|  |     struct d_ocp_qp_reduce_eq_dof_ws *hpipm_red_work; | ||||||
|  |     // in memory
 | ||||||
|  |     dense_qp_in *fcond_qp_in; | ||||||
|  |     dense_qp_out *fcond_qp_out; | ||||||
|  |     ocp_qp_in *red_qp; // reduced qp
 | ||||||
|  |     ocp_qp_out *red_sol; // reduced qp sol
 | ||||||
|  |     // only pointer
 | ||||||
|  |     ocp_qp_in *ptr_qp_in; | ||||||
|  |     qp_info *qp_out_info; // info in fcond_qp_in
 | ||||||
|  |     double time_qp_xcond; | ||||||
|  | } ocp_qp_full_condensing_memory; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_full_condensing_opts_calculate_size(void *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_qp_full_condensing_opts_assign(void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_full_condensing_opts_initialize_default(void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_full_condensing_opts_update(void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_full_condensing_opts_set(void *opts_, const char *field, void* value); | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_full_condensing_memory_calculate_size(void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void *ocp_qp_full_condensing_memory_assign(void *dims, void *opts_, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_full_condensing_workspace_calculate_size(void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | int ocp_qp_full_condensing(void *in, void *out, void *opts, void *mem, void *work); | ||||||
|  | //
 | ||||||
|  | int ocp_qp_full_expansion(void *in, void *out, void *opts, void *mem, void *work); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_full_condensing_config_initialize_default(void *config_); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_QP_OCP_QP_FULL_CONDENSING_H_
 | ||||||
| @ -0,0 +1,100 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_QP_OCP_QP_HPIPM_H_ | ||||||
|  | #define ACADOS_OCP_QP_OCP_QP_HPIPM_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // hpipm
 | ||||||
|  | #include "hpipm/include/hpipm_d_ocp_qp_ipm.h" | ||||||
|  | // acados
 | ||||||
|  | #include "acados/ocp_qp/ocp_qp_common.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // struct of arguments to the solver
 | ||||||
|  | // TODO(roversch): why not make this a typedef of the underlying struct?
 | ||||||
|  | typedef struct ocp_qp_hpipm_opts_ | ||||||
|  | { | ||||||
|  |     struct d_ocp_qp_ipm_arg *hpipm_opts; | ||||||
|  | } ocp_qp_hpipm_opts; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // TODO(roversch): why not make this a typedef of the underlying struct?
 | ||||||
|  | // struct of the solver memory
 | ||||||
|  | typedef struct ocp_qp_hpipm_memory_ | ||||||
|  | { | ||||||
|  |     struct d_ocp_qp_ipm_ws *hpipm_workspace; | ||||||
|  |     double time_qp_solver_call; | ||||||
|  |     int iter; | ||||||
|  | 
 | ||||||
|  | } ocp_qp_hpipm_memory; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_hpipm_opts_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_qp_hpipm_opts_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_hpipm_opts_initialize_default(void *config, void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_hpipm_opts_update(void *config, void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_hpipm_opts_set(void *config_, void *opts_, const char *field, void *value); | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_hpipm_memory_calculate_size(void *config, void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void *ocp_qp_hpipm_memory_assign(void *config, void *dims, void *opts_, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_hpipm_workspace_calculate_size(void *config, void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | int ocp_qp_hpipm(void *config, void *qp_in, void *qp_out, void *opts_, void *mem_, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_hpipm_eval_sens(void *config, void *qp_in, void *qp_out, void *opts_, void *mem_, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_hpipm_config_initialize_default(void *config); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_QP_OCP_QP_HPIPM_H_
 | ||||||
| @ -0,0 +1,129 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_QP_OCP_QP_HPMPC_H_ | ||||||
|  | #define ACADOS_OCP_QP_OCP_QP_HPMPC_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include "acados/ocp_qp/ocp_qp_common.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | typedef enum hpmpc_options_t_ { HPMPC_DEFAULT_ARGUMENTS } hpmpc_options_t; | ||||||
|  | 
 | ||||||
|  | typedef struct ocp_qp_hpmpc_opts_ | ||||||
|  | { | ||||||
|  |     double tol; | ||||||
|  |     int max_iter; | ||||||
|  |     double mu0; | ||||||
|  |     double alpha_min; | ||||||
|  |     int warm_start; | ||||||
|  |     int N2;  // horizion length of the partially condensed problem
 | ||||||
|  | 
 | ||||||
|  |     // partial tightening
 | ||||||
|  |     double sigma_mu; | ||||||
|  |     int N; | ||||||
|  |     int M; | ||||||
|  | } ocp_qp_hpmpc_opts; | ||||||
|  | 
 | ||||||
|  | // struct of the solver memory
 | ||||||
|  | typedef struct ocp_qp_hpmpc_memory_ | ||||||
|  | { | ||||||
|  |     struct blasfeo_dvec *hpi; | ||||||
|  |     double *stats; | ||||||
|  | 
 | ||||||
|  |     // workspace
 | ||||||
|  |     void *hpmpc_work;  // raw workspace
 | ||||||
|  | 
 | ||||||
|  |     // partial tightening-specific (init of extra variables)
 | ||||||
|  |     struct blasfeo_dvec *lam0; | ||||||
|  |     struct blasfeo_dvec *ux0; | ||||||
|  |     struct blasfeo_dvec *pi0; | ||||||
|  |     struct blasfeo_dvec *t0; | ||||||
|  | 
 | ||||||
|  |     // 2. workspace
 | ||||||
|  |     struct blasfeo_dmat *hsL; | ||||||
|  |     struct blasfeo_dmat *hsric_work_mat; | ||||||
|  |     struct blasfeo_dmat sLxM; | ||||||
|  |     struct blasfeo_dmat sPpM; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dvec *hsQx; | ||||||
|  |     struct blasfeo_dvec *hsqx; | ||||||
|  |     struct blasfeo_dvec *hstinv; | ||||||
|  |     struct blasfeo_dvec *hsrq; | ||||||
|  |     struct blasfeo_dvec *hsdux; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dvec *hsdlam; | ||||||
|  |     struct blasfeo_dvec *hsdt; | ||||||
|  |     struct blasfeo_dvec *hsdpi; | ||||||
|  |     struct blasfeo_dvec *hslamt; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dvec *hsPb; | ||||||
|  | 
 | ||||||
|  |     void *work_ric; | ||||||
|  | 
 | ||||||
|  |     int out_iter; | ||||||
|  | 
 | ||||||
|  |     double time_qp_solver_call; | ||||||
|  |     int iter; | ||||||
|  | 
 | ||||||
|  | } ocp_qp_hpmpc_memory; | ||||||
|  | 
 | ||||||
|  | acados_size_t ocp_qp_hpmpc_opts_calculate_size(void *config_, ocp_qp_dims *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_qp_hpmpc_opts_assign(void *config_, ocp_qp_dims *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_hpmpc_opts_initialize_default(void *config_, ocp_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_hpmpc_opts_update(void *config_, ocp_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_hpmpc_memory_calculate_size(void *config_, ocp_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void *ocp_qp_hpmpc_memory_assign(void *config_, ocp_qp_dims *dims, void *opts_, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_hpmpc_workspace_calculate_size(void *config_, ocp_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | int ocp_qp_hpmpc(void *config_, void *qp_in, void *qp_out, void *opts_, void *mem_, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_hpmpc_eval_sens(void *config_, void *qp_in, void *qp_out, void *opts_, void *mem_, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_hpmpc_config_initialize_default(void *config_); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_QP_OCP_QP_HPMPC_H_
 | ||||||
| @ -0,0 +1,146 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_QP_OCP_QP_OOQP_H_ | ||||||
|  | #define ACADOS_OCP_QP_OCP_QP_OOQP_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include "acados/ocp_qp/ocp_qp_common.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | enum ocp_qp_ooqp_termination_code | ||||||
|  | { | ||||||
|  |   SPARSE_SUCCESSFUL_TERMINATION = 0, | ||||||
|  |   SPARSE_NOT_FINISHED, | ||||||
|  |   SPARSE_MAX_ITS_EXCEEDED, | ||||||
|  |   SPARSE_INFEASIBLE, | ||||||
|  |   SPARSE_UNKNOWN | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | typedef struct ocp_qp_ooqp_opts_ | ||||||
|  | { | ||||||
|  |     int printLevel; | ||||||
|  |     int useDiagonalWeights;  // TODO(dimitris): implement option
 | ||||||
|  |     int fixHessian; | ||||||
|  |     int fixHessianSparsity; | ||||||
|  |     int fixDynamics; | ||||||
|  |     int fixDynamicsSparsity; | ||||||
|  |     int fixInequalities; | ||||||
|  |     int fixInequalitiesSparsity; | ||||||
|  | } ocp_qp_ooqp_opts; | ||||||
|  | 
 | ||||||
|  | typedef struct ocp_qp_ooqp_workspace_ | ||||||
|  | { | ||||||
|  |     double *x; | ||||||
|  |     double *gamma; | ||||||
|  |     double *phi; | ||||||
|  |     double *y; | ||||||
|  |     double *z; | ||||||
|  |     double *lambda; | ||||||
|  |     double *pi; | ||||||
|  |     double objectiveValue; | ||||||
|  |     int *tmpInt;    // temporary vector to sort indicies sparse matrices
 | ||||||
|  |     double *tmpReal;  // temporary vector to sort data of sparse matrices
 | ||||||
|  |     // int ierr;
 | ||||||
|  | } ocp_qp_ooqp_workspace; | ||||||
|  | 
 | ||||||
|  | typedef struct ocp_qp_ooqp_memory_ | ||||||
|  | { | ||||||
|  |     int firstRun; | ||||||
|  |     double *c; | ||||||
|  |     int nx; | ||||||
|  |     int *irowQ; | ||||||
|  |     int nnzQ; | ||||||
|  |     int *jcolQ; | ||||||
|  |     int *orderQ; | ||||||
|  |     double *dQ; | ||||||
|  |     double *xlow; | ||||||
|  |     char *ixlow; | ||||||
|  |     double *xupp; | ||||||
|  |     char *ixupp; | ||||||
|  |     int *irowA; | ||||||
|  |     int nnzA; | ||||||
|  |     int *jcolA; | ||||||
|  |     int *orderA; | ||||||
|  |     double *dA; | ||||||
|  |     double *bA; | ||||||
|  |     int my; | ||||||
|  |     int *irowC; | ||||||
|  |     int nnzC; | ||||||
|  |     int *jcolC; | ||||||
|  |     int *orderC; | ||||||
|  |     double *dC; | ||||||
|  |     double *clow; | ||||||
|  |     int mz; | ||||||
|  |     char *iclow; | ||||||
|  |     double *cupp; | ||||||
|  |     char *icupp; | ||||||
|  |     int nnz;  // max(nnzQ, nnzA, nnzC)
 | ||||||
|  |     double time_qp_solver_call; | ||||||
|  |     int iter; | ||||||
|  | 
 | ||||||
|  | } ocp_qp_ooqp_memory; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_ooqp_opts_calculate_size(void *config_, ocp_qp_dims *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_qp_ooqp_opts_assign(void *config_, ocp_qp_dims *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_ooqp_opts_initialize_default(void *config_, ocp_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_ooqp_opts_update(void *config_, ocp_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_ooqp_memory_calculate_size(void *config_, ocp_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void *ocp_qp_ooqp_memory_assign(void *config_, ocp_qp_dims *dims, void *opts_, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_ooqp_workspace_calculate_size(void *config_, ocp_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | int ocp_qp_ooqp(void *config_, ocp_qp_in *qp_in, ocp_qp_out *qp_out, void *opts_, void *memory_, | ||||||
|  |                 void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_ooqp_destroy(void *mem_, void *work); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_ooqp_eval_sens(void *config_, void *qp_in, void *qp_out, void *opts_, void *mem_, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_ooqp_config_initialize_default(void *config_); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_QP_OCP_QP_OOQP_H_
 | ||||||
| @ -0,0 +1,105 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_QP_OCP_QP_OSQP_H_ | ||||||
|  | #define ACADOS_OCP_QP_OCP_QP_OSQP_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // osqp
 | ||||||
|  | #include "osqp/include/types.h" | ||||||
|  | 
 | ||||||
|  | // acados
 | ||||||
|  | #include "acados/ocp_qp/ocp_qp_common.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | typedef struct ocp_qp_osqp_opts_ | ||||||
|  | { | ||||||
|  |     OSQPSettings *osqp_opts; | ||||||
|  | } ocp_qp_osqp_opts; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct ocp_qp_osqp_memory_ | ||||||
|  | { | ||||||
|  |     c_int first_run; | ||||||
|  | 
 | ||||||
|  |     c_float *q; | ||||||
|  |     c_float *l; | ||||||
|  |     c_float *u; | ||||||
|  | 
 | ||||||
|  |     c_int P_nnzmax; | ||||||
|  |     c_int *P_i; | ||||||
|  |     c_int *P_p; | ||||||
|  |     c_float *P_x; | ||||||
|  | 
 | ||||||
|  |     c_int A_nnzmax; | ||||||
|  |     c_int *A_i; | ||||||
|  |     c_int *A_p; | ||||||
|  |     c_float *A_x; | ||||||
|  | 
 | ||||||
|  |     OSQPData *osqp_data; | ||||||
|  |     OSQPWorkspace *osqp_work; | ||||||
|  | 
 | ||||||
|  |     double time_qp_solver_call; | ||||||
|  |     int iter; | ||||||
|  | 
 | ||||||
|  | } ocp_qp_osqp_memory; | ||||||
|  | 
 | ||||||
|  | acados_size_t ocp_qp_osqp_opts_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_qp_osqp_opts_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_osqp_opts_initialize_default(void *config, void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_osqp_opts_update(void *config, void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_osqp_memory_calculate_size(void *config, void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void *ocp_qp_osqp_memory_assign(void *config, void *dims, void *opts_, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_osqp_workspace_calculate_size(void *config, void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | int ocp_qp_osqp(void *config, void *qp_in, void *qp_out, void *opts_, void *mem_, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_osqp_eval_sens(void *config_, void *qp_in, void *qp_out, void *opts_, void *mem_, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_osqp_config_initialize_default(void *config); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_QP_OCP_QP_OSQP_H_
 | ||||||
| @ -0,0 +1,123 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_QP_OCP_QP_PARTIAL_CONDENSING_H_ | ||||||
|  | #define ACADOS_OCP_QP_OCP_QP_PARTIAL_CONDENSING_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // hpipm
 | ||||||
|  | #include "hpipm/include/hpipm_d_ocp_qp_red.h" | ||||||
|  | // acados
 | ||||||
|  | #include "acados/ocp_qp/ocp_qp_common.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     ocp_qp_dims *orig_dims; | ||||||
|  |     ocp_qp_dims *red_dims; // dims of reduced qp
 | ||||||
|  |     ocp_qp_dims *pcond_dims; | ||||||
|  |     int *block_size; | ||||||
|  |     int N2; | ||||||
|  |     int N2_bkp; | ||||||
|  | } ocp_qp_partial_condensing_dims; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct ocp_qp_partial_condensing_opts_ | ||||||
|  | { | ||||||
|  |     struct d_part_cond_qp_arg *hpipm_pcond_opts; | ||||||
|  |     struct d_ocp_qp_reduce_eq_dof_arg *hpipm_red_opts; | ||||||
|  | //    ocp_qp_dims *pcond_dims;  // TODO(all): move to dims
 | ||||||
|  | //    int *block_size;
 | ||||||
|  |     int N2; | ||||||
|  |     int N2_bkp; | ||||||
|  | //    int expand_dual_sol; // 0 primal sol only, 1 primal + dual sol
 | ||||||
|  |     int ric_alg; | ||||||
|  |     int mem_qp_in; // allocate qp_in in memory
 | ||||||
|  | } ocp_qp_partial_condensing_opts; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct ocp_qp_partial_condensing_memory_ | ||||||
|  | { | ||||||
|  |     struct d_part_cond_qp_ws *hpipm_pcond_work; | ||||||
|  |     struct d_ocp_qp_reduce_eq_dof_ws *hpipm_red_work; | ||||||
|  |     // in memory
 | ||||||
|  |     ocp_qp_in *pcond_qp_in; | ||||||
|  |     ocp_qp_out *pcond_qp_out; | ||||||
|  |     ocp_qp_in *red_qp; // reduced qp
 | ||||||
|  |     ocp_qp_out *red_sol; // reduced qp sol
 | ||||||
|  |     // only pointer
 | ||||||
|  |     ocp_qp_in *ptr_qp_in; | ||||||
|  |     ocp_qp_in *ptr_pcond_qp_in; | ||||||
|  |     qp_info *qp_out_info; // info in pcond_qp_in
 | ||||||
|  |     double time_qp_xcond; | ||||||
|  | } ocp_qp_partial_condensing_memory; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_partial_condensing_opts_calculate_size(void *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_qp_partial_condensing_opts_assign(void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_partial_condensing_opts_initialize_default(void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_partial_condensing_opts_update(void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_partial_condensing_opts_set(void *opts_, const char *field, void* value); | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_partial_condensing_memory_calculate_size(void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void *ocp_qp_partial_condensing_memory_assign(void *dims, void *opts, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_partial_condensing_workspace_calculate_size(void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | int ocp_qp_partial_condensing(void *in, void *out, void *opts, void *mem, void *work); | ||||||
|  | //
 | ||||||
|  | int ocp_qp_partial_expansion(void *in, void *out, void *opts, void *mem, void *work); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_partial_condensing_config_initialize_default(void *config_); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_QP_OCP_QP_PARTIAL_CONDENSING_H_
 | ||||||
| @ -0,0 +1,121 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_QP_OCP_QP_QPDUNES_H_ | ||||||
|  | #define ACADOS_OCP_QP_OCP_QP_QPDUNES_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include "qpDUNES.h" | ||||||
|  | 
 | ||||||
|  | #include "acados/ocp_qp/ocp_qp_common.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | typedef enum qpdunes_options_t_ { | ||||||
|  |     QPDUNES_DEFAULT_ARGUMENTS, | ||||||
|  |     QPDUNES_LINEAR_MPC,     // TODO(dimitris): partly implemented
 | ||||||
|  |     QPDUNES_NONLINEAR_MPC,  // TODO(dimitris): not implemented yet
 | ||||||
|  |     QPDUNES_ACADO_SETTINGS | ||||||
|  | } qpdunes_options_t; | ||||||
|  | 
 | ||||||
|  | typedef enum { QPDUNES_WITH_QPOASES, QPDUNES_WITH_CLIPPING } qpdunes_stage_qp_solver_t; | ||||||
|  | 
 | ||||||
|  | typedef struct ocp_qp_qpdunes_opts_ | ||||||
|  | { | ||||||
|  |     qpOptions_t options; | ||||||
|  |     qpdunes_stage_qp_solver_t stageQpSolver; | ||||||
|  |     int warmstart;  // warmstart = 0: all multipliers set to zero, warmstart = 1: use previous mult.
 | ||||||
|  |     bool isLinearMPC; | ||||||
|  | } ocp_qp_qpdunes_opts; | ||||||
|  | 
 | ||||||
|  | typedef struct ocp_qp_qpdunes_memory_ | ||||||
|  | { | ||||||
|  |     int firstRun; | ||||||
|  |     int nx; | ||||||
|  |     int nu; | ||||||
|  |     int nz; | ||||||
|  |     int nDmax;  // max(dims->ng)
 | ||||||
|  |     qpData_t qpData; | ||||||
|  |     double time_qp_solver_call; | ||||||
|  |     int iter; | ||||||
|  | 
 | ||||||
|  | } ocp_qp_qpdunes_memory; | ||||||
|  | 
 | ||||||
|  | typedef struct ocp_qp_qpdunes_workspace_ | ||||||
|  | { | ||||||
|  |     double *H; | ||||||
|  |     double *Q; | ||||||
|  |     double *R; | ||||||
|  |     double *S; | ||||||
|  |     double *g; | ||||||
|  |     double *ABt; | ||||||
|  |     double *b; | ||||||
|  |     double *Ct; | ||||||
|  |     double *lc; | ||||||
|  |     double *uc; | ||||||
|  |     double *zLow; | ||||||
|  |     double *zUpp; | ||||||
|  | } ocp_qp_qpdunes_workspace; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_qpdunes_opts_calculate_size(void *config_, ocp_qp_dims *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_qp_qpdunes_opts_assign(void *config_, ocp_qp_dims *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_qpdunes_opts_initialize_default(void *config_, ocp_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_qpdunes_opts_update(void *config_, ocp_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_qpdunes_memory_calculate_size(void *config_, ocp_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void *ocp_qp_qpdunes_memory_assign(void *config_, ocp_qp_dims *dims, void *opts_, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_qpdunes_workspace_calculate_size(void *config_, ocp_qp_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | int ocp_qp_qpdunes(void *config_, ocp_qp_in *qp_in, ocp_qp_out *qp_out, void *opts_, void *memory_, | ||||||
|  |                    void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_qpdunes_free_memory(void *mem_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_qpdunes_eval_sens(void *config_, void *qp_in, void *qp_out, void *opts_, void *mem_, void *work_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_qpdunes_config_initialize_default(void *config_); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_QP_OCP_QP_QPDUNES_H_
 | ||||||
| @ -0,0 +1,151 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_OCP_QP_OCP_QP_PARTIAL_CONDENSING_SOLVER_H_ | ||||||
|  | #define ACADOS_OCP_QP_OCP_QP_PARTIAL_CONDENSING_SOLVER_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // acados
 | ||||||
|  | #include "acados/ocp_qp/ocp_qp_common.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     ocp_qp_dims *orig_dims; | ||||||
|  |     void *xcond_dims; | ||||||
|  | } ocp_qp_xcond_solver_dims; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct ocp_qp_xcond_solver_opts_ | ||||||
|  | { | ||||||
|  |     void *xcond_opts; | ||||||
|  |     void *qp_solver_opts; | ||||||
|  | } ocp_qp_xcond_solver_opts; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct ocp_qp_xcond_solver_memory_ | ||||||
|  | { | ||||||
|  |     void *xcond_memory; | ||||||
|  |     void *solver_memory; | ||||||
|  |     void *xcond_qp_in; | ||||||
|  |     void *xcond_qp_out; | ||||||
|  | } ocp_qp_xcond_solver_memory; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct ocp_qp_xcond_solver_workspace_ | ||||||
|  | { | ||||||
|  |     void *xcond_work; | ||||||
|  |     void *qp_solver_work; | ||||||
|  | } ocp_qp_xcond_solver_workspace; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     acados_size_t (*dims_calculate_size)(void *config, int N); | ||||||
|  |     ocp_qp_xcond_solver_dims *(*dims_assign)(void *config, int N, void *raw_memory); | ||||||
|  |     void (*dims_set)(void *config_, ocp_qp_xcond_solver_dims *dims, int stage, const char *field, int* value); | ||||||
|  |     acados_size_t (*opts_calculate_size)(void *config, ocp_qp_xcond_solver_dims *dims); | ||||||
|  |     void *(*opts_assign)(void *config, ocp_qp_xcond_solver_dims *dims, void *raw_memory); | ||||||
|  |     void (*opts_initialize_default)(void *config, ocp_qp_xcond_solver_dims *dims, void *opts); | ||||||
|  |     void (*opts_update)(void *config, ocp_qp_xcond_solver_dims *dims, void *opts); | ||||||
|  |     void (*opts_set)(void *config_, void *opts_, const char *field, void* value); | ||||||
|  |     acados_size_t (*memory_calculate_size)(void *config, ocp_qp_xcond_solver_dims *dims, void *opts); | ||||||
|  |     void *(*memory_assign)(void *config, ocp_qp_xcond_solver_dims *dims, void *opts, void *raw_memory); | ||||||
|  |     void (*memory_get)(void *config_, void *mem_, const char *field, void* value); | ||||||
|  |     acados_size_t (*workspace_calculate_size)(void *config, ocp_qp_xcond_solver_dims *dims, void *opts); | ||||||
|  |     int (*evaluate)(void *config, ocp_qp_xcond_solver_dims *dims, ocp_qp_in *qp_in, ocp_qp_out *qp_out, void *opts, void *mem, void *work); | ||||||
|  |     void (*eval_sens)(void *config, ocp_qp_xcond_solver_dims *dims, ocp_qp_in *param_qp_in, ocp_qp_out *sens_qp_out, void *opts, void *mem, void *work); | ||||||
|  |     qp_solver_config *qp_solver;  // either ocp_qp_solver or dense_solver
 | ||||||
|  |     ocp_qp_xcond_config *xcond; | ||||||
|  | } ocp_qp_xcond_solver_config;  // pcond - partial condensing or fcond - full condensing
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* config */ | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_xcond_solver_config_calculate_size(); | ||||||
|  | //
 | ||||||
|  | ocp_qp_xcond_solver_config *ocp_qp_xcond_solver_config_assign(void *raw_memory); | ||||||
|  | 
 | ||||||
|  | /* dims */ | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_xcond_solver_dims_calculate_size(void *config, int N); | ||||||
|  | //
 | ||||||
|  | ocp_qp_xcond_solver_dims *ocp_qp_xcond_solver_dims_assign(void *config, int N, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_xcond_solver_dims_set_(void *config, ocp_qp_xcond_solver_dims *dims, int stage, const char *field, int* value); | ||||||
|  | 
 | ||||||
|  | /* opts */ | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_xcond_solver_opts_calculate_size(void *config, ocp_qp_xcond_solver_dims *dims); | ||||||
|  | //
 | ||||||
|  | void *ocp_qp_xcond_solver_opts_assign(void *config, ocp_qp_xcond_solver_dims *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_xcond_solver_opts_initialize_default(void *config, ocp_qp_xcond_solver_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_xcond_solver_opts_update(void *config, ocp_qp_xcond_solver_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void ocp_qp_xcond_solver_opts_set_(void *config_, void *opts_, const char *field, void* value); | ||||||
|  | 
 | ||||||
|  | /* memory */ | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_xcond_solver_memory_calculate_size(void *config, ocp_qp_xcond_solver_dims *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void *ocp_qp_xcond_solver_memory_assign(void *config, ocp_qp_xcond_solver_dims *dims, void *opts_, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | /* workspace */ | ||||||
|  | //
 | ||||||
|  | acados_size_t ocp_qp_xcond_solver_workspace_calculate_size(void *config, ocp_qp_xcond_solver_dims *dims, void *opts_); | ||||||
|  | 
 | ||||||
|  | /* config */ | ||||||
|  | //
 | ||||||
|  | int ocp_qp_xcond_solver(void *config, ocp_qp_xcond_solver_dims *dims, ocp_qp_in *qp_in, ocp_qp_out *qp_out, void *opts_, void *mem_, void *work_); | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | void ocp_qp_xcond_solver_config_initialize_default(void *config_); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_OCP_QP_OCP_QP_PARTIAL_CONDENSING_SOLVER_H_
 | ||||||
| @ -0,0 +1,91 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_SIM_SIM_COLLOCATION_UTILS_H_ | ||||||
|  | #define ACADOS_SIM_SIM_COLLOCATION_UTILS_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | enum Newton_type_collocation | ||||||
|  | { | ||||||
|  |     exact = 0, | ||||||
|  |     simplified_in, | ||||||
|  |     simplified_inis | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     enum Newton_type_collocation type; | ||||||
|  |     double *eig; | ||||||
|  |     double *low_tria; | ||||||
|  |     bool single; | ||||||
|  |     bool freeze; | ||||||
|  | 
 | ||||||
|  |     double *transf1; | ||||||
|  |     double *transf2; | ||||||
|  | 
 | ||||||
|  |     double *transf1_T; | ||||||
|  |     double *transf2_T; | ||||||
|  | } Newton_scheme; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t gauss_nodes_work_calculate_size(int ns); | ||||||
|  | //
 | ||||||
|  | void gauss_nodes(int ns, double *nodes, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | acados_size_t gauss_simplified_work_calculate_size(int ns); | ||||||
|  | //
 | ||||||
|  | void gauss_simplified(int ns, Newton_scheme *scheme, void *work); | ||||||
|  | //
 | ||||||
|  | acados_size_t butcher_table_work_calculate_size(int ns); | ||||||
|  | //
 | ||||||
|  | void butcher_table(int ns, double *nodes, double *b, double *A, void *work); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_SIM_SIM_COLLOCATION_UTILS_H_
 | ||||||
| @ -0,0 +1,221 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_SIM_SIM_COMMON_H_ | ||||||
|  | #define ACADOS_SIM_SIM_COMMON_H_ | ||||||
|  | 
 | ||||||
|  | #include <stdbool.h> | ||||||
|  | 
 | ||||||
|  | #include "acados/sim/sim_collocation_utils.h" | ||||||
|  | #include "acados/utils/timing.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | #include "acados/utils/external_function_generic.h" | ||||||
|  | 
 | ||||||
|  | // maximum number of integration stages
 | ||||||
|  | #define NS_MAX 15 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef enum | ||||||
|  | { | ||||||
|  |     // ERK and LIFTED_ERK
 | ||||||
|  |     EXPL_ODE_FUN, | ||||||
|  |     EXPL_ODE_HES,  // wrt x and u ???
 | ||||||
|  |     EXPL_VDE_FOR, | ||||||
|  |     EXPL_VDE_ADJ, | ||||||
|  |     // IRK
 | ||||||
|  |     IMPL_ODE_FUN, | ||||||
|  |     IMPL_ODE_FUN_JAC_X_XDOT, | ||||||
|  |     IMPL_ODE_JAC_X_XDOT_U, | ||||||
|  |     IMPL_ODE_FUN_JAC_X_XDOT_U, | ||||||
|  |     IMPL_ODE_HESS, | ||||||
|  |     // gnsf
 | ||||||
|  |     PHI_FUN, | ||||||
|  |     PHI_FUN_JAC_Y, | ||||||
|  |     PHI_JAC_Y_UHAT, | ||||||
|  |     LO_FUN, | ||||||
|  |     GET_GNSF_MATRICES | ||||||
|  | } sim_function_t; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     void *dims; | ||||||
|  | 
 | ||||||
|  |     double *x;  // x[NX] - initial state value for simulation
 | ||||||
|  |     double *u;  // u[NU] - control - constant over simulation time
 | ||||||
|  | 
 | ||||||
|  |     double *S_forw;  // forward seed [Sx, Su]
 | ||||||
|  |     double *S_adj;   // backward seed
 | ||||||
|  | 
 | ||||||
|  |     bool identity_seed; // indicating if S_forw = [eye(nx), zeros(nx x nu)]
 | ||||||
|  | 
 | ||||||
|  |     void *model; | ||||||
|  | 
 | ||||||
|  |     double T;  // simulation time
 | ||||||
|  | 
 | ||||||
|  | } sim_in; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     double CPUtime;  // in seconds
 | ||||||
|  |     double LAtime;   // in seconds
 | ||||||
|  |     double ADtime;   // in seconds
 | ||||||
|  | 
 | ||||||
|  | } sim_info; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     double *xn;      // xn[NX]
 | ||||||
|  |     double *S_forw;  // S_forw[NX*(NX+NU)]
 | ||||||
|  |     double *S_adj;   //
 | ||||||
|  |     double *S_hess;  //
 | ||||||
|  | 
 | ||||||
|  |     double *zn;           // z - algebraic variables - reported at start of simulation interval
 | ||||||
|  |     double *S_algebraic;  // sensitivities of reported value of algebraic variables w.r.t.
 | ||||||
|  |                           // initial stat & control (x_n,u)
 | ||||||
|  | 
 | ||||||
|  |     double *grad;  // gradient correction
 | ||||||
|  | 
 | ||||||
|  |     sim_info *info; | ||||||
|  | 
 | ||||||
|  | } sim_out; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int ns;  // number of integration stages
 | ||||||
|  | 
 | ||||||
|  |     int num_steps; | ||||||
|  |     int num_forw_sens; | ||||||
|  | 
 | ||||||
|  |     int tableau_size;  // check that is consistent with ns
 | ||||||
|  |             // only update when butcher tableau is changed
 | ||||||
|  |             // kind of private -> no setter!
 | ||||||
|  |     double *A_mat; | ||||||
|  |     double *c_vec; | ||||||
|  |     double *b_vec; | ||||||
|  | 
 | ||||||
|  |     bool sens_forw; | ||||||
|  |     bool sens_adj; | ||||||
|  |     bool sens_hess; | ||||||
|  | 
 | ||||||
|  |     bool output_z;        // 1 -- if zn should be computed
 | ||||||
|  |     bool sens_algebraic;  // 1 -- if S_algebraic should be computed
 | ||||||
|  |     bool exact_z_output;  // 1 -- if z, S_algebraic should be computed exactly, extra Newton iterations
 | ||||||
|  | 
 | ||||||
|  |     // for explicit integrators: newton_iter == 0 && scheme == NULL
 | ||||||
|  |     // && jac_reuse=false
 | ||||||
|  |     int newton_iter; | ||||||
|  |     bool jac_reuse; | ||||||
|  |     Newton_scheme *scheme; | ||||||
|  | 
 | ||||||
|  |     // workspace
 | ||||||
|  |     void *work; | ||||||
|  | 
 | ||||||
|  | } sim_opts; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int (*evaluate)(void *config_, sim_in *in, sim_out *out, void *opts, void *mem, void *work); | ||||||
|  |     int (*precompute)(void *config_, sim_in *in, sim_out *out, void *opts, void *mem, void *work); | ||||||
|  |     // opts
 | ||||||
|  |     acados_size_t (*opts_calculate_size)(void *config_, void *dims); | ||||||
|  |     void *(*opts_assign)(void *config_, void *dims, void *raw_memory); | ||||||
|  |     void (*opts_initialize_default)(void *config_, void *dims, void *opts); | ||||||
|  |     void (*opts_update)(void *config_, void *dims, void *opts); | ||||||
|  |     void (*opts_set)(void *config_, void *opts_, const char *field, void *value); | ||||||
|  |     void (*opts_get)(void *config_, void *opts_, const char *field, void *value); | ||||||
|  |     // mem
 | ||||||
|  |     acados_size_t (*memory_calculate_size)(void *config, void *dims, void *opts); | ||||||
|  |     void *(*memory_assign)(void *config, void *dims, void *opts, void *raw_memory); | ||||||
|  |     int (*memory_set)(void *config, void *dims, void *mem, const char *field, void *value); | ||||||
|  |     int (*memory_set_to_zero)(void *config, void *dims, void *opts, void *mem, const char *field); | ||||||
|  |     void (*memory_get)(void *config, void *dims, void *mem, const char *field, void *value); | ||||||
|  |     // work
 | ||||||
|  |     acados_size_t (*workspace_calculate_size)(void *config, void *dims, void *opts); | ||||||
|  |     // model
 | ||||||
|  |     acados_size_t (*model_calculate_size)(void *config, void *dims); | ||||||
|  |     void *(*model_assign)(void *config, void *dims, void *raw_memory); | ||||||
|  |     int (*model_set)(void *model, const char *field, void *value); | ||||||
|  |     // config
 | ||||||
|  |     void (*config_initialize_default)(void *config); | ||||||
|  |     // dims
 | ||||||
|  |     acados_size_t (*dims_calculate_size)(); | ||||||
|  |     void *(*dims_assign)(void *config, void *raw_memory); | ||||||
|  |     void (*dims_set)(void *config, void *dims, const char *field, const int *value); | ||||||
|  |     void (*dims_get)(void *config, void *dims, const char *field, int *value); | ||||||
|  | 
 | ||||||
|  | } sim_config; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* config */ | ||||||
|  | //
 | ||||||
|  | acados_size_t sim_config_calculate_size(); | ||||||
|  | //
 | ||||||
|  | sim_config *sim_config_assign(void *raw_memory); | ||||||
|  | 
 | ||||||
|  | /* in */ | ||||||
|  | //
 | ||||||
|  | acados_size_t sim_in_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | sim_in *sim_in_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | int sim_in_set_(void *config_, void *dims_, sim_in *in, const char *field, void *value); | ||||||
|  | 
 | ||||||
|  | /* out */ | ||||||
|  | //
 | ||||||
|  | acados_size_t sim_out_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | sim_out *sim_out_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | int sim_out_get_(void *config, void *dims, sim_out *out, const char *field, void *value); | ||||||
|  | 
 | ||||||
|  | /* opts */ | ||||||
|  | //
 | ||||||
|  | void sim_opts_set_(sim_opts *opts, const char *field, void *value); | ||||||
|  | //
 | ||||||
|  | void sim_opts_get_(sim_config *config, sim_opts *opts, const char *field, void *value); | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_SIM_SIM_COMMON_H_
 | ||||||
| @ -0,0 +1,143 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_SIM_SIM_ERK_INTEGRATOR_H_ | ||||||
|  | #define ACADOS_SIM_SIM_ERK_INTEGRATOR_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include "acados/sim/sim_common.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int nx; | ||||||
|  |     int nu; | ||||||
|  |     int nz; | ||||||
|  | } sim_erk_dims; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     /* external functions */ | ||||||
|  |     // explicit ode
 | ||||||
|  |     external_function_generic *expl_ode_fun; | ||||||
|  |     // hessian explicit ode
 | ||||||
|  |     external_function_generic *expl_ode_hes; | ||||||
|  |     // forward explicit vde
 | ||||||
|  |     external_function_generic *expl_vde_for; | ||||||
|  |     // adjoint explicit vde
 | ||||||
|  |     external_function_generic *expl_vde_adj; | ||||||
|  | 
 | ||||||
|  | } erk_model; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  | 	// memory
 | ||||||
|  | 	double time_sim; | ||||||
|  | 	double time_ad; | ||||||
|  | 	double time_la; | ||||||
|  | 
 | ||||||
|  | 	// workspace structs
 | ||||||
|  | } sim_erk_memory; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  | 	// workspace mem
 | ||||||
|  |     double *rhs_forw_in;  // x + S + p
 | ||||||
|  | 
 | ||||||
|  |     double *K_traj;         // (stages*nX) or (steps*stages*nX) for adj
 | ||||||
|  |     double *out_forw_traj;  // S or (steps+1)*nX for adj
 | ||||||
|  | 
 | ||||||
|  |     double *rhs_adj_in; | ||||||
|  |     double *out_adj_tmp; | ||||||
|  |     double *adj_traj; | ||||||
|  | 
 | ||||||
|  | } sim_erk_workspace; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // dims
 | ||||||
|  | acados_size_t sim_erk_dims_calculate_size(); | ||||||
|  | void *sim_erk_dims_assign(void *config_, void *raw_memory); | ||||||
|  | void sim_erk_dims_set(void *config_, void *dims_, const char *field, const int* value); | ||||||
|  | void sim_erk_dims_get(void *config_, void *dims_, const char *field, int* value); | ||||||
|  | 
 | ||||||
|  | // model
 | ||||||
|  | acados_size_t sim_erk_model_calculate_size(void *config, void *dims); | ||||||
|  | void *sim_erk_model_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | int sim_erk_model_set(void *model, const char *field, void *value); | ||||||
|  | 
 | ||||||
|  | // opts
 | ||||||
|  | acados_size_t sim_erk_opts_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | void sim_erk_opts_update(void *config_, void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void *sim_erk_opts_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void sim_erk_opts_initialize_default(void *config, void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void sim_erk_opts_set(void *config_, void *opts_, const char *field, void *value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // memory
 | ||||||
|  | acados_size_t sim_erk_memory_calculate_size(void *config, void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void *sim_erk_memory_assign(void *config, void *dims, void *opts_, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | int sim_erk_memory_set(void *config_, void *dims_, void *mem_, const char *field, void *value); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // workspace
 | ||||||
|  | acados_size_t sim_erk_workspace_calculate_size(void *config, void *dims, void *opts_); | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | int sim_erk(void *config, sim_in *in, sim_out *out, void *opts_, void *mem_, void *work_); | ||||||
|  | //
 | ||||||
|  | void sim_erk_config_initialize_default(void *config); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_SIM_SIM_ERK_INTEGRATOR_H_
 | ||||||
| @ -0,0 +1,367 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_SIM_SIM_GNSF_H_ | ||||||
|  | #define ACADOS_SIM_SIM_GNSF_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include <stdbool.h> | ||||||
|  | 
 | ||||||
|  | #include "acados/utils/timing.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | #include "acados/sim/sim_common.h" | ||||||
|  | 
 | ||||||
|  | #include "blasfeo/include/blasfeo_common.h" | ||||||
|  | #include "blasfeo/include/blasfeo_d_aux.h" | ||||||
|  | #include "blasfeo/include/blasfeo_d_aux_ext_dep.h" | ||||||
|  | #include "blasfeo/include/blasfeo_d_blas.h" | ||||||
|  | #include "blasfeo/include/blasfeo_d_kernel.h" | ||||||
|  | #include "blasfeo/include/blasfeo_i_aux_ext_dep.h" | ||||||
|  | #include "blasfeo/include/blasfeo_target.h" | ||||||
|  | 
 | ||||||
|  | /* 
 | ||||||
|  | GNSF - Generalized Nonlinear Static Feedback Model | ||||||
|  | has the following form | ||||||
|  | https://github.com/acados/acados/files/3359595/gnsf_structure_blo.pdf
 | ||||||
|  | 
 | ||||||
|  | Details on the algorithm can be found in master thesis of Jonathan Frey, | ||||||
|  | which presents a slightly different format without the terms B_LO, c_LO. | ||||||
|  | https://github.com/acados/acados/files/2318322/gnsf_structure.pdf
 | ||||||
|  | https://cdn.syscop.de/publications/Frey2018.pdf
 | ||||||
|  | https://cdn.syscop.de/publications/Frey2019.pdf
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int nx; // total number of differential states
 | ||||||
|  |     int nu; // total number of inputs
 | ||||||
|  |     int nz; // total number of algebraic states
 | ||||||
|  |     int nx1; // number of differential states in NSF part
 | ||||||
|  |     int nz1; // number of algebraic states in NSF part
 | ||||||
|  |     int n_out; // output dimension of phi
 | ||||||
|  |     int ny; // dimension of first input of phi
 | ||||||
|  |     int nuhat; // dimension of second input of phi
 | ||||||
|  | 
 | ||||||
|  | } sim_gnsf_dims; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     /* external functions */ | ||||||
|  |     // phi: nonlinearity function
 | ||||||
|  |     external_function_generic *phi_fun; | ||||||
|  |     external_function_generic *phi_fun_jac_y; | ||||||
|  |     external_function_generic *phi_jac_y_uhat; | ||||||
|  | 
 | ||||||
|  |     // f_lo: linear output function
 | ||||||
|  |     external_function_generic *f_lo_fun_jac_x1_x1dot_u_z; | ||||||
|  | 
 | ||||||
|  |     // to import model matrices
 | ||||||
|  |     external_function_generic *get_gnsf_matrices; | ||||||
|  | 
 | ||||||
|  |     // flag indicating, if model defining matrices are imported via external (casadi) function,
 | ||||||
|  |     //    [default]: true -> auto;
 | ||||||
|  |     bool auto_import_gnsf; | ||||||
|  | 
 | ||||||
|  |     // booleans from structure detection
 | ||||||
|  |     bool nontrivial_f_LO; // indicates if f_LO is constant zero function
 | ||||||
|  |     bool fully_linear; // indicates if model is fully linear LOS
 | ||||||
|  | 
 | ||||||
|  |     /* model defining matrices */ | ||||||
|  |     // TODO: add setters to set manually
 | ||||||
|  |     double *A; | ||||||
|  |     double *B; | ||||||
|  |     double *C; | ||||||
|  |     double *E; | ||||||
|  | 
 | ||||||
|  |     double *L_x; | ||||||
|  |     double *L_xdot; | ||||||
|  |     double *L_z; | ||||||
|  |     double *L_u; | ||||||
|  | 
 | ||||||
|  |     double *A_LO; | ||||||
|  |     double *B_LO; | ||||||
|  |     double *E_LO; | ||||||
|  | 
 | ||||||
|  |     /* constant vector */ | ||||||
|  |     double *c; | ||||||
|  |     double *c_LO; | ||||||
|  | 
 | ||||||
|  |     // permutation vector - to have GNSF order of x, z within sim_gnsf only
 | ||||||
|  |     int *ipiv_x; | ||||||
|  |     int *ipiv_z; | ||||||
|  | 
 | ||||||
|  |     double *ipiv_x_double; | ||||||
|  |     double *ipiv_z_double; | ||||||
|  | 
 | ||||||
|  | } gnsf_model; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // pre_workspace - workspace used in the precomputation phase
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     struct blasfeo_dmat E11; | ||||||
|  |     struct blasfeo_dmat E12; | ||||||
|  |     struct blasfeo_dmat E21; | ||||||
|  |     struct blasfeo_dmat E22; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dmat A1; | ||||||
|  |     struct blasfeo_dmat A2; | ||||||
|  |     struct blasfeo_dmat B1; | ||||||
|  |     struct blasfeo_dmat B2; | ||||||
|  |     struct blasfeo_dmat C1; | ||||||
|  |     struct blasfeo_dmat C2; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dmat AA1; | ||||||
|  |     struct blasfeo_dmat AA2; | ||||||
|  |     struct blasfeo_dmat BB1; | ||||||
|  |     struct blasfeo_dmat BB2; | ||||||
|  |     struct blasfeo_dmat CC1; | ||||||
|  |     struct blasfeo_dmat CC2; | ||||||
|  |     struct blasfeo_dmat DD1; | ||||||
|  |     struct blasfeo_dmat DD2; | ||||||
|  |     struct blasfeo_dmat EE1; | ||||||
|  |     struct blasfeo_dmat EE2; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dmat QQ1; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dmat LLZ; | ||||||
|  |     struct blasfeo_dmat LLx; | ||||||
|  |     struct blasfeo_dmat LLK; | ||||||
|  | 
 | ||||||
|  |     int *ipivEE1;  // index of pivot vector
 | ||||||
|  |     int *ipivEE2; | ||||||
|  |     int *ipivQQ1; | ||||||
|  | 
 | ||||||
|  |     // for algebraic sensitivity propagation
 | ||||||
|  |     struct blasfeo_dmat Q1; | ||||||
|  | 
 | ||||||
|  |     // for constant term in NSF
 | ||||||
|  |     struct blasfeo_dvec cc1; | ||||||
|  |     struct blasfeo_dvec cc2; | ||||||
|  | 
 | ||||||
|  | } gnsf_pre_workspace; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // workspace
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     double *Z_work;  // used to perform computations to get out->zn
 | ||||||
|  | 
 | ||||||
|  |     int *ipiv;  // index of pivot vector
 | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dvec *vv_traj; | ||||||
|  |     struct blasfeo_dvec *yy_traj; | ||||||
|  |     struct blasfeo_dmat *f_LO_jac_traj; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dvec K2_val; | ||||||
|  |     struct blasfeo_dvec x0_traj; | ||||||
|  |     struct blasfeo_dvec res_val; | ||||||
|  |     struct blasfeo_dvec u0; | ||||||
|  |     struct blasfeo_dvec lambda; | ||||||
|  |     struct blasfeo_dvec lambda_old; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dvec yyu; | ||||||
|  |     struct blasfeo_dvec yyss; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dvec K1_val; | ||||||
|  |     struct blasfeo_dvec f_LO_val; | ||||||
|  |     struct blasfeo_dvec x1_stage_val; | ||||||
|  |     struct blasfeo_dvec Z1_val; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dvec K1u; | ||||||
|  |     struct blasfeo_dvec Zu; | ||||||
|  |     struct blasfeo_dvec ALOtimesx02; | ||||||
|  |     struct blasfeo_dvec BLOtimesu0; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dvec uhat; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dmat J_r_vv; | ||||||
|  |     struct blasfeo_dmat J_r_x1u; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dmat dK1_dx1; | ||||||
|  |     struct blasfeo_dmat dK1_du; | ||||||
|  |     struct blasfeo_dmat dZ_dx1; | ||||||
|  |     struct blasfeo_dmat dZ_du; | ||||||
|  |     struct blasfeo_dmat J_G2_K1; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dmat dK2_dx1; | ||||||
|  |     struct blasfeo_dmat dK2_dvv; | ||||||
|  |     struct blasfeo_dmat dxf_dwn; | ||||||
|  |     struct blasfeo_dmat S_forw_new; | ||||||
|  |     struct blasfeo_dmat S_algebraic_aux; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dmat dPsi_dvv; | ||||||
|  |     struct blasfeo_dmat dPsi_dx; | ||||||
|  |     struct blasfeo_dmat dPsi_du; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dmat dPHI_dyuhat; | ||||||
|  |     struct blasfeo_dvec z0; | ||||||
|  | 
 | ||||||
|  |     // memory only available if (opts->sens_algebraic)
 | ||||||
|  |     // struct blasfeo_dvec y_one_stage;
 | ||||||
|  |     // struct blasfeo_dvec x0dot_1;
 | ||||||
|  |     // struct blasfeo_dmat dz10_dx1u;  // (nz1) * (nx1+nu);
 | ||||||
|  |     // struct blasfeo_dmat dr0_dvv0;  // (n_out * n_out)
 | ||||||
|  |     // struct blasfeo_dmat f_LO_jac0; // (nx2+nz2) * (2*nx1 + nz1 + nu)
 | ||||||
|  |     // struct blasfeo_dmat sens_z2_rhs; // (nx2 + nz2) * (nx1 + nu)
 | ||||||
|  |     // int *ipiv_vv0;
 | ||||||
|  | 
 | ||||||
|  | } gnsf_workspace; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // memory
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     bool first_call; | ||||||
|  | 
 | ||||||
|  |     // simulation time for one step
 | ||||||
|  |     double dt; | ||||||
|  | 
 | ||||||
|  |     // (scaled) butcher table
 | ||||||
|  |     double *A_dt; | ||||||
|  |     double *b_dt; | ||||||
|  |     double *c_butcher; | ||||||
|  | 
 | ||||||
|  |     // value used to initialize integration variables - corresponding to value of phi
 | ||||||
|  |     double *phi_guess;  //  n_out
 | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dmat S_forw; | ||||||
|  |     struct blasfeo_dmat S_algebraic; | ||||||
|  | 
 | ||||||
|  |     // precomputed matrices
 | ||||||
|  |     struct blasfeo_dmat KKv; | ||||||
|  |     struct blasfeo_dmat KKx; | ||||||
|  |     struct blasfeo_dmat KKu; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dmat YYv; | ||||||
|  |     struct blasfeo_dmat YYx; | ||||||
|  |     struct blasfeo_dmat YYu; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dmat ZZv; | ||||||
|  |     struct blasfeo_dmat ZZx; | ||||||
|  |     struct blasfeo_dmat ZZu; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dmat ALO; | ||||||
|  |     struct blasfeo_dmat BLO; | ||||||
|  |     struct blasfeo_dmat M2_LU; | ||||||
|  |     int *ipivM2; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dmat dK2_dx2; | ||||||
|  |     struct blasfeo_dmat dK2_du; | ||||||
|  |     struct blasfeo_dmat dx2f_dx2u; | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dmat Lu; | ||||||
|  | 
 | ||||||
|  |     // precomputed vectors for constant term in NSF
 | ||||||
|  |     struct blasfeo_dvec KK0; | ||||||
|  |     struct blasfeo_dvec YY0; | ||||||
|  |     struct blasfeo_dvec ZZ0; | ||||||
|  | 
 | ||||||
|  |     // for algebraic sensitivities only;
 | ||||||
|  |     // struct blasfeo_dmat *Z0x;
 | ||||||
|  |     // struct blasfeo_dmat *Z0u;
 | ||||||
|  |     // struct blasfeo_dmat *Z0v;
 | ||||||
|  | 
 | ||||||
|  |     // struct blasfeo_dmat *Y0x;
 | ||||||
|  |     // struct blasfeo_dmat *Y0u;
 | ||||||
|  |     // struct blasfeo_dmat *Y0v;
 | ||||||
|  | 
 | ||||||
|  |     // struct blasfeo_dmat *K0x;
 | ||||||
|  |     // struct blasfeo_dmat *K0u;
 | ||||||
|  |     // struct blasfeo_dmat *K0v;
 | ||||||
|  | 
 | ||||||
|  |     // struct blasfeo_dmat *ELO_LU;
 | ||||||
|  |     // int *ipiv_ELO;
 | ||||||
|  |     // struct blasfeo_dmat *ELO_inv_ALO;
 | ||||||
|  | 
 | ||||||
|  |     // struct blasfeo_dmat *Lx;
 | ||||||
|  |     // struct blasfeo_dmat *Lxdot;
 | ||||||
|  |     // struct blasfeo_dmat *Lz;
 | ||||||
|  | 
 | ||||||
|  | 	double time_sim; | ||||||
|  | 	double time_ad; | ||||||
|  | 	double time_la; | ||||||
|  | 
 | ||||||
|  | } sim_gnsf_memory; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // gnsf dims
 | ||||||
|  | acados_size_t sim_gnsf_dims_calculate_size(); | ||||||
|  | void *sim_gnsf_dims_assign(void *config_, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | // get & set functions
 | ||||||
|  | void sim_gnsf_dims_set(void *config_, void *dims_, const char *field, const int *value); | ||||||
|  | void sim_gnsf_dims_get(void *config_, void *dims_, const char *field, int* value); | ||||||
|  | 
 | ||||||
|  | // opts
 | ||||||
|  | acados_size_t sim_gnsf_opts_calculate_size(void *config, void *dims); | ||||||
|  | void *sim_gnsf_opts_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | void sim_gnsf_opts_initialize_default(void *config, void *dims, void *opts_); | ||||||
|  | void sim_gnsf_opts_update(void *config_, void *dims, void *opts_); | ||||||
|  | void sim_gnsf_opts_set(void *config_, void *opts_, const char *field, void *value); | ||||||
|  | 
 | ||||||
|  | // model
 | ||||||
|  | acados_size_t sim_gnsf_model_calculate_size(void *config, void *dims_); | ||||||
|  | void *sim_gnsf_model_assign(void *config, void *dims_, void *raw_memory); | ||||||
|  | int sim_gnsf_model_set(void *model_, const char *field, void *value); | ||||||
|  | 
 | ||||||
|  | // precomputation
 | ||||||
|  | int sim_gnsf_precompute(void *config_, sim_in *in, sim_out *out, void *opts_, void *mem_, | ||||||
|  |                        void *work_); | ||||||
|  | 
 | ||||||
|  | // workspace & memory
 | ||||||
|  | acados_size_t sim_gnsf_workspace_calculate_size(void *config, void *dims_, void *args); | ||||||
|  | acados_size_t sim_gnsf_memory_calculate_size(void *config, void *dims_, void *opts_); | ||||||
|  | void *sim_gnsf_memory_assign(void *config, void *dims_, void *opts_, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | // interface
 | ||||||
|  | void sim_gnsf_config_initialize_default(void *config_); | ||||||
|  | 
 | ||||||
|  | // integrator
 | ||||||
|  | int sim_gnsf(void *config, sim_in *in, sim_out *out, void *opts, void *mem_, void *work_); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_SIM_SIM_GNSF_H_
 | ||||||
| @ -0,0 +1,186 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_SIM_SIM_IRK_INTEGRATOR_H_ | ||||||
|  | #define ACADOS_SIM_SIM_IRK_INTEGRATOR_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include "acados/sim/sim_common.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | #include "blasfeo/include/blasfeo_common.h" | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int nx; | ||||||
|  |     int nu; | ||||||
|  |     int nz; | ||||||
|  | 
 | ||||||
|  | } sim_irk_dims; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     /* external functions */ | ||||||
|  |     // implicit fun - can either be fully implicit ode or dae
 | ||||||
|  |     //          - i.e. dae has z as additional last argument & nz > 0
 | ||||||
|  |     external_function_generic *impl_ode_fun; | ||||||
|  |     // implicit ode & jac_x & jax_xdot & jac_z
 | ||||||
|  |     external_function_generic *impl_ode_fun_jac_x_xdot_z; | ||||||
|  |     // jax_x & jac_xdot & jac_u & jac_z of implicit ode
 | ||||||
|  |     external_function_generic *impl_ode_jac_x_xdot_u_z; | ||||||
|  |     // hessian of implicit ode:
 | ||||||
|  |     external_function_generic *impl_ode_hess; | ||||||
|  | } irk_model; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     struct blasfeo_dvec *rG;        // residuals of G (nx*ns)
 | ||||||
|  |     struct blasfeo_dvec *K;         // internal K variables ((nx+nz)*ns)
 | ||||||
|  |     struct blasfeo_dvec *xt;        // temporary x
 | ||||||
|  |     struct blasfeo_dvec *xn;        // x at each integration step
 | ||||||
|  |     struct blasfeo_dvec xtdot;      // temporary xdot
 | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dvec *lambda;    // adjoint sensitivities (nx + nu)
 | ||||||
|  |     struct blasfeo_dvec *lambdaK;   // auxiliary variable ((nx+nz)*ns) for adjoint propagation
 | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dmat df_dx;     // temporary Jacobian of ode w.r.t x (nx+nz, nx)
 | ||||||
|  |     struct blasfeo_dmat df_dxdot;  // temporary Jacobian of ode w.r.t xdot (nx+nz, nx)
 | ||||||
|  |     struct blasfeo_dmat df_du;     // temporary Jacobian of ode w.r.t u (nx+nz, nu)
 | ||||||
|  |     struct blasfeo_dmat df_dz;     // temporary Jacobian of ode w.r.t z (nx+nz, nu)
 | ||||||
|  | 
 | ||||||
|  |     /* NOTE: the memory allocation corresponding to the following fields is CONDITIONAL */ | ||||||
|  | 
 | ||||||
|  |     // only allocated if (opts->sens_algebraic || opts->output_z)
 | ||||||
|  |     int *ipiv_one_stage;  // index of pivot vector (nx + nz)
 | ||||||
|  |     double *Z_work;  // used to perform computations to get out->zn (ns)
 | ||||||
|  | 
 | ||||||
|  |     // df_dxdotz, dk0_dxu, only allocated if (opts->sens_algebraic && opts->exact_z_output)
 | ||||||
|  |     //      used for algebraic sensitivity generation
 | ||||||
|  |     struct blasfeo_dmat df_dxdotz;  // temporary Jacobian of ode w.r.t. xdot,z (nx+nz, nx+nz);
 | ||||||
|  |     struct blasfeo_dmat dk0_dxu;    // intermediate result, (nx+nz, nx+nu)
 | ||||||
|  | 
 | ||||||
|  |     // dK_dxu: if (!opts->sens_hess) - single blasfeo_dmat that is reused
 | ||||||
|  |     //         if ( opts->sens_hess) - array of (num_steps) blasfeo_dmat
 | ||||||
|  |     //                                  to store intermediate results
 | ||||||
|  |     struct blasfeo_dmat *dK_dxu;  // jacobian of (K,Z) over x and u ((nx+nz)*ns, nx+nu);
 | ||||||
|  | 
 | ||||||
|  |     // S_forw: if (!opts->sens_hess) - single blasfeo_dmat that is reused
 | ||||||
|  |     //         if ( opts->sens_hess) - array of (num_steps + 1) blasfeo_dmat
 | ||||||
|  |     //                                  to store intermediate results
 | ||||||
|  |     struct blasfeo_dmat *S_forw;  // forward sensitivities (nx, nx+nu)
 | ||||||
|  | 
 | ||||||
|  |     // dG_dxu: if (!opts->sens_hess) - single blasfeo_dmat that is reused
 | ||||||
|  |     //         if ( opts->sens_hess) - array of blasfeo_dmat to store intermediate results
 | ||||||
|  |     struct blasfeo_dmat *dG_dxu;  // jacobian of G over x and u ((nx+nz)*ns, nx+nu)
 | ||||||
|  | 
 | ||||||
|  |     // dG_dK:  if (!opts->sens_hess) - single blasfeo_dmat that is reused
 | ||||||
|  |     //         if ( opts->sens_hess) - array of blasfeo_dmat to store intermediate results
 | ||||||
|  |     struct blasfeo_dmat *dG_dK;   // jacobian of G over K ((nx+nz)*ns, (nx+nz)*ns)
 | ||||||
|  | 
 | ||||||
|  |     // ipiv: index of pivot vector
 | ||||||
|  |     //         if (!opts->sens_hess) - array (ns * (nx + nz)) that is reused
 | ||||||
|  |     //         if ( opts->sens_hess) - array (ns * (nx + nz)) * num_steps, to store all
 | ||||||
|  |     //              pivot vectors for dG_dxu
 | ||||||
|  |     int *ipiv;  // index of pivot vector
 | ||||||
|  | 
 | ||||||
|  |     // xn_traj, K_traj only available if( opts->sens_adj || opts->sens_hess )
 | ||||||
|  |     struct blasfeo_dvec *xn_traj;  // xn trajectory
 | ||||||
|  |     struct blasfeo_dvec *K_traj;   // K trajectory
 | ||||||
|  | 
 | ||||||
|  |     /* the following variables are only available if (opts->sens_hess) */ | ||||||
|  |     // For Hessian propagation
 | ||||||
|  |     struct blasfeo_dmat Hess;   // temporary Hessian (nx + nu, nx + nu)
 | ||||||
|  |     // output of impl_ode_hess
 | ||||||
|  |     struct blasfeo_dmat f_hess;  // size: (nx + nu, nx + nu)
 | ||||||
|  |     struct blasfeo_dmat dxkzu_dw0;  // size (2*nx + nu + nz) x (nx + nu)
 | ||||||
|  |     struct blasfeo_dmat tmp_dxkzu_dw0;  // size (2*nx + nu + nz) x (nx + nu)
 | ||||||
|  | 
 | ||||||
|  | } sim_irk_workspace; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     double *xdot;  // xdot[NX] - initialization for state derivatives k within the integrator
 | ||||||
|  |     double *z;     // z[NZ] - initialization for algebraic variables z
 | ||||||
|  | 
 | ||||||
|  | 	double time_sim; | ||||||
|  | 	double time_ad; | ||||||
|  | 	double time_la; | ||||||
|  | } sim_irk_memory; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // get & set functions
 | ||||||
|  | void sim_irk_dims_set(void *config_, void *dims_, const char *field, const int *value); | ||||||
|  | void sim_irk_dims_get(void *config_, void *dims_, const char *field, int* value); | ||||||
|  | 
 | ||||||
|  | // dims
 | ||||||
|  | acados_size_t sim_irk_dims_calculate_size(); | ||||||
|  | void *sim_irk_dims_assign(void *config_, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | // model
 | ||||||
|  | acados_size_t sim_irk_model_calculate_size(void *config, void *dims); | ||||||
|  | void *sim_irk_model_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | int sim_irk_model_set(void *model, const char *field, void *value); | ||||||
|  | 
 | ||||||
|  | // opts
 | ||||||
|  | acados_size_t sim_irk_opts_calculate_size(void *config, void *dims); | ||||||
|  | void *sim_irk_opts_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | void sim_irk_opts_initialize_default(void *config, void *dims, void *opts_); | ||||||
|  | void sim_irk_opts_update(void *config_, void *dims, void *opts_); | ||||||
|  | void sim_irk_opts_set(void *config_, void *opts_, const char *field, void *value); | ||||||
|  | 
 | ||||||
|  | // memory
 | ||||||
|  | acados_size_t sim_irk_memory_calculate_size(void *config, void *dims, void *opts_); | ||||||
|  | void *sim_irk_memory_assign(void *config, void *dims, void *opts_, void *raw_memory); | ||||||
|  | int sim_irk_memory_set(void *config_, void *dims_, void *mem_, const char *field, void *value); | ||||||
|  | 
 | ||||||
|  | // workspace
 | ||||||
|  | acados_size_t sim_irk_workspace_calculate_size(void *config, void *dims, void *opts_); | ||||||
|  | void sim_irk_config_initialize_default(void *config); | ||||||
|  | 
 | ||||||
|  | // main
 | ||||||
|  | int sim_irk(void *config, sim_in *in, sim_out *out, void *opts_, void *mem_, void *work_); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_SIM_SIM_IRK_INTEGRATOR_H_
 | ||||||
| @ -0,0 +1,159 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_SIM_SIM_LIFTED_IRK_INTEGRATOR_H_ | ||||||
|  | #define ACADOS_SIM_SIM_LIFTED_IRK_INTEGRATOR_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include "acados/sim/sim_common.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int nx; | ||||||
|  |     int nu; | ||||||
|  |     int nz; | ||||||
|  | } sim_lifted_irk_dims; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     /* external functions */ | ||||||
|  |     // implicit ode
 | ||||||
|  |     external_function_generic *impl_ode_fun; | ||||||
|  |     // implicit ode & jax_x & jac_xdot & jac_u implicit ode
 | ||||||
|  |     external_function_generic *impl_ode_fun_jac_x_xdot_u; | ||||||
|  | 
 | ||||||
|  | } lifted_irk_model; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dmat *J_temp_x;     // temporary Jacobian of ode w.r.t x (nx, nx)
 | ||||||
|  |     struct blasfeo_dmat *J_temp_xdot;  // temporary Jacobian of ode w.r.t xdot (nx, nx)
 | ||||||
|  |     struct blasfeo_dmat *J_temp_u;     // temporary Jacobian of ode w.r.t u (nx, nu)
 | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dvec *rG;      // residuals of G (nx*ns)
 | ||||||
|  |     struct blasfeo_dvec *xt;      // temporary x
 | ||||||
|  |     struct blasfeo_dvec *xn;      // x at each integration step (for evaluations)
 | ||||||
|  |     struct blasfeo_dvec *xn_out;  // x at each integration step (output)
 | ||||||
|  |     struct blasfeo_dvec *dxn;     // dx at each integration step
 | ||||||
|  |     struct blasfeo_dvec *w;       // stacked x and u
 | ||||||
|  | 
 | ||||||
|  |     int *ipiv;  // index of pivot vector
 | ||||||
|  | 
 | ||||||
|  | } sim_lifted_irk_workspace; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     // memory for lifted integrators
 | ||||||
|  |     struct blasfeo_dmat *S_forw;    // forward sensitivities
 | ||||||
|  |     struct blasfeo_dmat *JGK;       // jacobian of G over K (nx*ns, nx*ns)
 | ||||||
|  |     struct blasfeo_dmat *JGf;       // jacobian of G over x and u (nx*ns, nx+nu);
 | ||||||
|  |     struct blasfeo_dmat *JKf;       // jacobian of K over x and u (nx*ns, nx+nu);
 | ||||||
|  | 
 | ||||||
|  |     struct blasfeo_dvec *K;         // internal variables (nx*ns)
 | ||||||
|  |     struct blasfeo_dvec *x;         // states (nx) -- for expansion step
 | ||||||
|  |     struct blasfeo_dvec *u;         // controls (nu) -- for expansion step
 | ||||||
|  | 
 | ||||||
|  |     int update_sens; | ||||||
|  | 
 | ||||||
|  | 	double time_sim; | ||||||
|  | 	double time_ad; | ||||||
|  | 	double time_la; | ||||||
|  | 
 | ||||||
|  | } sim_lifted_irk_memory; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* dims */ | ||||||
|  | void sim_lifted_irk_dims_set(void *config_, void *dims_, const char *field, const int *value); | ||||||
|  | void sim_lifted_irk_dims_get(void *config_, void *dims_, const char *field, int* value); | ||||||
|  | 
 | ||||||
|  | acados_size_t sim_lifted_irk_dims_calculate_size(); | ||||||
|  | //
 | ||||||
|  | void *sim_lifted_irk_dims_assign(void* config_, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | /* model */ | ||||||
|  | //
 | ||||||
|  | acados_size_t sim_lifted_irk_model_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | void *sim_lifted_irk_model_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | int sim_lifted_irk_model_set(void *model_, const char *field, void *value); | ||||||
|  | 
 | ||||||
|  | /* opts */ | ||||||
|  | //
 | ||||||
|  | acados_size_t sim_lifted_irk_opts_calculate_size(void *config, void *dims); | ||||||
|  | //
 | ||||||
|  | void *sim_lifted_irk_opts_assign(void *config, void *dims, void *raw_memory); | ||||||
|  | //
 | ||||||
|  | void sim_lifted_irk_opts_initialize_default(void *config, void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void sim_lifted_irk_opts_update(void *config_, void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void sim_lifted_irk_opts_set(void *config_, void *opts_, const char *field, void *value); | ||||||
|  | 
 | ||||||
|  | /* memory */ | ||||||
|  | //
 | ||||||
|  | acados_size_t sim_lifted_irk_memory_calculate_size(void *config, void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void *sim_lifted_irk_memory_assign(void *config, void *dims, void *opts_, void *raw_memory); | ||||||
|  | 
 | ||||||
|  | /* workspace */ | ||||||
|  | //
 | ||||||
|  | acados_size_t sim_lifted_irk_workspace_calculate_size(void *config, void *dims, void *opts_); | ||||||
|  | //
 | ||||||
|  | void sim_lifted_irk_config_initialize_default(void *config); | ||||||
|  | 
 | ||||||
|  | /* solver */ | ||||||
|  | //
 | ||||||
|  | int sim_lifted_irk(void *config, sim_in *in, sim_out *out, void *opts_, | ||||||
|  |         void *mem_, void *work_); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_SIM_SIM_LIFTED_IRK_INTEGRATOR_H_
 | ||||||
| @ -0,0 +1,245 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_UTILS_EXTERNAL_FUNCTION_GENERIC_H_ | ||||||
|  | #define ACADOS_UTILS_EXTERNAL_FUNCTION_GENERIC_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * generic external function | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | // type of arguments
 | ||||||
|  | typedef enum { | ||||||
|  |     COLMAJ, | ||||||
|  |     BLASFEO_DMAT, | ||||||
|  |     BLASFEO_DVEC, | ||||||
|  |     COLMAJ_ARGS, | ||||||
|  |     BLASFEO_DMAT_ARGS, | ||||||
|  |     BLASFEO_DVEC_ARGS, | ||||||
|  |     IGNORE_ARGUMENT | ||||||
|  | } ext_fun_arg_t; | ||||||
|  | 
 | ||||||
|  | struct colmaj_args | ||||||
|  | { | ||||||
|  |     double *A; | ||||||
|  |     int lda; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct blasfeo_dmat_args | ||||||
|  | { | ||||||
|  |     struct blasfeo_dmat *A; | ||||||
|  |     int ai; | ||||||
|  |     int aj; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct blasfeo_dvec_args | ||||||
|  | { | ||||||
|  |     struct blasfeo_dvec *x; | ||||||
|  |     int xi; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | // prototype of an external function
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     // public members (have to be before private ones)
 | ||||||
|  |     void (*evaluate)(void *, ext_fun_arg_t *, void **, ext_fun_arg_t *, void **); | ||||||
|  |     // private members
 | ||||||
|  |     // .....
 | ||||||
|  | } external_function_generic; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * generic external parametric function | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | // prototype of a parametric external function
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     // public members for core (have to be before private ones)
 | ||||||
|  |     void (*evaluate)(void *, ext_fun_arg_t *, void **, ext_fun_arg_t *, void **); | ||||||
|  | 	// public members for interfaces
 | ||||||
|  |     void (*get_nparam)(void *, int *); | ||||||
|  |     void (*set_param)(void *, double *); | ||||||
|  |     void (*set_param_sparse)(void *, int n_update, int *idx, double *); | ||||||
|  |     // private members
 | ||||||
|  |     void *ptr_ext_mem;  // pointer to external memory
 | ||||||
|  |     int (*fun)(void **, void **, void *); | ||||||
|  |     double *p;  // parameters
 | ||||||
|  |     int np;     // number of parameters
 | ||||||
|  |     // .....
 | ||||||
|  | } external_function_param_generic; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t external_function_param_generic_struct_size(); | ||||||
|  | //
 | ||||||
|  | void external_function_param_generic_set_fun(external_function_param_generic *fun, void *value); | ||||||
|  | //
 | ||||||
|  | acados_size_t external_function_param_generic_calculate_size(external_function_param_generic *fun, int np); | ||||||
|  | //
 | ||||||
|  | void external_function_param_generic_assign(external_function_param_generic *fun, void *mem); | ||||||
|  | //
 | ||||||
|  | void external_function_param_generic_wrapper(void *self, ext_fun_arg_t *type_in, void **in, ext_fun_arg_t *type_out, void **out); | ||||||
|  | //
 | ||||||
|  | void external_function_param_generic_get_nparam(void *self, int *np); | ||||||
|  | //
 | ||||||
|  | void external_function_param_generic_set_param(void *self, double *p); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * casadi external function | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     // public members (have to be the same as in the prototype, and before the private ones)
 | ||||||
|  |     void (*evaluate)(void *, ext_fun_arg_t *, void **, ext_fun_arg_t *, void **); | ||||||
|  |     // private members
 | ||||||
|  |     void *ptr_ext_mem;  // pointer to external memory
 | ||||||
|  |     int (*casadi_fun)(const double **, double **, int *, double *, void *); | ||||||
|  |     int (*casadi_work)(int *, int *, int *, int *); | ||||||
|  |     const int *(*casadi_sparsity_in)(int); | ||||||
|  |     const int *(*casadi_sparsity_out)(int); | ||||||
|  |     int (*casadi_n_in)(); | ||||||
|  |     int (*casadi_n_out)(); | ||||||
|  |     double **args; | ||||||
|  |     double **res; | ||||||
|  |     double *w; | ||||||
|  |     int *iw; | ||||||
|  |     int *args_size;     // size of args[i]
 | ||||||
|  |     int *res_size;      // size of res[i]
 | ||||||
|  |     int args_num;       // number of args arrays
 | ||||||
|  |     int args_size_tot;  // total size of args arrays
 | ||||||
|  |     int res_num;        // number of res arrays
 | ||||||
|  |     int res_size_tot;   // total size of res arrays
 | ||||||
|  |     int in_num;         // number of input arrays
 | ||||||
|  |     int out_num;        // number of output arrays
 | ||||||
|  |     int iw_size;        // number of ints for worksapce
 | ||||||
|  |     int w_size;         // number of doubles for workspace
 | ||||||
|  | } external_function_casadi; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t external_function_casadi_struct_size(); | ||||||
|  | //
 | ||||||
|  | void external_function_casadi_set_fun(external_function_casadi *fun, void *value); | ||||||
|  | //
 | ||||||
|  | void external_function_casadi_set_work(external_function_casadi *fun, void *value); | ||||||
|  | //
 | ||||||
|  | void external_function_casadi_set_sparsity_in(external_function_casadi *fun, void *value); | ||||||
|  | //
 | ||||||
|  | void external_function_casadi_set_sparsity_out(external_function_casadi *fun, void *value); | ||||||
|  | //
 | ||||||
|  | void external_function_casadi_set_n_in(external_function_casadi *fun, void *value); | ||||||
|  | //
 | ||||||
|  | void external_function_casadi_set_n_out(external_function_casadi *fun, void *value); | ||||||
|  | //
 | ||||||
|  | acados_size_t external_function_casadi_calculate_size(external_function_casadi *fun); | ||||||
|  | //
 | ||||||
|  | void external_function_casadi_assign(external_function_casadi *fun, void *mem); | ||||||
|  | //
 | ||||||
|  | void external_function_casadi_wrapper(void *self, ext_fun_arg_t *type_in, void **in, | ||||||
|  |                                       ext_fun_arg_t *type_out, void **out); | ||||||
|  | 
 | ||||||
|  | /************************************************
 | ||||||
|  |  * casadi external parametric function | ||||||
|  |  ************************************************/ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     // public members for core (have to be the same as in the prototype, and before the private ones)
 | ||||||
|  |     void (*evaluate)(void *, ext_fun_arg_t *, void **, ext_fun_arg_t *, void **); | ||||||
|  | 	// public members for interfaces
 | ||||||
|  |     void (*get_nparam)(void *, int *); | ||||||
|  |     void (*set_param)(void *, double *); | ||||||
|  |     void (*set_param_sparse)(void *, int n_update, int *idx, double *); | ||||||
|  |     // private members
 | ||||||
|  |     void *ptr_ext_mem;  // pointer to external memory
 | ||||||
|  |     int (*casadi_fun)(const double **, double **, int *, double *, void *); | ||||||
|  |     int (*casadi_work)(int *, int *, int *, int *); | ||||||
|  |     const int *(*casadi_sparsity_in)(int); | ||||||
|  |     const int *(*casadi_sparsity_out)(int); | ||||||
|  |     int (*casadi_n_in)(); | ||||||
|  |     int (*casadi_n_out)(); | ||||||
|  |     double **args; | ||||||
|  |     double **res; | ||||||
|  |     double *w; | ||||||
|  |     int *iw; | ||||||
|  |     int *args_size;     // size of args[i]
 | ||||||
|  |     int *res_size;      // size of res[i]
 | ||||||
|  |     int args_num;       // number of args arrays
 | ||||||
|  |     int args_size_tot;  // total size of args arrays
 | ||||||
|  |     int res_num;        // number of res arrays
 | ||||||
|  |     int res_size_tot;   // total size of res arrays
 | ||||||
|  |     int in_num;         // number of input arrays
 | ||||||
|  |     int out_num;        // number of output arrays
 | ||||||
|  |     int iw_size;        // number of ints for worksapce
 | ||||||
|  |     int w_size;         // number of doubles for workspace
 | ||||||
|  |     int np;             // number of parameters
 | ||||||
|  | } external_function_param_casadi; | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | acados_size_t external_function_param_casadi_struct_size(); | ||||||
|  | //
 | ||||||
|  | void external_function_param_casadi_set_fun(external_function_param_casadi *fun, void *value); | ||||||
|  | //
 | ||||||
|  | void external_function_param_casadi_set_work(external_function_param_casadi *fun, void *value); | ||||||
|  | //
 | ||||||
|  | void external_function_param_casadi_set_sparsity_in(external_function_param_casadi *fun, void *value); | ||||||
|  | //
 | ||||||
|  | void external_function_param_casadi_set_sparsity_out(external_function_param_casadi *fun, void *value); | ||||||
|  | //
 | ||||||
|  | void external_function_param_casadi_set_n_in(external_function_param_casadi *fun, void *value); | ||||||
|  | //
 | ||||||
|  | void external_function_param_casadi_set_n_out(external_function_param_casadi *fun, void *value); | ||||||
|  | //
 | ||||||
|  | acados_size_t external_function_param_casadi_calculate_size(external_function_param_casadi *fun, int np); | ||||||
|  | //
 | ||||||
|  | void external_function_param_casadi_assign(external_function_param_casadi *fun, void *mem); | ||||||
|  | //
 | ||||||
|  | void external_function_param_casadi_wrapper(void *self, ext_fun_arg_t *type_in, void **in, | ||||||
|  |                                             ext_fun_arg_t *type_out, void **out); | ||||||
|  | //
 | ||||||
|  | void external_function_param_casadi_get_nparam(void *self, int *np); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_UTILS_EXTERNAL_FUNCTION_GENERIC_H_
 | ||||||
| @ -0,0 +1,105 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_UTILS_MATH_H_ | ||||||
|  | #define ACADOS_UTILS_MATH_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | #if defined(__DSPACE__) | ||||||
|  | double fmax(double a, double b); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #define MIN(a,b) (((a)<(b))?(a):(b)) | ||||||
|  | #define MAX(a,b) (((a)>(b))?(a):(b)) | ||||||
|  | 
 | ||||||
|  | void dgemm_nn_3l(int m, int n, int k, double *A, int lda, double *B, int ldb, double *C, int ldc); | ||||||
|  | // void dgemv_n_3l(int m, int n, double *A, int lda, double *x, double *y);
 | ||||||
|  | // void dgemv_t_3l(int m, int n, double *A, int lda, double *x, double *y);
 | ||||||
|  | // void dcopy_3l(int n, double *x, int incx, double *y, int incy);
 | ||||||
|  | void daxpy_3l(int n, double da, double *dx, double *dy); | ||||||
|  | void dscal_3l(int n, double da, double *dx); | ||||||
|  | double twonormv(int n, double *ptrv); | ||||||
|  | 
 | ||||||
|  | /* copies a matrix into another matrix */ | ||||||
|  | void dmcopy(int row, int col, double *ptrA, int lda, double *ptrB, int ldb); | ||||||
|  | 
 | ||||||
|  | /* solution of a system of linear equations */ | ||||||
|  | void dgesv_3l(int n, int nrhs, double *A, int lda, int *ipiv, double *B, int ldb, int *info); | ||||||
|  | 
 | ||||||
|  | /* matrix exponential */ | ||||||
|  | void expm(int row, double *A); | ||||||
|  | 
 | ||||||
|  | int idamax_3l(int n, double *x); | ||||||
|  | 
 | ||||||
|  | void dswap_3l(int n, double *x, int incx, double *y, int incy); | ||||||
|  | 
 | ||||||
|  | void dger_3l(int m, int n, double alpha, double *x, int incx, double *y, int incy, double *A, | ||||||
|  |              int lda); | ||||||
|  | 
 | ||||||
|  | void dgetf2_3l(int m, int n, double *A, int lda, int *ipiv, int *info); | ||||||
|  | 
 | ||||||
|  | void dlaswp_3l(int n, double *A, int lda, int k1, int k2, int *ipiv); | ||||||
|  | 
 | ||||||
|  | void dtrsm_l_l_n_u_3l(int m, int n, double *A, int lda, double *B, int ldb); | ||||||
|  | 
 | ||||||
|  | void dgetrs_3l(int n, int nrhs, double *A, int lda, int *ipiv, double *B, int ldb); | ||||||
|  | 
 | ||||||
|  | void dgesv_3l(int n, int nrhs, double *A, int lda, int *ipiv, double *B, int ldb, int *info); | ||||||
|  | 
 | ||||||
|  | double onenorm(int row, int col, double *ptrA); | ||||||
|  | 
 | ||||||
|  | // double twonormv(int n, double *ptrv);
 | ||||||
|  | 
 | ||||||
|  | void padeapprox(int m, int row, double *A); | ||||||
|  | 
 | ||||||
|  | void expm(int row, double *A); | ||||||
|  | 
 | ||||||
|  | // void d_compute_qp_size_ocp2dense_rev(int N, int *nx, int *nu, int *nb, int **hidxb, int *ng,
 | ||||||
|  | //                                      int *nvd, int *ned, int *nbd, int *ngd);
 | ||||||
|  | 
 | ||||||
|  | void acados_eigen_decomposition(int dim, double *A, double *V, double *d, double *e); | ||||||
|  | 
 | ||||||
|  | double minimum_of_doubles(double *x, int n); | ||||||
|  | 
 | ||||||
|  | void neville_algorithm(double xx, int n, double *x, double *Q, double *out); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_UTILS_MATH_H_
 | ||||||
| @ -0,0 +1,113 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_UTILS_MEM_H_ | ||||||
|  | #define ACADOS_UTILS_MEM_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdbool.h> | ||||||
|  | 
 | ||||||
|  | #include "types.h" | ||||||
|  | 
 | ||||||
|  | // blasfeo
 | ||||||
|  | #include "blasfeo/include/blasfeo_d_aux.h" | ||||||
|  | #include "blasfeo/include/blasfeo_d_aux_ext_dep.h" | ||||||
|  | 
 | ||||||
|  | // TODO(dimitris): probably does not belong here
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int (*fun)(void *); | ||||||
|  |     acados_size_t (*calculate_args_size)(void *); | ||||||
|  |     void *(*assign_args)(void *); | ||||||
|  |     void (*initialize_default_args)(void *); | ||||||
|  |     acados_size_t (*calculate_memory_size)(void *); | ||||||
|  |     void *(*assign_memory)(void *); | ||||||
|  |     acados_size_t (*calculate_workspace_size)(void *); | ||||||
|  | } module_solver; | ||||||
|  | 
 | ||||||
|  | // make int counter of memory multiple of a number (typically 8 or 64)
 | ||||||
|  | void make_int_multiple_of(acados_size_t num, acados_size_t *size); | ||||||
|  | 
 | ||||||
|  | // align char pointer to number (typically 8 for pointers and doubles,
 | ||||||
|  | // 64 for blasfeo structs) and return offset
 | ||||||
|  | int align_char_to(int num, char **c_ptr); | ||||||
|  | 
 | ||||||
|  | // switch between malloc and calloc (for valgrinding)
 | ||||||
|  | void *acados_malloc(size_t nitems, acados_size_t size); | ||||||
|  | 
 | ||||||
|  | // uses always calloc
 | ||||||
|  | void *acados_calloc(size_t nitems, acados_size_t size); | ||||||
|  | 
 | ||||||
|  | // allocate vector of pointers to vectors of doubles and advance pointer
 | ||||||
|  | void assign_and_advance_double_ptrs(int n, double ***v, char **ptr); | ||||||
|  | 
 | ||||||
|  | // allocate vector of pointers to vectors of ints and advance pointer
 | ||||||
|  | void assign_and_advance_int_ptrs(int n, int ***v, char **ptr); | ||||||
|  | 
 | ||||||
|  | // allocate vector of pointers to strvecs and advance pointer
 | ||||||
|  | void assign_and_advance_blasfeo_dvec_structs(int n, struct blasfeo_dvec **sv, char **ptr); | ||||||
|  | 
 | ||||||
|  | // allocate vector of pointers to strmats and advance pointer
 | ||||||
|  | void assign_and_advance_blasfeo_dmat_structs(int n, struct blasfeo_dmat **sm, char **ptr); | ||||||
|  | 
 | ||||||
|  | // allocate vector of pointers to vector of pointers to strmats and advance pointer
 | ||||||
|  | void assign_and_advance_blasfeo_dmat_ptrs(int n, struct blasfeo_dmat ***sm, char **ptr); | ||||||
|  | 
 | ||||||
|  | // allocate vector of chars and advance pointer
 | ||||||
|  | void assign_and_advance_char(int n, char **v, char **ptr); | ||||||
|  | 
 | ||||||
|  | // allocate vector of ints and advance pointer
 | ||||||
|  | void assign_and_advance_int(int n, int **v, char **ptr); | ||||||
|  | 
 | ||||||
|  | // allocate vector of bools and advance pointer
 | ||||||
|  | void assign_and_advance_bool(int n, bool **v, char **ptr); | ||||||
|  | 
 | ||||||
|  | // allocate vector of doubles and advance pointer
 | ||||||
|  | void assign_and_advance_double(int n, double **v, char **ptr); | ||||||
|  | 
 | ||||||
|  | // allocate strvec and advance pointer
 | ||||||
|  | void assign_and_advance_blasfeo_dvec_mem(int n, struct blasfeo_dvec *sv, char **ptr); | ||||||
|  | 
 | ||||||
|  | // allocate strmat and advance pointer
 | ||||||
|  | void assign_and_advance_blasfeo_dmat_mem(int m, int n, struct blasfeo_dmat *sA, char **ptr); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_UTILS_MEM_H_
 | ||||||
| @ -0,0 +1,109 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_UTILS_PRINT_H_ | ||||||
|  | #define ACADOS_UTILS_PRINT_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include "acados/dense_qp/dense_qp_common.h" | ||||||
|  | #include "acados/ocp_nlp/ocp_nlp_common.h" | ||||||
|  | #include "acados/ocp_qp/ocp_qp_common.h" | ||||||
|  | #include "acados/ocp_qp/ocp_qp_common_frontend.h" | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | // void print_matrix(char *file_name, const real_t *matrix, const int_t nrows, const int_t ncols);
 | ||||||
|  | 
 | ||||||
|  | // void print_matrix_name(char *file_name, char *name, const real_t *matrix, const int_t nrows,
 | ||||||
|  | //                        const int_t ncols);
 | ||||||
|  | 
 | ||||||
|  | // void print_int_matrix(char *file_name, const int_t *matrix, const int_t nrows, const int_t ncols);
 | ||||||
|  | 
 | ||||||
|  | // void print_array(char *file_name, real_t *array, int_t size);
 | ||||||
|  | 
 | ||||||
|  | // void print_int_array(char *file_name, const int_t *array, int_t size);
 | ||||||
|  | 
 | ||||||
|  | void read_matrix(const char *file_name, real_t *array, const int_t nrows, const int_t ncols); | ||||||
|  | 
 | ||||||
|  | void write_double_vector_to_txt(real_t *vec, int_t n, const char *fname); | ||||||
|  | 
 | ||||||
|  | // ocp nlp
 | ||||||
|  | // TODO(andrea): inconsistent naming
 | ||||||
|  | void ocp_nlp_dims_print(ocp_nlp_dims *dims); | ||||||
|  | // TODO(andrea): inconsistent naming
 | ||||||
|  | void ocp_nlp_out_print(ocp_nlp_dims *dims, ocp_nlp_out *nlp_out); | ||||||
|  | // TODO(andrea): inconsistent naming
 | ||||||
|  | void ocp_nlp_res_print(ocp_nlp_dims *dims, ocp_nlp_res *nlp_res); | ||||||
|  | 
 | ||||||
|  | // ocp qp
 | ||||||
|  | void print_ocp_qp_dims(ocp_qp_dims *dims); | ||||||
|  | 
 | ||||||
|  | // void print_dense_qp_dims(dense_qp_dims *dims);
 | ||||||
|  | 
 | ||||||
|  | void print_ocp_qp_in(ocp_qp_in *qp_in); | ||||||
|  | 
 | ||||||
|  | void print_ocp_qp_out(ocp_qp_out *qp_out); | ||||||
|  | 
 | ||||||
|  | // void print_ocp_qp_in_to_string(char string_out[], ocp_qp_in *qp_in);
 | ||||||
|  | 
 | ||||||
|  | // void print_ocp_qp_out_to_string(char string_out[], ocp_qp_out *qp_out);
 | ||||||
|  | 
 | ||||||
|  | void print_ocp_qp_res(ocp_qp_res *qp_res); | ||||||
|  | 
 | ||||||
|  | // void print_colmaj_ocp_qp_in(colmaj_ocp_qp_in *qp);
 | ||||||
|  | 
 | ||||||
|  | // void print_colmaj_ocp_qp_in_to_file(colmaj_ocp_qp_in *qp);
 | ||||||
|  | 
 | ||||||
|  | // void print_colmaj_ocp_qp_out(char *filename, colmaj_ocp_qp_in *qp, colmaj_ocp_qp_out *out);
 | ||||||
|  | 
 | ||||||
|  | void print_dense_qp_in(dense_qp_in *qp_in); | ||||||
|  | 
 | ||||||
|  | void print_qp_info(qp_info *info); | ||||||
|  | 
 | ||||||
|  | // void acados_warning(char warning_string[]);
 | ||||||
|  | 
 | ||||||
|  | // void acados_error(char error_string[]);
 | ||||||
|  | 
 | ||||||
|  | // void acados_not_implemented(char feature_string[]);
 | ||||||
|  | 
 | ||||||
|  | // blasfeo
 | ||||||
|  | // void print_blasfeo_target();
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_UTILS_PRINT_H_
 | ||||||
| @ -0,0 +1,72 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_UTILS_STRSEP_H_ | ||||||
|  | #define ACADOS_UTILS_STRSEP_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | #include <string> | ||||||
|  | #define STD(x) std::x | ||||||
|  | namespace std | ||||||
|  | { | ||||||
|  | #else | ||||||
|  | #include <string.h> | ||||||
|  | #define STD(x) x | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | char* strsep_acados(char** stringp, const char* delim) | ||||||
|  | { | ||||||
|  |     char* result; | ||||||
|  | 
 | ||||||
|  |     if ((stringp == NULL) || (*stringp == NULL)) return NULL; | ||||||
|  | 
 | ||||||
|  |     result = *stringp; | ||||||
|  | 
 | ||||||
|  |     while (**stringp && !STD(strchr)(delim, **stringp)) ++*stringp; | ||||||
|  | 
 | ||||||
|  |     if (**stringp) | ||||||
|  |         *(*stringp)++ = '\0'; | ||||||
|  |     else | ||||||
|  |         *stringp = NULL; | ||||||
|  | 
 | ||||||
|  |     return result; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | }  // namespace std
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #undef STD | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_UTILS_STRSEP_H_
 | ||||||
| @ -0,0 +1,125 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_UTILS_TIMING_H_ | ||||||
|  | #define ACADOS_UTILS_TIMING_H_ | ||||||
|  | 
 | ||||||
|  | #include "acados/utils/types.h" | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef MEASURE_TIMINGS | ||||||
|  | #if (defined _WIN32 || defined _WIN64) && !(defined __MINGW32__ || defined __MINGW64__) | ||||||
|  | 
 | ||||||
|  | /* Use Windows QueryPerformanceCounter for timing. */ | ||||||
|  | #include <Windows.h> | ||||||
|  | 
 | ||||||
|  | /** A structure for keeping internal timer data. */ | ||||||
|  | typedef struct acados_timer_ | ||||||
|  | { | ||||||
|  |     LARGE_INTEGER tic; | ||||||
|  |     LARGE_INTEGER toc; | ||||||
|  |     LARGE_INTEGER freq; | ||||||
|  | } acados_timer; | ||||||
|  | 
 | ||||||
|  | #elif defined(__APPLE__) | ||||||
|  | 
 | ||||||
|  | #include <mach/mach_time.h> | ||||||
|  | 
 | ||||||
|  | /** A structure for keeping internal timer data. */ | ||||||
|  | typedef struct acados_timer_ | ||||||
|  | { | ||||||
|  |     uint64_t tic; | ||||||
|  |     uint64_t toc; | ||||||
|  |     mach_timebase_info_data_t tinfo; | ||||||
|  | } acados_timer; | ||||||
|  | 
 | ||||||
|  | #elif defined(__DSPACE__) | ||||||
|  | 
 | ||||||
|  | #include <brtenv.h> | ||||||
|  | 
 | ||||||
|  | typedef struct acados_timer_ | ||||||
|  | { | ||||||
|  |     double time; | ||||||
|  | } acados_timer; | ||||||
|  | 
 | ||||||
|  | #else | ||||||
|  | 
 | ||||||
|  | /* Use POSIX clock_gettime() for timing on non-Windows machines. */ | ||||||
|  | #include <time.h> | ||||||
|  | 
 | ||||||
|  | #if (__STDC_VERSION__ >= 199901L) && !(defined __MINGW32__ || defined __MINGW64__)  // C99 Mode
 | ||||||
|  | 
 | ||||||
|  | #include <sys/stat.h> | ||||||
|  | #include <sys/time.h> | ||||||
|  | 
 | ||||||
|  | typedef struct acados_timer_ | ||||||
|  | { | ||||||
|  |     struct timeval tic; | ||||||
|  |     struct timeval toc; | ||||||
|  | } acados_timer; | ||||||
|  | 
 | ||||||
|  | #else  // ANSI C Mode
 | ||||||
|  | 
 | ||||||
|  | /** A structure for keeping internal timer data. */ | ||||||
|  | typedef struct acados_timer_ | ||||||
|  | { | ||||||
|  |     struct timespec tic; | ||||||
|  |     struct timespec toc; | ||||||
|  | } acados_timer; | ||||||
|  | 
 | ||||||
|  | #endif  // __STDC_VERSION__ >= 199901L
 | ||||||
|  | 
 | ||||||
|  | #endif  // (defined _WIN32 || defined _WIN64)
 | ||||||
|  | 
 | ||||||
|  | #else | ||||||
|  | 
 | ||||||
|  | // Dummy type when timings are off
 | ||||||
|  | typedef real_t acados_timer; | ||||||
|  | 
 | ||||||
|  | #endif  // MEASURE_TIMINGS
 | ||||||
|  | 
 | ||||||
|  | /** A function for measurement of the current time. */ | ||||||
|  | void acados_tic(acados_timer* t); | ||||||
|  | 
 | ||||||
|  | /** A function which returns the elapsed time. */ | ||||||
|  | real_t acados_toc(acados_timer* t); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_UTILS_TIMING_H_
 | ||||||
| @ -0,0 +1,79 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, | ||||||
|  |  * Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, | ||||||
|  |  * Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, | ||||||
|  |  * Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl | ||||||
|  |  * | ||||||
|  |  * This file is part of acados. | ||||||
|  |  * | ||||||
|  |  * The 2-Clause BSD License | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer. | ||||||
|  |  * | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  |  * and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||||||
|  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  |  * POSSIBILITY OF SUCH DAMAGE.; | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef ACADOS_UTILS_TYPES_H_ | ||||||
|  | #define ACADOS_UTILS_TYPES_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include <stdbool.h> | ||||||
|  | #include <stddef.h> | ||||||
|  | 
 | ||||||
|  | #define MAX_STR_LEN 256 | ||||||
|  | #define ACADOS_EPS 1e-12 | ||||||
|  | #define ACADOS_NEG_INFTY -1.0e9 | ||||||
|  | #define ACADOS_POS_INFTY +1.0e9 | ||||||
|  | #define UNUSED(x) ((void)(x)) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef double real_t; | ||||||
|  | typedef int int_t; | ||||||
|  | typedef size_t acados_size_t; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | typedef int (*casadi_function_t)(const double** arg, double** res, int* iw, double* w, void* mem); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // enum of return values
 | ||||||
|  | enum return_values | ||||||
|  | { | ||||||
|  |     ACADOS_SUCCESS, | ||||||
|  |     ACADOS_FAILURE, | ||||||
|  |     ACADOS_MAXITER, | ||||||
|  |     ACADOS_MINSTEP, | ||||||
|  |     ACADOS_QP_FAILURE, | ||||||
|  |     ACADOS_READY, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } /* extern "C" */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  // ACADOS_UTILS_TYPES_H_
 | ||||||
									
										Binary file not shown.
									
								
							
						
									
										Binary file not shown.
									
								
							
						
									
										Binary file not shown.
									
								
							
						
									
										Binary file not shown.
									
								
							
						
					Loading…
					
					
				
		Reference in new issue