Skip to content

asymmetric_loss_channel (tableau) ignores measurement back-action #249

Open

Description

@david-pl

Where: crates/ppvm-tableau/src/noise.rs, GeneralizedTableau::asymmetric_loss_channel

Problem
The total loss probability is computed correctly from the populations,
p_tot = p0·P(0) + p1·P(1), but the state update after sampling is not the one
given by the Kraus operators

K0 = √(1−p0)|0⟩⟨0| + √(1−p1)|1⟩⟨1| + |L⟩⟨L|,   K1 = √p0 |L⟩⟨0|,   K2 = √p1 |L⟩⟨1|

For p0 ≠ p1 the channel acts as a weak Z measurement, but the implementation
doesn't account for this:

  • Lost branch: the qubit is collapsed with an ordinary measure (Born
    probabilities P(0), P(1)) before reset. It should collapse to |0⟩ with
    probability p0·P(0)/p_tot and to |1⟩ with p1·P(1)/p_tot.
  • Survival branch: the state is left unchanged. It should be updated with
    K0 (renormalized), which biases the survivor towards the less lossy state.

For an isolated qubit this is invisible (the lost qubit is reset anyway), but
correlations with other qubits come out wrong.

Example
Bell pair (|00⟩ + |11⟩)/√2, asymmetric loss on qubit 0 with p0 = 0, p1 = 1:

expected current
P(lost) 1/2 1/2 ✅
partner given lost |1⟩ 50/50 ❌
state given survived |00⟩ Bell pair unchanged ❌

Possible fix
Sample one of three branches: lost-from-|0⟩ (p0·P(0)), lost-from-|1⟩ (p1·P(1)),
or survived (1 − p_tot).

  • Lost branches: project onto the corresponding Z outcome (forced-outcome
    measurement), then reset and flag as lost.
  • Survived: apply K0 restricted to the computational subspace,
    a·I + b·Z with a = (√(1−p0)+√(1−p1))/2 and b = (√(1−p0)−√(1−p1))/2, then renormalize.
    This is a non-Clifford (non-unitary) Pauli-sum update, which fits the
    generalized tableau's coefficient vector. It is trivial if the qubit is in a Z eigenstate.

Scope
Only reachable via the Rust/Python API; the bytecode ISA has no asymmetric
loss instruction. Symmetric (loss_channel) and correlated loss are unaffected,
since there the Born-rule collapse coincides with the conditional distribution.
leakage_channel takes p0/p1 as pin probabilities rather than state-dependent
loss rates, so it isn't affected either.

Activity

  1. added theissue type on Oct 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions