/*
* 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 . ;
*/
// standard
# include <stdio.h>
# include <stdlib.h>
# include <assert.h>
// acados
// #include "acados/utils/print.h"
# include "acados_c/ocp_nlp_interface.h"
# include "acados_c/external_function_interface.h"
// example specific
# include "{{ model.name }}_model/{{ model.name }}_model.h"
{ % if constraints . constr_type = = " BGP " and dims . nphi % }
# include "{{ model.name }}_constraints/{{ model.name }}_phi_constraint.h"
{ % endif % }
{ % if constraints . constr_type_e = = " BGP " and dims . nphi_e > 0 % }
# include "{{ model.name }}_constraints/{{ model.name }}_phi_e_constraint.h"
{ % endif % }
{ % if constraints . constr_type = = " BGH " and dims . nh > 0 % }
# include "{{ model.name }}_constraints/{{ model.name }}_h_constraint.h"
{ % endif % }
{ % if constraints . constr_type_e = = " BGH " and dims . nh_e > 0 % }
# include "{{ model.name }}_constraints/{{ model.name }}_h_e_constraint.h"
{ % endif % }
{ % - if cost . cost_type = = " NONLINEAR_LS " % }
# include "{{ model.name }}_cost/{{ model.name }}_cost_y_fun.h"
{ % - elif cost . cost_type = = " EXTERNAL " % }
# include "{{ model.name }}_cost/{{ model.name }}_external_cost.h"
{ % - endif % }
{ % - if cost . cost_type_0 = = " NONLINEAR_LS " % }
# include "{{ model.name }}_cost/{{ model.name }}_cost_y_0_fun.h"
{ % - elif cost . cost_type_0 = = " EXTERNAL " % }
# include "{{ model.name }}_cost/{{ model.name }}_external_cost_0.h"
{ % - endif % }
{ % - if cost . cost_type_e = = " NONLINEAR_LS " % }
# include "{{ model.name }}_cost/{{ model.name }}_cost_y_e_fun.h"
{ % - elif cost . cost_type_e = = " EXTERNAL " % }
# include "{{ model.name }}_cost/{{ model.name }}_external_cost_e.h"
{ % - endif % }
# include "acados_solver_{{ model.name }}.h"
# define NX {{ model.name | upper }}_NX
# define NZ {{ model.name | upper }}_NZ
# define NU {{ model.name | upper }}_NU
# define NP {{ model.name | upper }}_NP
# define NBX {{ model.name | upper }}_NBX
# define NBX0 {{ model.name | upper }}_NBX0
# define NBU {{ model.name | upper }}_NBU
# define NSBX {{ model.name | upper }}_NSBX
# define NSBU {{ model.name | upper }}_NSBU
# define NSH {{ model.name | upper }}_NSH
# define NSG {{ model.name | upper }}_NSG
# define NSPHI {{ model.name | upper }}_NSPHI
# define NSHN {{ model.name | upper }}_NSHN
# define NSGN {{ model.name | upper }}_NSGN
# define NSPHIN {{ model.name | upper }}_NSPHIN
# define NSBXN {{ model.name | upper }}_NSBXN
# define NS {{ model.name | upper }}_NS
# define NSN {{ model.name | upper }}_NSN
# define NG {{ model.name | upper }}_NG
# define NBXN {{ model.name | upper }}_NBXN
# define NGN {{ model.name | upper }}_NGN
# define NY0 {{ model.name | upper }}_NY0
# define NY {{ model.name | upper }}_NY
# define NYN {{ model.name | upper }}_NYN
// #define N {{ model.name | upper }}_N
# define NH {{ model.name | upper }}_NH
# define NPHI {{ model.name | upper }}_NPHI
# define NHN {{ model.name | upper }}_NHN
# define NPHIN {{ model.name | upper }}_NPHIN
# define NR {{ model.name | upper }}_NR
// ** solver data **
{ { model . name } } _solver_capsule * { { model . name } } _acados_create_capsule ( void )
{
void * capsule_mem = malloc ( sizeof ( { { model . name } } _solver_capsule ) ) ;
{ { model . name } } _solver_capsule * capsule = ( { { model . name } } _solver_capsule * ) capsule_mem ;
return capsule ;
}
int { { model . name } } _acados_free_capsule ( { { model . name } } _solver_capsule * capsule )
{
free ( capsule ) ;
return 0 ;
}
int { { model . name } } _acados_create ( { { model . name } } _solver_capsule * capsule )
{
int N_shooting_intervals = { { model . name | upper } } _N ;
double * new_time_steps = NULL ; // NULL -> don't alter the code generated time-steps
return { { model . name } } _acados_create_with_discretization ( capsule , N_shooting_intervals , new_time_steps ) ;
}
int { { model . name } } _acados_update_time_steps ( { { model . name } } _solver_capsule * capsule , int N , double * new_time_steps )
{
if ( N ! = capsule - > nlp_solver_plan - > N ) {
fprintf ( stderr , " {{ model.name }}_acados_update_time_steps: given number of time steps (= %d) " \
" differs from the currently allocated number of " \
" time steps (= %d)! \n " \
" Please recreate with new discretization and provide a new vector of time_stamps! \n " ,
N , capsule - > nlp_solver_plan - > N ) ;
return 1 ;
}
ocp_nlp_config * nlp_config = capsule - > nlp_config ;
ocp_nlp_dims * nlp_dims = capsule - > nlp_dims ;
ocp_nlp_in * nlp_in = capsule - > nlp_in ;
for ( int i = 0 ; i < N ; i + + )
{
ocp_nlp_in_set ( nlp_config , nlp_dims , nlp_in , i , " Ts " , & new_time_steps [ i ] ) ;
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , i , " scaling " , & new_time_steps [ i ] ) ;
}
return 0 ;
}
/**
* Internal function for { { model . name } } _acados_create : step 1
*/
void { { model . name } } _acados_create_1_set_plan ( ocp_nlp_plan_t * nlp_solver_plan , const int N )
{
assert ( N = = nlp_solver_plan - > N ) ;
/************************************************
* plan
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
{ % - if solver_options . nlp_solver_type = = " SQP " % }
nlp_solver_plan - > nlp_solver = SQP ;
{ % - else % }
nlp_solver_plan - > nlp_solver = SQP_RTI ;
{ % - endif % }
nlp_solver_plan - > ocp_qp_solver_plan . qp_solver = { { solver_options . qp_solver } } ;
nlp_solver_plan - > nlp_cost [ 0 ] = { { cost . cost_type_0 } } ;
for ( int i = 1 ; i < N ; i + + )
nlp_solver_plan - > nlp_cost [ i ] = { { cost . cost_type } } ;
nlp_solver_plan - > nlp_cost [ N ] = { { cost . cost_type_e } } ;
for ( int i = 0 ; i < N ; i + + )
{
{ % - if solver_options . integrator_type = = " DISCRETE " % }
nlp_solver_plan - > nlp_dynamics [ i ] = DISCRETE_MODEL ;
// discrete dynamics does not need sim solver option, this field is ignored
nlp_solver_plan - > sim_solver_plan [ i ] . sim_solver = INVALID_SIM_SOLVER ;
{ % - else % }
nlp_solver_plan - > nlp_dynamics [ i ] = CONTINUOUS_MODEL ;
nlp_solver_plan - > sim_solver_plan [ i ] . sim_solver = { { solver_options . integrator_type } } ;
{ % - endif % }
}
for ( int i = 0 ; i < N ; i + + )
{
{ % - if constraints . constr_type = = " BGP " % }
nlp_solver_plan - > nlp_constraints [ i ] = BGP ;
{ % - else - % }
nlp_solver_plan - > nlp_constraints [ i ] = BGH ;
{ % - endif % }
}
{ % - if constraints . constr_type_e = = " BGP " % }
nlp_solver_plan - > nlp_constraints [ N ] = BGP ;
{ % - else % }
nlp_solver_plan - > nlp_constraints [ N ] = BGH ;
{ % - endif % }
{ % - if solver_options . hessian_approx = = " EXACT " % }
{ % - if solver_options . regularize_method = = " NO_REGULARIZE " % }
nlp_solver_plan - > regularization = NO_REGULARIZE ;
{ % - elif solver_options . regularize_method = = " MIRROR " % }
nlp_solver_plan - > regularization = MIRROR ;
{ % - elif solver_options . regularize_method = = " PROJECT " % }
nlp_solver_plan - > regularization = PROJECT ;
{ % - elif solver_options . regularize_method = = " PROJECT_REDUC_HESS " % }
nlp_solver_plan - > regularization = PROJECT_REDUC_HESS ;
{ % - elif solver_options . regularize_method = = " CONVEXIFY " % }
nlp_solver_plan - > regularization = CONVEXIFY ;
{ % - endif % }
{ % - endif % }
}
/**
* Internal function for { { model . name } } _acados_create : step 2
*/
ocp_nlp_dims * { { model . name } } _acados_create_2_create_and_set_dimensions ( { { model . name } } _solver_capsule * capsule )
{
ocp_nlp_plan_t * nlp_solver_plan = capsule - > nlp_solver_plan ;
const int N = nlp_solver_plan - > N ;
ocp_nlp_config * nlp_config = capsule - > nlp_config ;
/************************************************
* dimensions
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# define NINTNP1MEMS 17
int * intNp1mem = ( int * ) malloc ( ( N + 1 ) * sizeof ( int ) * NINTNP1MEMS ) ;
int * nx = intNp1mem + ( N + 1 ) * 0 ;
int * nu = intNp1mem + ( N + 1 ) * 1 ;
int * nbx = intNp1mem + ( N + 1 ) * 2 ;
int * nbu = intNp1mem + ( N + 1 ) * 3 ;
int * nsbx = intNp1mem + ( N + 1 ) * 4 ;
int * nsbu = intNp1mem + ( N + 1 ) * 5 ;
int * nsg = intNp1mem + ( N + 1 ) * 6 ;
int * nsh = intNp1mem + ( N + 1 ) * 7 ;
int * nsphi = intNp1mem + ( N + 1 ) * 8 ;
int * ns = intNp1mem + ( N + 1 ) * 9 ;
int * ng = intNp1mem + ( N + 1 ) * 10 ;
int * nh = intNp1mem + ( N + 1 ) * 11 ;
int * nphi = intNp1mem + ( N + 1 ) * 12 ;
int * nz = intNp1mem + ( N + 1 ) * 13 ;
int * ny = intNp1mem + ( N + 1 ) * 14 ;
int * nr = intNp1mem + ( N + 1 ) * 15 ;
int * nbxe = intNp1mem + ( N + 1 ) * 16 ;
for ( int i = 0 ; i < N + 1 ; i + + )
{
// common
nx [ i ] = NX ;
nu [ i ] = NU ;
nz [ i ] = NZ ;
ns [ i ] = NS ;
// cost
ny [ i ] = NY ;
// constraints
nbx [ i ] = NBX ;
nbu [ i ] = NBU ;
nsbx [ i ] = NSBX ;
nsbu [ i ] = NSBU ;
nsg [ i ] = NSG ;
nsh [ i ] = NSH ;
nsphi [ i ] = NSPHI ;
ng [ i ] = NG ;
nh [ i ] = NH ;
nphi [ i ] = NPHI ;
nr [ i ] = NR ;
nbxe [ i ] = 0 ;
}
// for initial state
nbx [ 0 ] = NBX0 ;
nsbx [ 0 ] = 0 ;
ns [ 0 ] = NS - NSBX ;
nbxe [ 0 ] = { { dims . nbxe_0 } } ;
ny [ 0 ] = NY0 ;
// terminal - common
nu [ N ] = 0 ;
nz [ N ] = 0 ;
ns [ N ] = NSN ;
// cost
ny [ N ] = NYN ;
// constraint
nbx [ N ] = NBXN ;
nbu [ N ] = 0 ;
ng [ N ] = NGN ;
nh [ N ] = NHN ;
nphi [ N ] = NPHIN ;
nr [ N ] = { { dims . nr_e } } ;
nsbx [ N ] = NSBXN ;
nsbu [ N ] = 0 ;
nsg [ N ] = NSGN ;
nsh [ N ] = NSHN ;
nsphi [ N ] = NSPHIN ;
/* create and set ocp_nlp_dims */
ocp_nlp_dims * nlp_dims = ocp_nlp_dims_create ( nlp_config ) ;
ocp_nlp_dims_set_opt_vars ( nlp_config , nlp_dims , " nx " , nx ) ;
ocp_nlp_dims_set_opt_vars ( nlp_config , nlp_dims , " nu " , nu ) ;
ocp_nlp_dims_set_opt_vars ( nlp_config , nlp_dims , " nz " , nz ) ;
ocp_nlp_dims_set_opt_vars ( nlp_config , nlp_dims , " ns " , ns ) ;
for ( int i = 0 ; i < = N ; i + + )
{
ocp_nlp_dims_set_constraints ( nlp_config , nlp_dims , i , " nbx " , & nbx [ i ] ) ;
ocp_nlp_dims_set_constraints ( nlp_config , nlp_dims , i , " nbu " , & nbu [ i ] ) ;
ocp_nlp_dims_set_constraints ( nlp_config , nlp_dims , i , " nsbx " , & nsbx [ i ] ) ;
ocp_nlp_dims_set_constraints ( nlp_config , nlp_dims , i , " nsbu " , & nsbu [ i ] ) ;
ocp_nlp_dims_set_constraints ( nlp_config , nlp_dims , i , " ng " , & ng [ i ] ) ;
ocp_nlp_dims_set_constraints ( nlp_config , nlp_dims , i , " nsg " , & nsg [ i ] ) ;
ocp_nlp_dims_set_constraints ( nlp_config , nlp_dims , i , " nbxe " , & nbxe [ i ] ) ;
}
{ % - if cost . cost_type_0 = = " NONLINEAR_LS " or cost . cost_type_0 = = " LINEAR_LS " % }
ocp_nlp_dims_set_cost ( nlp_config , nlp_dims , 0 , " ny " , & ny [ 0 ] ) ;
{ % - endif % }
{ % - if cost . cost_type = = " NONLINEAR_LS " or cost . cost_type = = " LINEAR_LS " % }
for ( int i = 1 ; i < N ; i + + )
ocp_nlp_dims_set_cost ( nlp_config , nlp_dims , i , " ny " , & ny [ i ] ) ;
{ % - endif % }
for ( int i = 0 ; i < N ; i + + )
{
{ % - if constraints . constr_type = = " BGH " and dims . nh > 0 % }
ocp_nlp_dims_set_constraints ( nlp_config , nlp_dims , i , " nh " , & nh [ i ] ) ;
ocp_nlp_dims_set_constraints ( nlp_config , nlp_dims , i , " nsh " , & nsh [ i ] ) ;
{ % - elif constraints . constr_type = = " BGP " and dims . nphi > 0 % }
ocp_nlp_dims_set_constraints ( nlp_config , nlp_dims , i , " nr " , & nr [ i ] ) ;
ocp_nlp_dims_set_constraints ( nlp_config , nlp_dims , i , " nphi " , & nphi [ i ] ) ;
ocp_nlp_dims_set_constraints ( nlp_config , nlp_dims , i , " nsphi " , & nsphi [ i ] ) ;
{ % - endif % }
}
{ % - if constraints . constr_type_e = = " BGH " % }
ocp_nlp_dims_set_constraints ( nlp_config , nlp_dims , N , " nh " , & nh [ N ] ) ;
ocp_nlp_dims_set_constraints ( nlp_config , nlp_dims , N , " nsh " , & nsh [ N ] ) ;
{ % - elif constraints . constr_type_e = = " BGP " % }
ocp_nlp_dims_set_constraints ( nlp_config , nlp_dims , N , " nr " , & nr [ N ] ) ;
ocp_nlp_dims_set_constraints ( nlp_config , nlp_dims , N , " nphi " , & nphi [ N ] ) ;
ocp_nlp_dims_set_constraints ( nlp_config , nlp_dims , N , " nsphi " , & nsphi [ N ] ) ;
{ % - endif % }
{ % - if cost . cost_type_e = = " NONLINEAR_LS " or cost . cost_type_e = = " LINEAR_LS " % }
ocp_nlp_dims_set_cost ( nlp_config , nlp_dims , N , " ny " , & ny [ N ] ) ;
{ % - endif % }
free ( intNp1mem ) ;
{ % - if solver_options . integrator_type = = " GNSF " - % }
// GNSF specific dimensions
int gnsf_nx1 = { { dims . gnsf_nx1 } } ;
int gnsf_nz1 = { { dims . gnsf_nz1 } } ;
int gnsf_nout = { { dims . gnsf_nout } } ;
int gnsf_ny = { { dims . gnsf_ny } } ;
int gnsf_nuhat = { { dims . gnsf_nuhat } } ;
for ( int i = 0 ; i < N ; i + + )
{
if ( nlp_solver_plan - > sim_solver_plan [ i ] . sim_solver = = GNSF )
{
ocp_nlp_dims_set_dynamics ( nlp_config , nlp_dims , i , " gnsf_nx1 " , & gnsf_nx1 ) ;
ocp_nlp_dims_set_dynamics ( nlp_config , nlp_dims , i , " gnsf_nz1 " , & gnsf_nz1 ) ;
ocp_nlp_dims_set_dynamics ( nlp_config , nlp_dims , i , " gnsf_nout " , & gnsf_nout ) ;
ocp_nlp_dims_set_dynamics ( nlp_config , nlp_dims , i , " gnsf_ny " , & gnsf_ny ) ;
ocp_nlp_dims_set_dynamics ( nlp_config , nlp_dims , i , " gnsf_nuhat " , & gnsf_nuhat ) ;
}
}
{ % - endif % }
return nlp_dims ;
}
/**
* Internal function for { { model . name } } _acados_create : step 3
*/
void { { model . name } } _acados_create_3_create_and_set_functions ( { { model . name } } _solver_capsule * capsule )
{
const int N = capsule - > nlp_solver_plan - > N ;
ocp_nlp_config * nlp_config = capsule - > nlp_config ;
/************************************************
* external functions
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# define MAP_CASADI_FNC(__CAPSULE_FNC__, __MODEL_BASE_FNC__) do{ \
capsule - > __CAPSULE_FNC__ . casadi_fun = & __MODEL_BASE_FNC__ ; \
capsule - > __CAPSULE_FNC__ . casadi_n_in = & __MODEL_BASE_FNC__ # # _n_in ; \
capsule - > __CAPSULE_FNC__ . casadi_n_out = & __MODEL_BASE_FNC__ # # _n_out ; \
capsule - > __CAPSULE_FNC__ . casadi_sparsity_in = & __MODEL_BASE_FNC__ # # _sparsity_in ; \
capsule - > __CAPSULE_FNC__ . casadi_sparsity_out = & __MODEL_BASE_FNC__ # # _sparsity_out ; \
capsule - > __CAPSULE_FNC__ . casadi_work = & __MODEL_BASE_FNC__ # # _work ; \
external_function_param_casadi_create ( & capsule - > __CAPSULE_FNC__ , { { dims . np } } ) ; \
} while ( false )
{ % if constraints . constr_type = = " BGP " % }
// constraints.constr_type == "BGP"
capsule - > phi_constraint = ( external_function_param_casadi * ) malloc ( sizeof ( external_function_param_casadi ) * N ) ;
for ( int i = 0 ; i < N ; i + + )
{
// nonlinear part of convex-composite constraint
MAP_CASADI_FNC ( phi_constraint [ i ] , { { model . name } } _phi_constraint ) ;
}
{ % - endif % }
{ % - if constraints . constr_type_e = = " BGP " % }
// constraints.constr_type_e == "BGP"
// nonlinear part of convex-composite constraint
MAP_CASADI_FNC ( phi_e_constraint , { { model . name } } _phi_e_constraint ) ;
{ % - endif % }
{ % - if constraints . constr_type = = " BGH " and dims . nh > 0 % }
// constraints.constr_type == "BGH" and dims.nh > 0
capsule - > nl_constr_h_fun_jac = ( external_function_param_casadi * ) malloc ( sizeof ( external_function_param_casadi ) * N ) ;
for ( int i = 0 ; i < N ; i + + ) {
MAP_CASADI_FNC ( nl_constr_h_fun_jac [ i ] , { { model . name } } _constr_h_fun_jac_uxt_zt ) ;
}
capsule - > nl_constr_h_fun = ( external_function_param_casadi * ) malloc ( sizeof ( external_function_param_casadi ) * N ) ;
for ( int i = 0 ; i < N ; i + + ) {
MAP_CASADI_FNC ( nl_constr_h_fun [ i ] , { { model . name } } _constr_h_fun ) ;
}
{ % if solver_options . hessian_approx = = " EXACT " % }
capsule - > nl_constr_h_fun_jac_hess = ( external_function_param_casadi * ) malloc ( sizeof ( external_function_param_casadi ) * N ) ;
for ( int i = 0 ; i < N ; i + + ) {
MAP_CASADI_FNC ( nl_constr_h_fun_jac_hess [ i ] , { { model . name } } _constr_h_fun_jac_uxt_zt_hess ) ;
}
{ % endif % }
{ % endif % }
{ % - if constraints . constr_type_e = = " BGH " and dims . nh_e > 0 % }
MAP_CASADI_FNC ( nl_constr_h_e_fun_jac , { { model . name } } _constr_h_e_fun_jac_uxt_zt ) ;
MAP_CASADI_FNC ( nl_constr_h_e_fun , { { model . name } } _constr_h_e_fun ) ;
{ % - if solver_options . hessian_approx = = " EXACT " % }
MAP_CASADI_FNC ( nl_constr_h_e_fun_jac_hess , { { model . name } } _constr_h_e_fun_jac_uxt_zt_hess ) ;
{ % endif % }
{ % - endif % }
{ % if solver_options . integrator_type = = " ERK " % }
// explicit ode
capsule - > forw_vde_casadi = ( external_function_param_casadi * ) malloc ( sizeof ( external_function_param_casadi ) * N ) ;
for ( int i = 0 ; i < N ; i + + ) {
MAP_CASADI_FNC ( forw_vde_casadi [ i ] , { { model . name } } _expl_vde_forw ) ;
}
capsule - > expl_ode_fun = ( external_function_param_casadi * ) malloc ( sizeof ( external_function_param_casadi ) * N ) ;
for ( int i = 0 ; i < N ; i + + ) {
MAP_CASADI_FNC ( expl_ode_fun [ i ] , { { model . name } } _expl_ode_fun ) ;
}
{ % - if solver_options . hessian_approx = = " EXACT " % }
capsule - > hess_vde_casadi = ( external_function_param_casadi * ) malloc ( sizeof ( external_function_param_casadi ) * N ) ;
for ( int i = 0 ; i < N ; i + + ) {
MAP_CASADI_FNC ( hess_vde_casadi [ i ] , { { model . name } } _expl_ode_hess ) ;
}
{ % - endif % }
{ % elif solver_options . integrator_type = = " IRK " % }
// implicit dae
capsule - > impl_dae_fun = ( external_function_param_casadi * ) malloc ( sizeof ( external_function_param_casadi ) * N ) ;
for ( int i = 0 ; i < N ; i + + ) {
MAP_CASADI_FNC ( impl_dae_fun [ i ] , { { model . name } } _impl_dae_fun ) ;
}
capsule - > impl_dae_fun_jac_x_xdot_z = ( external_function_param_casadi * ) malloc ( sizeof ( external_function_param_casadi ) * N ) ;
for ( int i = 0 ; i < N ; i + + ) {
MAP_CASADI_FNC ( impl_dae_fun_jac_x_xdot_z [ i ] , { { model . name } } _impl_dae_fun_jac_x_xdot_z ) ;
}
capsule - > impl_dae_jac_x_xdot_u_z = ( external_function_param_casadi * ) malloc ( sizeof ( external_function_param_casadi ) * N ) ;
for ( int i = 0 ; i < N ; i + + ) {
MAP_CASADI_FNC ( impl_dae_jac_x_xdot_u_z [ i ] , { { model . name } } _impl_dae_jac_x_xdot_u_z ) ;
}
{ % - if solver_options . hessian_approx = = " EXACT " % }
capsule - > impl_dae_hess = ( external_function_param_casadi * ) malloc ( sizeof ( external_function_param_casadi ) * N ) ;
for ( int i = 0 ; i < N ; i + + ) {
MAP_CASADI_FNC ( impl_dae_hess [ i ] , { { model . name } } _impl_dae_hess ) ;
}
{ % - endif % }
{ % elif solver_options . integrator_type = = " LIFTED_IRK " % }
// external functions (implicit model)
capsule - > impl_dae_fun = ( external_function_param_casadi * ) malloc ( sizeof ( external_function_param_casadi ) * N ) ;
for ( int i = 0 ; i < N ; i + + ) {
MAP_CASADI_FNC ( impl_dae_fun [ i ] , { { model . name } } _impl_dae_fun ) ;
}
capsule - > impl_dae_fun_jac_x_xdot_u = ( external_function_param_casadi * ) malloc ( sizeof ( external_function_param_casadi ) * N ) ;
for ( int i = 0 ; i < N ; i + + ) {
MAP_CASADI_FNC ( impl_dae_fun_jac_x_xdot_u [ i ] , { { model . name } } _impl_dae_fun_jac_x_xdot_u ) ;
}
{ % elif solver_options . integrator_type = = " GNSF " % }
{ % if model . gnsf . purely_linear ! = 1 % }
capsule - > gnsf_phi_fun = ( external_function_param_casadi * ) malloc ( sizeof ( external_function_param_casadi ) * N ) ;
for ( int i = 0 ; i < N ; i + + ) {
MAP_CASADI_FNC ( gnsf_phi_fun [ i ] , { { model . name } } _gnsf_phi_fun ) ;
}
capsule - > gnsf_phi_fun_jac_y = ( external_function_param_casadi * ) malloc ( sizeof ( external_function_param_casadi ) * N ) ;
for ( int i = 0 ; i < N ; i + + ) {
MAP_CASADI_FNC ( gnsf_phi_fun_jac_y [ i ] , { { model . name } } _gnsf_phi_fun_jac_y ) ;
}
capsule - > gnsf_phi_jac_y_uhat = ( external_function_param_casadi * ) malloc ( sizeof ( external_function_param_casadi ) * N ) ;
for ( int i = 0 ; i < N ; i + + ) {
MAP_CASADI_FNC ( gnsf_phi_jac_y_uhat [ i ] , { { model . name } } _gnsf_phi_jac_y_uhat ) ;
}
{ % if model . gnsf . nontrivial_f_LO = = 1 % }
capsule - > gnsf_f_lo_jac_x1_x1dot_u_z = ( external_function_param_casadi * ) malloc ( sizeof ( external_function_param_casadi ) * N ) ;
for ( int i = 0 ; i < N ; i + + ) {
MAP_CASADI_FNC ( gnsf_f_lo_jac_x1_x1dot_u_z [ i ] , { { model . name } } _gnsf_f_lo_fun_jac_x1k1uz ) ;
}
{ % - endif % }
{ % - endif % }
capsule - > gnsf_get_matrices_fun = ( external_function_param_casadi * ) malloc ( sizeof ( external_function_param_casadi ) * N ) ;
for ( int i = 0 ; i < N ; i + + ) {
MAP_CASADI_FNC ( gnsf_get_matrices_fun [ i ] , { { model . name } } _gnsf_get_matrices_fun ) ;
}
{ % elif solver_options . integrator_type = = " DISCRETE " % }
// discrete dynamics
capsule - > discr_dyn_phi_fun = ( external_function_param_ { { model . dyn_ext_fun_type } } * ) malloc ( sizeof ( external_function_param_ { { model . dyn_ext_fun_type } } ) * N ) ;
for ( int i = 0 ; i < N ; i + + )
{
{ % - if model . dyn_ext_fun_type = = " casadi " % }
MAP_CASADI_FNC ( discr_dyn_phi_fun [ i ] , { { model . name } } _dyn_disc_phi_fun ) ;
{ % - else % }
capsule - > discr_dyn_phi_fun [ i ] . fun = & { { model . dyn_disc_fun } } ;
external_function_param_ { { model . dyn_ext_fun_type } } _create ( & capsule - > discr_dyn_phi_fun [ i ] , { { dims . np } } ) ;
{ % - endif % }
}
capsule - > discr_dyn_phi_fun_jac_ut_xt = ( external_function_param_ { { model . dyn_ext_fun_type } } * ) malloc ( sizeof ( external_function_param_ { { model . dyn_ext_fun_type } } ) * N ) ;
for ( int i = 0 ; i < N ; i + + )
{
{ % - if model . dyn_ext_fun_type = = " casadi " % }
MAP_CASADI_FNC ( discr_dyn_phi_fun_jac_ut_xt [ i ] , { { model . name } } _dyn_disc_phi_fun_jac ) ;
{ % - else % }
capsule - > discr_dyn_phi_fun_jac_ut_xt [ i ] . fun = & { { model . dyn_disc_fun_jac } } ;
external_function_param_ { { model . dyn_ext_fun_type } } _create ( & capsule - > discr_dyn_phi_fun_jac_ut_xt [ i ] , { { dims . np } } ) ;
{ % - endif % }
}
{ % - if solver_options . hessian_approx = = " EXACT " % }
capsule - > discr_dyn_phi_fun_jac_ut_xt_hess = ( external_function_param_ { { model . dyn_ext_fun_type } } * ) malloc ( sizeof ( external_function_param_ { { model . dyn_ext_fun_type } } ) * N ) ;
for ( int i = 0 ; i < N ; i + + )
{
{ % - if model . dyn_ext_fun_type = = " casadi " % }
MAP_CASADI_FNC ( discr_dyn_phi_fun_jac_ut_xt_hess [ i ] , { { model . name } } _dyn_disc_phi_fun_jac_hess ) ;
{ % - else % }
capsule - > discr_dyn_phi_fun_jac_ut_xt_hess [ i ] . fun = & { { model . dyn_disc_fun_jac_hess } } ;
external_function_param_ { { model . dyn_ext_fun_type } } _create ( & capsule - > discr_dyn_phi_fun_jac_ut_xt_hess [ i ] , { { dims . np } } ) ;
{ % - endif % }
}
{ % - endif % }
{ % - endif % }
{ % - if cost . cost_type_0 = = " NONLINEAR_LS " % }
// nonlinear least squares function
MAP_CASADI_FNC ( cost_y_0_fun , { { model . name } } _cost_y_0_fun ) ;
MAP_CASADI_FNC ( cost_y_0_fun_jac_ut_xt , { { model . name } } _cost_y_0_fun_jac_ut_xt ) ;
MAP_CASADI_FNC ( cost_y_0_hess , { { model . name } } _cost_y_0_hess ) ;
{ % - elif cost . cost_type_0 = = " EXTERNAL " % }
// external cost
{ % - if cost . cost_ext_fun_type_0 = = " casadi " % }
MAP_CASADI_FNC ( ext_cost_0_fun , { { model . name } } _cost_ext_cost_0_fun ) ;
{ % - else % }
capsule - > ext_cost_0_fun . fun = & { { cost . cost_function_ext_cost_0 } } ;
external_function_param_ { { cost . cost_ext_fun_type_0 } } _create ( & capsule - > ext_cost_0_fun , { { dims . np } } ) ;
{ % - endif % }
// external cost
{ % - if cost . cost_ext_fun_type_0 = = " casadi " % }
MAP_CASADI_FNC ( ext_cost_0_fun_jac , { { model . name } } _cost_ext_cost_0_fun_jac ) ;
{ % - else % }
capsule - > ext_cost_0_fun_jac . fun = & { { cost . cost_function_ext_cost_0 } } ;
external_function_param_ { { cost . cost_ext_fun_type_0 } } _create ( & capsule - > ext_cost_0_fun_jac , { { dims . np } } ) ;
{ % - endif % }
// external cost
{ % - if cost . cost_ext_fun_type_0 = = " casadi " % }
MAP_CASADI_FNC ( ext_cost_0_fun_jac_hess , { { model . name } } _cost_ext_cost_0_fun_jac_hess ) ;
{ % - else % }
capsule - > ext_cost_0_fun_jac_hess . fun = & { { cost . cost_function_ext_cost_0 } } ;
external_function_param_ { { cost . cost_ext_fun_type_0 } } _create ( & capsule - > ext_cost_0_fun_jac_hess , { { dims . np } } ) ;
{ % - endif % }
{ % - endif % }
{ % - if cost . cost_type = = " NONLINEAR_LS " % }
// nonlinear least squares cost
capsule - > cost_y_fun = ( external_function_param_casadi * ) malloc ( sizeof ( external_function_param_casadi ) * N ) ;
for ( int i = 0 ; i < N - 1 ; i + + )
{
MAP_CASADI_FNC ( cost_y_fun [ i ] , { { model . name } } _cost_y_fun ) ;
}
capsule - > cost_y_fun_jac_ut_xt = ( external_function_param_casadi * ) malloc ( sizeof ( external_function_param_casadi ) * N ) ;
for ( int i = 0 ; i < N - 1 ; i + + )
{
MAP_CASADI_FNC ( cost_y_fun_jac_ut_xt [ i ] , { { model . name } } _cost_y_fun_jac_ut_xt ) ;
}
capsule - > cost_y_hess = ( external_function_param_casadi * ) malloc ( sizeof ( external_function_param_casadi ) * N ) ;
for ( int i = 0 ; i < N - 1 ; i + + )
{
MAP_CASADI_FNC ( cost_y_hess [ i ] , { { model . name } } _cost_y_hess ) ;
}
{ % - elif cost . cost_type = = " EXTERNAL " % }
// external cost
capsule - > ext_cost_fun = ( external_function_param_ { { cost . cost_ext_fun_type } } * ) malloc ( sizeof ( external_function_param_ { { cost . cost_ext_fun_type } } ) * N ) ;
for ( int i = 0 ; i < N - 1 ; i + + )
{
{ % - if cost . cost_ext_fun_type = = " casadi " % }
MAP_CASADI_FNC ( ext_cost_fun [ i ] , { { model . name } } _cost_ext_cost_fun ) ;
{ % - else % }
capsule - > ext_cost_fun [ i ] . fun = & { { cost . cost_function_ext_cost } } ;
external_function_param_ { { cost . cost_ext_fun_type } } _create ( & capsule - > ext_cost_fun [ i ] , { { dims . np } } ) ;
{ % - endif % }
}
capsule - > ext_cost_fun_jac = ( external_function_param_ { { cost . cost_ext_fun_type } } * ) malloc ( sizeof ( external_function_param_ { { cost . cost_ext_fun_type } } ) * N ) ;
for ( int i = 0 ; i < N - 1 ; i + + )
{
{ % - if cost . cost_ext_fun_type = = " casadi " % }
MAP_CASADI_FNC ( ext_cost_fun_jac [ i ] , { { model . name } } _cost_ext_cost_fun_jac ) ;
{ % - else % }
capsule - > ext_cost_fun_jac [ i ] . fun = & { { cost . cost_function_ext_cost } } ;
external_function_param_ { { cost . cost_ext_fun_type } } _create ( & capsule - > ext_cost_fun_jac [ i ] , { { dims . np } } ) ;
{ % - endif % }
}
capsule - > ext_cost_fun_jac_hess = ( external_function_param_ { { cost . cost_ext_fun_type } } * ) malloc ( sizeof ( external_function_param_ { { cost . cost_ext_fun_type } } ) * N ) ;
for ( int i = 0 ; i < N - 1 ; i + + )
{
{ % - if cost . cost_ext_fun_type = = " casadi " % }
MAP_CASADI_FNC ( ext_cost_fun_jac_hess [ i ] , { { model . name } } _cost_ext_cost_fun_jac_hess ) ;
{ % - else % }
capsule - > ext_cost_fun_jac_hess [ i ] . fun = & { { cost . cost_function_ext_cost } } ;
external_function_param_ { { cost . cost_ext_fun_type } } _create ( & capsule - > ext_cost_fun_jac_hess [ i ] , { { dims . np } } ) ;
{ % - endif % }
}
{ % - endif % }
{ % - if cost . cost_type_e = = " NONLINEAR_LS " % }
// nonlinear least square function
MAP_CASADI_FNC ( cost_y_e_fun , { { model . name } } _cost_y_e_fun ) ;
MAP_CASADI_FNC ( cost_y_e_fun_jac_ut_xt , { { model . name } } _cost_y_e_fun_jac_ut_xt ) ;
MAP_CASADI_FNC ( cost_y_e_hess , { { model . name } } _cost_y_e_hess ) ;
{ % - elif cost . cost_type_e = = " EXTERNAL " % }
// external cost - function
{ % - if cost . cost_ext_fun_type_e = = " casadi " % }
MAP_CASADI_FNC ( ext_cost_e_fun , { { model . name } } _cost_ext_cost_e_fun ) ;
{ % else % }
capsule - > ext_cost_e_fun . fun = & { { cost . cost_function_ext_cost_e } } ;
external_function_param_ { { cost . cost_ext_fun_type_e } } _create ( & capsule - > ext_cost_e_fun , { { dims . np } } ) ;
{ % - endif % }
// external cost - jacobian
{ % - if cost . cost_ext_fun_type_e = = " casadi " % }
MAP_CASADI_FNC ( ext_cost_e_fun_jac , { { model . name } } _cost_ext_cost_e_fun_jac ) ;
{ % - else % }
capsule - > ext_cost_e_fun_jac . fun = & { { cost . cost_function_ext_cost_e } } ;
external_function_param_ { { cost . cost_ext_fun_type_e } } _create ( & capsule - > ext_cost_e_fun_jac , { { dims . np } } ) ;
{ % - endif % }
// external cost - hessian
{ % - if cost . cost_ext_fun_type_e = = " casadi " % }
MAP_CASADI_FNC ( ext_cost_e_fun_jac_hess , { { model . name } } _cost_ext_cost_e_fun_jac_hess ) ;
{ % - else % }
capsule - > ext_cost_e_fun_jac_hess . fun = & { { cost . cost_function_ext_cost_e } } ;
external_function_param_ { { cost . cost_ext_fun_type_e } } _create ( & capsule - > ext_cost_e_fun_jac_hess , { { dims . np } } ) ;
{ % - endif % }
{ % - endif % }
# undef MAP_CASADI_FNC
}
/**
* Internal function for { { model . name } } _acados_create : step 4
*/
void { { model . name } } _acados_create_4_set_default_parameters ( { { model . name } } _solver_capsule * capsule ) {
{ % - if dims . np > 0 % }
const int N = capsule - > nlp_solver_plan - > N ;
// initialize parameters to nominal value
double * p = calloc ( NP , sizeof ( double ) ) ;
{ % - for item in parameter_values % }
{ % - if item ! = 0 % }
p [ { { loop . index0 } } ] = { { item } } ;
{ % - endif % }
{ % - endfor % }
for ( int i = 0 ; i < = N ; i + + ) {
{ { model . name } } _acados_update_params ( capsule , i , p , NP ) ;
}
free ( p ) ;
{ % - else % }
// no parameters defined
{ % - endif % } { # if dims . np # }
}
/**
* Internal function for { { model . name } } _acados_create : step 5
*/
void { { model . name } } _acados_create_5_set_nlp_in ( { { model . name } } _solver_capsule * capsule , const int N , double * new_time_steps )
{
assert ( N = = capsule - > nlp_solver_plan - > N ) ;
ocp_nlp_config * nlp_config = capsule - > nlp_config ;
ocp_nlp_dims * nlp_dims = capsule - > nlp_dims ;
/************************************************
* nlp_in
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// ocp_nlp_in * nlp_in = ocp_nlp_in_create(nlp_config, nlp_dims);
// capsule->nlp_in = nlp_in;
ocp_nlp_in * nlp_in = capsule - > nlp_in ;
// set up time_steps
{ % set all_equal = true - % }
{ % - set val = solver_options . time_steps [ 0 ] % }
{ % - for j in range ( start = 1 , end = dims . N ) % }
{ % - if val ! = solver_options . time_steps [ j ] % }
{ % - set_global all_equal = false % }
{ % - break % }
{ % - endif % }
{ % - endfor % }
if ( new_time_steps ) {
{ { model . name } } _acados_update_time_steps ( capsule , N , new_time_steps ) ;
} else {
{ % - if all_equal = = true - % }
// all time_steps are identical
double time_step = { { solver_options . time_steps [ 0 ] } } ;
for ( int i = 0 ; i < N ; i + + )
{
ocp_nlp_in_set ( nlp_config , nlp_dims , nlp_in , i , " Ts " , & time_step ) ;
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , i , " scaling " , & time_step ) ;
}
{ % - else - % }
// time_steps are different
double * time_steps = malloc ( N * sizeof ( double ) ) ;
{ % - for j in range ( end = dims . N ) % }
time_steps [ { { j } } ] = { { solver_options . time_steps [ j ] } } ;
{ % - endfor % }
{ { model . name } } _acados_update_time_steps ( capsule , N , time_steps ) ;
free ( time_steps ) ;
{ % - endif % }
}
/**** Dynamics ****/
for ( int i = 0 ; i < N ; i + + )
{
{ % - if solver_options . integrator_type = = " ERK " % }
ocp_nlp_dynamics_model_set ( nlp_config , nlp_dims , nlp_in , i , " expl_vde_forw " , & capsule - > forw_vde_casadi [ i ] ) ;
ocp_nlp_dynamics_model_set ( nlp_config , nlp_dims , nlp_in , i , " expl_ode_fun " , & capsule - > expl_ode_fun [ i ] ) ;
{ % - if solver_options . hessian_approx = = " EXACT " % }
ocp_nlp_dynamics_model_set ( nlp_config , nlp_dims , nlp_in , i , " expl_ode_hess " , & capsule - > hess_vde_casadi [ i ] ) ;
{ % - endif % }
{ % elif solver_options . integrator_type = = " IRK " % }
ocp_nlp_dynamics_model_set ( nlp_config , nlp_dims , nlp_in , i , " impl_dae_fun " , & capsule - > impl_dae_fun [ i ] ) ;
ocp_nlp_dynamics_model_set ( nlp_config , nlp_dims , nlp_in , i ,
" impl_dae_fun_jac_x_xdot_z " , & capsule - > impl_dae_fun_jac_x_xdot_z [ i ] ) ;
ocp_nlp_dynamics_model_set ( nlp_config , nlp_dims , nlp_in , i ,
" impl_dae_jac_x_xdot_u " , & capsule - > impl_dae_jac_x_xdot_u_z [ i ] ) ;
{ % - if solver_options . hessian_approx = = " EXACT " % }
ocp_nlp_dynamics_model_set ( nlp_config , nlp_dims , nlp_in , i , " impl_dae_hess " , & capsule - > impl_dae_hess [ i ] ) ;
{ % - endif % }
{ % elif solver_options . integrator_type = = " LIFTED_IRK " % }
ocp_nlp_dynamics_model_set ( nlp_config , nlp_dims , nlp_in , i , " impl_dae_fun " , & capsule - > impl_dae_fun [ i ] ) ;
ocp_nlp_dynamics_model_set ( nlp_config , nlp_dims , nlp_in , i ,
" impl_dae_fun_jac_x_xdot_u " , & capsule - > impl_dae_fun_jac_x_xdot_u [ i ] ) ;
{ % elif solver_options . integrator_type = = " GNSF " % }
{ % if model . gnsf . purely_linear ! = 1 % }
ocp_nlp_dynamics_model_set ( nlp_config , nlp_dims , nlp_in , i , " phi_fun " , & capsule - > gnsf_phi_fun [ i ] ) ;
ocp_nlp_dynamics_model_set ( nlp_config , nlp_dims , nlp_in , i , " phi_fun_jac_y " , & capsule - > gnsf_phi_fun_jac_y [ i ] ) ;
ocp_nlp_dynamics_model_set ( nlp_config , nlp_dims , nlp_in , i , " phi_jac_y_uhat " , & capsule - > gnsf_phi_jac_y_uhat [ i ] ) ;
{ % if model . gnsf . nontrivial_f_LO = = 1 % }
ocp_nlp_dynamics_model_set ( nlp_config , nlp_dims , nlp_in , i , " f_lo_jac_x1_x1dot_u_z " ,
& capsule - > gnsf_f_lo_jac_x1_x1dot_u_z [ i ] ) ;
{ % - endif % }
{ % - endif % }
ocp_nlp_dynamics_model_set ( nlp_config , nlp_dims , nlp_in , i , " gnsf_get_matrices_fun " ,
& capsule - > gnsf_get_matrices_fun [ i ] ) ;
{ % elif solver_options . integrator_type = = " DISCRETE " % }
ocp_nlp_dynamics_model_set ( nlp_config , nlp_dims , nlp_in , i , " disc_dyn_fun " , & capsule - > discr_dyn_phi_fun [ i ] ) ;
ocp_nlp_dynamics_model_set ( nlp_config , nlp_dims , nlp_in , i , " disc_dyn_fun_jac " ,
& capsule - > discr_dyn_phi_fun_jac_ut_xt [ i ] ) ;
{ % - if solver_options . hessian_approx = = " EXACT " % }
ocp_nlp_dynamics_model_set ( nlp_config , nlp_dims , nlp_in , i , " disc_dyn_fun_jac_hess " ,
& capsule - > discr_dyn_phi_fun_jac_ut_xt_hess [ i ] ) ;
{ % - endif % }
{ % - endif % }
}
/**** Cost ****/
{ % - if cost . cost_type_0 = = " NONLINEAR_LS " or cost . cost_type_0 = = " LINEAR_LS " % }
{ % - if dims . ny_0 > 0 % }
double * W_0 = calloc ( NY0 * NY0 , sizeof ( double ) ) ;
// change only the non-zero elements:
{ % - for j in range ( end = dims . ny_0 ) % }
{ % - for k in range ( end = dims . ny_0 ) % }
{ % - if cost . W_0 [ j ] [ k ] ! = 0 % }
W_0 [ { { j } } + ( NY0 ) * { { k } } ] = { { cost . W_0 [ j ] [ k ] } } ;
{ % - endif % }
{ % - endfor % }
{ % - endfor % }
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , 0 , " W " , W_0 ) ;
free ( W_0 ) ;
double * yref_0 = calloc ( NY0 , sizeof ( double ) ) ;
// change only the non-zero elements:
{ % - for j in range ( end = dims . ny_0 ) % }
{ % - if cost . yref_0 [ j ] ! = 0 % }
yref_0 [ { { j } } ] = { { cost . yref_0 [ j ] } } ;
{ % - endif % }
{ % - endfor % }
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , 0 , " yref " , yref_0 ) ;
free ( yref_0 ) ;
{ % - endif % }
{ % - endif % }
{ % - if cost . cost_type = = " NONLINEAR_LS " or cost . cost_type = = " LINEAR_LS " % }
{ % - if dims . ny > 0 % }
double * W = calloc ( NY * NY , sizeof ( double ) ) ;
// change only the non-zero elements:
{ % - for j in range ( end = dims . ny ) % }
{ % - for k in range ( end = dims . ny ) % }
{ % - if cost . W [ j ] [ k ] ! = 0 % }
W [ { { j } } + ( NY ) * { { k } } ] = { { cost . W [ j ] [ k ] } } ;
{ % - endif % }
{ % - endfor % }
{ % - endfor % }
double * yref = calloc ( NY , sizeof ( double ) ) ;
// change only the non-zero elements:
{ % - for j in range ( end = dims . ny ) % }
{ % - if cost . yref [ j ] ! = 0 % }
yref [ { { j } } ] = { { cost . yref [ j ] } } ;
{ % - endif % }
{ % - endfor % }
for ( int i = 1 ; i < N ; i + + )
{
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , i , " W " , W ) ;
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , i , " yref " , yref ) ;
}
free ( W ) ;
free ( yref ) ;
{ % - endif % }
{ % - endif % }
{ % - if cost . cost_type_0 = = " LINEAR_LS " % }
double * Vx_0 = calloc ( NY0 * NX , sizeof ( double ) ) ;
// change only the non-zero elements:
{ % - for j in range ( end = dims . ny_0 ) % }
{ % - for k in range ( end = dims . nx ) % }
{ % - if cost . Vx_0 [ j ] [ k ] ! = 0 % }
Vx_0 [ { { j } } + ( NY0 ) * { { k } } ] = { { cost . Vx_0 [ j ] [ k ] } } ;
{ % - endif % }
{ % - endfor % }
{ % - endfor % }
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , 0 , " Vx " , Vx_0 ) ;
free ( Vx_0 ) ;
{ % - if dims . ny_0 > 0 and dims . nu > 0 % }
double * Vu_0 = calloc ( NY0 * NU , sizeof ( double ) ) ;
// change only the non-zero elements:
{ % - for j in range ( end = dims . ny_0 ) % }
{ % - for k in range ( end = dims . nu ) % }
{ % - if cost . Vu_0 [ j ] [ k ] ! = 0 % }
Vu_0 [ { { j } } + ( NY0 ) * { { k } } ] = { { cost . Vu_0 [ j ] [ k ] } } ;
{ % - endif % }
{ % - endfor % }
{ % - endfor % }
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , 0 , " Vu " , Vu_0 ) ;
free ( Vu_0 ) ;
{ % - endif % }
{ % - if dims . ny_0 > 0 and dims . nz > 0 % }
double * Vz_0 = calloc ( NY0 * NZ , sizeof ( double ) ) ;
// change only the non-zero elements:
{ % for j in range ( end = dims . ny_0 ) % }
{ % - for k in range ( end = dims . nz ) % }
{ % - if cost . Vz_0 [ j ] [ k ] ! = 0 % }
Vz_0 [ { { j } } + ( NY0 ) * { { k } } ] = { { cost . Vz_0 [ j ] [ k ] } } ;
{ % - endif % }
{ % - endfor % }
{ % - endfor % }
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , 0 , " Vz " , Vz_0 ) ;
free ( Vz_0 ) ;
{ % - endif % }
{ % - endif % } { # LINEAR LS # }
{ % - if cost . cost_type = = " LINEAR_LS " % }
double * Vx = calloc ( NY * NX , sizeof ( double ) ) ;
// change only the non-zero elements:
{ % - for j in range ( end = dims . ny ) % }
{ % - for k in range ( end = dims . nx ) % }
{ % - if cost . Vx [ j ] [ k ] ! = 0 % }
Vx [ { { j } } + ( NY ) * { { k } } ] = { { cost . Vx [ j ] [ k ] } } ;
{ % - endif % }
{ % - endfor % }
{ % - endfor % }
for ( int i = 1 ; i < N ; i + + )
{
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , i , " Vx " , Vx ) ;
}
free ( Vx ) ;
{ % if dims . ny > 0 and dims . nu > 0 % }
double * Vu = calloc ( NY * NU , sizeof ( double ) ) ;
// change only the non-zero elements:
{ % for j in range ( end = dims . ny ) % }
{ % - for k in range ( end = dims . nu ) % }
{ % - if cost . Vu [ j ] [ k ] ! = 0 % }
Vu [ { { j } } + ( NY ) * { { k } } ] = { { cost . Vu [ j ] [ k ] } } ;
{ % - endif % }
{ % - endfor % }
{ % - endfor % }
for ( int i = 1 ; i < N ; i + + )
{
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , i , " Vu " , Vu ) ;
}
free ( Vu ) ;
{ % - endif % }
{ % - if dims . ny > 0 and dims . nz > 0 % }
double * Vz = calloc ( NY * NZ , sizeof ( double ) ) ;
// change only the non-zero elements:
{ % for j in range ( end = dims . ny ) % }
{ % - for k in range ( end = dims . nz ) % }
{ % - if cost . Vz [ j ] [ k ] ! = 0 % }
Vz [ { { j } } + ( NY ) * { { k } } ] = { { cost . Vz [ j ] [ k ] } } ;
{ % - endif % }
{ % - endfor % }
{ % - endfor % }
for ( int i = 1 ; i < N ; i + + )
{
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , i , " Vz " , Vz ) ;
}
free ( Vz ) ;
{ % - endif % }
{ % - endif % } { # LINEAR LS # }
{ % - if cost . cost_type_0 = = " NONLINEAR_LS " % }
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , 0 , " nls_y_fun " , & capsule - > cost_y_0_fun ) ;
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , 0 , " nls_y_fun_jac " , & capsule - > cost_y_0_fun_jac_ut_xt ) ;
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , 0 , " nls_y_hess " , & capsule - > cost_y_0_hess ) ;
{ % - elif cost . cost_type_0 = = " EXTERNAL " % }
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , 0 , " ext_cost_fun " , & capsule - > ext_cost_0_fun ) ;
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , 0 , " ext_cost_fun_jac " , & capsule - > ext_cost_0_fun_jac ) ;
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , 0 , " ext_cost_fun_jac_hess " , & capsule - > ext_cost_0_fun_jac_hess ) ;
{ % - endif % }
{ % - if cost . cost_type = = " NONLINEAR_LS " % }
for ( int i = 1 ; i < N ; i + + )
{
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , i , " nls_y_fun " , & capsule - > cost_y_fun [ i - 1 ] ) ;
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , i , " nls_y_fun_jac " , & capsule - > cost_y_fun_jac_ut_xt [ i - 1 ] ) ;
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , i , " nls_y_hess " , & capsule - > cost_y_hess [ i - 1 ] ) ;
}
{ % - elif cost . cost_type = = " EXTERNAL " % }
for ( int i = 1 ; i < N ; i + + )
{
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , i , " ext_cost_fun " , & capsule - > ext_cost_fun [ i - 1 ] ) ;
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , i , " ext_cost_fun_jac " , & capsule - > ext_cost_fun_jac [ i - 1 ] ) ;
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , i , " ext_cost_fun_jac_hess " , & capsule - > ext_cost_fun_jac_hess [ i - 1 ] ) ;
}
{ % - endif % }
{ % - if dims . ns > 0 % }
double * zlumem = calloc ( 4 * NS , sizeof ( double ) ) ;
double * Zl = zlumem + NS * 0 ;
double * Zu = zlumem + NS * 1 ;
double * zl = zlumem + NS * 2 ;
double * zu = zlumem + NS * 3 ;
// change only the non-zero elements:
{ % - for j in range ( end = dims . ns ) % }
{ % - if cost . Zl [ j ] ! = 0 % }
Zl [ { { j } } ] = { { cost . Zl [ j ] } } ;
{ % - endif % }
{ % - endfor % }
{ % - for j in range ( end = dims . ns ) % }
{ % - if cost . Zu [ j ] ! = 0 % }
Zu [ { { j } } ] = { { cost . Zu [ j ] } } ;
{ % - endif % }
{ % - endfor % }
{ % - for j in range ( end = dims . ns ) % }
{ % - if cost . zl [ j ] ! = 0 % }
zl [ { { j } } ] = { { cost . zl [ j ] } } ;
{ % - endif % }
{ % - endfor % }
{ % - for j in range ( end = dims . ns ) % }
{ % - if cost . zu [ j ] ! = 0 % }
zu [ { { j } } ] = { { cost . zu [ j ] } } ;
{ % - endif % }
{ % - endfor % }
for ( int i = 0 ; i < N ; i + + )
{
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , i , " Zl " , Zl ) ;
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , i , " Zu " , Zu ) ;
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , i , " zl " , zl ) ;
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , i , " zu " , zu ) ;
}
free ( zlumem ) ;
{ % - endif % }
// terminal cost
{ % - if cost . cost_type_e = = " LINEAR_LS " or cost . cost_type_e = = " NONLINEAR_LS " % }
{ % - if dims . ny_e > 0 % }
double * yref_e = calloc ( NYN , sizeof ( double ) ) ;
// change only the non-zero elements:
{ % - for j in range ( end = dims . ny_e ) % }
{ % - if cost . yref_e [ j ] ! = 0 % }
yref_e [ { { j } } ] = { { cost . yref_e [ j ] } } ;
{ % - endif % }
{ % - endfor % }
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , N , " yref " , yref_e ) ;
free ( yref_e ) ;
double * W_e = calloc ( NYN * NYN , sizeof ( double ) ) ;
// change only the non-zero elements:
{ % - for j in range ( end = dims . ny_e ) % }
{ % - for k in range ( end = dims . ny_e ) % }
{ % - if cost . W_e [ j ] [ k ] ! = 0 % }
W_e [ { { j } } + ( NYN ) * { { k } } ] = { { cost . W_e [ j ] [ k ] } } ;
{ % - endif % }
{ % - endfor % }
{ % - endfor % }
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , N , " W " , W_e ) ;
free ( W_e ) ;
{ % - if cost . cost_type_e = = " LINEAR_LS " % }
double * Vx_e = calloc ( NYN * NX , sizeof ( double ) ) ;
// change only the non-zero elements:
{ % for j in range ( end = dims . ny_e ) % }
{ % - for k in range ( end = dims . nx ) % }
{ % - if cost . Vx_e [ j ] [ k ] ! = 0 % }
Vx_e [ { { j } } + ( NYN ) * { { k } } ] = { { cost . Vx_e [ j ] [ k ] } } ;
{ % - endif % }
{ % - endfor % }
{ % - endfor % }
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , N , " Vx " , Vx_e ) ;
free ( Vx_e ) ;
{ % - endif % }
{ % - if cost . cost_type_e = = " NONLINEAR_LS " % }
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , N , " nls_y_fun " , & capsule - > cost_y_e_fun ) ;
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , N , " nls_y_fun_jac " , & capsule - > cost_y_e_fun_jac_ut_xt ) ;
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , N , " nls_y_hess " , & capsule - > cost_y_e_hess ) ;
{ % - endif % }
{ % - endif % } { # ny_e > 0 # }
{ % - elif cost . cost_type_e = = " EXTERNAL " % }
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , N , " ext_cost_fun " , & capsule - > ext_cost_e_fun ) ;
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , N , " ext_cost_fun_jac " , & capsule - > ext_cost_e_fun_jac ) ;
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , N , " ext_cost_fun_jac_hess " , & capsule - > ext_cost_e_fun_jac_hess ) ;
{ % - endif % }
{ % if dims . ns_e > 0 % }
double * zluemem = calloc ( 4 * NSN , sizeof ( double ) ) ;
double * Zl_e = zluemem + NSN * 0 ;
double * Zu_e = zluemem + NSN * 1 ;
double * zl_e = zluemem + NSN * 2 ;
double * zu_e = zluemem + NSN * 3 ;
// change only the non-zero elements:
{ % for j in range ( end = dims . ns_e ) % }
{ % - if cost . Zl_e [ j ] ! = 0 % }
Zl_e [ { { j } } ] = { { cost . Zl_e [ j ] } } ;
{ % - endif % }
{ % - endfor % }
{ % for j in range ( end = dims . ns_e ) % }
{ % - if cost . Zu_e [ j ] ! = 0 % }
Zu_e [ { { j } } ] = { { cost . Zu_e [ j ] } } ;
{ % - endif % }
{ % - endfor % }
{ % for j in range ( end = dims . ns_e ) % }
{ % - if cost . zl_e [ j ] ! = 0 % }
zl_e [ { { j } } ] = { { cost . zl_e [ j ] } } ;
{ % - endif % }
{ % - endfor % }
{ % for j in range ( end = dims . ns_e ) % }
{ % - if cost . zu_e [ j ] ! = 0 % }
zu_e [ { { j } } ] = { { cost . zu_e [ j ] } } ;
{ % - endif % }
{ % - endfor % }
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , N , " Zl " , Zl_e ) ;
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , N , " Zu " , Zu_e ) ;
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , N , " zl " , zl_e ) ;
ocp_nlp_cost_model_set ( nlp_config , nlp_dims , nlp_in , N , " zu " , zu_e ) ;
free ( zluemem ) ;
{ % - endif % }
/**** Constraints ****/
// bounds for initial stage
{ % - if dims . nbx_0 > 0 % }
// x0
int * idxbx0 = malloc ( NBX0 * sizeof ( int ) ) ;
{ % - for i in range ( end = dims . nbx_0 ) % }
idxbx0 [ { { i } } ] = { { constraints . idxbx_0 [ i ] } } ;
{ % - endfor % }
double * lubx0 = calloc ( 2 * NBX0 , sizeof ( double ) ) ;
double * lbx0 = lubx0 ;
double * ubx0 = lubx0 + NBX0 ;
// change only the non-zero elements:
{ % - for i in range ( end = dims . nbx_0 ) % }
{ % - if constraints . lbx_0 [ i ] ! = 0 % }
lbx0 [ { { i } } ] = { { constraints . lbx_0 [ i ] } } ;
{ % - endif % }
{ % - if constraints . ubx_0 [ i ] ! = 0 % }
ubx0 [ { { i } } ] = { { constraints . ubx_0 [ i ] } } ;
{ % - endif % }
{ % - endfor % }
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , 0 , " idxbx " , idxbx0 ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , 0 , " lbx " , lbx0 ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , 0 , " ubx " , ubx0 ) ;
free ( idxbx0 ) ;
free ( lubx0 ) ;
{ % - endif % }
{ % - if dims . nbxe_0 > 0 % }
// idxbxe_0
int * idxbxe_0 = malloc ( { { dims . nbxe_0 } } * sizeof ( int ) ) ;
{ % for i in range ( end = dims . nbxe_0 ) % }
idxbxe_0 [ { { i } } ] = { { constraints . idxbxe_0 [ i ] } } ;
{ % - endfor % }
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , 0 , " idxbxe " , idxbxe_0 ) ;
free ( idxbxe_0 ) ;
{ % - endif % }
/* constraints that are the same for initial and intermediate */
{ % - if dims . nsbx > 0 % }
{ # TODO : introduce nsbx0 & move this block down ! ! # }
// ocp_nlp_constraints_model_set(nlp_config, nlp_dims, nlp_in, 0, "idxsbx", idxsbx);
// ocp_nlp_constraints_model_set(nlp_config, nlp_dims, nlp_in, 0, "lsbx", lsbx);
// ocp_nlp_constraints_model_set(nlp_config, nlp_dims, nlp_in, 0, "usbx", usbx);
// soft bounds on x
int * idxsbx = malloc ( NSBX * sizeof ( int ) ) ;
{ % - for i in range ( end = dims . nsbx ) % }
idxsbx [ { { i } } ] = { { constraints . idxsbx [ i ] } } ;
{ % - endfor % }
double * lusbx = calloc ( 2 * NSBX , sizeof ( double ) ) ;
double * lsbx = lusbx ;
double * usbx = lusbx + NSBX ;
{ % - for i in range ( end = dims . nsbx ) % }
{ % - if constraints . lsbx [ i ] ! = 0 % }
lsbx [ { { i } } ] = { { constraints . lsbx [ i ] } } ;
{ % - endif % }
{ % - if constraints . usbx [ i ] ! = 0 % }
usbx [ { { i } } ] = { { constraints . usbx [ i ] } } ;
{ % - endif % }
{ % - endfor % }
for ( int i = 1 ; i < N ; i + + )
{
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " idxsbx " , idxsbx ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " lsbx " , lsbx ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " usbx " , usbx ) ;
}
free ( idxsbx ) ;
free ( lusbx ) ;
{ % - endif % }
{ % - if dims . nbu > 0 % }
// u
int * idxbu = malloc ( NBU * sizeof ( int ) ) ;
{ % for i in range ( end = dims . nbu ) % }
idxbu [ { { i } } ] = { { constraints . idxbu [ i ] } } ;
{ % - endfor % }
double * lubu = calloc ( 2 * NBU , sizeof ( double ) ) ;
double * lbu = lubu ;
double * ubu = lubu + NBU ;
{ % for i in range ( end = dims . nbu ) % }
{ % - if constraints . lbu [ i ] ! = 0 % }
lbu [ { { i } } ] = { { constraints . lbu [ i ] } } ;
{ % - endif % }
{ % - if constraints . ubu [ i ] ! = 0 % }
ubu [ { { i } } ] = { { constraints . ubu [ i ] } } ;
{ % - endif % }
{ % - endfor % }
for ( int i = 0 ; i < N ; i + + )
{
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " idxbu " , idxbu ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " lbu " , lbu ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " ubu " , ubu ) ;
}
free ( idxbu ) ;
free ( lubu ) ;
{ % - endif % }
{ % - if dims . nsbu > 0 % }
// set up soft bounds for u
int * idxsbu = malloc ( NSBU * sizeof ( int ) ) ;
{ % for i in range ( end = dims . nsbu ) % }
idxsbu [ { { i } } ] = { { constraints . idxsbu [ i ] } } ;
{ % - endfor % }
double * lusbu = calloc ( 2 * NSBU , sizeof ( double ) ) ;
double * lsbu = lusbu ;
double * usbu = lusbu + NSBU ;
{ % for i in range ( end = dims . nsbu ) % }
{ % - if constraints . lsbu [ i ] ! = 0 % }
lsbu [ { { i } } ] = { { constraints . lsbu [ i ] } } ;
{ % - endif % }
{ % - if constraints . usbu [ i ] ! = 0 % }
usbu [ { { i } } ] = { { constraints . usbu [ i ] } } ;
{ % - endif % }
{ % - endfor % }
for ( int i = 0 ; i < N ; i + + )
{
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " idxsbu " , idxsbu ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " lsbu " , lsbu ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " usbu " , usbu ) ;
}
free ( idxsbu ) ;
free ( lusbu ) ;
{ % - endif % }
{ % if dims . nsg > 0 % }
// set up soft bounds for general linear constraints
int * idxsg = malloc ( NSG * sizeof ( int ) ) ;
{ % for i in range ( end = dims . nsg ) % }
idxsg [ { { i } } ] = { { constraints . idxsg [ i ] } } ;
{ % - endfor % }
double * lusg = calloc ( 2 * NSG , sizeof ( double ) ) ;
double * lsg = lusg ;
double * usg = lusg + NSG ;
{ % for i in range ( end = dims . nsg ) % }
{ % - if constraints . lsg [ i ] ! = 0 % }
lsg [ { { i } } ] = { { constraints . lsg [ i ] } } ;
{ % - endif % }
{ % - if constraints . usg [ i ] ! = 0 % }
usg [ { { i } } ] = { { constraints . usg [ i ] } } ;
{ % - endif % }
{ % - endfor % }
for ( int i = 0 ; i < N ; i + + )
{
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " idxsg " , idxsg ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " lsg " , lsg ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " usg " , usg ) ;
}
free ( idxsg ) ;
free ( lusg ) ;
{ % - endif % }
{ % if dims . nsh > 0 % }
// set up soft bounds for nonlinear constraints
int * idxsh = malloc ( NSH * sizeof ( int ) ) ;
{ % for i in range ( end = dims . nsh ) % }
idxsh [ { { i } } ] = { { constraints . idxsh [ i ] } } ;
{ % - endfor % }
double * lush = calloc ( 2 * NSH , sizeof ( double ) ) ;
double * lsh = lush ;
double * ush = lush + NSH ;
{ % for i in range ( end = dims . nsh ) % }
{ % - if constraints . lsh [ i ] ! = 0 % }
lsh [ { { i } } ] = { { constraints . lsh [ i ] } } ;
{ % - endif % }
{ % - if constraints . ush [ i ] ! = 0 % }
ush [ { { i } } ] = { { constraints . ush [ i ] } } ;
{ % - endif % }
{ % - endfor % }
for ( int i = 0 ; i < N ; i + + )
{
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " idxsh " , idxsh ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " lsh " , lsh ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " ush " , ush ) ;
}
free ( idxsh ) ;
free ( lush ) ;
{ % - endif % }
{ % if dims . nsphi > 0 % }
// set up soft bounds for convex-over-nonlinear constraints
int * idxsphi = malloc ( NSPHI * sizeof ( int ) ) ;
{ % for i in range ( end = dims . nsphi ) % }
idxsphi [ { { i } } ] = { { constraints . idxsphi [ i ] } } ;
{ % - endfor % }
double * lusphi = calloc ( 2 * NSPHI , sizeof ( double ) ) ;
double * lsphi = lusphi ;
double * usphi = lusphi + NSPHI ;
{ % for i in range ( end = dims . nsphi ) % }
{ % - if constraints . lsphi [ i ] ! = 0 % }
lsphi [ { { i } } ] = { { constraints . lsphi [ i ] } } ;
{ % - endif % }
{ % - if constraints . usphi [ i ] ! = 0 % }
usphi [ { { i } } ] = { { constraints . usphi [ i ] } } ;
{ % - endif % }
{ % - endfor % }
for ( int i = 0 ; i < N ; i + + )
{
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " idxsphi " , idxsphi ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " lsphi " , lsphi ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " usphi " , usphi ) ;
}
free ( idxsphi ) ;
free ( lusphi ) ;
{ % - endif % }
{ % if dims . nbx > 0 % }
// x
int * idxbx = malloc ( NBX * sizeof ( int ) ) ;
{ % for i in range ( end = dims . nbx ) % }
idxbx [ { { i } } ] = { { constraints . idxbx [ i ] } } ;
{ % - endfor % }
double * lubx = calloc ( 2 * NBX , sizeof ( double ) ) ;
double * lbx = lubx ;
double * ubx = lubx + NBX ;
{ % for i in range ( end = dims . nbx ) % }
{ % - if constraints . lbx [ i ] ! = 0 % }
lbx [ { { i } } ] = { { constraints . lbx [ i ] } } ;
{ % - endif % }
{ % - if constraints . ubx [ i ] ! = 0 % }
ubx [ { { i } } ] = { { constraints . ubx [ i ] } } ;
{ % - endif % }
{ % - endfor % }
for ( int i = 1 ; i < N ; i + + )
{
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " idxbx " , idxbx ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " lbx " , lbx ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " ubx " , ubx ) ;
}
free ( idxbx ) ;
free ( lubx ) ;
{ % - endif % }
{ % if dims . ng > 0 % }
// set up general constraints for stage 0 to N-1
double * D = calloc ( NG * NU , sizeof ( double ) ) ;
double * C = calloc ( NG * NX , sizeof ( double ) ) ;
double * lug = calloc ( 2 * NG , sizeof ( double ) ) ;
double * lg = lug ;
double * ug = lug + NG ;
{ % for j in range ( end = dims . ng ) - % }
{ % for k in range ( end = dims . nu ) % }
{ % - if constraints . D [ j ] [ k ] ! = 0 % }
D [ { { j } } + NG * { { k } } ] = { { constraints . D [ j ] [ k ] } } ;
{ % - endif % }
{ % - endfor % }
{ % - endfor % }
{ % for j in range ( end = dims . ng ) - % }
{ % for k in range ( end = dims . nx ) % }
{ % - if constraints . C [ j ] [ k ] ! = 0 % }
C [ { { j } } + NG * { { k } } ] = { { constraints . C [ j ] [ k ] } } ;
{ % - endif % }
{ % - endfor % }
{ % - endfor % }
{ % for i in range ( end = dims . ng ) % }
{ % - if constraints . lg [ i ] ! = 0 % }
lg [ { { i } } ] = { { constraints . lg [ i ] } } ;
{ % - endif % }
{ % - endfor % }
{ % for i in range ( end = dims . ng ) % }
{ % - if constraints . ug [ i ] ! = 0 % }
ug [ { { i } } ] = { { constraints . ug [ i ] } } ;
{ % - endif % }
{ % - endfor % }
for ( int i = 0 ; i < N ; i + + )
{
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " D " , D ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " C " , C ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " lg " , lg ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " ug " , ug ) ;
}
free ( D ) ;
free ( C ) ;
free ( lug ) ;
{ % - endif % }
{ % if dims . nh > 0 % }
// set up nonlinear constraints for stage 0 to N-1
double * luh = calloc ( 2 * NH , sizeof ( double ) ) ;
double * lh = luh ;
double * uh = luh + NH ;
{ % for i in range ( end = dims . nh ) % }
{ % - if constraints . lh [ i ] ! = 0 % }
lh [ { { i } } ] = { { constraints . lh [ i ] } } ;
{ % - endif % }
{ % - endfor % }
{ % for i in range ( end = dims . nh ) % }
{ % - if constraints . uh [ i ] ! = 0 % }
uh [ { { i } } ] = { { constraints . uh [ i ] } } ;
{ % - endif % }
{ % - endfor % }
for ( int i = 0 ; i < N ; i + + )
{
// nonlinear constraints for stages 0 to N-1
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " nl_constr_h_fun_jac " ,
& capsule - > nl_constr_h_fun_jac [ i ] ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " nl_constr_h_fun " ,
& capsule - > nl_constr_h_fun [ i ] ) ;
{ % if solver_options . hessian_approx = = " EXACT " % }
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i ,
" nl_constr_h_fun_jac_hess " , & capsule - > nl_constr_h_fun_jac_hess [ i ] ) ;
{ % endif % }
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " lh " , lh ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " uh " , uh ) ;
}
free ( luh ) ;
{ % - endif % }
{ % if dims . nphi > 0 and constraints . constr_type = = " BGP " % }
// set up convex-over-nonlinear constraints for stage 0 to N-1
double * luphi = calloc ( 2 * NPHI , sizeof ( double ) ) ;
double * lphi = luphi ;
double * uphi = luphi + NPHI ;
{ % for i in range ( end = dims . nphi ) % }
{ % - if constraints . lphi [ i ] ! = 0 % }
lphi [ { { i } } ] = { { constraints . lphi [ i ] } } ;
{ % - endif % }
{ % - endfor % }
{ % for i in range ( end = dims . nphi ) % }
{ % - if constraints . uphi [ i ] ! = 0 % }
uphi [ { { i } } ] = { { constraints . uphi [ i ] } } ;
{ % - endif % }
{ % - endfor % }
for ( int i = 0 ; i < N ; i + + )
{
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i ,
" nl_constr_phi_o_r_fun_phi_jac_ux_z_phi_hess_r_jac_ux " , & capsule - > phi_constraint [ i ] ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " lphi " , lphi ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , i , " uphi " , uphi ) ;
}
free ( luphi ) ;
{ % - endif % }
/* terminal constraints */
{ % if dims . nbx_e > 0 % }
// set up bounds for last stage
// x
int * idxbx_e = malloc ( NBXN * sizeof ( int ) ) ;
{ % for i in range ( end = dims . nbx_e ) % }
idxbx_e [ { { i } } ] = { { constraints . idxbx_e [ i ] } } ;
{ % - endfor % }
double * lubx_e = calloc ( 2 * NBXN , sizeof ( double ) ) ;
double * lbx_e = lubx_e ;
double * ubx_e = lubx_e + NBXN ;
{ % for i in range ( end = dims . nbx_e ) % }
{ % - if constraints . lbx_e [ i ] ! = 0 % }
lbx_e [ { { i } } ] = { { constraints . lbx_e [ i ] } } ;
{ % - endif % }
{ % - if constraints . ubx_e [ i ] ! = 0 % }
ubx_e [ { { i } } ] = { { constraints . ubx_e [ i ] } } ;
{ % - endif % }
{ % - endfor % }
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " idxbx " , idxbx_e ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " lbx " , lbx_e ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " ubx " , ubx_e ) ;
free ( idxbx_e ) ;
free ( lubx_e ) ;
{ % - endif % }
{ % if dims . nsg_e > 0 % }
// set up soft bounds for general linear constraints
int * idxsg_e = calloc ( NSGN , sizeof ( int ) ) ;
{ % for i in range ( end = dims . nsg_e ) % }
idxsg_e [ { { i } } ] = { { constraints . idxsg_e [ i ] } } ;
{ % - endfor % }
double * lusg_e = calloc ( 2 * NSGN , sizeof ( double ) ) ;
double * lsg_e = lusg_e ;
double * usg_e = lusg_e + NSGN ;
{ % for i in range ( end = dims . nsg_e ) % }
{ % - if constraints . lsg_e [ i ] ! = 0 % }
lsg_e [ { { i } } ] = { { constraints . lsg_e [ i ] } } ;
{ % - endif % }
{ % - if constraints . usg_e [ i ] ! = 0 % }
usg_e [ { { i } } ] = { { constraints . usg_e [ i ] } } ;
{ % - endif % }
{ % - endfor % }
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " idxsg " , idxsg_e ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " lsg " , lsg_e ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " usg " , usg_e ) ;
free ( idxsg_e ) ;
free ( lusg_e ) ;
{ % - endif % }
{ % if dims . nsh_e > 0 % }
// set up soft bounds for nonlinear constraints
int * idxsh_e = malloc ( NSHN * sizeof ( int ) ) ;
{ % for i in range ( end = dims . nsh_e ) % }
idxsh_e [ { { i } } ] = { { constraints . idxsh_e [ i ] } } ;
{ % - endfor % }
double * lush_e = calloc ( 2 * NSHN , sizeof ( double ) ) ;
double * lsh_e = lush_e ;
double * ush_e = lush_e + NSHN ;
{ % for i in range ( end = dims . nsh_e ) % }
{ % - if constraints . lsh_e [ i ] ! = 0 % }
lsh_e [ { { i } } ] = { { constraints . lsh_e [ i ] } } ;
{ % - endif % }
{ % - if constraints . ush_e [ i ] ! = 0 % }
ush_e [ { { i } } ] = { { constraints . ush_e [ i ] } } ;
{ % - endif % }
{ % - endfor % }
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " idxsh " , idxsh_e ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " lsh " , lsh_e ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " ush " , ush_e ) ;
free ( idxsh_e ) ;
free ( lush_e ) ;
{ % - endif % }
{ % if dims . nsphi_e > 0 % }
// set up soft bounds for convex-over-nonlinear constraints
int * idxsphi_e = malloc ( NSPHIN * sizeof ( int ) ) ;
{ % for i in range ( end = dims . nsphi_e ) % }
idxsphi_e [ { { i } } ] = { { constraints . idxsphi_e [ i ] } } ;
{ % - endfor % }
double * lusphi_e = calloc ( 2 * NSPHIN , sizeof ( double ) ) ;
double * lsphi_e = lusphi_e ;
double * usphi_e = lusphi_e + NSPHIN ;
{ % for i in range ( end = dims . nsphi_e ) % }
{ % - if constraints . lsphi_e [ i ] ! = 0 % }
lsphi_e [ { { i } } ] = { { constraints . lsphi_e [ i ] } } ;
{ % - endif % }
{ % - if constraints . usphi_e [ i ] ! = 0 % }
usphi_e [ { { i } } ] = { { constraints . usphi_e [ i ] } } ;
{ % - endif % }
{ % - endfor % }
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " idxsphi " , idxsphi_e ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " lsphi " , lsphi_e ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " usphi " , usphi_e ) ;
free ( idxsphi_e ) ;
free ( lusphi_e ) ;
{ % - endif % }
{ % if dims . nsbx_e > 0 % }
// soft bounds on x
int * idxsbx_e = malloc ( NSBXN * sizeof ( int ) ) ;
{ % for i in range ( end = dims . nsbx_e ) % }
idxsbx_e [ { { i } } ] = { { constraints . idxsbx_e [ i ] } } ;
{ % - endfor % }
double * lusbx_e = calloc ( 2 * NSBXN , sizeof ( double ) ) ;
double * lsbx_e = lusbx_e ;
double * usbx_e = lusbx_e + NSBXN ;
{ % for i in range ( end = dims . nsbx_e ) % }
{ % - if constraints . lsbx_e [ i ] ! = 0 % }
lsbx_e [ { { i } } ] = { { constraints . lsbx_e [ i ] } } ;
{ % - endif % }
{ % - if constraints . usbx_e [ i ] ! = 0 % }
usbx_e [ { { i } } ] = { { constraints . usbx_e [ i ] } } ;
{ % - endif % }
{ % - endfor % }
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " idxsbx " , idxsbx_e ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " lsbx " , lsbx_e ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " usbx " , usbx_e ) ;
free ( idxsbx_e ) ;
free ( lusbx_e ) ;
{ % endif % }
{ % if dims . ng_e > 0 % }
// set up general constraints for last stage
double * C_e = calloc ( NGN * NX , sizeof ( double ) ) ;
double * lug_e = calloc ( 2 * NGN , sizeof ( double ) ) ;
double * lg_e = lug_e ;
double * ug_e = lug_e + NGN ;
{ % for j in range ( end = dims . ng ) % }
{ % - for k in range ( end = dims . nx ) % }
{ % - if constraints . C_e [ j ] [ k ] ! = 0 % }
C_e [ { { j } } + NG * { { k } } ] = { { constraints . C_e [ j ] [ k ] } } ;
{ % - endif % }
{ % - endfor % }
{ % - endfor % }
{ % for i in range ( end = dims . ng_e ) % }
{ % - if constraints . lg_e [ i ] ! = 0 % }
lg_e [ { { i } } ] = { { constraints . lg_e [ i ] } } ;
{ % - endif % }
{ % - if constraints . ug_e [ i ] ! = 0 % }
ug_e [ { { i } } ] = { { constraints . ug_e [ i ] } } ;
{ % - endif % }
{ % - endfor % }
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " C " , C_e ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " lg " , lg_e ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " ug " , ug_e ) ;
free ( C_e ) ;
free ( lug_e ) ;
{ % - endif % }
{ % if dims . nh_e > 0 % }
// set up nonlinear constraints for last stage
double * luh_e = calloc ( 2 * NHN , sizeof ( double ) ) ;
double * lh_e = luh_e ;
double * uh_e = luh_e + NHN ;
{ % for i in range ( end = dims . nh_e ) % }
{ % - if constraints . lh_e [ i ] ! = 0 % }
lh_e [ { { i } } ] = { { constraints . lh_e [ i ] } } ;
{ % - endif % }
{ % - endfor % }
{ % for i in range ( end = dims . nh_e ) % }
{ % - if constraints . uh_e [ i ] ! = 0 % }
uh_e [ { { i } } ] = { { constraints . uh_e [ i ] } } ;
{ % - endif % }
{ % - endfor % }
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " nl_constr_h_fun_jac " , & capsule - > nl_constr_h_e_fun_jac ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " nl_constr_h_fun " , & capsule - > nl_constr_h_e_fun ) ;
{ % if solver_options . hessian_approx = = " EXACT " % }
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " nl_constr_h_fun_jac_hess " ,
& capsule - > nl_constr_h_e_fun_jac_hess ) ;
{ % endif % }
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " lh " , lh_e ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " uh " , uh_e ) ;
free ( luh_e ) ;
{ % - endif % }
{ % if dims . nphi_e > 0 and constraints . constr_type_e = = " BGP " % }
// set up convex-over-nonlinear constraints for last stage
double * luphi_e = calloc ( 2 * NPHIN , sizeof ( double ) ) ;
double * lphi_e = luphi_e ;
double * uphi_e = luphi_e + NPHIN ;
{ % for i in range ( end = dims . nphi_e ) % }
{ % - if constraints . lphi_e [ i ] ! = 0 % }
lphi_e [ { { i } } ] = { { constraints . lphi_e [ i ] } } ;
{ % - endif % }
{ % - if constraints . uphi_e [ i ] ! = 0 % }
uphi_e [ { { i } } ] = { { constraints . uphi_e [ i ] } } ;
{ % - endif % }
{ % - endfor % }
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " lphi " , lphi_e ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N , " uphi " , uphi_e ) ;
ocp_nlp_constraints_model_set ( nlp_config , nlp_dims , nlp_in , N ,
" nl_constr_phi_o_r_fun_phi_jac_ux_z_phi_hess_r_jac_ux " , & capsule - > phi_e_constraint ) ;
free ( luphi_e ) ;
{ % endif % }
}
/**
* Internal function for { { model . name } } _acados_create : step 6
*/
void { { model . name } } _acados_create_6_set_opts ( { { model . name } } _solver_capsule * capsule )
{
const int N = capsule - > nlp_solver_plan - > N ;
ocp_nlp_config * nlp_config = capsule - > nlp_config ;
ocp_nlp_dims * nlp_dims = capsule - > nlp_dims ;
void * nlp_opts = capsule - > nlp_opts ;
/************************************************
* opts
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
{ % if solver_options . hessian_approx = = " EXACT " % }
bool nlp_solver_exact_hessian = true ;
// TODO: this if should not be needed! however, calling the setter with false leads to weird behavior. Investigate!
if ( nlp_solver_exact_hessian )
{
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " exact_hess " , & nlp_solver_exact_hessian ) ;
}
int exact_hess_dyn = { { solver_options . exact_hess_dyn } } ;
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " exact_hess_dyn " , & exact_hess_dyn ) ;
int exact_hess_cost = { { solver_options . exact_hess_cost } } ;
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " exact_hess_cost " , & exact_hess_cost ) ;
int exact_hess_constr = { { solver_options . exact_hess_constr } } ;
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " exact_hess_constr " , & exact_hess_constr ) ;
{ % - endif - % }
{ % - if solver_options . globalization = = " FIXED_STEP " % }
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " globalization " , " fixed_step " ) ;
{ % - elif solver_options . globalization = = " MERIT_BACKTRACKING " % }
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " globalization " , " merit_backtracking " ) ;
double alpha_min = { { solver_options . alpha_min } } ;
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " alpha_min " , & alpha_min ) ;
double alpha_reduction = { { solver_options . alpha_reduction } } ;
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " alpha_reduction " , & alpha_reduction ) ;
int line_search_use_sufficient_descent = { { solver_options . line_search_use_sufficient_descent } } ;
ocp_nlp_solver_opts_set ( nlp_config , capsule - > nlp_opts , " line_search_use_sufficient_descent " , & line_search_use_sufficient_descent ) ;
int globalization_use_SOC = { { solver_options . globalization_use_SOC } } ;
ocp_nlp_solver_opts_set ( nlp_config , capsule - > nlp_opts , " globalization_use_SOC " , & globalization_use_SOC ) ;
double eps_sufficient_descent = { { solver_options . eps_sufficient_descent } } ;
ocp_nlp_solver_opts_set ( nlp_config , capsule - > nlp_opts , " eps_sufficient_descent " , & eps_sufficient_descent ) ;
{ % - endif - % }
int full_step_dual = { { solver_options . full_step_dual } } ;
ocp_nlp_solver_opts_set ( nlp_config , capsule - > nlp_opts , " full_step_dual " , & full_step_dual ) ;
{ % - if dims . nz > 0 % }
// TODO: these options are lower level -> should be encapsulated! maybe through hessian approx option.
bool output_z_val = true ;
bool sens_algebraic_val = true ;
for ( int i = 0 ; i < N ; i + + )
ocp_nlp_solver_opts_set_at_stage ( nlp_config , nlp_opts , i , " dynamics_output_z " , & output_z_val ) ;
for ( int i = 0 ; i < N ; i + + )
ocp_nlp_solver_opts_set_at_stage ( nlp_config , nlp_opts , i , " dynamics_sens_algebraic " , & sens_algebraic_val ) ;
{ % - endif % }
{ % - if solver_options . integrator_type ! = " DISCRETE " % }
// set collocation type (relevant for implicit integrators)
sim_collocation_type collocation_type = { { solver_options . collocation_type } } ;
for ( int i = 0 ; i < N ; i + + )
ocp_nlp_solver_opts_set_at_stage ( nlp_config , nlp_opts , i , " dynamics_collocation_type " , & collocation_type ) ;
// set up sim_method_num_steps
{ % - set all_equal = true % }
{ % - set val = solver_options . sim_method_num_steps [ 0 ] % }
{ % - for j in range ( start = 1 , end = dims . N ) % }
{ % - if val ! = solver_options . sim_method_num_steps [ j ] % }
{ % - set_global all_equal = false % }
{ % - break % }
{ % - endif % }
{ % - endfor % }
{ % - if all_equal = = true % }
// all sim_method_num_steps are identical
int sim_method_num_steps = { { solver_options . sim_method_num_steps [ 0 ] } } ;
for ( int i = 0 ; i < N ; i + + )
ocp_nlp_solver_opts_set_at_stage ( nlp_config , nlp_opts , i , " dynamics_num_steps " , & sim_method_num_steps ) ;
{ % - else % }
// sim_method_num_steps are different
int * sim_method_num_steps = malloc ( N * sizeof ( int ) ) ;
{ % - for j in range ( end = dims . N ) % }
sim_method_num_steps [ { { j } } ] = { { solver_options . sim_method_num_steps [ j ] } } ;
{ % - endfor % }
for ( int i = 0 ; i < N ; i + + )
ocp_nlp_solver_opts_set_at_stage ( nlp_config , nlp_opts , i , " dynamics_num_steps " , & sim_method_num_steps [ i ] ) ;
free ( sim_method_num_steps ) ;
{ % - endif % }
// set up sim_method_num_stages
{ % - set all_equal = true % }
{ % - set val = solver_options . sim_method_num_stages [ 0 ] % }
{ % - for j in range ( start = 1 , end = dims . N ) % }
{ % - if val ! = solver_options . sim_method_num_stages [ j ] % }
{ % - set_global all_equal = false % }
{ % - break % }
{ % - endif % }
{ % - endfor % }
{ % - if all_equal = = true % }
// all sim_method_num_stages are identical
int sim_method_num_stages = { { solver_options . sim_method_num_stages [ 0 ] } } ;
for ( int i = 0 ; i < N ; i + + )
ocp_nlp_solver_opts_set_at_stage ( nlp_config , nlp_opts , i , " dynamics_num_stages " , & sim_method_num_stages ) ;
{ % - else % }
int * sim_method_num_stages = malloc ( N * sizeof ( int ) ) ;
{ % - for j in range ( end = dims . N ) % }
sim_method_num_stages [ { { j } } ] = { { solver_options . sim_method_num_stages [ j ] } } ;
{ % - endfor % }
for ( int i = 0 ; i < N ; i + + )
ocp_nlp_solver_opts_set_at_stage ( nlp_config , nlp_opts , i , " dynamics_num_stages " , & sim_method_num_stages [ i ] ) ;
free ( sim_method_num_stages ) ;
{ % - endif % }
int newton_iter_val = { { solver_options . sim_method_newton_iter } } ;
for ( int i = 0 ; i < N ; i + + )
ocp_nlp_solver_opts_set_at_stage ( nlp_config , nlp_opts , i , " dynamics_newton_iter " , & newton_iter_val ) ;
// set up sim_method_jac_reuse
{ % - set all_equal = true % }
{ % - set val = solver_options . sim_method_jac_reuse [ 0 ] % }
{ % - for j in range ( start = 1 , end = dims . N ) % }
{ % - if val ! = solver_options . sim_method_jac_reuse [ j ] % }
{ % - set_global all_equal = false % }
{ % - break % }
{ % - endif % }
{ % - endfor % }
{ % - if all_equal = = true % }
bool tmp_bool = ( bool ) { { solver_options . sim_method_jac_reuse [ 0 ] } } ;
for ( int i = 0 ; i < N ; i + + )
ocp_nlp_solver_opts_set_at_stage ( nlp_config , nlp_opts , i , " dynamics_jac_reuse " , & tmp_bool ) ;
{ % - else % }
bool * sim_method_jac_reuse = malloc ( N * sizeof ( bool ) ) ;
{ % - for j in range ( end = dims . N ) % }
sim_method_jac_reuse [ { { j } } ] = ( bool ) { { solver_options . sim_method_jac_reuse [ j ] } } ;
{ % - endfor % }
for ( int i = 0 ; i < N ; i + + )
ocp_nlp_solver_opts_set_at_stage ( nlp_config , nlp_opts , i , " dynamics_jac_reuse " , & sim_method_jac_reuse [ i ] ) ;
free ( sim_method_jac_reuse ) ;
{ % - endif % }
{ % - endif % }
double nlp_solver_step_length = { { solver_options . nlp_solver_step_length } } ;
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " step_length " , & nlp_solver_step_length ) ;
{ % - if solver_options . nlp_solver_warm_start_first_qp % }
int nlp_solver_warm_start_first_qp = { { solver_options . nlp_solver_warm_start_first_qp } } ;
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " warm_start_first_qp " , & nlp_solver_warm_start_first_qp ) ;
{ % - endif % }
double levenberg_marquardt = { { solver_options . levenberg_marquardt } } ;
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " levenberg_marquardt " , & levenberg_marquardt ) ;
/* options QP solver */
{ % - if solver_options . qp_solver is starting_with ( " PARTIAL_CONDENSING " ) % }
int qp_solver_cond_N ;
{ % if solver_options . qp_solver_cond_N - % }
const int qp_solver_cond_N_ori = { { solver_options . qp_solver_cond_N } } ;
qp_solver_cond_N = N < qp_solver_cond_N_ori ? N : qp_solver_cond_N_ori ; // use the minimum value here
{ % - else % }
// NOTE: there is no condensing happening here!
qp_solver_cond_N = N ;
{ % - endif % }
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " qp_cond_N " , & qp_solver_cond_N ) ;
{ % - endif % }
{ % - if solver_options . qp_solver is containing ( " HPIPM " ) % }
// set HPIPM mode: should be done before setting other QP solver options
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " qp_hpipm_mode " , " {{ solver_options.hpipm_mode }} " ) ;
{ % - endif % }
{ % if solver_options . nlp_solver_type = = " SQP " % }
// set SQP specific options
double nlp_solver_tol_stat = { { solver_options . nlp_solver_tol_stat } } ;
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " tol_stat " , & nlp_solver_tol_stat ) ;
double nlp_solver_tol_eq = { { solver_options . nlp_solver_tol_eq } } ;
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " tol_eq " , & nlp_solver_tol_eq ) ;
double nlp_solver_tol_ineq = { { solver_options . nlp_solver_tol_ineq } } ;
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " tol_ineq " , & nlp_solver_tol_ineq ) ;
double nlp_solver_tol_comp = { { solver_options . nlp_solver_tol_comp } } ;
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " tol_comp " , & nlp_solver_tol_comp ) ;
int nlp_solver_max_iter = { { solver_options . nlp_solver_max_iter } } ;
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " max_iter " , & nlp_solver_max_iter ) ;
int initialize_t_slacks = { { solver_options . initialize_t_slacks } } ;
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " initialize_t_slacks " , & initialize_t_slacks ) ;
{ % - endif % }
int qp_solver_iter_max = { { solver_options . qp_solver_iter_max } } ;
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " qp_iter_max " , & qp_solver_iter_max ) ;
{ # NOTE : qp_solver tolerances must be set after NLP ones , since the setter for NLP tolerances sets the QP tolerances to the sam values . # }
{ % - if solver_options . qp_solver_tol_stat % }
double qp_solver_tol_stat = { { solver_options . qp_solver_tol_stat } } ;
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " qp_tol_stat " , & qp_solver_tol_stat ) ;
{ % - endif - % }
{ % - if solver_options . qp_solver_tol_eq % }
double qp_solver_tol_eq = { { solver_options . qp_solver_tol_eq } } ;
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " qp_tol_eq " , & qp_solver_tol_eq ) ;
{ % - endif - % }
{ % - if solver_options . qp_solver_tol_ineq % }
double qp_solver_tol_ineq = { { solver_options . qp_solver_tol_ineq } } ;
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " qp_tol_ineq " , & qp_solver_tol_ineq ) ;
{ % - endif - % }
{ % - if solver_options . qp_solver_tol_comp % }
double qp_solver_tol_comp = { { solver_options . qp_solver_tol_comp } } ;
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " qp_tol_comp " , & qp_solver_tol_comp ) ;
{ % - endif - % }
{ % - if solver_options . qp_solver_warm_start % }
int qp_solver_warm_start = { { solver_options . qp_solver_warm_start } } ;
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " qp_warm_start " , & qp_solver_warm_start ) ;
{ % - endif - % }
int print_level = { { solver_options . print_level } } ;
ocp_nlp_solver_opts_set ( nlp_config , nlp_opts , " print_level " , & print_level ) ;
int ext_cost_num_hess = { { solver_options . ext_cost_num_hess } } ;
{ % - if cost . cost_type = = " EXTERNAL " % }
for ( int i = 0 ; i < N ; i + + )
{
ocp_nlp_solver_opts_set_at_stage ( nlp_config , nlp_opts , i , " cost_numerical_hessian " , & ext_cost_num_hess ) ;
}
{ % - endif % }
{ % - if cost . cost_type_e = = " EXTERNAL " % }
ocp_nlp_solver_opts_set_at_stage ( nlp_config , nlp_opts , N , " cost_numerical_hessian " , & ext_cost_num_hess ) ;
{ % - endif % }
}
/**
* Internal function for { { model . name } } _acados_create : step 7
*/
void { { model . name } } _acados_create_7_set_nlp_out ( { { model . name } } _solver_capsule * capsule )
{
const int N = capsule - > nlp_solver_plan - > N ;
ocp_nlp_config * nlp_config = capsule - > nlp_config ;
ocp_nlp_dims * nlp_dims = capsule - > nlp_dims ;
ocp_nlp_out * nlp_out = capsule - > nlp_out ;
// initialize primal solution
double * xu0 = calloc ( NX + NU , sizeof ( double ) ) ;
double * x0 = xu0 ;
{ % if dims . nbx_0 = = dims . nx % }
// initialize with x0
{ % for item in constraints . lbx_0 % }
{ % - if item ! = 0 % }
x0 [ { { loop . index0 } } ] = { { item } } ;
{ % - endif % }
{ % - endfor % }
{ % else % }
// initialize with zeros
{ % - endif % }
double * u0 = xu0 + NX ;
for ( int i = 0 ; i < N ; i + + )
{
// x0
ocp_nlp_out_set ( nlp_config , nlp_dims , nlp_out , i , " x " , x0 ) ;
// u0
ocp_nlp_out_set ( nlp_config , nlp_dims , nlp_out , i , " u " , u0 ) ;
}
ocp_nlp_out_set ( nlp_config , nlp_dims , nlp_out , N , " x " , x0 ) ;
free ( xu0 ) ;
}
/**
* Internal function for { { model . name } } _acados_create : step 8
*/
//void {{ model.name }}_acados_create_8_create_solver({{ model.name }}_solver_capsule* capsule)
//{
// capsule->nlp_solver = ocp_nlp_solver_create(capsule->nlp_config, capsule->nlp_dims, capsule->nlp_opts);
//}
/**
* Internal function for { { model . name } } _acados_create : step 9
*/
int { { model . name } } _acados_create_9_precompute ( { { model . name } } _solver_capsule * capsule ) {
int status = ocp_nlp_precompute ( capsule - > nlp_solver , capsule - > nlp_in , capsule - > nlp_out ) ;
if ( status ! = ACADOS_SUCCESS ) {
printf ( " \n ocp_nlp_precompute failed! \n \n " ) ;
exit ( 1 ) ;
}
return status ;
}
int { { model . name } } _acados_create_with_discretization ( { { model . name } } _solver_capsule * capsule , int N , double * new_time_steps )
{
// If N does not match the number of shooting intervals used for code generation, new_time_steps must be given.
if ( N ! = { { model . name | upper } } _N & & ! new_time_steps ) {
fprintf ( stderr , " {{ model.name }}_acados_create_with_discretization: new_time_steps is NULL " \
" but the number of shooting intervals (= %d) differs from the number of " \
" shooting intervals (= %d) during code generation! Please provide a new vector of time_stamps! \n " , \
N , { { model . name | upper } } _N ) ;
return 1 ;
}
// number of expected runtime parameters
capsule - > nlp_np = NP ;
// 1) create and set nlp_solver_plan; create nlp_config
capsule - > nlp_solver_plan = ocp_nlp_plan_create ( N ) ;
{ { model . name } } _acados_create_1_set_plan ( capsule - > nlp_solver_plan , N ) ;
capsule - > nlp_config = ocp_nlp_config_create ( * capsule - > nlp_solver_plan ) ;
// 3) create and set dimensions
capsule - > nlp_dims = { { model . name } } _acados_create_2_create_and_set_dimensions ( capsule ) ;
{ { model . name } } _acados_create_3_create_and_set_functions ( capsule ) ;
// 4) set default parameters in functions
{ { model . name } } _acados_create_4_set_default_parameters ( capsule ) ;
// 5) create and set nlp_in
capsule - > nlp_in = ocp_nlp_in_create ( capsule - > nlp_config , capsule - > nlp_dims ) ;
{ { model . name } } _acados_create_5_set_nlp_in ( capsule , N , new_time_steps ) ;
// 6) create and set nlp_opts
capsule - > nlp_opts = ocp_nlp_solver_opts_create ( capsule - > nlp_config , capsule - > nlp_dims ) ;
{ { model . name } } _acados_create_6_set_opts ( capsule ) ;
// 7) create and set nlp_out
// 7.1) nlp_out
capsule - > nlp_out = ocp_nlp_out_create ( capsule - > nlp_config , capsule - > nlp_dims ) ;
// 7.2) sens_out
capsule - > sens_out = ocp_nlp_out_create ( capsule - > nlp_config , capsule - > nlp_dims ) ;
{ { model . name } } _acados_create_7_set_nlp_out ( capsule ) ;
// 8) create solver
capsule - > nlp_solver = ocp_nlp_solver_create ( capsule - > nlp_config , capsule - > nlp_dims , capsule - > nlp_opts ) ;
//{{ model.name }}_acados_create_8_create_solver(capsule);
// 9) do precomputations
int status = { { model . name } } _acados_create_9_precompute ( capsule ) ;
return status ;
}
/**
* This function is for updating an already initialized solver with a different number of qp_cond_N . It is useful for code reuse after code export .
*/
int { { model . name } } _acados_update_qp_solver_cond_N ( { { model . name } } _solver_capsule * capsule , int qp_solver_cond_N )
{
{ % - if solver_options . qp_solver is starting_with ( " PARTIAL_CONDENSING " ) % }
// 1) destroy solver
ocp_nlp_solver_destroy ( capsule - > nlp_solver ) ;
// 2) set new value for "qp_cond_N"
const int N = capsule - > nlp_solver_plan - > N ;
if ( qp_solver_cond_N > N )
printf ( " Warning: qp_solver_cond_N = %d > N = %d \n " , qp_solver_cond_N , N ) ;
ocp_nlp_solver_opts_set ( capsule - > nlp_config , capsule - > nlp_opts , " qp_cond_N " , & qp_solver_cond_N ) ;
// 3) continue with the remaining steps from {{ model.name }}_acados_create_with_discretization(...):
// -> 8) create solver
capsule - > nlp_solver = ocp_nlp_solver_create ( capsule - > nlp_config , capsule - > nlp_dims , capsule - > nlp_opts ) ;
// -> 9) do precomputations
int status = { { model . name } } _acados_create_9_precompute ( capsule ) ;
return status ;
{ % - else % }
printf ( " \n acados_update_qp_solver_cond_N() failed, since no partial condensing solver is used! \n \n " ) ;
// Todo: what is an adequate behavior here?
exit ( 1 ) ;
return - 1 ;
{ % - endif % }
}
int { { model . name } } _acados_reset ( { { model . name } } _solver_capsule * capsule )
{
// set initialization to all zeros
{ # TODO : use guess values / initial state value from json instead ? ! # }
const int N = capsule - > nlp_solver_plan - > N ;
ocp_nlp_config * nlp_config = capsule - > nlp_config ;
ocp_nlp_dims * nlp_dims = capsule - > nlp_dims ;
ocp_nlp_out * nlp_out = capsule - > nlp_out ;
ocp_nlp_in * nlp_in = capsule - > nlp_in ;
ocp_nlp_solver * nlp_solver = capsule - > nlp_solver ;
int nx , nu , nv , ns , nz , ni , dim ;
double * buffer = calloc ( NX + NU + NZ + 2 * NS + 2 * NSN + NBX + NBU + NG + NH + NPHI + NBX0 + NBXN + NHN + NPHIN + NGN , sizeof ( double ) ) ;
for ( int i = 0 ; i < N + 1 ; i + + )
{
ocp_nlp_out_set ( nlp_config , nlp_dims , nlp_out , i , " x " , buffer ) ;
ocp_nlp_out_set ( nlp_config , nlp_dims , nlp_out , i , " u " , buffer ) ;
ocp_nlp_out_set ( nlp_config , nlp_dims , nlp_out , i , " sl " , buffer ) ;
ocp_nlp_out_set ( nlp_config , nlp_dims , nlp_out , i , " su " , buffer ) ;
ocp_nlp_out_set ( nlp_config , nlp_dims , nlp_out , i , " lam " , buffer ) ;
ocp_nlp_out_set ( nlp_config , nlp_dims , nlp_out , i , " t " , buffer ) ;
ocp_nlp_out_set ( nlp_config , nlp_dims , nlp_out , i , " z " , buffer ) ;
if ( i < N )
{
ocp_nlp_out_set ( nlp_config , nlp_dims , nlp_out , i , " pi " , buffer ) ;
{ % - if solver_options . integrator_type = = " IRK " % }
ocp_nlp_set ( nlp_config , nlp_solver , i , " xdot_guess " , buffer ) ;
ocp_nlp_set ( nlp_config , nlp_solver , i , " z_guess " , buffer ) ;
{ % elif solver_options . integrator_type = = " LIFTED_IRK " % }
ocp_nlp_set ( nlp_config , nlp_solver , i , " xdot_guess " , buffer ) ;
{ % elif solver_options . integrator_type = = " GNSF " % }
ocp_nlp_set ( nlp_config , nlp_solver , i , " gnsf_phi_guess " , buffer ) ;
{ % - endif % }
}
}
{ % - if solver_options . qp_solver = = ' PARTIAL_CONDENSING_HPIPM ' % }
// get qp_status: if NaN -> reset memory
int qp_status ;
ocp_nlp_get ( capsule - > nlp_config , capsule - > nlp_solver , " qp_status " , & qp_status ) ;
if ( qp_status = = 3 )
{
// printf("\nin reset qp_status %d -> resetting QP memory\n", qp_status);
ocp_nlp_solver_reset_qp_memory ( nlp_solver , nlp_in , nlp_out ) ;
}
{ % - endif % }
free ( buffer ) ;
return 0 ;
}
int { { model . name } } _acados_update_params ( { { model . name } } _solver_capsule * capsule , int stage , double * p , int np )
{
int solver_status = 0 ;
int casadi_np = { { dims . np } } ;
if ( casadi_np ! = np ) {
printf ( " acados_update_params: trying to set %i parameters for external functions. "
" External function has %i parameters. Exiting. \n " , np , casadi_np ) ;
exit ( 1 ) ;
}
{ % - if dims . np > 0 % }
const int N = capsule - > nlp_solver_plan - > N ;
if ( stage < N & & stage > = 0 )
{
{ % - if solver_options . integrator_type = = " IRK " % }
capsule - > impl_dae_fun [ stage ] . set_param ( capsule - > impl_dae_fun + stage , p ) ;
capsule - > impl_dae_fun_jac_x_xdot_z [ stage ] . set_param ( capsule - > impl_dae_fun_jac_x_xdot_z + stage , p ) ;
capsule - > impl_dae_jac_x_xdot_u_z [ stage ] . set_param ( capsule - > impl_dae_jac_x_xdot_u_z + stage , p ) ;
{ % - if solver_options . hessian_approx = = " EXACT " % }
capsule - > impl_dae_hess [ stage ] . set_param ( capsule - > impl_dae_hess + stage , p ) ;
{ % - endif % }
{ % elif solver_options . integrator_type = = " LIFTED_IRK " % }
capsule - > impl_dae_fun [ stage ] . set_param ( capsule - > impl_dae_fun + stage , p ) ;
capsule - > impl_dae_fun_jac_x_xdot_u [ stage ] . set_param ( capsule - > impl_dae_fun_jac_x_xdot_u + stage , p ) ;
{ % elif solver_options . integrator_type = = " ERK " % }
capsule - > forw_vde_casadi [ stage ] . set_param ( capsule - > forw_vde_casadi + stage , p ) ;
capsule - > expl_ode_fun [ stage ] . set_param ( capsule - > expl_ode_fun + stage , p ) ;
{ % - if solver_options . hessian_approx = = " EXACT " % }
capsule - > hess_vde_casadi [ stage ] . set_param ( capsule - > hess_vde_casadi + stage , p ) ;
{ % - endif % }
{ % elif solver_options . integrator_type = = " GNSF " % }
{ % if model . gnsf . purely_linear ! = 1 % }
capsule - > gnsf_phi_fun [ stage ] . set_param ( capsule - > gnsf_phi_fun + stage , p ) ;
capsule - > gnsf_phi_fun_jac_y [ stage ] . set_param ( capsule - > gnsf_phi_fun_jac_y + stage , p ) ;
capsule - > gnsf_phi_jac_y_uhat [ stage ] . set_param ( capsule - > gnsf_phi_jac_y_uhat + stage , p ) ;
{ % if model . gnsf . nontrivial_f_LO = = 1 % }
capsule - > gnsf_f_lo_jac_x1_x1dot_u_z [ stage ] . set_param ( capsule - > gnsf_f_lo_jac_x1_x1dot_u_z + stage , p ) ;
{ % - endif % }
{ % - endif % }
{ % elif solver_options . integrator_type = = " DISCRETE " % }
capsule - > discr_dyn_phi_fun [ stage ] . set_param ( capsule - > discr_dyn_phi_fun + stage , p ) ;
capsule - > discr_dyn_phi_fun_jac_ut_xt [ stage ] . set_param ( capsule - > discr_dyn_phi_fun_jac_ut_xt + stage , p ) ;
{ % - if solver_options . hessian_approx = = " EXACT " % }
capsule - > discr_dyn_phi_fun_jac_ut_xt_hess [ stage ] . set_param ( capsule - > discr_dyn_phi_fun_jac_ut_xt_hess + stage , p ) ;
{ % endif % }
{ % - endif % } { # integrator_type # }
// constraints
{ % if constraints . constr_type = = " BGP " % }
capsule - > phi_constraint [ stage ] . set_param ( capsule - > phi_constraint + stage , p ) ;
{ % elif constraints . constr_type = = " BGH " and dims . nh > 0 % }
capsule - > nl_constr_h_fun_jac [ stage ] . set_param ( capsule - > nl_constr_h_fun_jac + stage , p ) ;
capsule - > nl_constr_h_fun [ stage ] . set_param ( capsule - > nl_constr_h_fun + stage , p ) ;
{ % - if solver_options . hessian_approx = = " EXACT " % }
capsule - > nl_constr_h_fun_jac_hess [ stage ] . set_param ( capsule - > nl_constr_h_fun_jac_hess + stage , p ) ;
{ % - endif % }
{ % - endif % }
// cost
if ( stage = = 0 )
{
{ % - if cost . cost_type_0 = = " NONLINEAR_LS " % }
capsule - > cost_y_0_fun . set_param ( & capsule - > cost_y_0_fun , p ) ;
capsule - > cost_y_0_fun_jac_ut_xt . set_param ( & capsule - > cost_y_0_fun_jac_ut_xt , p ) ;
capsule - > cost_y_0_hess . set_param ( & capsule - > cost_y_0_hess , p ) ;
{ % - elif cost . cost_type_0 = = " EXTERNAL " % }
capsule - > ext_cost_0_fun . set_param ( & capsule - > ext_cost_0_fun , p ) ;
capsule - > ext_cost_0_fun_jac . set_param ( & capsule - > ext_cost_0_fun_jac , p ) ;
capsule - > ext_cost_0_fun_jac_hess . set_param ( & capsule - > ext_cost_0_fun_jac_hess , p ) ;
{ % endif % }
}
else // 0 < stage < N
{
{ % - if cost . cost_type = = " NONLINEAR_LS " % }
capsule - > cost_y_fun [ stage - 1 ] . set_param ( capsule - > cost_y_fun + stage - 1 , p ) ;
capsule - > cost_y_fun_jac_ut_xt [ stage - 1 ] . set_param ( capsule - > cost_y_fun_jac_ut_xt + stage - 1 , p ) ;
capsule - > cost_y_hess [ stage - 1 ] . set_param ( capsule - > cost_y_hess + stage - 1 , p ) ;
{ % - elif cost . cost_type = = " EXTERNAL " % }
capsule - > ext_cost_fun [ stage - 1 ] . set_param ( capsule - > ext_cost_fun + stage - 1 , p ) ;
capsule - > ext_cost_fun_jac [ stage - 1 ] . set_param ( capsule - > ext_cost_fun_jac + stage - 1 , p ) ;
capsule - > ext_cost_fun_jac_hess [ stage - 1 ] . set_param ( capsule - > ext_cost_fun_jac_hess + stage - 1 , p ) ;
{ % - endif % }
}
}
else // stage == N
{
// terminal shooting node has no dynamics
// cost
{ % - if cost . cost_type_e = = " NONLINEAR_LS " % }
capsule - > cost_y_e_fun . set_param ( & capsule - > cost_y_e_fun , p ) ;
capsule - > cost_y_e_fun_jac_ut_xt . set_param ( & capsule - > cost_y_e_fun_jac_ut_xt , p ) ;
capsule - > cost_y_e_hess . set_param ( & capsule - > cost_y_e_hess , p ) ;
{ % - elif cost . cost_type_e = = " EXTERNAL " % }
capsule - > ext_cost_e_fun . set_param ( & capsule - > ext_cost_e_fun , p ) ;
capsule - > ext_cost_e_fun_jac . set_param ( & capsule - > ext_cost_e_fun_jac , p ) ;
capsule - > ext_cost_e_fun_jac_hess . set_param ( & capsule - > ext_cost_e_fun_jac_hess , p ) ;
{ % endif % }
// constraints
{ % if constraints . constr_type_e = = " BGP " % }
capsule - > phi_e_constraint . set_param ( & capsule - > phi_e_constraint , p ) ;
{ % elif constraints . constr_type_e = = " BGH " and dims . nh_e > 0 % }
capsule - > nl_constr_h_e_fun_jac . set_param ( & capsule - > nl_constr_h_e_fun_jac , p ) ;
capsule - > nl_constr_h_e_fun . set_param ( & capsule - > nl_constr_h_e_fun , p ) ;
{ % - if solver_options . hessian_approx = = " EXACT " % }
capsule - > nl_constr_h_e_fun_jac_hess . set_param ( & capsule - > nl_constr_h_e_fun_jac_hess , p ) ;
{ % - endif % }
{ % endif % }
}
{ % endif % } { # if dims . np # }
return solver_status ;
}
int { { model . name } } _acados_solve ( { { model . name } } _solver_capsule * capsule )
{
// solve NLP
int solver_status = ocp_nlp_solve ( capsule - > nlp_solver , capsule - > nlp_in , capsule - > nlp_out ) ;
return solver_status ;
}
int { { model . name } } _acados_free ( { { model . name } } _solver_capsule * capsule )
{
// before destroying, keep some info
const int N = capsule - > nlp_solver_plan - > N ;
// free memory
ocp_nlp_solver_opts_destroy ( capsule - > nlp_opts ) ;
ocp_nlp_in_destroy ( capsule - > nlp_in ) ;
ocp_nlp_out_destroy ( capsule - > nlp_out ) ;
ocp_nlp_out_destroy ( capsule - > sens_out ) ;
ocp_nlp_solver_destroy ( capsule - > nlp_solver ) ;
ocp_nlp_dims_destroy ( capsule - > nlp_dims ) ;
ocp_nlp_config_destroy ( capsule - > nlp_config ) ;
ocp_nlp_plan_destroy ( capsule - > nlp_solver_plan ) ;
/* free external function */
// dynamics
{ % - if solver_options . integrator_type = = " IRK " % }
for ( int i = 0 ; i < N ; i + + )
{
external_function_param_casadi_free ( & capsule - > impl_dae_fun [ i ] ) ;
external_function_param_casadi_free ( & capsule - > impl_dae_fun_jac_x_xdot_z [ i ] ) ;
external_function_param_casadi_free ( & capsule - > impl_dae_jac_x_xdot_u_z [ i ] ) ;
{ % - if solver_options . hessian_approx = = " EXACT " % }
external_function_param_casadi_free ( & capsule - > impl_dae_hess [ i ] ) ;
{ % - endif % }
}
free ( capsule - > impl_dae_fun ) ;
free ( capsule - > impl_dae_fun_jac_x_xdot_z ) ;
free ( capsule - > impl_dae_jac_x_xdot_u_z ) ;
{ % - if solver_options . hessian_approx = = " EXACT " % }
free ( capsule - > impl_dae_hess ) ;
{ % - endif % }
{ % - elif solver_options . integrator_type = = " LIFTED_IRK " % }
for ( int i = 0 ; i < N ; i + + )
{
external_function_param_casadi_free ( & capsule - > impl_dae_fun [ i ] ) ;
external_function_param_casadi_free ( & capsule - > impl_dae_fun_jac_x_xdot_u [ i ] ) ;
}
free ( capsule - > impl_dae_fun ) ;
free ( capsule - > impl_dae_fun_jac_x_xdot_u ) ;
{ % - elif solver_options . integrator_type = = " ERK " % }
for ( int i = 0 ; i < N ; i + + )
{
external_function_param_casadi_free ( & capsule - > forw_vde_casadi [ i ] ) ;
external_function_param_casadi_free ( & capsule - > expl_ode_fun [ i ] ) ;
{ % - if solver_options . hessian_approx = = " EXACT " % }
external_function_param_casadi_free ( & capsule - > hess_vde_casadi [ i ] ) ;
{ % - endif % }
}
free ( capsule - > forw_vde_casadi ) ;
free ( capsule - > expl_ode_fun ) ;
{ % - if solver_options . hessian_approx = = " EXACT " % }
free ( capsule - > hess_vde_casadi ) ;
{ % - endif % }
{ % - elif solver_options . integrator_type = = " GNSF " % }
for ( int i = 0 ; i < N ; i + + )
{
{ % if model . gnsf . purely_linear ! = 1 % }
external_function_param_casadi_free ( & capsule - > gnsf_phi_fun [ i ] ) ;
external_function_param_casadi_free ( & capsule - > gnsf_phi_fun_jac_y [ i ] ) ;
external_function_param_casadi_free ( & capsule - > gnsf_phi_jac_y_uhat [ i ] ) ;
{ % if model . gnsf . nontrivial_f_LO = = 1 % }
external_function_param_casadi_free ( & capsule - > gnsf_f_lo_jac_x1_x1dot_u_z [ i ] ) ;
{ % - endif % }
{ % - endif % }
external_function_param_casadi_free ( & capsule - > gnsf_get_matrices_fun [ i ] ) ;
}
{ % if model . gnsf . purely_linear ! = 1 % }
free ( capsule - > gnsf_phi_fun ) ;
free ( capsule - > gnsf_phi_fun_jac_y ) ;
free ( capsule - > gnsf_phi_jac_y_uhat ) ;
{ % if model . gnsf . nontrivial_f_LO = = 1 % }
free ( capsule - > gnsf_f_lo_jac_x1_x1dot_u_z ) ;
{ % - endif % }
{ % - endif % }
free ( capsule - > gnsf_get_matrices_fun ) ;
{ % - elif solver_options . integrator_type = = " DISCRETE " % }
for ( int i = 0 ; i < N ; i + + )
{
external_function_param_ { { model . dyn_ext_fun_type } } _free ( & capsule - > discr_dyn_phi_fun [ i ] ) ;
external_function_param_ { { model . dyn_ext_fun_type } } _free ( & capsule - > discr_dyn_phi_fun_jac_ut_xt [ i ] ) ;
{ % - if solver_options . hessian_approx = = " EXACT " % }
external_function_param_ { { model . dyn_ext_fun_type } } _free ( & capsule - > discr_dyn_phi_fun_jac_ut_xt_hess [ i ] ) ;
{ % - endif % }
}
free ( capsule - > discr_dyn_phi_fun ) ;
free ( capsule - > discr_dyn_phi_fun_jac_ut_xt ) ;
{ % - if solver_options . hessian_approx = = " EXACT " % }
free ( capsule - > discr_dyn_phi_fun_jac_ut_xt_hess ) ;
{ % - endif % }
{ % - endif % }
// cost
{ % - if cost . cost_type_0 = = " NONLINEAR_LS " % }
external_function_param_casadi_free ( & capsule - > cost_y_0_fun ) ;
external_function_param_casadi_free ( & capsule - > cost_y_0_fun_jac_ut_xt ) ;
external_function_param_casadi_free ( & capsule - > cost_y_0_hess ) ;
{ % - elif cost . cost_type_0 = = " EXTERNAL " % }
external_function_param_ { { cost . cost_ext_fun_type_0 } } _free ( & capsule - > ext_cost_0_fun ) ;
external_function_param_ { { cost . cost_ext_fun_type_0 } } _free ( & capsule - > ext_cost_0_fun_jac ) ;
external_function_param_ { { cost . cost_ext_fun_type_0 } } _free ( & capsule - > ext_cost_0_fun_jac_hess ) ;
{ % - endif % }
{ % - if cost . cost_type = = " NONLINEAR_LS " % }
for ( int i = 0 ; i < N - 1 ; i + + )
{
external_function_param_casadi_free ( & capsule - > cost_y_fun [ i ] ) ;
external_function_param_casadi_free ( & capsule - > cost_y_fun_jac_ut_xt [ i ] ) ;
external_function_param_casadi_free ( & capsule - > cost_y_hess [ i ] ) ;
}
free ( capsule - > cost_y_fun ) ;
free ( capsule - > cost_y_fun_jac_ut_xt ) ;
free ( capsule - > cost_y_hess ) ;
{ % - elif cost . cost_type = = " EXTERNAL " % }
for ( int i = 0 ; i < N - 1 ; i + + )
{
external_function_param_ { { cost . cost_ext_fun_type } } _free ( & capsule - > ext_cost_fun [ i ] ) ;
external_function_param_ { { cost . cost_ext_fun_type } } _free ( & capsule - > ext_cost_fun_jac [ i ] ) ;
external_function_param_ { { cost . cost_ext_fun_type } } _free ( & capsule - > ext_cost_fun_jac_hess [ i ] ) ;
}
free ( capsule - > ext_cost_fun ) ;
free ( capsule - > ext_cost_fun_jac ) ;
free ( capsule - > ext_cost_fun_jac_hess ) ;
{ % - endif % }
{ % - if cost . cost_type_e = = " NONLINEAR_LS " % }
external_function_param_casadi_free ( & capsule - > cost_y_e_fun ) ;
external_function_param_casadi_free ( & capsule - > cost_y_e_fun_jac_ut_xt ) ;
external_function_param_casadi_free ( & capsule - > cost_y_e_hess ) ;
{ % - elif cost . cost_type_e = = " EXTERNAL " % }
external_function_param_ { { cost . cost_ext_fun_type_e } } _free ( & capsule - > ext_cost_e_fun ) ;
external_function_param_ { { cost . cost_ext_fun_type_e } } _free ( & capsule - > ext_cost_e_fun_jac ) ;
external_function_param_ { { cost . cost_ext_fun_type_e } } _free ( & capsule - > ext_cost_e_fun_jac_hess ) ;
{ % - endif % }
// constraints
{ % - if constraints . constr_type = = " BGH " and dims . nh > 0 % }
for ( int i = 0 ; i < N ; i + + )
{
external_function_param_casadi_free ( & capsule - > nl_constr_h_fun_jac [ i ] ) ;
external_function_param_casadi_free ( & capsule - > nl_constr_h_fun [ i ] ) ;
}
{ % - if solver_options . hessian_approx = = " EXACT " % }
for ( int i = 0 ; i < N ; i + + )
{
external_function_param_casadi_free ( & capsule - > nl_constr_h_fun_jac_hess [ i ] ) ;
}
{ % - endif % }
free ( capsule - > nl_constr_h_fun_jac ) ;
free ( capsule - > nl_constr_h_fun ) ;
{ % - if solver_options . hessian_approx = = " EXACT " % }
free ( capsule - > nl_constr_h_fun_jac_hess ) ;
{ % - endif % }
{ % - elif constraints . constr_type = = " BGP " and dims . nphi > 0 % }
for ( int i = 0 ; i < N ; i + + )
{
external_function_param_casadi_free ( & capsule - > phi_constraint [ i ] ) ;
}
free ( capsule - > phi_constraint ) ;
{ % - endif % }
{ % - if constraints . constr_type_e = = " BGH " and dims . nh_e > 0 % }
external_function_param_casadi_free ( & capsule - > nl_constr_h_e_fun_jac ) ;
external_function_param_casadi_free ( & capsule - > nl_constr_h_e_fun ) ;
{ % - if solver_options . hessian_approx = = " EXACT " % }
external_function_param_casadi_free ( & capsule - > nl_constr_h_e_fun_jac_hess ) ;
{ % - endif % }
{ % - elif constraints . constr_type_e = = " BGP " and dims . nphi_e > 0 % }
external_function_param_casadi_free ( & capsule - > phi_e_constraint ) ;
{ % - endif % }
return 0 ;
}
ocp_nlp_in * { { model . name } } _acados_get_nlp_in ( { { model . name } } _solver_capsule * capsule ) { return capsule - > nlp_in ; }
ocp_nlp_out * { { model . name } } _acados_get_nlp_out ( { { model . name } } _solver_capsule * capsule ) { return capsule - > nlp_out ; }
ocp_nlp_out * { { model . name } } _acados_get_sens_out ( { { model . name } } _solver_capsule * capsule ) { return capsule - > sens_out ; }
ocp_nlp_solver * { { model . name } } _acados_get_nlp_solver ( { { model . name } } _solver_capsule * capsule ) { return capsule - > nlp_solver ; }
ocp_nlp_config * { { model . name } } _acados_get_nlp_config ( { { model . name } } _solver_capsule * capsule ) { return capsule - > nlp_config ; }
void * { { model . name } } _acados_get_nlp_opts ( { { model . name } } _solver_capsule * capsule ) { return capsule - > nlp_opts ; }
ocp_nlp_dims * { { model . name } } _acados_get_nlp_dims ( { { model . name } } _solver_capsule * capsule ) { return capsule - > nlp_dims ; }
ocp_nlp_plan_t * { { model . name } } _acados_get_nlp_plan ( { { model . name } } _solver_capsule * capsule ) { return capsule - > nlp_solver_plan ; }
void { { model . name } } _acados_print_stats ( { { model . name } } _solver_capsule * capsule )
{
int sqp_iter , stat_m , stat_n , tmp_int ;
ocp_nlp_get ( capsule - > nlp_config , capsule - > nlp_solver , " sqp_iter " , & sqp_iter ) ;
ocp_nlp_get ( capsule - > nlp_config , capsule - > nlp_solver , " stat_n " , & stat_n ) ;
ocp_nlp_get ( capsule - > nlp_config , capsule - > nlp_solver , " stat_m " , & stat_m ) ;
{ % set stat_n_max = 12 % }
double stat [ { { solver_options . nlp_solver_max_iter * stat_n_max } } ] ;
ocp_nlp_get ( capsule - > nlp_config , capsule - > nlp_solver , " statistics " , stat ) ;
int nrow = sqp_iter + 1 < stat_m ? sqp_iter + 1 : stat_m ;
{ % - if solver_options . nlp_solver_type = = " SQP " % }
printf ( " iter \t res_stat \t res_eq \t \t res_ineq \t res_comp \t qp_stat \t qp_iter \t alpha \n " ) ;
for ( int i = 0 ; i < nrow ; i + + )
{
for ( int j = 0 ; j < stat_n + 1 ; j + + )
{
if ( j = = 0 | | j = = 5 | | j = = 6 )
{
tmp_int = ( int ) stat [ i + j * nrow ] ;
printf ( " %d \t " , tmp_int ) ;
}
else
{
printf ( " %e \t " , stat [ i + j * nrow ] ) ;
}
}
printf ( " \n " ) ;
}
{ % else % }
printf ( " iter \t qp_stat \t qp_iter \n " ) ;
for ( int i = 0 ; i < nrow ; i + + )
{
for ( int j = 0 ; j < stat_n + 1 ; j + + )
{
tmp_int = ( int ) stat [ i + j * nrow ] ;
printf ( " %d \t " , tmp_int ) ;
}
printf ( " \n " ) ;
}
{ % - endif % }
}