.. _julia_interface: Julia ====== Load the module --------------- The OSQP module can be load with .. code:: julia using OSQP .. _julia_setup: Setup ----- The solver is initialized by creating an OSQP Model .. code:: julia m = OSQP.Model() The problem is specified in the setup phase by running .. code:: julia OSQP.setup!(m; P=P, q=q, A=A, l=l, u=u, settings...) The arguments :code:`q`, :code:`l` and :code:`u` are :code:`Vector{Float64}`. The elements of :code:`l` and :code:`u` can be :math:`\pm \infty` ( using :code:`Inf`). The arguments :code:`P` and :code:`A` are sparse matrices of type :code:`SparseMatrixCSC`. Matrix :code:`P` can be either complete or just the upper triangular part. OSQP will make use of only the upper triangular part. If they are sparse matrices are in another format, the interface will attempt to convert them. There is no need to specify all the arguments. The argument :code:`settings` specifies the solver settings. Settings can also be passed as indipendent keyword arguments such as :code:`max_iter=1000`. The allowed parameters are defined in :ref:`solver_settings`. Solve ----- The problem can be solved by .. code:: julia results = OSQP.solve!(m) The output :code:`results` contains the primal solution :code:`x`, the dual solution :code:`y`, certificate of primal infeasibility :code:`prim_inf_cert`, certificate of dual infeasibility :code:`dual_inf_cert` and the :code:`info` object containing the solver statistics defined in the following table +-----------------------+------------------------------------------------+ | Member | Description | +=======================+================================================+ | :code:`iter` | Number of iterations | +-----------------------+------------------------------------------------+ | :code:`status` | Solver status | +-----------------------+------------------------------------------------+ | :code:`status_val` | Solver status value as in :ref:`status_values` | +-----------------------+------------------------------------------------+ | :code:`status_polish` | Polishing status | +-----------------------+------------------------------------------------+ | :code:`obj_val` | Objective value | +-----------------------+------------------------------------------------+ | :code:`pri_res` | Primal residual | +-----------------------+------------------------------------------------+ | :code:`dua_res` | Dual residual | +-----------------------+------------------------------------------------+ | :code:`setup_time` | Setup time | +-----------------------+------------------------------------------------+ | :code:`solve_time` | Solve time | +-----------------------+------------------------------------------------+ | :code:`update_time` | Update time | +-----------------------+------------------------------------------------+ | :code:`polish_time` | Polish time | +-----------------------+------------------------------------------------+ | :code:`run_time` | Total run time: setup/update + solve + polish | +-----------------------+------------------------------------------------+ | :code:`rho_estimate` | Optimal rho estimate | +-----------------------+------------------------------------------------+ | :code:`rho_updates` | Number of rho updates | +-----------------------+------------------------------------------------+ Note that if multiple solves are executed from single setup, then after the first one :code:`run_time` includes :code:`update_time` + :code:`solve_time` + :code:`polish_time`. Update ------ Part of problem data and settings can be updated without requiring a new problem setup. Update problem vectors ^^^^^^^^^^^^^^^^^^^^^^ Vectors :code:`q`, :code:`l` and :code:`u` can be updated with new values :code:`q_new`, :code:`l_new` and :code:`u_new` by just running .. code:: julia OSQP.update!(m; q=q_new, l=l_new, u=u_new) The user does not have to specify all the keyword arguments. Update problem matrices ^^^^^^^^^^^^^^^^^^^^^^^^ Matrices :code:`A` and :code:`P` can be updated by changing the value of their elements but not their sparsity pattern. The interface is designed to mimic the :ref:`C/C++ counterpart ` with the Julia 1-based indexing. Note that the new values of :code:`P` represent only the upper triangular part while :code:`A` is always represented as a full matrix. You can update the values of all the elements of :code:`P` by executing .. code:: julia OSQP.update!(m, Px=Px_new) If you want to update only some elements, you can pass .. code:: julia OSQP.update!(m, Px=Px_new, Px_idx=Px_new_idx) where :code:`Px_new_idx` is the vector of indices of mapping the elements of :code:`Px_new` to the original vector :code:`Px` representing the data of the sparse matrix :code:`P`. Matrix :code:`A` can be changed in the same way. You can also change both matrices at the same time by running, for example .. code:: julia OSQP.update!(m, Px=Px_new, Px_idx=Px_new_idx, Ax=Ax_new, Ax=Ax_new_idx) .. _julia_update_settings: Update settings ^^^^^^^^^^^^^^^ Settings can be updated by running .. code:: julia OSQP.update_settings!(m; new_settings) where :code:`new_settings` are the new settings specified as keyword arguments that can be updated which are marked with an * in :ref:`solver_settings`. Warm start ---------- OSQP automatically warm starts primal and dual variables from the previous QP solution. If you would like to warm start their values manually, you can use .. code:: julia OSQP.warm_start!(m; x=x0, y=y0) where :code:`x0` and :code:`y0` are the new primal and dual variables.