|
@@ -0,0 +1,430 @@
|
|
|
|
+#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
|