/* * Fatrop - A fast trajectory optimization solver * Copyright (C) 2022 - 2024 Lander Vanroye, KU Leuven. All rights reserved. * * This file is part of Fatrop. * * Fatrop is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fatrop is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Fatrop. If not, see . */ #ifndef OCPCINTERFACEINCLUDED #define OCPCINTERFACEINCLUDED #ifdef __cplusplus extern "C" { #endif /* Symbol visibility in DLLs */ #ifndef FATROP_SYMBOL_EXPORT #if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) #if defined(STATIC_LINKED) #define FATROP_SYMBOL_EXPORT #else #define FATROP_SYMBOL_EXPORT __declspec(dllexport) #endif #elif defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) #define FATROP_SYMBOL_EXPORT __attribute__((visibility("default"))) #else #define FATROP_SYMBOL_EXPORT #endif #endif #include #define fatrop_int int #ifndef FATROP_OCP_SOLVER_IMPLEMENTATION // Opaque types typedef struct FatropOcpCSolver FatropOcpCSolver; #endif struct FatropOcpCDims { const fatrop_int *ux_offs; const fatrop_int *g_offs; const fatrop_int *dyn_offs; const fatrop_int *dyn_eq_offs; const fatrop_int *g_ineq_offs; const fatrop_int *ineq_offs; fatrop_int max_nu; fatrop_int max_nx; fatrop_int max_ng; fatrop_int max_ngineq; fatrop_int n_ineqs; fatrop_int K; const fatrop_int *nu; const fatrop_int *nx; const fatrop_int *ng; const fatrop_int *ng_ineq; }; struct FatropOcpCStats { double compute_sd_time; double duinf_time; double eval_hess_time; double eval_jac_time; double eval_cv_time; double eval_grad_time; double eval_obj_time; double initialization_time; double time_total; int eval_hess_count; int eval_jac_count; int eval_cv_count; int eval_grad_count; int eval_obj_count; int iterations_count; int return_flag; }; // Function pointer types typedef fatrop_int (*FatropOcpCGetDim_k)(fatrop_int, void* user_data); typedef fatrop_int (*FatropOcpCGetDim)(void* user_data); typedef fatrop_int (*FatropOcpCGetDouble_k)(double*, fatrop_int, void* user_data); typedef fatrop_int (*FatropOcpCGetDouble)(double*, void* user_data); typedef fatrop_int (*FatropOcpCEval_BAbt_k)(const double*, const double*, const double*, const double*, const double*, struct blasfeo_dmat*, fatrop_int, void* user_data); typedef fatrop_int (*FatropOcpCEval_RSQrqt_k)(const double*, const double*, const double*, const double*, const double*, const double*, const double*, const double*, struct blasfeo_dmat*, fatrop_int, void* user_data); typedef fatrop_int (*FatropOcpCEval_Ggt_k)(const double*, const double*, const double*, const double*, struct blasfeo_dmat*, fatrop_int, void* user_data); typedef fatrop_int (*FatropOcpCEval_Ggt_ineq_k)(const double*, const double*, const double*, const double*, struct blasfeo_dmat*, fatrop_int, void* user_data); typedef fatrop_int (*FatropOcpCEval_b_k)(const double*, const double*, const double*, const double*, const double*, double*, fatrop_int, void* user_data); typedef fatrop_int (*FatropOcpCEval_g_k)(const double*, const double*, const double*, const double*, double*, fatrop_int, void* user_data); typedef fatrop_int (*FatropOcpCEval_gineq_k)(const double*, const double*, const double*, const double*, double*, fatrop_int, void* user_data); typedef fatrop_int (*FatropOcpCEval_rq_k)(const double*, const double*, const double*, const double*, const double*, double*, fatrop_int, void* user_data); typedef fatrop_int (*FatropOcpCEval_L_k)(const double*, const double*, const double*, const double*, const double*, double*, fatrop_int, void* user_data); typedef fatrop_int (*FatropOcpCGetBounds_k)(double*, double*, fatrop_int, void* user_data); typedef fatrop_int (*FatropOcpCFullEvalLagHess)(double, const double*, const double*, const double*, const double*, struct blasfeo_dmat *, const struct FatropOcpCDims*, void*); typedef fatrop_int (*FatropOcpCFullEvalConstrJac)(const double*, const double*, const double*, struct blasfeo_dmat *, struct blasfeo_dmat *, struct blasfeo_dmat *, const struct FatropOcpCDims*, void*); typedef fatrop_int (*FatropOcpCFullEvalContrViol)(const double*, const double*, const double*, double *, const struct FatropOcpCDims*, void*); typedef fatrop_int (*FatropOcpCFullEvalObjGrad)(double, const double*, const double*, const double*, double *, const struct FatropOcpCDims*, void*); typedef fatrop_int (*FatropOcpCFullEvalObj)(double, const double*, const double*, const double*, double *, const struct FatropOcpCDims*, void*); typedef void (*FatropOcpCWrite)(const char* msg, int num); typedef void (*FatropOcpCFlush)(void); struct FatropOcpCInterface { /// @brief number of states for time step k /// @param k: time step FatropOcpCGetDim_k get_nx; /// @brief number of inputs for time step k /// @param k: time step FatropOcpCGetDim_k get_nu; /// @brief number of equality constraints for time step k /// @param k: time step FatropOcpCGetDim_k get_ng; /// @brief number of stage parameters for time step k /// @param k: time step FatropOcpCGetDim_k get_n_stage_params; /// @brief number of global parameters FatropOcpCGetDim get_n_global_params; /// @brief default stage parameters for time step k /// @param stage_params: pointer to array of size n_stage_params_k /// @param k: time step FatropOcpCGetDouble_k get_default_stage_params; /// @brief default global parameters /// @param global_params: pointer to array of size n_global_params FatropOcpCGetDouble get_default_global_params; /// @brief number of inequality constraints for time step k /// @param k: time step FatropOcpCGetDim_k get_ng_ineq; /// @brief horizon length FatropOcpCGetDim get_horizon_length; /// @brief discretized dynamics /// it evaluates the vertical concatenation of A_k^T, B_k^T, and b_k^T from the linearized dynamics x_{k+1} = A_k x_k + B_k u_k + b_k. /// The matrix is in column major format. /// @param states_kp1: pointer to nx_{k+1}-array states of time step k+1 /// @param inputs_k: pointer to array inputs of time step k /// @param states_k: pointer to array states of time step k /// @param stage_params_k: pointer to array stage parameters of time step k /// @param global_params: pointer to array global parameters /// @param res: pointer to (nu+nx+1 x nu+nx)-matrix /// @param k: time step FatropOcpCEval_BAbt_k eval_BAbt; /// @brief stagewise Lagrangian Hessian /// It evaluates is the vertical concatenation of (1) the Hessian of the Lagrangian to the concatenation of (u_k, x_k) (2) the first order derivative of the Lagrangian Hessian to the concatenation of (u_k, x_k). /// The matrix is in column major format. /// @param objective_scale: scale factor for objective function (usually 1.0) /// @param inputs_k: pointer to array inputs of time step k /// @param states_k: pointer to array states of time step k /// @param lam_dyn_k: pointer to array dual variables for dynamics of time step k /// @param lam_eq_k: pointer to array dual variables for equality constraints of time step k /// @param lam_eq_ineq_k: pointer to array dual variables for inequality constraints of time step k /// @param stage_params_k: pointer to array stage parameters of time step k /// @param global_params: pointer to array global parameters /// @param res: pointer to (nu+nx+1 x nu+nx)-matrix. /// @param k /// @return FatropOcpCEval_RSQrqt_k eval_RSQrqt; /// @brief stagewise equality constraints Jacobian. /// It evaluates the vertical concatenation of (1) the Jacobian of the equality constraints to the concatenation of (u_k, x_k) (2) the equality constraints evaluated at u_k, x_k. /// The matrix is in column major format. /// @param inputs_k: pointer to array inputs of time step k /// @param states_k: pointer to array states of time step k /// @param stage_params_k: pointer to array stage parameters of time step k /// @param global_params: pointer to array global parameters /// @param res: pointer to (nu+nx+1 x ng)-matrix. /// @param k: time step /// @return FatropOcpCEval_Ggt_k eval_Ggt; /// @brief stagewise inequality constraints Jacobian. /// It evaluates the vertical concatenation of (1) the Jacobian of the inequality constraints to the concatenation of (u_k, x_k) (2) the inequality constraints evaluated at u_k, x_k. /// The matrix is in column major format. /// @param inputs_k: pointer to array inputs of time step k /// @param states_k: pointer to array states of time step k /// @param stage_params_k: pointer to array stage parameters of time step k /// @param global_params_ko: pointer to array global parameters /// @param res: pointer to (nu+nx+1 x ng_ineq)-matrix, column major format /// @param k : time step /// @return FatropOcpCEval_Ggt_ineq_k eval_Ggt_ineq; /// @brief the dynamics constraint violation (b_k = -x_{k+1} + f_k(u_k, x_k, p_k, p)) /// @param states_kp1: pointer to array states of time step k+1 /// @param inputs_k: pointer to array inputs of time step k /// @param states_k: pointer to array states of time step k /// @param stage_params_k: pointer to array stage parameters of time step k /// @param global_params: pointer to array global parameters /// @param res: pointer to array nx_{k+1}-vector /// @param k: time step /// @return FatropOcpCEval_b_k eval_b; /// @brief the equality constraint violation (g_k = g_k(u_k, x_k, p_k, p)) /// @param inputs_k: pointer to array inputs of time step k /// @param states_k: pointer to array states of time step k /// @param stage_params_k: pointer to array stage parameters of time step k /// @param global_params: pointer to array global parameters /// @param res: pointer to array ng-vector /// @param k: time step FatropOcpCEval_g_k eval_g; /// @brief the inequality constraint violation (g_ineq_k = g_ineq_k(u_k, x_k, p_k, p)) /// @param inputs_k: pointer to array inputs of time step k /// @param states_k: pointer to array states of time step k /// @param stage_params_k: pointer to array stage parameters of time step k /// @param global_params: pointer to array global parameters /// @param res: pointer to array ng_ineq-vector /// @param k: time step FatropOcpCEval_gineq_k eval_gineq; /// @brief gradient of the objective function (not the Lagrangian!) to the concatenation of (u_k, x_k) /// @param objective_scale: pointer to objective scale /// @param inputs_k: pointer to array inputs of time step k /// @param states_k: pointer to array states of time step k /// @param stage_params_k: pointer to array stage parameters of time step k /// @param global_params: pointer to array global parameters /// @param res: pointer to (nu+nx)-array /// @param k: time step FatropOcpCEval_rq_k eval_rq; /// @brief objective function value /// @param objective_scale: pointer to array objective scale /// @param inputs_k: pointer to array inputs of time step k /// @param states_k: pointer to array states of time step k /// @param stage_params_k: pointer to array stage parameters of time step k /// @param global_params: pointer to array global parameters /// @param res: pointer to double /// @param k: time step FatropOcpCEval_L_k eval_L; /// @brief the bounds of the inequalites at stage k /// @param lower: pointer to ng_ineq-vector /// @param upper: pointer to ng_ineq-vector /// @param k: time step FatropOcpCGetBounds_k get_bounds; /// @brief default initial guess for the states of stage k /// @param xk: pointer to states of time step k /// @param k: time step FatropOcpCGetDouble_k get_initial_xk; /// @brief default initial guess for the inputs of stage k /// @param uk: pointer to inputs of time step k /// @param k: time step FatropOcpCGetDouble_k get_initial_uk; FatropOcpCFullEvalLagHess full_eval_lag_hess; FatropOcpCFullEvalConstrJac full_eval_constr_jac; FatropOcpCFullEvalContrViol full_eval_contr_viol; FatropOcpCFullEvalObjGrad full_eval_obj_grad; FatropOcpCFullEvalObj full_eval_obj; void* user_data; }; /* * @brief Create a new OCP solver * @param ocp_interface: pointer to the OCP interface * @param write: function pointer to write function (can be zero to indicate stdout) * @param flush: function pointer to flush function (can be zero) * @return pointer to the OCP solver */ FATROP_SYMBOL_EXPORT struct FatropOcpCSolver* fatrop_ocp_c_create(struct FatropOcpCInterface* ocp_interface, FatropOcpCWrite write, FatropOcpCFlush flush); FATROP_SYMBOL_EXPORT fatrop_int fatrop_ocp_c_solve(struct FatropOcpCSolver*); /* -1 for not found, 0 for double, 1 for int, 2 for bool, 3 for string */ FATROP_SYMBOL_EXPORT int fatrop_ocp_c_option_type(const char* name); FATROP_SYMBOL_EXPORT int fatrop_ocp_c_set_option_double(struct FatropOcpCSolver* s, const char* name, double val); FATROP_SYMBOL_EXPORT int fatrop_ocp_c_set_option_bool(struct FatropOcpCSolver* s, const char* name, int val); FATROP_SYMBOL_EXPORT int fatrop_ocp_c_set_option_int(struct FatropOcpCSolver* s, const char* name, int val); FATROP_SYMBOL_EXPORT int fatrop_ocp_c_set_option_string(struct FatropOcpCSolver* s, const char* name, const char* val); FATROP_SYMBOL_EXPORT const struct blasfeo_dvec* fatrop_ocp_c_get_primal(struct FatropOcpCSolver* s); FATROP_SYMBOL_EXPORT const struct blasfeo_dvec* fatrop_ocp_c_get_dual(struct FatropOcpCSolver* s); FATROP_SYMBOL_EXPORT const struct FatropOcpCDims* fatrop_ocp_c_get_dims(struct FatropOcpCSolver* s); FATROP_SYMBOL_EXPORT const struct FatropOcpCStats* fatrop_ocp_c_get_stats(struct FatropOcpCSolver* s); FATROP_SYMBOL_EXPORT void fatrop_ocp_c_destroy(struct FatropOcpCSolver*); #ifdef __cplusplus } // extern "C" #endif #endif // OCPCINTERFACEINCLUDED