use std::error::Error;
use quantr::{
states::{ProductState, Qubit, SuperPosition},
Circuit, Gate, Measurement, Printer,
};
fn main() -> Result<(), Box<dyn Error>> {
let mut qc: Circuit = Circuit::new(4)?;
qc.add_repeating_gate(Gate::X, &[0, 1, 2])?
.add_gate(Gate::Custom(cccnot, &[0, 1, 2], "X".to_string()), 3)?;
let mut circuit_printer: Printer = Printer::new(&qc);
circuit_printer.print_diagram();
qc.toggle_simulation_progress(); qc.simulate();
if let Ok(Measurement::Observable(bin_count)) = qc.repeat_measurement(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,
}
}