Coincidence Measurements

Coincidence measurements are implemented by BellMeasure. There are three possible types of measurements, one for each basis X, Y, and Z.

BellMeasure is supported by QuantumClifford's apply!, but more importantly, it is supported by mctrajectories, which provides for an easy way to run multiple Monte Carlo simulation trajectories. A successful coincidence measurement lets the simulations continue. A failed coincidence ends the simulations with a reported error.

Measurement results depending on basis

As seen in the code example below, the meaning of the measurements is as follows

CallBasis & CheckStates passed
BellMeasure(1,_)X coincidence00&01
BellMeasure(2,_)Y anticoincidence00&11
BellMeasure(3,_)Z coincidence00&10

For reference, here are the states in different representations

BPGates notationStabilizer tableauxKetsin X basisin Y basis
00+XX +ZZ∣00⟩+∣11⟩∣++⟩+∣--⟩∣i₊i₋⟩+∣i₋i₊⟩
01+XX -ZZ∣01⟩+∣10⟩∣++⟩-∣--⟩∣i₊i₊⟩-∣i₋i₋⟩
10-XX +ZZ∣00⟩-∣11⟩∣+-⟩+∣-+⟩∣i₊i₊⟩+∣i₋i₋⟩
11-XX -ZZ∣01⟩-∣10⟩∣+-⟩-∣-+⟩∣i₊i₋⟩-∣i₋i₊⟩
julia> all_states = [BellState([0,0]), BellState([1,0]), BellState([0,1]), BellState([1,1])];
julia> filter_true(meas) = [state for state in all_states if bellmeasure!(copy(state), meas)[2]];
julia> filter_true(BellMeasure(1,1))2-element Vector{BellState}: BellState(Bool[0, 0]) BellState(Bool[0, 1])
julia> filter_true(BellMeasure(2,1))2-element Vector{BellState}: BellState(Bool[0, 0]) BellState(Bool[1, 1])
julia> filter_true(BellMeasure(3,1))2-element Vector{BellState}: BellState(Bool[0, 0]) BellState(Bool[1, 0])