SolverConfig – Solver Configuration Reference
The SolverConfig class defines how a QUBO problem should be solved — specifying whether to use a quantum or classical approach, which backend to run on, and additional execution parameters.
This configuration is passed into any solver (e.g., QuboSolver) and guides its behavior.
Note that SolverConfig uses three other configuration objects: EmbeddingConfig, ClassicalConfig and DriveShapingConfig.
Besides ClassicalConfig, the other configurations represents different parts of the solver when using a quantum approach:
Fields for SolverConfig
Bases: Config
A SolverConfig instance defines how a QUBO problem should be solved.
We specify whether to use a quantum or classical approach,
which backend to run on, and additional execution parameters.
| ATTRIBUTE | DESCRIPTION |
|---|---|
config_name |
The name of the current configuration. Defaults to ''.
TYPE:
|
use_quantum |
Whether to solve using a quantum approach (
TYPE:
|
embedding |
Embedding part configuration of the solver.
TYPE:
|
drive_shaping |
Drive-shaping part configuration of the solver.
TYPE:
|
classical |
Classical part configuration of the solver.
TYPE:
|
backend |
backend
for running quantum programs. Note that parameters
such as
TYPE:
|
device |
The quantum device specification. Defaults to
TYPE:
|
do_postprocessing |
Whether we apply post-processing (
TYPE:
|
do_preprocessing |
Whether we apply pre-processing (
TYPE:
|
activate_trivial_solutions |
Whether calculate trivial solutions (
TYPE:
|
decompose |
which decomposition configuration to use when solving large QUBOs. Defaults to None, i.e. no decomposition is applied.
TYPE:
|
from_kwargs(**kwargs)
classmethod
Create an instance based on entries of other configs.
Note that if any of the keywords ("embedding", "drive_shaping", "classical") are present in kwargs, the values are taken directly.
| RETURNS | DESCRIPTION |
|---|---|
SolverConfig
|
An instance from values.
TYPE:
|
Source code in qubosolver/config.py
print_specs()
specs()
Return the specs of the SolverConfig, that is all attributes.
| RETURNS | DESCRIPTION |
|---|---|
dict
|
Dictionary of specs key-values.
TYPE:
|
Source code in qubosolver/config.py
Embedding configuration
When solving with a quantum approach, we need to define an embedding method, that is how we define the geometry (register) of atoms based on the QUBO instance and compatibility with a device.
The embedding configuration part (the embedding field of SolverConfig) is divided into several attributes that concerns the embedding_method chosen (BLaDE or Greedy, for which a prefix enables defning to which method they belong):
Bases: Config
A EmbeddingConfig instance defines the embedding
part of a SolverConfig.
| ATTRIBUTE | DESCRIPTION |
|---|---|
embedding_method |
The type of
embedding method used to place atoms on the register according to the QUBO problem.
Defaults to
TYPE:
|
greedy_layout |
Layout type for the
greedy embedder method. Defaults to
TYPE:
|
greedy_traps |
The number of traps on the register.
Defaults to
TYPE:
|
greedy_spacing |
The minimum distance between atoms.
Defaults to
TYPE:
|
greedy_density |
The estimated density of the QUBO matrix. Defaults to None.
TYPE:
|
blade_steps_per_round |
The number of steps for each layer of dimension for BLaDE. Defaults to 200.
TYPE:
|
blade_starting_positions |
The starting parameters according to the specified dimensions. Defaults to None.
TYPE:
|
blade_dimensions |
A list of dimension degrees
to explore one after the other (default is
TYPE:
|
draw_steps |
Show generated graph at each step of the optimization.
Defaults to
TYPE:
|
animation_save_path |
If provided, path to save animation. Defaults to None.
TYPE:
|
Drive Shaping configuration
Quantum devices can be programmed by specifying a Drive. A program in the Rydberg analog model is defined as a time-dependent drive Hamiltonian that is imposed on the qubits.
The drive shaping configuration part (the drive_shaping field of SolverConfig) is set via the DriveShapingConfig class, and defines how the drive parameters are constructed (in an adiabatic fashion, via bayesian optimization, ...).
Note, for parameters concerning exclusively the optimized drive shaping method (bayesian optimization), an optimized_ prefix is present.
Bases: Config
A DriveShapingConfig instance defines the drive shaping part of a SolverConfig.
| ATTRIBUTE | DESCRIPTION |
|---|---|
drive_shaping_method |
Drive shaping
method used. Defauts to
TYPE:
|
dmm |
Whether to use a detuning map when applying drive shaping or not. This adds WeightedDetuning with a Constant Waveform. Defaults to True, which applies DMM.
TYPE:
|
optimized_re_execute_opt_drive |
Whether to re-run the optimal drive sequence after optimization. Defaults to False.
TYPE:
|
optimized_n_calls |
Number of calls for the optimization process. Defaults to 20. Note the optimizer accepts a minimal value of 12.
TYPE:
|
optimized_initial_omega_parameters |
Default initial omega parameters for the drive. Defaults to Omega = (5, 10, 5).
TYPE:
|
optimized_initial_detuning_parameters |
Default initial detuning parameters for the drive. Defaults to delta = (-10, 0, 10).
TYPE:
|
optimized_custom_qubo_cost |
Apply a different
qubo cost evaluation
than the default QUBO evaluation defined in
TYPE:
|
optimized_custom_objective_fn |
For bayesian optimization, one can change the output of
TYPE:
|
optimized_callback_objective |
Apply a callback
during bayesian optimization. Only accepts one input dictionary
created during optimization
TYPE:
|
Classical solver configuration
For the classical solver, its configuration can be set via the ClassicalConfig class:
Bases: Config
A ClassicalConfig instance defines the classical
part of a SolverConfig.
| ATTRIBUTE | DESCRIPTION |
|---|---|
classical_solver_type |
Classical solver type. Defaults to "simulated_annealing_tabu_search".
TYPE:
|
cplex_maxtime |
CPLEX maximum runtime. Defaults to 600s.
TYPE:
|
cplex_log_path |
CPLEX log path. Default to
TYPE:
|
max_iter |
Maximum number of iterations to perform for simulated annealing or tabu search.
TYPE:
|
max_bitstrings |
Maximal number of bitstrings returned as solutions.
TYPE:
|
sa_initial_temp |
Starting temperature (controls exploration).
TYPE:
|
sa_final_temp |
Minimum temperature threshold for stopping.
TYPE:
|
sa_cooling_rate |
Cooling rate - should be slightly below 1 (e.g., 0.95–0.99).
TYPE:
|
sa_seed |
Random seed for reproducibility.
TYPE:
|
sa_start |
Optioanl initial bitstring of shape (n,).
TYPE:
|
sa_energy_tol |
Energy tolerance for considering two solutions as equivalent.
TYPE:
|
tabu_x0 |
The initial binary solution tensor of shape (n,).
TYPE:
|
tabu_tenure |
Number of iterations a move (bit flip) remains tabu.
TYPE:
|
tabu_max_no_improve |
Maximum number of consecutive iterations without improvement before termination.
TYPE:
|
Note, for parameters concerning exclusively simulated annealing, an sa_ prefix is present.
Similarly for tabu search, the prefix is tabu_.
Pre-Post processing parameters
We can also apply preprocessing of the QUBO instance (to reduce it to another smaller instance) or postprocessing the solution after solving.
| Field | Type | Description |
|---|---|---|
do_postprocessing |
bool |
Whether we apply post-processing (True) or not (False). |
do_preprocessing |
bool |
Whether we apply pre-processing (True) or not (False). |
Example
The SolverConfig is designed in such way that all parameters have a default value which fulfilled the minimum required configuration to execute the necessary steps to solve a QUBO.
All the parameters are optional which allows for running SolverConfig without specifying any parameter:
from qubosolver.config import SolverConfig
from qubosolver.qubo_types import EmbedderType
config = SolverConfig()
print(config.specs())
from qubosolver import QUBOInstance
from qubosolver.config import SolverConfig, EmbeddingConfig
coefficients = [[0, 1, 2], [1, 0, 3], [2, 3, 0]]
instance = QUBOInstance(coefficients=coefficients)
embedding_config = EmbeddingConfig(embedding_method="greedy", greedy_traps=instance.size)
config = SolverConfig(
config_name="my_config",
use_quantum=True,
embedding = embedding_config,
)
Equivalently, one can instantiate a SolverConfig simply using the keyword arguments of the other configs via the SolverConfig.from_kwargs method:
from qubosolver import QUBOInstance
from qubosolver.config import SolverConfig
coefficients = [[0, 1, 2], [1, 0, 3], [2, 3, 0]]
instance = QUBOInstance(coefficients=coefficients)
config = SolverConfig.from_kwargs(
config_name="my_config",
use_quantum=True,
embedding_method="greedy",
greedy_traps=instance.size
)