/*
* Copyright 2019 Gianluca Frison , Dimitris Kouzoupis , Robin Verschueren ,
* Andrea Zanelli , Niels van Duijkeren , Jonathan Frey , Tommaso Sartor ,
* Branimir Novoselnik , Rien Quirynen , Rezart Qelibari , Dang Doan ,
* Jonas Koenemann , Yutao Chen , Tobias Schöls , Jonas Schlagenhauf , Moritz Diehl
*
* This file is part of acados .
*
* The 2 - Clause BSD License
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions are met :
*
* 1. Redistributions of source code must retain the above copyright notice ,
* this list of conditions and the following disclaimer .
*
* 2. Redistributions in binary form must reproduce the above copyright notice ,
* this list of conditions and the following disclaimer in the documentation
* and / or other materials provided with the distribution .
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS " AS IS "
* AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR
* CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS
* INTERRUPTION ) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN
* CONTRACT , STRICT LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE )
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE . ;
*/
# ifndef INTERFACES_ACADOS_C_OCP_NLP_INTERFACE_H_
# define INTERFACES_ACADOS_C_OCP_NLP_INTERFACE_H_
# ifdef __cplusplus
extern " C " {
# endif
// acados
# include "acados/ocp_nlp/ocp_nlp_common.h"
# include "acados/ocp_nlp/ocp_nlp_constraints_bgh.h"
# include "acados/sim/sim_erk_integrator.h"
# include "acados/sim/sim_irk_integrator.h"
# include "acados/sim/sim_lifted_irk_integrator.h"
# include "acados/sim/sim_gnsf.h"
// acados_c
# include "acados_c/ocp_qp_interface.h"
# include "acados_c/sim_interface.h"
/// Solution methods for optimal control problems.
typedef enum
{
SQP ,
SQP_RTI ,
INVALID_NLP_SOLVER ,
} ocp_nlp_solver_t ;
/// Types of the cost function.
typedef enum
{
LINEAR_LS ,
NONLINEAR_LS ,
EXTERNAL ,
INVALID_COST ,
} ocp_nlp_cost_t ;
/// Types of the system dynamics, discrete or continuous time.
typedef enum
{
CONTINUOUS_MODEL ,
DISCRETE_MODEL ,
INVALID_DYNAMICS ,
} ocp_nlp_dynamics_t ;
/// Constraint types
typedef enum
{
/// Comprises simple bounds, polytopic constraints,
/// general non-linear constraints.
BGH ,
/// Comprises simple bounds, polytopic constraints,
/// general non-linear constraints, and positive definite constraints.
BGP ,
INVALID_CONSTRAINT ,
} ocp_nlp_constraints_t ;
/// Regularization types
typedef enum
{
NO_REGULARIZE ,
MIRROR ,
PROJECT ,
PROJECT_REDUC_HESS ,
CONVEXIFY ,
INVALID_REGULARIZE ,
} ocp_nlp_reg_t ;
/// Structure to store the configuration of a non-linear program
typedef struct ocp_nlp_plan
{
/// QP solver configuration.
ocp_qp_solver_plan ocp_qp_solver_plan ;
/// Simulation solver configuration for each stage.
sim_solver_plan * sim_solver_plan ;
/// Nlp solver type.
ocp_nlp_solver_t nlp_solver ;
/// Regularization type, defaults to no regularization.
ocp_nlp_reg_t regularization ;
/// Cost type for each stage.
ocp_nlp_cost_t * nlp_cost ;
/// Dynamics type for each stage.
ocp_nlp_dynamics_t * nlp_dynamics ;
/// Constraints type for each stage.
ocp_nlp_constraints_t * nlp_constraints ;
/// Horizon length.
int N ;
} ocp_nlp_plan ;
/// Structure to store the state/configuration for the non-linear programming solver
typedef struct ocp_nlp_solver
{
ocp_nlp_config * config ;
void * dims ;
void * opts ;
void * mem ;
void * work ;
} ocp_nlp_solver ;
/// Constructs an empty plan struct (user nlp configuration), all fields are set to a
/// default/invalid state.
///
/// \param N Horizon length
ocp_nlp_plan * ocp_nlp_plan_create ( int N ) ;
/// Destructor for plan struct, frees memory.
///
/// \param plan_ The plan struct to destroy.
void ocp_nlp_plan_destroy ( void * plan_ ) ;
/// Constructs an nlp configuration struct from a plan.
///
/// \param plan The plan (user nlp configuration).
ocp_nlp_config * ocp_nlp_config_create ( ocp_nlp_plan plan ) ;
/// Desctructor of the nlp configuration.
///
/// \param config_ The configuration struct.
void ocp_nlp_config_destroy ( void * config_ ) ;
/// Constructs an struct that contains the dimensions of the variables.
///
/// \param config_ The configuration struct.
ocp_nlp_dims * ocp_nlp_dims_create ( void * config_ ) ;
/// Destructor of The dimension struct.
///
/// \param dims_ The dimension struct.
void ocp_nlp_dims_destroy ( void * dims_ ) ;
/// Constructs an input struct for a non-linear programs.
///
/// \param config The configuration struct.
/// \param dims The dimension struct.
ocp_nlp_in * ocp_nlp_in_create ( ocp_nlp_config * config , ocp_nlp_dims * dims ) ;
/// Destructor of the inputs struct.
///
/// \param in The inputs struct.
void ocp_nlp_in_destroy ( void * in ) ;
/// Sets the sampling times for the given stage.
///
/// \param config The configuration struct.
/// \param dims The dimension struct.
/// \param in The inputs struct.
/// \param stage Stage number.
/// \param field Has to be "Ts" (TBC other options).
/// \param value The sampling times (floating point).
void ocp_nlp_in_set ( ocp_nlp_config * config , ocp_nlp_dims * dims , ocp_nlp_in * in , int stage ,
const char * field , void * value ) ;
/// Sets the function pointers to the dynamics functions for the given stage.
///
/// \param config The configuration struct.
/// \param dims The dimension struct.
/// \param in The inputs struct.
/// \param stage Stage number.
/// \param fun_type The name of the function type, either impl_ode_fun,
/// impl_ode_fun_jac_x_xdot, impl_ode_jac_x_xdot_u (TBC)
/// \param fun_ptr Function pointer to the dynamics function.
int ocp_nlp_dynamics_model_set ( ocp_nlp_config * config , ocp_nlp_dims * dims , ocp_nlp_in * in ,
int stage , const char * fun_type , void * fun_ptr ) ;
/// Sets the function pointers to the cost functions for the given stage.
///
/// \param config The configuration struct.
/// \param dims The dimension struct.
/// \param in The inputs struct.
/// \param stage Stage number.
/// \param field The name of the field, either nls_res_jac,
/// y_ref, W (others TBC)
/// \param value Cost values.
int ocp_nlp_cost_model_set_slice ( ocp_nlp_config * config , ocp_nlp_dims * dims , ocp_nlp_in * in ,
int start_stage , int end_stage , const char * field , void * value , int dim ) ;
int ocp_nlp_cost_model_set ( ocp_nlp_config * config , ocp_nlp_dims * dims , ocp_nlp_in * in ,
int start_stage , const char * field , void * value ) ;
/// Sets the function pointers to the constraints functions for the given stage.
///
/// \param config The configuration struct.
/// \param dims The dimension struct.
/// \param in The inputs struct.
/// \param stage Stage number.
/// \param field The name of the field, either lb, ub (others TBC)
/// \param value Constraints function or values.
int ocp_nlp_constraints_model_set_slice ( ocp_nlp_config * config , ocp_nlp_dims * dims , ocp_nlp_in * in ,
int start_stage , int end_stage , const char * field , void * value , int dim ) ;
int ocp_nlp_constraints_model_set ( ocp_nlp_config * config , ocp_nlp_dims * dims ,
ocp_nlp_in * in , int stage , const char * field , void * value ) ;
/* out */
/// Constructs an output struct for the non-linear program.
///
/// \param config The configuration struct.
/// \param dims The dimension struct.
ocp_nlp_out * ocp_nlp_out_create ( ocp_nlp_config * config , ocp_nlp_dims * dims ) ;
/// Destructor of the output struct.
///
/// \param out The output struct.
void ocp_nlp_out_destroy ( void * out ) ;
/// Sets fields in the output struct of an nlp solver, used to initialize the solver.
///
/// \param config The configuration struct.
/// \param dims The dimension struct.
/// \param out The output struct.
/// \param stage Stage number.
/// \param field The name of the field, either x, u, pi.
/// \param value Initialization values.
void ocp_nlp_out_set ( ocp_nlp_config * config , ocp_nlp_dims * dims , ocp_nlp_out * out ,
int stage , const char * field , void * value ) ;
/// Gets values of fields in the output struct of an nlp solver.
///
/// \param config The configuration struct.
/// \param dims The dimension struct.
/// \param out The output struct.
/// \param stage Stage number.
/// \param field The name of the field, either x, u, z, pi.
/// \param value Pointer to the output memory.
void ocp_nlp_out_get ( ocp_nlp_config * config , ocp_nlp_dims * dims , ocp_nlp_out * out ,
int stage , const char * field , void * value ) ;
void ocp_nlp_out_get_slice ( ocp_nlp_config * config , ocp_nlp_dims * dims , ocp_nlp_out * out ,
int start_stage , int end_stage , const char * field , void * value ) ;
//
void ocp_nlp_get_at_stage ( ocp_nlp_config * config , ocp_nlp_dims * dims , ocp_nlp_solver * solver ,
int stage , const char * field , void * value ) ;
// TODO(andrea): remove this once/if the MATLAB interface uses the new setters below?
int ocp_nlp_dims_get_from_attr ( ocp_nlp_config * config , ocp_nlp_dims * dims , ocp_nlp_out * out ,
int stage , const char * field ) ;
void ocp_nlp_constraint_dims_get_from_attr ( ocp_nlp_config * config , ocp_nlp_dims * dims , ocp_nlp_out * out ,
int stage , const char * field , int * dims_out ) ;
void ocp_nlp_cost_dims_get_from_attr ( ocp_nlp_config * config , ocp_nlp_dims * dims , ocp_nlp_out * out ,
int stage , const char * field , int * dims_out ) ;
/* opts */
/// Creates an options struct for the non-linear program.
///
/// \param config The configuration struct.
/// \param dims The dimension struct.
void * ocp_nlp_solver_opts_create ( ocp_nlp_config * config , ocp_nlp_dims * dims ) ;
/// Destructor of the options.
///
/// \param opts The options struct.
void ocp_nlp_solver_opts_destroy ( void * opts ) ;
/// Sets an option.
///
/// \param config The configuration struct.
/// \param opts_ The options struct.
/// \param field Name of the option.
/// \param value Value of the option.
void ocp_nlp_solver_opts_set ( ocp_nlp_config * config , void * opts_ , const char * field , void * value ) ;
void ocp_nlp_solver_opts_set_at_stage ( ocp_nlp_config * config , void * opts_ , int stage , const char * field , void * value ) ;
/// TBC
/// Updates the options.
///
/// \param config The configuration struct.
/// \param dims The dimension struct.
/// \param opts_ The options struct.
void ocp_nlp_solver_opts_update ( ocp_nlp_config * config , ocp_nlp_dims * dims , void * opts_ ) ;
/* solver */
/// Creates an ocp solver.
///
/// \param config The configuration struct.
/// \param dims The dimension struct.
/// \param opts_ The options struct.
/// \return The solver.
ocp_nlp_solver * ocp_nlp_solver_create ( ocp_nlp_config * config , ocp_nlp_dims * dims , void * opts_ ) ;
/// Destructor of the solver.
///
/// \param solver The solver struct.
void ocp_nlp_solver_destroy ( void * solver ) ;
/// Solves the optimal control problem. Call ocp_nlp_precompute before
/// calling this functions (TBC).
///
/// \param solver The solver struct.
/// \param nlp_in The inputs struct.
/// \param nlp_out The output struct.
int ocp_nlp_solve ( ocp_nlp_solver * solver , ocp_nlp_in * nlp_in , ocp_nlp_out * nlp_out ) ;
/// Performs precomputations for the solver. Needs to be called before
/// ocl_nlp_solve (TBC).
///
/// \param solver The solver struct.
/// \param nlp_in The inputs struct.
/// \param nlp_out The output struct.
int ocp_nlp_precompute ( ocp_nlp_solver * solver , ocp_nlp_in * nlp_in , ocp_nlp_out * nlp_out ) ;
/// Computes cost function value.
///
/// \param solver The solver struct.
/// \param nlp_in The inputs struct.
/// \param nlp_out The output struct.
void ocp_nlp_eval_cost ( ocp_nlp_solver * solver , ocp_nlp_in * nlp_in , ocp_nlp_out * nlp_out ) ;
//
void ocp_nlp_eval_param_sens ( ocp_nlp_solver * solver , char * field , int stage , int index , ocp_nlp_out * sens_nlp_out ) ;
/* get */
/// \param config The configuration struct.
/// \param solver The solver struct.
/// \param field Supports "sqp_iter", "status", "nlp_res", "time_tot", ...
/// \param return_value_ Pointer to the output memory.
void ocp_nlp_get ( ocp_nlp_config * config , ocp_nlp_solver * solver ,
const char * field , void * return_value_ ) ;
/* set */
/// Sets the initial guesses for the integrator for the given stage.
///
/// \param config The configuration struct.
/// \param solver The ocp_nlp_solver struct.
/// \param stage Stage number.
/// \param field Supports "z_guess", "xdot_guess" (IRK), "phi_guess" (GNSF-IRK)
/// \param value The initial guess for the algebraic variables in the integrator (if continuous model is used).
void ocp_nlp_set ( ocp_nlp_config * config , ocp_nlp_solver * solver ,
int stage , const char * field , void * value ) ;
# ifdef __cplusplus
} /* extern "C" */
# endif
# endif // INTERFACES_ACADOS_C_OCP_NLP_INTERFACE_H_