# Pavito

Pavito is a **mixed-integer convex programming** (MICP) solver package written in Julia. MICP problems are convex except for restrictions that some variables take binary or integer values.

Pavito solves MICP problems by constructing sequential polyhedral outer-approximations of the convex feasible set, similar to Bonmin. Pavito accesses state-of-the-art MILP solvers and continuous, derivative-based nonlinear programming (NLP) solvers through the MathOptInterface interface.

For algorithms that use a conic solver instead of an NLP solver, use Pajarito. Pajarito is a robust mixed-integer conic solver that can handle such established problem classes as mixed-integer second-order cone programming (MISOCP) and mixed-integer semidefinite programming (MISDP).

## Installation

Pavito can be installed through the Julia package manager:

```
julia> ]
pkg> add Pavito
```

## Usage

There are several convenient ways to model MICPs in Julia and access Pavito:

JuMP | Convex.jl | MathOptInterface | |
---|---|---|---|

NLP model | X | X | |

Conic model | X | X | X |

JuMP and Convex.jl are algebraic modeling interfaces, while MathOptInterface is a lower-level interface for providing input in raw callback or matrix form.
Convex.jl is perhaps the most user-friendly way to provide input in conic form, since it transparently handles conversion of algebraic expressions.
JuMP supports general nonlinear smooth functions, e.g. by using `@NLconstraint`

. JuMP also supports conic modeling, but requires cones to be explicitly specified, e.g. by using `@constraint(model, [t; x] in SecondOrderCone())`

for second-order cone constraints.

## MIP and continuous solvers

The algorithm implemented by Pavito itself is relatively simple, and most of the hard work is performed by the MILP solver and the NLP solver.
**The performance of Pavito depends on these two types of solvers.**

The mixed-integer solver is specified by using the `mip_solver`

option to `Pavito.Optimizer`

, e.g. `optimizer_with_attributes(Pavito.Optimizer, "mip_solver" => CPLEX.Optimizer)`

.
You must first load the Julia package which provides the mixed-integer solver, e.g. `using CPLEX`

.
The continuous derivative-based nonlinear solver (e.g. Ipopt or KNITRO) is specified by using the `cont_solver`

option, e.g. `optimizer_with_attributes(Pavito.Optimizer, "cont_solver" => Ipopt.Optimizer)`

.

MIP and continuous solver parameters must be specified through their corresponding Julia interfaces.
For example, to turn off the output of Ipopt solver, use `"cont_solver" => optimizer_with_attributes(Ipopt.Optimizer, "print_level" => 0)`

.

## Pavito solver options

The following optimizer attributes can set to a `Pavito.Optimizer`

to modify its behavior:

`log_level::Int`

Verbosity flag: 0 for quiet, higher for basic solve info`timeout::Float64`

Time limit for algorithm (in seconds)`rel_gap::Float64`

Relative optimality gap termination condition`mip_solver_drives::Bool`

Let MILP solver manage convergence ("branch and cut")`mip_solver::MathOptInterface.AbstractMathProgSolver`

MILP solver`cont_solver::MathOptInterface.AbstractMathProgSolver`

Continuous NLP solver

**Pavito is not yet numerically robust and may require tuning of parameters to improve convergence.**
If the default parameters don't work for you, please let us know.
For improved Pavito performance, MILP solver integrality tolerance and feasibility tolerances should typically be tightened, for example to `1e-8`

.

## Bug reports and support

Please report any issues via the Github **issue tracker**. All types of issues are welcome and encouraged; this includes bug reports, documentation typos, feature requests, etc. The **Optimization (Mathematical)** category on Discourse is appropriate for general discussion.