use std::path::PathBuf;
use crate::factored::{PendingFactoredState, PendingOperation};
fn circuit_dir(name: &str) -> PathBuf {
PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("testdata/circuits")
.join(name)
}
pub fn soft_benchmark_circuits() -> PathBuf {
circuit_dir("soft")
}
pub fn ccz_nontels_circuits() -> PathBuf {
circuit_dir("ccz")
}
pub fn msc_d3_circuit() -> PathBuf {
soft_benchmark_circuits().join("msc_d3_inject_cultivate_p1e-3.stim")
}
pub fn require_pending_record_conditions_are_causal(state: &PendingFactoredState, context: &str) {
let producers: Vec<(i32, usize)> = state
.pending_operations
.iter()
.enumerate()
.filter_map(|(index, operation)| {
operation
.record_condition()
.map(|condition| (condition, index))
})
.collect();
for (use_index, operation) in state.pending_operations.iter().enumerate() {
let expression = match operation {
PendingOperation::ClassicalRecord(record) => &record.outcome,
PendingOperation::PauliRotation(rotation) => &rotation.pauli.sign,
PendingOperation::PauliMeasurement(measurement) => &measurement.pauli.sign,
};
for condition in &expression.conditions {
for &(producer, producer_index) in &producers {
assert!(
producer != *condition || producer_index < use_index,
"{context} uses measurement condition {condition} before it is assigned"
);
}
}
}
}