Skip to content

PopulationAnnealingQpu

Population Annealing uses a sequential Monte Carlo method to minimize the energy of a population. The population consists of walkers that can explore their neighborhood during the cooling process. Afterwards, walkers are removed and duplicated using bias to lower energy. Eventually, a population collapse occurs where all walkers are in the lowest energy state.

Note

This solver is only available for commercial and academic licenses.


Compatible Backends

The PopulationAnnealingQpu algorithm supports the following backends:

  • DWaveQpu By default, PopulationAnnealingQpu uses the DWaveQpu backend.

Initialization

The following section outlines the default configurations of PopulationAnnealingQpu. You can also specify other compatible backends for the algorithm. When backend=None is specified, the default backend will be initialized automatically. In this case, if the backend requires a token, it will be taken from the environment variables.

Default Configuration
from luna_quantum.algorithms import PopulationAnnealingQpu
from luna_quantum.solve.parameters.algorithms.base_params import (
    Decomposer,
    QuantumAnnealingParams
)

algorithm = PopulationAnnealingQpu(
    backend=None,
    num_reads=100,
    num_retries=0,
    max_iter=20,
    max_time=2,
    fixed_temp_sampler_num_sweeps=10000,
    fixed_temp_sampler_num_reads=None,
    decomposer=Decomposer(
        size=10,
        min_gain=None,
        rolling=True,
        rolling_history=1.0,
        silent_rewind=True,
        traversal='energy'
    ),
    quantum_annealing_params=QuantumAnnealingParams(
        anneal_offsets=None,
        anneal_schedule=None,
        annealing_time=None,
        auto_scale=None,
        fast_anneal=False,
        flux_biases=None,
        flux_drift_compensation=True,
        h_gain_schedule=None,
        initial_state=None,
        max_answers=None,
        num_reads=1,
        programming_thermalization=None,
        readout_thermalization=None,
        reduce_intersample_correlation=False,
        reinitialize_state=None
    )
)

Parameter Details

For a complete overview of available parameters and their usage, see the PopulationAnnealingQpu API Reference.


Usage

from luna_quantum import LunaSolve

LunaSolve.authenticate("<YOUR_LUNA_API_KEY>")

# Define your model and algorithm
model = ...
algorithm = ...

solve_job = algorithm.run(model, name="my-solve-job")

API Reference

Bases: LunaAlgorithm[DWaveQpu]

Parameters for the Population Annealing QPU algorithm.

Population Annealing uses a sequential Monte Carlo method to minimize the energy of a population. The population consists of walkers that can explore their neighborhood during the cooling process. Afterwards, walkers are removed and duplicated using bias to lower energy. Eventually, a population collapse occurs where all walkers are in the lowest energy state.

Attributes:

Name Type Description
num_reads int

Number of annealing cycles to perform on the D-Wave QPU. Default is 100.

num_retries int

Number of attempts to retry embedding the problem onto the quantum hardware. Default is 0.

max_iter int

Maximum number of iterations. Controls how many rounds of annealing and population adjustments are performed. Default is 20.

max_time int

Maximum time in seconds that the algorithm is allowed to run. Serves as a stopping criterion alongside max_iter. Default is 2.

fixed_temp_sampler_num_sweeps int

Number of Monte Carlo sweeps to perform, where one sweep attempts to update all variables once. More sweeps produce better equilibrated samples but increase computation time. Default is 10,000, which is suitable for thorough exploration of moderate-sized problems.

fixed_temp_sampler_num_reads int | None

Number of independent sampling runs to perform. Each run produces one sample from the equilibrium distribution. Multiple reads provide better statistical coverage of the solution space. Default is None, which typically defaults to 1 or matches the number of initial states provided.

decomposer Decomposer

Decomposer: Breaks down problems into subproblems of manageable size Default is a Decomposer instance with default settings.

quantum_annealing_params QuantumAnnealingParams

Parameters that control the quantum annealing process, including annealing schedule, temperature settings, and other quantum-specific parameters. These settings determine how the system transitions from quantum superposition to classical states during the optimization process.

backend class-attribute instance-attribute

backend: BACKEND_TYPE | None = Field(default=None, exclude=True, repr=False)

decomposer class-attribute instance-attribute

decomposer: Decomposer = Field(default_factory=Decomposer)

fixed_temp_sampler_num_reads class-attribute instance-attribute

fixed_temp_sampler_num_reads: int | None = None

fixed_temp_sampler_num_sweeps class-attribute instance-attribute

fixed_temp_sampler_num_sweeps: int = 10000

max_iter class-attribute instance-attribute

max_iter: int = 20

max_time class-attribute instance-attribute

max_time: int = 2

model_config class-attribute instance-attribute

model_config = ConfigDict(
    arbitrary_types_allowed=True, extra="allow", validate_assignment=True
)

num_reads class-attribute instance-attribute

num_reads: int = 100

num_retries class-attribute instance-attribute

num_retries: int = 0

quantum_annealing_params class-attribute instance-attribute

quantum_annealing_params: QuantumAnnealingParams = Field(
    default_factory=QuantumAnnealingParams
)

get_compatible_backends classmethod

get_compatible_backends() -> tuple[type[DWaveQpu], ...]

Check at runtime if the used backend is compatible with the solver.

Returns:

Type Description
tuple[type[IBackend], ...]

True if the backend is compatible with the solver, False otherwise.

get_default_backend classmethod

get_default_backend() -> DWaveQpu

Return the default backend implementation.

This property must be implemented by subclasses to provide the default backend instance to use when no specific backend is specified.

Returns:

Type Description
IBackend

An instance of a class implementing the IBackend interface that serves as the default backend.

run

run(
    model: Model | str,
    name: str | None = None,
    backend: BACKEND_TYPE | None = None,
    client: LunaSolve | str | None = None,
    *args: Any,
    **kwargs: Any,
) -> SolveJob

Run the configured solver.

Parameters:

Name Type Description Default
model Model or str

The model to be optimized or solved. It could be an Model instance or a string identifier representing the model id.

required
name str | None

If provided, the name of the job. Defaults to None.

None
backend BACKEND_TYPE | None

Backend to use for the solver. If not provided, the default backend is used.

None
client LunaSolve or str

The client interface used to interact with the backend services. If not provided, a default client will be used.

None
*args Any

Additional arguments that will be passed to the solver or client.

()
**kwargs Any

Additional keyword parameters for configuration or customization.

{}

Returns:

Type Description
SolveJob

The job object containing the information about the solve process.

Bases: BaseModel

Configuration for breaking down larger problems into subproblems for DWave QPUs.

Attributes:

Name Type Description
size int, default=10

Nominal number of variables in each subproblem. The actual subproblem can be smaller depending on other parameters (e.g., min_gain).

min_gain Optional[float], default=None

Minimum required energy reduction threshold for including a variable in the subproblem. A variable is included only if flipping its value reduces the BQM energy by at least this amount. If None, no minimum gain is required.

rolling bool, default=True

Controls variable selection strategy for successive calls on the same problem:

  • True: Produces subproblems on different variables by rolling down the list of all variables sorted by decreasing impact
  • False: Always selects variables with the highest impact
rolling_history float, default=1.0

Fraction of the problem size (range 0.0 to 1.0) that participates in the rolling selection. Once this fraction of variables has been processed, subproblem unrolling is reset. Min: 0.0, Max: 1.0

silent_rewind bool, default=True

Controls behavior when resetting/rewinding the subproblem generator:

  • True: Silently rewind when the reset condition is met
  • False: Raises EndOfStream exception when rewinding
traversal Literal["energy", "bfs", "pfs"], default="energy"

Algorithm used to select a subproblem of size variables:

  • "energy": Selects the next size variables ordered by descending energy impact
  • "bfs": Uses breadth-first traversal seeded by the next variable in the energy impact list
  • "pfs": Uses priority-first traversal seeded by variables from the energy impact list, proceeding with the variable on the search boundary having the highest energy impact

min_gain class-attribute instance-attribute

min_gain: float | None = None

rolling class-attribute instance-attribute

rolling: bool = True

rolling_history class-attribute instance-attribute

rolling_history: float = Field(default=1.0, ge=0.0, le=1.0)

silent_rewind class-attribute instance-attribute

silent_rewind: bool = True

size class-attribute instance-attribute

size: int = 10

traversal class-attribute instance-attribute

traversal: Literal['energy', 'bfs', 'pfs'] = 'energy'

Bases: BaseModel

Parameters for quantum annealing sampling on physical quantum processors (QPUs).

These parameters control the quantum annealing process on hardware devices like D-Wave quantum annealers, specifying how the annealing is performed, how many samples to collect, and various hardware-specific settings that affect solution quality and runtime.

Attributes:

Name Type Description
anneal_offsets list[float] | None

Per-qubit time offsets for the annealing path in normalized annealing time units. List of floats with length equal to the number of qubits. Default is None.

anneal_schedule list[tuple[float, float]] | None

Custom schedule for the annealing process as a list of (time, s) pairs. Time is in normalized units [0, 1] and s is the annealing parameter [0, 1]. Default is None.

annealing_time float | None

Duration of the annealing process in microseconds. Must be within the range supported by the QPU hardware. Default is None.

auto_scale bool | None

Whether to automatically normalize the problem energy range to use the full range of h and J values supported by the hardware. Default is None.

fast_anneal bool

Use accelerated annealing protocol for shorter annealing times. Default is False.

flux_biases list[float] | None

Custom flux bias offsets for each qubit in units of Ξ¦β‚€ (flux quantum). List length must equal the number of qubits. Default is None.

flux_drift_compensation bool

Whether to compensate for drift in qubit flux over time using real-time calibration data. Default is True.

h_gain_schedule list[tuple[float, float]] | None

Schedule for h-gain during annealing as a list of (time, gain) pairs. Time is in normalized units [0, 1]. Default is None.

initial_state list[int] | None

Starting state for the annealing process. List of {-1, +1} values with length equal to the number of qubits. Default is None.

max_answers int | None

Maximum number of unique answer states to return. Must be ≀ num_reads. Default is None.

num_reads int

Number of annealing cycles to perform. Must be positive integer. Default is 1.

programming_thermalization float | None

Wait time after programming the QPU in microseconds to allow the system to thermalize. Default is None.

readout_thermalization float | None

Wait time after each anneal before reading results in microseconds. Default is None.

reduce_intersample_correlation bool

Whether to add delay between samples to reduce correlation between consecutive measurements. Default is False.

reinitialize_state bool | None

Whether to reset to a new initial state between reads to reduce correlation. Default is None.

anneal_offsets class-attribute instance-attribute

anneal_offsets: list[float] | None = None

anneal_schedule class-attribute instance-attribute

anneal_schedule: list[tuple[float, float]] | None = None

annealing_time class-attribute instance-attribute

annealing_time: float | None = Field(default=None, gt=0)

auto_scale class-attribute instance-attribute

auto_scale: bool | None = None

fast_anneal class-attribute instance-attribute

fast_anneal: bool = False

flux_biases class-attribute instance-attribute

flux_biases: list[float] | None = None

flux_drift_compensation class-attribute instance-attribute

flux_drift_compensation: bool = True

h_gain_schedule class-attribute instance-attribute

h_gain_schedule: list[tuple[float, float]] | None = None

initial_state class-attribute instance-attribute

initial_state: list[int] | None = None

max_answers class-attribute instance-attribute

max_answers: int | None = Field(default=None, ge=1)

num_reads class-attribute instance-attribute

num_reads: int = Field(default=1, ge=1)

programming_thermalization class-attribute instance-attribute

programming_thermalization: float | None = Field(default=None, gt=0)

readout_thermalization class-attribute instance-attribute

readout_thermalization: float | None = Field(default=None, gt=0)

reduce_intersample_correlation class-attribute instance-attribute

reduce_intersample_correlation: bool = False

reinitialize_state class-attribute instance-attribute

reinitialize_state: bool | None = None