CplexSolver
Class Documentation
Overview
The CplexSolver
class implements a classical QUBO solver using IBM ILOG CPLEX. It extends the BaseClassicalSolver
abstract base class and translates a QUBO (Quadratic Unconstrained Binary Optimization) instance into a CPLEX quadratic optimization model.
Initialization
class CplexSolver(BaseClassicalSolver):
def __init__(
self,
instance: QUBOInstance,
config: Optional[Dict[str, Any]] = None
)
- Parameters:
instance
(QUBOInstance
): QUBO problem containing a square coefficient matrix (torch.Tensor
).config
(Optional[Dict[str, Any]]
): Dictionary supporting:cplex_maxtime
(float
, default600.0
): Maximum solve time in seconds.cplex_log_path
(str
, default"solver.log"
): Path for CPLEX log output.
Configuration Options
Key | Type | Default | Description |
---|---|---|---|
cplex_maxtime |
float |
600.0 |
Time limit for the CPLEX solver, in seconds. |
cplex_log_path |
str |
"solver.log" |
Log file path for CPLEX output streams. |
Configure the solver by passing a dict at instantiation:
config = {
"cplex_maxtime": 300.0,
"cplex_log_path": "cplex_run.log",
}
solver = CplexSolver(qubo_instance, config)
solve()
Method
Solves the QUBO problem via CPLEX and returns a QUBOSolution
containing bitstrings and costs.
Behavior
-
Validate Input Raises
ValueError
ifinstance.coefficients
isNone
. -
Handle Empty Problem If the coefficient matrix has size zero, returns an empty
QUBOSolution
. -
Convert to Sparse Format Calls
qubo_instance_to_sparsepairs(instance)
to obtainList[cplex.SparsePair]
for quadratic terms. -
Build CPLEX Model
- Instantiate
cplex.Cplex()
. - Redirect log, error, warning, and result streams to the file at
cplex_log_path
. - Set
timelimit
parameter tocplex_maxtime
. - Specify minimization objective.
- Add
N
binary variables (types="B" * N
). -
Assign quadratic objective via
objective.set_quadratic(sparsepairs)
. -
Solve Invoke
problem.solve()
. -
Extract Results
- Retrieve variable values (
problem.solution.get_values()
) and objective cost (get_objective_value()
). -
Close the log file.
-
Format Output
- Build a
torch.Tensor
for bitstrings of shape(1, N)
, dtypefloat32
. - Build a
torch.Tensor
for cost of shape(1,)
, dtypefloat32
. - Return
QUBOSolution(bitstrings, costs)
.
Exceptions
ValueError
: Thrown if the QUBO instance has no coefficients.
Example Usage
import torch
from qubosolver import QUBOInstance
from qubosolver.config import SolverConfig, ClassicalConfig
from qubosolver.solver import QuboSolver
# Define a simple 2×2 QUBO matrix (identity)
matrix = torch.eye(2)
instance = QUBOInstance(coefficients=matrix)
# Prepare solver configuration
cplex = ClassicalConfig(
classical_solver_type="cplex",
cplex_maxtime=120.0,
cplex_log_path="cplex_run.log",
)
config = SolverConfig(
classical=cplex,
use_quantum=False
)
# Directly obtain solution via dispatcher
classical_solver = QuboSolver(instance, config)
solution = classical_solver.solve()
print("Bitstrings:", solution.bitstrings)
print("Costs:", solution.costs)