DDDMitigation#

class qiskit_calculquebec.mitigation.ddd.DDDMitigation(backend, rule: str = 'xyxy', num_trials: int = 3, shots: int = 1024)#

Bases: object

Digital Dynamical Decoupling (DDD) for MonarQ.

Inserts decoupling gate sequences into idle windows to suppress dephasing noise. Results are averaged over num_trials randomized placements.

Parameters:
  • backend (MonarQBackend) – Calcul Québec backend.

  • rule (str) – DDD rule: 'xx', 'yy', or 'xyxy' (default).

  • num_trials (int) – Number of repetitions to average over the stochastic placement. Default: 3.

  • shots (int) – Shots per circuit. Default: 1024.

Examples

Default observable — P(|0…0⟩):

>>> ddd = DDDMitigation(backend, rule='xyxy')
>>> result = ddd.run(circuit)
>>> print(f"Raw: {ddd.run_unmitigated(circuit):.4f}  DDD: {result:.4f}")

Arbitrary Pauli observable:

>>> from mitiq import Observable, PauliString
>>> obs = Observable(PauliString("ZZ", support=[0, 1]))  # <Z0 Z1>
>>> result = ddd.run(circuit, observable=obs)

DDD combined with REM:

>>> rem = ReadoutMitigation(backend, method='m3')
>>> rem.cals_from_system()
>>> pm = generate_preset_pass_manager(optimization_level=0, backend=backend)
>>> t = pm.run(circuit)
>>> physical_qubits = (
...     [t.layout.final_layout[q] for q in t.qubits]
...     if t.layout and t.layout.final_layout
...     else list(range(circuit.num_qubits))
... )
>>> ddd = DDDMitigation(backend, rule='xyxy')
>>> result = ddd.run(circuit, rem=rem, qubits=physical_qubits)

run(circuit[, observable, rem, qubits])

Run the circuit with DDD and return the mitigated value.

run_unmitigated(circuit[, observable, rem, ...])

Run the circuit without DDD for baseline comparison.

run(circuit, observable=None, rem=None, qubits=None) float#

Run the circuit with DDD and return the mitigated value.

Measurements are stripped before passing to mitiq in both modes:

  • observable mode: mitiq adds its own measurements via observable.measure_in().

  • float mode: the executor re-adds measurements via measure_all() if absent.

Parameters:
  • circuit (QuantumCircuit) – Circuit to execute. Measurements are handled internally by mitiq.

  • observable (mitiq.Observable | None) – Pauli observable to measure. None → P(|0…0⟩). Example: Observable(PauliString("ZZ", support=[0, 1]))

  • rem (ReadoutMitigation | None) – Optional REM correction applied inside the executor.

  • qubits (list[int] | None) – Physical qubits; required when rem is provided.

Returns:

Mitigated ⟨observable⟩ (averaged over num_trials), or

P(|0…0⟩) if observable is None.

Return type:

float

run_unmitigated(circuit, observable=None, rem=None, qubits=None) float#

Run the circuit without DDD for baseline comparison.

Parameters:
  • circuit (QuantumCircuit) – Circuit to execute.

  • observable (mitiq.Observable | None) – Pauli observable to measure. None → P(|0…0⟩).

  • rem (ReadoutMitigation | None) – Optional REM correction applied inside the executor.

  • qubits (list[int] | None) – Physical qubits; required when rem is provided.

Returns:

Raw ⟨observable⟩, or P(|0…0⟩) if observable is None.

Return type:

float