# Utilities¶

## Input/Output with LP/QPLIB File¶

A `BinaryQuadraticModel`

of the Amplify SDK can be saved/loaded into/from a file in LP format or QPLIB format.

### LP File Format¶

The LP file format follows the format described in Gurobi LP Format. However, the following restrictions apply.

Each variable must be a binary variable.

The following sections and subsections must be unspecified or empty.

bounds section

variable type sections except for binary subsection

The following formats and sections are not supported.

multi-objective

indicator constraint

lazy constraints section

SOS section

PWLObj section

general constraint section

scenario section

### QPLIB File Format¶

The QPLIB file format follows the format described in QPLIB.
However, all of the variables must be binary variables, that is, the second character of the problem type must be `B`

.

### Output to Files¶

The `save_lp()`

and the `save_qplib()`

output a logical model to an LP file and a QPLIB file, respectively.
These functions take a `BinaryQuadraticModel`

as the first argument and a file path (string) as the second argument.

```
from amplify import BinarySymbolGenerator, BinaryQuadraticModel, save_lp
from amplify.constraint import one_hot
gen = BinarySymbolGenerator()
q = gen.array(4) # generate variable array of length 4
f = 2 * q[0] * q[1] * q[2] + q[0] * q[1] + q[0] + q[1] + q[2] - 1
c1 = one_hot(q[:3]) # q_0 + q_1 + q_2 == 1
c2 = one_hot(q[1:]) # q_1 + q_2 + q_3 == 1
model = BinaryQuadraticModel(f, c1 + c2)
save_lp(model, "model.lp")
```

In this case, the following will be output to the file `model.lp`

.

```
Minimize
x_0 + x_1 + x_2 + 2 x_3 + [ 6 x_0 * x_1 + 4 x_0 * x_2 - 4 x_0 * x_3 + 4 x_1 *
x_2 - 4 x_1 * x_3 - 4 x_2 * x_3 ] / 2 - 1
Subject To
x_0 + x_1 + x_2 = 1
x_1 + x_2 + x_4 = 1
Binaries
x_0 x_1 x_2 x_3 x_4
End
```

Since the polynomials written in the LP file or QPLIB file must be at most quadratic, the `save_lp()`

and `save_qplib()`

saves the logical expressions of the logical model after the quadratization is made. Therefore, the input variables may be reindexed, and the mapping information can be obtained by `logical_mapping`

.
If the constraint condition is naturally expressed in a quadratic or lower expression, that expression is written out, otherwise, the expression “penalty function reduced to the second degree \(= 0\)” is written out.

### Input from Files¶

The `load_lp()`

and the `load_qplib()`

converts an LP file and QPLIB file to a logical model, respectively.
This function takes a file path (string) as the first argument and returns a tuple of a logical model and a dictionary with variable names as keys and variable indices as values.

For example, the `model.lp`

created above in the example of `save_lp()`

can be read as follows:

```
from amplify import load_lp
model, variables = load_lp("model.lp")
```

```
>>> model.input_poly
3 q_0 q_1 + 2 q_0 q_2 - 2 q_0 q_3 + 2 q_1 q_2 - 2 q_1 q_3 - 2 q_2 q_3 + q_0 + q_1 + q_2 + 2 q_3 - 1
>>> variables
{'x_4': 4, 'x_3': 3, 'x_2': 2, 'x_1': 1, 'x_0': 0}
```

When writing out constraints, the `load_lp()`

and the `load_qplib()`

calls the `equal_to()`

or `less_equal()`

etc. Please note that `penalty()`

is not called in any cases. A method to formulate inequalities and a method to perform quadratization can be specified by giving an instance of `InequalityFormulation`

and an instance of `QuadratizationMethod`

to the keyword arguments `inequality_formulation_method`

and `quadratization_method`

, respectively. For detailed usage of these methods, please refer to Inequality Formulation Methods and Specify a Reduction Method.

Note

Please note that saving a `BinaryQuadraticModel`

into an LP file or QPLIB file and loading the same file may not completely reproduce the original logical model. This is because the information on the functions used to construct the constraints and the constraint weights cannot be saved in the LP file or QPLIB file.

Note

The problem type of a QPLIB file generated by the `save_qplib()`

function will not have `C`

or `D`

as its first or third character, because the `BinaryQuadraticModel`

cannot have information on the convexity of the objective function and constraint conditions. Similarly, the initial values of the variables, dual variables, Lagrange multipliers, as well as variable names, will not be saved.