Noise Models

Noise Models

Maestro has a built-in noise layer. A maestro.NoiseModel describes which errors act on which qubits, and that one model can be run in several ways: a quick analytical estimate, Monte Carlo trajectories, or an exact mixed-state simulation. This lets you test error mitigation, study how an algorithm degrades under noise, or approximate a specific QPU before spending hardware time.

What a noise model can describe

Family Examples
Pauli noise Depolarising, dephasing, bit-flip, and general Pauli channels per qubit, with separate rates for single- and two-qubit gates
Coherent errors Systematic over- and under-rotations that stay fixed within a realisation
Relaxation T1 amplitude damping, T1/T2 thermal relaxation with excited-state population, phase damping, generalised amplitude damping
Idle noise Relaxation and detuning applied during explicit delay operations
Readout Asymmetric measurement errors per qubit
Correlated noise ZZ crosstalk between qubit pairs, correlated phase flips
Time-correlated noise Non-Markovian dephasing such as AR(1), Ornstein–Uhlenbeck, and 1/f processes
Arbitrary channels User-supplied Kraus operators

Noise can also be placed at a specific point in a circuit, for example a Pauli channel after a given gate or a readout error on one measurement, much like Stim’s noise instructions.

How noise is executed

Mode How it works When to use it
noisy_estimate One noiseless run, with each expectation value damped analytically Quick screening of many circuits
noisy_execute, noisy_estimate_montecarlo Monte Carlo trajectories: errors are sampled gate by gate over many realisations Sampled counts under noise; noise that builds up with depth
coherent_execute, coherent_estimate Trajectories with systematic rotation errors Calibration errors
full_noise_execute, full_noise_estimate Every configured noise layer Device-level emulation

On pure-state methods (statevector, MPS) channels are sampled as trajectories. On the density-matrix and MPO methods they are applied exactly, which is required for non-unital channels such as phase damping or arbitrary Kraus channels. MPO extends exact noisy simulation well beyond what a density matrix can hold. The GPU plugin accelerates both.

import maestro
from maestro.circuits import QuantumCircuit

noise = maestro.NoiseModel()
for q in range(2):
    noise.set_thermal_relaxation(qubit=q, gate_time_s=50e-9, t1_s=100e-6, t2_s=80e-6, excited_population=0.0)
    noise.set_readout_error(qubit=q, p_meas1_prep0=0.01, p_meas0_prep1=0.03)
noise.set_2q_gate_depolarizing(qubit=0, p=0.005)

bell = QuantumCircuit()
bell.h(0)
bell.cx(0, 1)
bell.measure_all()

counts = maestro.full_noise_execute(bell, noise, shots=2000, noise_realizations=200)["counts"]

Device-calibrated noise

A noise model can be built from a real device’s calibration data: T1/T2 times, gate errors, readout errors, and coupling. Simulation then approximates that device. On Qoro’s cloud, noisy-device simulation builds its Maestro noise model from stored calibration data for the target device, with a scaling factor to explore better or worse hardware. The calibration-to-noise mapping has been validated against IBM and IQM hardware using mirror and GHZ circuits.

Where noise is available

  • Python (maestro.NoiseModel) and Divi’s MaestroSimulator(noise_model=...).
  • The native JSON request API, which accepts a portable noise block. A Python NoiseModel can be exported to that format, so a model built locally can travel to a server or cluster unchanged.
  • Qoro’s cloud, through a job’s Maestro configuration.
  • QEC workflows through maestro.sinter, for example running Stim circuits with coherent noise.

📖 Full channel list and parameters: Noise and error correction.