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.