Optimized Pulse
Optimized Pulse Shaper
Section titled “Optimized Pulse Shaper”OptimizedPulseShaper
uses bayesian optimization to find pulse parameters (amplitude and detuning) in order to solve a QUBO problem using quantum simulation.
It outputs both the optimized pulse and a solution object containing bitstrings, counts, probabilities, and associated costs.
Features:
Section titled “Features:”- Computes normalized weights from the QUBO diagonal to support later application of the Detuning Map Modulator (DMM).
- Uses Bayesian optimization to tune six parameters: three for the Rabi amplitude (), and three for the global detuning ().
- Executes quantum simulations at each iteration to evaluate candidate pulse parameters and their performance on the QUBO.
- Returns the final optimized pulse and best QUBO solution, with full metadata (counts, probabilities, and costs).
Initialization Parameters:
Section titled “Initialization Parameters:”Field | Type | Description |
---|---|---|
instance |
QUBOInstance |
Qubo instance. |
config |
SolverConfig |
Configuration for solving. |
Pulse Parameterization
Section titled “Pulse Parameterization”The optimized pulse is built from an InterpolatedWaveform
with:
Amplitude:
Detuning:
These waveforms:
Always start and end in zero amplitude; Use 3 intermediate amplitude values ( to ) and 3 detuning values ( to ), which are the parameters optimized.
The pulse starts with an InterpolatedWaveform
with the points:
Methods Overview
Section titled “Methods Overview”-
generate(self, target: Register, instance: QUBOInstance) -> tuple[Pulse, QUBOSolution]
: Runs the Bayesian optimization loop and returns the optimized pulse and corresponding solution. Handles fallback cases if simulation fails. -
build_pulse(self, params: list) -> Pulse
: Creates a Pulse from a 6-element parameter list: the first 3 for amplitude, the last 3 for detuning. -
_compute_norm_weights(self, QUBO: torch.Tensor) -> list[float]
: Normalizes the QUBO diagonal weights (used in DMM shaping). -
run_simulation(...) -> tuple[...]
: Runs a simulation of the current pulse on a quantum backend and returns bitstring results, probabilities, and QUBO costs. -
compute_qubo_cost(self, bitstring: str, QUBO: torch.Tensor) -> float
: Computes the QUBO cost of a specific bitstring.
Output Structure
Section titled “Output Structure”After the final round of optimization, the following attributes are populated:
pulse
: Final Pulse object with optimized waveform parameters.best_cost
: Minimum cost found during optimization.best_bitstring
: Corresponding bitstring with the lowest cost.bitstrings, counts, probabilities, costs
: Full result distributions as PyTorch tensors.
Example
Section titled “Example”import torch
from qubosolver import QUBOInstancefrom qubosolver.config import SolverConfig, PulseShapingConfigfrom qoolqit._solvers.types import BackendType, DeviceTypefrom qubosolver.solver import QuboSolverfrom qubosolver.qubo_types import PulseType
Q = torch.tensor([[-63.9423, 0.0000], [0.0000, -44.1916]])
instance = QUBOInstance(Q)
default_config = SolverConfig( use_quantum = True, pulse_shaping=PulseShapingConfig(pulse_shaping_method=PulseType.OPTIMIZED), n_calls = 25)solver = QuboSolver(instance, default_config)
solution = solver.solve()print(solution)
QUBOSolution
instance, which comprehends the solution bitstrings, the counts of each bitstring, their probabilities and costs.