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’sMaestroSimulator(noise_model=...). - The native JSON request API, which accepts a portable noise block. A Python
NoiseModelcan 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.