custom_gate/
custom_gate.rs1use quantr::{
14 states::{ProductState, Qubit, SuperPosition},
15 Circuit, Gate, Measurement, Printer, QuantrError,
16};
17
18fn main() -> Result<(), QuantrError> {
19 let mut qc: Circuit = Circuit::new(4)?;
20
21 qc.add_repeating_gate(Gate::X, &[0, 1, 2])?
24 .add_gate(Gate::Custom(cccnot, vec![0, 1, 2], "X".to_string()), 3)?;
25
26 let mut circuit_printer: Printer = Printer::new(&qc);
28 circuit_printer.print_diagram();
29
30 qc.set_print_progress(true);
32 let simulated = qc.simulate();
33
34 if let Measurement::Observable(bin_count) = simulated.measure_all(50) {
36 println!("\nStates observed over 50 measurements:");
37 for (states, count) in bin_count.into_iter() {
38 println!("|{}> : {}", states, count);
39 }
40 }
41
42 Ok(())
43}
44
45fn cccnot(input_state: ProductState) -> Option<SuperPosition> {
47 let state: &[Qubit] = input_state.get_qubits();
48 let state_slice: [Qubit; 4] = [state[0], state[1], state[2], state[3]];
49 match state_slice {
52 [Qubit::One, Qubit::One, Qubit::One, Qubit::Zero] => {
53 Some(ProductState::new(&[Qubit::One; 4]).unwrap().into())
54 }
55 [Qubit::One, Qubit::One, Qubit::One, Qubit::One] => Some(
56 ProductState::new(&[Qubit::One, Qubit::One, Qubit::One, Qubit::Zero])
57 .unwrap()
58 .into(),
59 ),
60 _ => return None,
61 }
62}