#ifndef OSQP_H # define OSQP_H # ifdef __cplusplus extern "C" { # endif // ifdef __cplusplus /* Includes */ # include "types.h" # include "util.h" // Needed for osqp_set_default_settings functions // Library to deal with sparse matrices enabled only if embedded not defined # ifndef EMBEDDED # include "cs.h" # endif // ifndef EMBEDDED /******************** * Main Solver API * ********************/ /** * @name Main solver API * @{ */ /** * Set default settings from constants.h file * assumes settings already allocated in memory * @param settings settings structure */ void osqp_set_default_settings(OSQPSettings *settings); # ifndef EMBEDDED /** * Initialize OSQP solver allocating memory. * * All the inputs must be already allocated in memory before calling. * * It performs: * - data and settings validation * - problem data scaling * - automatic parameters tuning (if enabled) * - setup linear system solver: * - direct solver: KKT matrix factorization is performed here * - indirect solver: KKT matrix preconditioning is performed here * * NB: This is the only function that allocates dynamic memory and is not used *during code generation * * @param workp Solver workspace pointer * @param data Problem data * @param settings Solver settings * @return Exitflag for errors (0 if no errors) */ c_int osqp_setup(OSQPWorkspace** workp, const OSQPData* data, const OSQPSettings* settings); # endif // #ifndef EMBEDDED /** * Solve quadratic program * * The final solver information is stored in the \a work->info structure * * The solution is stored in the \a work->solution structure * * If the problem is primal infeasible, the certificate is stored * in \a work->delta_y * * If the problem is dual infeasible, the certificate is stored in \a * work->delta_x * * @param work Workspace allocated * @return Exitflag for errors */ c_int osqp_solve(OSQPWorkspace *work); # ifndef EMBEDDED /** * Cleanup workspace by deallocating memory * * This function is not used in code generation * @param work Workspace * @return Exitflag for errors */ c_int osqp_cleanup(OSQPWorkspace *work); # endif // ifndef EMBEDDED /** @} */ /******************************************** * Sublevel API * * * * Edit data without performing setup again * ********************************************/ /** * @name Sublevel API * @{ */ /** * Update linear cost in the problem * @param work Workspace * @param q_new New linear cost * @return Exitflag for errors and warnings */ c_int osqp_update_lin_cost(OSQPWorkspace *work, const c_float *q_new); /** * Update lower and upper bounds in the problem constraints * @param work Workspace * @param l_new New lower bound * @param u_new New upper bound * @return Exitflag: 1 if new lower bound is not <= than new upper bound */ c_int osqp_update_bounds(OSQPWorkspace *work, const c_float *l_new, const c_float *u_new); /** * Update lower bound in the problem constraints * @param work Workspace * @param l_new New lower bound * @return Exitflag: 1 if new lower bound is not <= than upper bound */ c_int osqp_update_lower_bound(OSQPWorkspace *work, const c_float *l_new); /** * Update upper bound in the problem constraints * @param work Workspace * @param u_new New upper bound * @return Exitflag: 1 if new upper bound is not >= than lower bound */ c_int osqp_update_upper_bound(OSQPWorkspace *work, const c_float *u_new); /** * Warm start primal and dual variables * @param work Workspace structure * @param x Primal variable * @param y Dual variable * @return Exitflag */ c_int osqp_warm_start(OSQPWorkspace *work, const c_float *x, const c_float *y); /** * Warm start primal variable * @param work Workspace structure * @param x Primal variable * @return Exitflag */ c_int osqp_warm_start_x(OSQPWorkspace *work, const c_float *x); /** * Warm start dual variable * @param work Workspace structure * @param y Dual variable * @return Exitflag */ c_int osqp_warm_start_y(OSQPWorkspace *work, const c_float *y); # if EMBEDDED != 1 /** * Update elements of matrix P (upper triangular) * without changing sparsity structure. * * * If Px_new_idx is OSQP_NULL, Px_new is assumed to be as long as P->x * and the whole P->x is replaced. * * @param work Workspace structure * @param Px_new Vector of new elements in P->x (upper triangular) * @param Px_new_idx Index mapping new elements to positions in P->x * @param P_new_n Number of new elements to be changed * @return output flag: 0: OK * 1: P_new_n > nnzP * <0: error in the update */ c_int osqp_update_P(OSQPWorkspace *work, const c_float *Px_new, const c_int *Px_new_idx, c_int P_new_n); /** * Update elements of matrix A without changing sparsity structure. * * * If Ax_new_idx is OSQP_NULL, Ax_new is assumed to be as long as A->x * and the whole A->x is replaced. * * @param work Workspace structure * @param Ax_new Vector of new elements in A->x * @param Ax_new_idx Index mapping new elements to positions in A->x * @param A_new_n Number of new elements to be changed * @return output flag: 0: OK * 1: A_new_n > nnzA * <0: error in the update */ c_int osqp_update_A(OSQPWorkspace *work, const c_float *Ax_new, const c_int *Ax_new_idx, c_int A_new_n); /** * Update elements of matrix P (upper triangular) and elements of matrix A * without changing sparsity structure. * * * If Px_new_idx is OSQP_NULL, Px_new is assumed to be as long as P->x * and the whole P->x is replaced. * * If Ax_new_idx is OSQP_NULL, Ax_new is assumed to be as long as A->x * and the whole A->x is replaced. * * @param work Workspace structure * @param Px_new Vector of new elements in P->x (upper triangular) * @param Px_new_idx Index mapping new elements to positions in P->x * @param P_new_n Number of new elements to be changed * @param Ax_new Vector of new elements in A->x * @param Ax_new_idx Index mapping new elements to positions in A->x * @param A_new_n Number of new elements to be changed * @return output flag: 0: OK * 1: P_new_n > nnzP * 2: A_new_n > nnzA * <0: error in the update */ c_int osqp_update_P_A(OSQPWorkspace *work, const c_float *Px_new, const c_int *Px_new_idx, c_int P_new_n, const c_float *Ax_new, const c_int *Ax_new_idx, c_int A_new_n); /** * Update rho. Limit it between RHO_MIN and RHO_MAX. * @param work Workspace * @param rho_new New rho setting * @return Exitflag */ c_int osqp_update_rho(OSQPWorkspace *work, c_float rho_new); # endif // if EMBEDDED != 1 /** @} */ /** * @name Update settings * @{ */ /** * Update max_iter setting * @param work Workspace * @param max_iter_new New max_iter setting * @return Exitflag */ c_int osqp_update_max_iter(OSQPWorkspace *work, c_int max_iter_new); /** * Update absolute tolernace value * @param work Workspace * @param eps_abs_new New absolute tolerance value * @return Exitflag */ c_int osqp_update_eps_abs(OSQPWorkspace *work, c_float eps_abs_new); /** * Update relative tolernace value * @param work Workspace * @param eps_rel_new New relative tolerance value * @return Exitflag */ c_int osqp_update_eps_rel(OSQPWorkspace *work, c_float eps_rel_new); /** * Update primal infeasibility tolerance * @param work Workspace * @param eps_prim_inf_new New primal infeasibility tolerance * @return Exitflag */ c_int osqp_update_eps_prim_inf(OSQPWorkspace *work, c_float eps_prim_inf_new); /** * Update dual infeasibility tolerance * @param work Workspace * @param eps_dual_inf_new New dual infeasibility tolerance * @return Exitflag */ c_int osqp_update_eps_dual_inf(OSQPWorkspace *work, c_float eps_dual_inf_new); /** * Update relaxation parameter alpha * @param work Workspace * @param alpha_new New relaxation parameter value * @return Exitflag */ c_int osqp_update_alpha(OSQPWorkspace *work, c_float alpha_new); /** * Update warm_start setting * @param work Workspace * @param warm_start_new New warm_start setting * @return Exitflag */ c_int osqp_update_warm_start(OSQPWorkspace *work, c_int warm_start_new); /** * Update scaled_termination setting * @param work Workspace * @param scaled_termination_new New scaled_termination setting * @return Exitflag */ c_int osqp_update_scaled_termination(OSQPWorkspace *work, c_int scaled_termination_new); /** * Update check_termination setting * @param work Workspace * @param check_termination_new New check_termination setting * @return Exitflag */ c_int osqp_update_check_termination(OSQPWorkspace *work, c_int check_termination_new); # ifndef EMBEDDED /** * Update regularization parameter in polish * @param work Workspace * @param delta_new New regularization parameter * @return Exitflag */ c_int osqp_update_delta(OSQPWorkspace *work, c_float delta_new); /** * Update polish setting * @param work Workspace * @param polish_new New polish setting * @return Exitflag */ c_int osqp_update_polish(OSQPWorkspace *work, c_int polish_new); /** * Update number of iterative refinement steps in polish * @param work Workspace * @param polish_refine_iter_new New iterative reginement steps * @return Exitflag */ c_int osqp_update_polish_refine_iter(OSQPWorkspace *work, c_int polish_refine_iter_new); /** * Update verbose setting * @param work Workspace * @param verbose_new New verbose setting * @return Exitflag */ c_int osqp_update_verbose(OSQPWorkspace *work, c_int verbose_new); # endif // #ifndef EMBEDDED # ifdef PROFILING /** * Update time_limit setting * @param work Workspace * @param time_limit_new New time_limit setting * @return Exitflag */ c_int osqp_update_time_limit(OSQPWorkspace *work, c_float time_limit_new); # endif // ifdef PROFILING /** @} */ # ifdef __cplusplus } # endif // ifdef __cplusplus #endif // ifndef OSQP_H