use quantr::{
states::{ProductState, Qubit, SuperPosition},
Circuit, Gate, Measurement, Printer, QuantrError,
};
fn main() -> Result<(), QuantrError> {
let mut qc: Circuit = Circuit::new(4)?;
qc.add_repeating_gate(Gate::X, &[0, 1, 2])?
.add_gate(Gate::Custom(cccnot, vec![0, 1, 2], "X".to_string()), 3)?;
let mut circuit_printer: Printer = Printer::new(&qc);
circuit_printer.print_diagram();
qc.set_print_progress(true);
let simulated = qc.simulate();
if let Measurement::Observable(bin_count) = simulated.measure_all(50) {
println!("\nStates observed over 50 measurements:");
for (states, count) in bin_count.into_iter() {
println!("|{}> : {}", states, count);
}
}
Ok(())
}
fn cccnot(input_state: ProductState) -> Option<SuperPosition> {
let state: &[Qubit] = input_state.get_qubits();
let state_slice: [Qubit; 4] = [state[0], state[1], state[2], state[3]];
match state_slice {
[Qubit::One, Qubit::One, Qubit::One, Qubit::Zero] => {
Some(ProductState::new(&[Qubit::One; 4]).unwrap().into())
}
[Qubit::One, Qubit::One, Qubit::One, Qubit::One] => Some(
ProductState::new(&[Qubit::One, Qubit::One, Qubit::One, Qubit::Zero])
.unwrap()
.into(),
),
_ => return None,
}
}