Skip to content

Conversation

@PabloAndresCQ
Copy link
Collaborator

@PabloAndresCQ PabloAndresCQ commented Oct 30, 2025

Description

  • Introduces new gatetypes MeasCrosstalkLocalPayload and MeasCrosstalkGlobalPayload to communicate details from runtime necessary to model crosstalk more realistically.
  • Introduces noise channels for local and global crosstalk using the data from these payloads.
  • The parameter p_meas_crosstalk has been replaced by p_meas_crosstalk_global and p_meas_crosstalk_local. The method with_p_meas_crosstalk from the builder now sets both of these parameters to the given value. There are also individual with_* methods for global and local.
  • There is a new parameter p_meas_crosstalk_model for the transition probabilities after crosstalk-induced Z projection on the victim qubits.
  • The specs for global and local crosstalk are defined here: https://github.com/quantinuum-dev/selene-pecos-plugin/issues/66 and https://github.com/quantinuum-dev/selene-pecos-plugin/issues/67.

Discussion

  • With p_meas_crosstalk_model = {"0->0": 1.0, "1->1: 0.0"} and using with_p_meas_crosstalk, the model reproduces the previous implementation of the channel... with one important caveat: PECOS does not itself introduce MeasCrosstalk*Payload instructions which are the ones that trigger the crosstalk channels.
    • A simple workaround for PECOS to be self-sufficient is to have an option explicit_meas_crosstalk (that Selene always sets to True) where, if False, causes PECOS to assume it won't receive MeasCrosstalk*Payload operations and instead needs to call apply_crosstalk_faults_from_payload() when encountering Measure or MeasureLeaked.

…that accumulates the outcomes of user-issued measurements and returns that only at Complete stage. This allows us to do multiple rounds of communication between the simulator and the noise model via NeedsProcessing.
… and 1->1 so that it matches the behaviour of previous simple crosstalk channel
Copy link
Collaborator Author

@PabloAndresCQ PabloAndresCQ left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ready for review. Some comments below to give context to the changes

measured_qubits: Vec<(usize, GateType)>,

/// Stored outcome builder
results_builder: ByteMessageBuilder,
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Keeps track of the outcomes that need to be sent back once continue_processing returns Complete(O). This is so that we can have multiple rounds of NeedsProcessing(I) and accummulate the outcomes until we are ready to return them.

.iter()
.map(|q| (usize::from(*q), gate.gate_type)),
);
}
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Moved this out because it's necessary to keep track of measured_qubits even if Measure and/or MeasureLeaked are contained in noiseless_gates.

}
self.apply_prep_faults(&gate, &mut builder);
self.apply_crosstalk_faults(&gate, self.p_prep_crosstalk, &mut builder);
self.apply_simple_crosstalk_faults(&gate, self.p_prep_crosstalk, &mut builder);
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Prep still uses the old crosstalk channel. In Selene we currently set p_prep_crosstalk = 0.0.

// Build and return the biased measurement results
Ok(results_builder.build())
self.results_builder.add_outcomes(&outcomes);
Ok(ops_builder.build())
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

apply_noise_on_continue_processing now always returns a ByteMessage of quantum_ops and appends the outcomes to the new field self.results_builder. It's continue_processing the one that, if this ByteMessage is empty, flushes the results_builder and sends it via Complete(O).

@PabloAndresCQ PabloAndresCQ marked this pull request as ready for review November 13, 2025 14:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants