# Matlab¶

## Setup¶

The solver is initialized by creating an OSQP object

```
m = osqp;
```

The problem is specified in the setup phase by running

```
m.setup(P, q, A, l, u, varargin)
```

The arguments `q`

, `l`

and `u`

are arrays. The elements of `l`

and `u`

can be \(\pm \infty\) ( using `Inf`

). The arguments `P`

and `A`

are sparse matrices.

There is no need to specify all the problem data. They can be omitted by writing `[]`

.

The last argument `varargin`

specifies the solver options. You can pass the options in two ways. You can either set the individual parameters as field-value pairs, e.g.,

```
m.setup(P, q, A, l, u, 'eps_abs', 1e-04, 'eps_rel', 1e-04);
```

Alternatively, you can create a structure containing all the settings, change some of the fields and then pass it as the last argument

```
settings = m.default_settings();
settings.eps_abs = 1e-04;
settings.eps_rel = 1e-04;
m.setup(P, q, A, l, u, settings);
```

The allowed settings are defined in Solver settings.

## Solve¶

The problem can be solved by

```
results = m.solve();
```

The `results`

structure contains the primal solution `x`

, the dual solution `y`

, certificate of primal infeasibility `prim_inf_cert`

, certificate of dual infeasibility `dual_inf_cert`

and the `info`

structure containing the solver statistics defined in the following table

Member | Description |
---|---|

`iter` |
Number of iterations |

`status` |
Solver status |

`status_val` |
Solver status value as in Status values |

`status_polish` |
Polishing status |

`obj_val` |
Objective value |

`pri_res` |
Primal residual |

`dua_res` |
Dual residual |

`setup_time` |
Setup time |

`solve_time` |
Solve time |

`polish_time` |
Polish time |

`run_time` |
Total run time: setup + solve + polish |

`rho_estimate` |
Optimal rho estimate |

`rho_updates` |
Number of rho updates |

Note that if multiple solves are executed from single setup, then after the
first one `run_time`

includes only `solve_time`

+ `polish_time`

.

## Update¶

Part of problem data and settings can be updated without requiring a new problem setup.

### Update problem data¶

Vectors `q`

, `l`

and `u`

can be updated with new values `q_new`

, `l_new`

and `u_new`

by just running

```
m.update('q', q_new, 'l', l_new, 'u', u_new);
```

The user does not have to specify all the arguments.

### Update settings¶

Settings can be updated by running

```
m.update_settings(varargin);
```

where `varargin`

argument is described in Setup. The allowed settings that can be updated are marked with an * in 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

```
m.warm_start('x', x0, 'y', y0)
```

where `x0`

and `y0`

are the new primal and dual variables.