Skip to main contentIBM Quantum Documentation
Important

IBM Quantum Platform is moving and this version will be sunset on July 1. To get started on the new platform, read the migration guide.

QDrift

class qiskit.synthesis.QDrift(reps=1, insert_barriers=False, cx_structure='chain', atomic_evolution=None, seed=None, wrap=False, preserve_order=True, *, atomic_evolution_sparse_observable=False)

GitHub

Bases: ProductFormula

The QDrift Trotterization method, which selects each term in the Trotterization randomly, with a probability proportional to its weight. Based on the work of Earl Campbell in Ref. [1].

References

[1]: E. Campbell, “A random compiler for fast Hamiltonian simulation” (2018). arXiv:quant-ph/1811.08017

Parameters

  • reps (int) – The number of times to repeat the Trotterization circuit.
  • insert_barriers (bool) – Whether to insert barriers between the atomic evolutions.
  • cx_structure (str) – How to arrange the CX gates for the Pauli evolutions, can be "chain", where next neighbor connections are used, or "fountain", where all qubits are connected to one. This only takes effect when atomic_evolution is None.
  • atomic_evolution (Callable[[QuantumCircuit, Pauli |SparsePauliOp, float], None] | None) – A function to apply the evolution of a single Pauli, or SparsePauliOp of only commuting terms, to a circuit. The function takes in three arguments: the circuit to append the evolution to, the Pauli operator to evolve, and the evolution time. By default, a single Pauli evolution is decomposed into a chain of CX gates and a single RZ gate.
  • seed (int | None) – An optional seed for reproducibility of the random sampling process.
  • wrap (bool) – Whether to wrap the atomic evolutions into custom gate objects. This only takes effect when atomic_evolution is None.
  • preserve_order (bool) – If False, allows reordering the terms of the operator to potentially yield a shallower evolution circuit. Not relevant when synthesizing operator with a single term.
  • atomic_evolution_sparse_observable (bool) – If a custom atomic_evolution is passed, which does not yet support SparseObservables as input, set this argument to False to automatically apply a conversion to SparsePauliOp. This argument is supported until Qiskit 2.2, at which point all atomic evolutions are required to support SparseObservables as input.

Attributes

settings

Return the settings in a dictionary, which can be used to reconstruct the object.

Returns

A dictionary containing the settings of this product formula.

Raises

NotImplementedError – If a custom atomic evolution is set, which cannot be serialized.


Methods

expand

expand(evolution)

GitHub

Apply the product formula to expand the Hamiltonian in the evolution gate.

Parameters

evolution (PauliEvolutionGate) – The PauliEvolutionGate, whose Hamiltonian we expand.

Returns

A list of Pauli rotations in a sparse format, where each element is (paulistring, qubits, coefficient). For example, the Lie-Trotter expansion of H = XI + ZZ would return [("X", [1], 1), ("ZZ", [0, 1], 1)].

Return type

list[tuple[str, tuple[int], float]]

synthesize

synthesize(evolution)

GitHub

Synthesize a PauliEvolutionGate.

Parameters

evolution (PauliEvolutionGate) – The evolution gate to synthesize.

Returns

A circuit implementing the evolution.

Return type

QuantumCircuit

Was this page helpful?
Report a bug or request content on GitHub.