123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430 |
- #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
|