Skip to content

New Technique: benchmarked noise ZNE #2980

@natestemen

Description

@natestemen

What is bnZNE?

bnZNE (benchmarked noise ZNE) is a recently proposed technique (https://arxiv.org/abs/2603.10224) that avoids the core assumption of standard ZNE that noise can be artificially scaled by a known factor. Instead it directly measures device noise at execution time using benchmark circuits.

It works in three steps:

  1. Generate benchmark circuits from the application circuit $C$. Two approaches:
    • Hardware-agnostic: express each gate in the circuit as a Pauli rotation $R_P(\theta)$, randomly reassign Pauli angles to Clifford values, and add a correction layer (at the end?). The benchmark circuit is classically simulable but must transpile to the same native gate sequence as $C$ (not clear to me how this works).
    • Hardware-tailored: substitute equal-error native gates. On IBM Heron for example: replace $\sqrt{X}$ with $X$, which are implemented by equal-duration pulses. The result is classically simulable and shares $C$'s native gate structure by construction.
  2. Characterize device noise by running the benchmark circuits and comparing measured outputs to their known ideal values.
  3. Perform ZNE extrapolation using the measured noise characterization rather than an assumed noise model.

Why a separate module (at least at first)?

My main concern is API complexity. execute_with_zne is already fairly involved with many moving parts (noise scaling method, extrapolation factory, etc.), and bnZNE would add several tightly coupled new parameters. E.g. a method generate_benchmark_circuit, which has its own configuration space (method choice, gate substitution rules, transpilation constraints). Before we understand the full shape of the interface it seems premature to "fold" it into the existing signature.

The other issue is that benchmark circuit generation is fundamentally backend-specific. Unlike noise scaling (e.g. fold_gates_at_random), which is a structural transformation that works on any circuit, generating valid benchmark circuits requires knowing which native gates are available. Mitiq can't derive that from the circuit alone and needs information about the users backend. So there's no sensible universal default; every backend needs its own generator. A standalone module makes that "bring your own generator" contract more explicit than a flag on execute_with_zne would.

Proposed initial scope

  • mitiq/experimental/bnzne/ with a standalone execute_with_bnzne entry point
  • IBM Heron hardware-tailored benchmark generator
  • Once stable, revisit whether it makes sense to surface this as flag/kwarg within execute_with_zne

References

Paper: https://arxiv.org/abs/2603.10224
Implementation: https://github.com/joeharrisuk/qem-bias-mitigation


cc @livelyke @joeharrisuk — is my description of the technique accurate? Anything important I left out? Any design decisions from your implementation we should know about before scoping this out?

Metadata

Metadata

Assignees

No one assigned

    Labels

    new techniqueFor proposed new techniques

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions