Skip to main content

Models

Models classes can be found using:

from strangeworks_optimization_models.problem_models import *
ModelProviders
Quadratic Unconstrained Binary Optimization (QUBO)D-Wave, Gurobi, Quantagonia, NEC, JiJ, Hitachi, Fujitsu, Toshiba
Mathematical Programming System (MPS)Gurobi, Quantagonia
Constrained Quadratic Model (CQM)D-Wave, JiJ
Discrete Quadratic Model (DQM)D-Wave
Polynomial Unconstrained Binary Optimization (PUBO)Toshiba
Quadratic Programming ProblemsToshiba
Matrix MarketToshiba

Quadratic Unconstrained Binary Optimization

Quadratic Unconstrained Binary Optimization (QUBO) is a mathematical problem that is used to model a wide range of combinatorial optimization problems. It is a type of optimization problem that is used to find the minimum value of a quadratic function of binary variables. The QUBO problem can be represented as:

minimize: f(x) = x^T * Q * x
subject to: x_i ∈ {0, 1}

Where x is a vector of binary variables, Q is a symmetric matrix, and x^T is the transpose of x. The QUBO problem can be used to model a wide range of combinatorial optimization problems such as the Traveling Salesman Problem, the Maximum Cut Problem, and the Graph Coloring Problem.

To create a simple qubo model, you can use the following code:

from dimod import BinaryQuadraticModel

linear = {1: -2, 2: -2, 3: -3, 4: -3, 5: -2}
quadratic = {(1, 2): 2, (1, 3): 2, (2, 4): 2, (3, 4): 2, (3, 5): 2, (4, 5): 2}
model = BinaryQuadraticModel(linear, quadratic, "BINARY")

Mathematical Programming System

Mathematical Programming System (MPS) is a file format that is used to represent linear and mixed-integer programming problems. The MPS file format is widely used in the field of mathematical optimization and is supported by a wide range of optimization solvers. The MPS file format is a plain text file format that is used to represent the objective function, the constraints, and the bounds of the decision variables in a mathematical programming problem.

MPS problems can be represented as:

minimize: c^T * x
subject to: Ax = b
l <= x <= u

Where c is a vector of coefficients, x is a vector of decision variables, A is a matrix of coefficients, b is a vector of constants, l is a vector of lower bounds, and u is a vector of upper bounds.

To create an MPS problem, you can load an MPS file using the following code:

from strangeworks_optimization_models.problem_models import MPSFile

model = MPSFile.read_file("path/to/file.mps")

Constrained Quadratic Model

Constrained Quadratic Model (CQM) is used to find the minimum value of a quadratic function of continuous variables subject to linear equality and inequality constraints. The CQM problem can be represented as:

minimize: f(x) = x^T * Q * x + c^T * x
subject to: Ax = b
Gx <= h

Where x is a vector of continuous variables, Q is a symmetric matrix, c is a vector of coefficients, A is a matrix of coefficients, b is a vector of constants, G is a matrix of coefficients, and h is a vector of constants.

Here's an example of how to create a CQM for the D-Wave Leap solver using the dimod library:

from dimod import Binary, ConstrainedQuadraticModel

weights = [0.9, 0.7, 0.2, 0.1]
capacity = 1
y = [Binary(f"y_{j}") for j in range(len(weights))]
x = [[Binary(f"x_{i}_{j}") for j in range(len(weights))] for i in range(len(weights))]
model = ConstrainedQuadraticModel()
model.set_objective(sum(y))

for i in range(len(weights)):
model.add_constraint(sum(x[i]) == 1, label=f"item_placing_{i}")

for j in range(len(weights)):
model.add_constraint(
sum(weights[i] * x[i][j] for i in range(len(weights))) - y[j] * capacity <= 0,
label=f"capacity_bin_{j}",
)

JiJ also supports CQM problems but they must be created using the jij library and the options must contain the feed_dict:

from strangeworks_optimization_models.parameter_models import JijLeapHybridCQMParameterModel
import jijmodeling as jm

d = jm.Placeholder("d", ndim=1) # Define variable d
d.len_at(0, latex="N") # Set latex expression of the length of d
x = jm.BinaryVar("x", shape=(d.shape[0],)) # Define binary variable
i = jm.Element("i", belong_to=(0, d.shape[0])) # Define dummy index in summation
model = jm.Problem("simple problem") # Create problem instance
model += jm.sum(i, d[i] * x[i]) # Add objective function
model += jm.Constraint("one hot", jm.sum(i, x[i]) == 1) # Add constraint condition
model # Display the problem

solver = "jij.LeapHybridCQM"
options = JijLeapHybridCQMParameterModel(feed_dict={"d": [1.0, 0.1, -2.0, 1.0]})

Discrete Quadratic Model

Discrete Quadratic Model (DQM) is used to find the minimum value of a quadratic function of discrete variables subject to linear equality and inequality constraints. The DQM problem can be represented as:

minimize: f(x) = x^T * Q * x + c^T * x
subject to: Ax = b
Gx <= h
x_i ∈ {0, 1}

Where x is a vector of binary variables, Q is a symmetric matrix, c is a vector of coefficients, A is a matrix of coefficients, b is a vector of constants, G is a matrix of coefficients, and h is a vector of constants.

Here's an example DQM:

from dimod import DiscreteQuadraticModel
import random

model = DiscreteQuadraticModel()
for i in range(10):
model.add_variable(4)
for i in range(9):
for j in range(i + 1, 10):
model.set_quadratic_case(i, random.randrange(0, 4), j, random.randrange(0, 4), random.random())

Quadratic Programming Problems

QPLIB is a collection of test problems for quadratic programming (QP) and quadratic unconstrained binary optimization (QUBO).

You can download QPLIB files from the QPLIB website.

QPLIB problems can be represented as:

minimize: 0.5 * x^T * Q * x + c^T * x
subject to: Ax = b
l <= x <= u

Where Q is a symmetric matrix, c is a vector of coefficients, x is a vector of decision variables, A is a matrix of coefficients, b is a vector of constants, l is a vector of lower bounds, and u is a vector of upper bounds.

Note: The QPLIB file format is used to store by Quadratic Programming and PUBO problems. Please make sure you are using the correct solver for your problem.

To load a QPLIB file, you can use the following code:

from strangeworks_optimization_models.problem_models import QplibFile

model = QplibFile.read_file("path/to/file.qplib")

Polynomial Unconstrained Binary Optimization

Polynomial Unconstrained Binary Optimization (PUBO) is used to find the minimum value of a polynomial function of binary variables. The PUBO problem can be represented as:

minimize: f(x) = ∑_i ∑_j ∑_k a_{ijk} x_i x_j x_k + ∑_i ∑_j a_{ij} x_i x_j + ∑_i a_i x_i + c
subject to: x_i ∈ {0, 1}

Where x is a vector of binary variables, a is a tensor of coefficients, and c is a constant.

Note: The QPLIB file format is used to store by Quadratic Programming and PUBO problems. Please make sure you are using the correct solver for your problem.

To load a PUBO, you can use the following code to read in a QPLIB file that stores a PUBO:

from strangeworks_optimization_models.problem_models import QplibFile

model = QplibFile.read_file("path/to/file.qplib")

Matrix Market

Matrix Market is a NIST-sponsored repository of test matrices for use in numerical algorithms.

You can download Matrix Market files from the Matrix Market website.

They are written in the following format:

%%MatrixMarket matrix coordinate real general
% comment
M N L
I1 J1 A1
I2 J2 A2
...

Where M is the number of rows, N is the number of columns, L is the number of non-zero elements, I is the row index, J is the column index, and A is the value of the non-zero element.

To load a Matrix Market file, you can use the following code:

from strangeworks_optimization_models.problem_models import MatrixMarket

model = MatrixMarket.read_file("path/to/matrix/market.txt")