Function ctrl

Source
pub fn ctrl<F>(
    process: &mut Process,
    control: &[LogicalQubit],
    f: F,
) -> Result<()>
where F: FnMut(&mut Process) -> Result<()>,
Examples found in repository?
examples/mcx.rs (lines 49-51)
7fn main() -> Result<(), KetError> {
8    set_log_level(4);
9
10    let config = Configuration {
11        num_qubits: 12,
12        qpu: Some(QPU::new(
13            // 0--1--2--3
14            // |  |  |  |
15            // 4--5--6--7
16            // |  |  |  |
17            // 8--9--A--B
18            Some(vec![
19                (0, 4),
20                (0, 1),
21                (1, 2),
22                (1, 5),
23                (2, 3),
24                (2, 6),
25                (3, 7),
26                (4, 8),
27                (4, 5),
28                (5, 9),
29                (5, 6),
30                (6, 10),
31                (6, 7),
32                (7, 11),
33                (8, 9),
34                (9, 10),
35                (10, 11),
36            ]),
37            12,
38            Default::default(),
39            Default::default(),
40        )),
41        ..Default::default()
42    };
43
44    let mut process = Process::new(config);
45
46    let size = 6;
47
48    let qubits: Vec<_> = (0..size).map(|_| process.alloc().unwrap()).collect();
49    ctrl(&mut process, &qubits[1..], |process| {
50        process.gate(QuantumGate::PauliZ, qubits[0])
51    })?;
52
53    let _ = process.sample(&qubits, 1024)?;
54    process.transpile();
55
56    println!("Instructions:");
57    for line in process.instructions() {
58        println!("\t{:?}", line);
59    }
60
61    println!("ISA Instructions:");
62    if let Some(isa) = process.isa_instructions() {
63        for line in isa {
64            println!("\t{:?}", line);
65        }
66    }
67
68    Ok(())
69}
More examples
Hide additional examples
examples/grover.rs (lines 50-52)
9fn main() -> Result<(), KetError> {
10    set_log_level(3);
11
12    let config = Configuration {
13        num_qubits: 12,
14        qpu: Some(QPU::new(
15            // 0--1--2--3
16            // |  |  |  |
17            // 4--5--6--7
18            // |  |  |  |
19            // 8--9--A--B
20            Some(ket::ex_arch::GRID12.to_vec()),
21            12,
22            U2Gates::RzSx,
23            U4Gate::CZ,
24        )),
25        ..Default::default()
26    };
27
28    let mut process = Process::new(config);
29
30    let size = 8;
31
32    let qubits: Vec<_> = (0..size).map(|_| process.alloc().unwrap()).collect();
33
34    for qubit in &qubits {
35        process.gate(QuantumGate::Hadamard, *qubit)?;
36    }
37
38    let steps = ((FRAC_PI_4) * f64::sqrt((1 << size) as f64)) as i64;
39
40    for _ in 0..steps {
41        around(
42            &mut process,
43            |process| {
44                for qubit in &qubits {
45                    process.gate(QuantumGate::PauliX, *qubit)?;
46                }
47                Ok(())
48            },
49            |process| {
50                ctrl(process, &qubits[1..], |process| {
51                    process.gate(QuantumGate::PauliZ, qubits[0])
52                })
53            },
54        )?;
55
56        around(
57            &mut process,
58            |process| {
59                for qubit in &qubits {
60                    process.gate(QuantumGate::Hadamard, *qubit)?;
61                }
62
63                for qubit in &qubits {
64                    process.gate(QuantumGate::PauliX, *qubit)?;
65                }
66                Ok(())
67            },
68            |process| {
69                ctrl(process, &qubits[1..], |process| {
70                    process.gate(QuantumGate::PauliZ, qubits[0])
71                })
72            },
73        )?;
74    }
75
76    let _ = process.sample(&qubits, 1024)?;
77    process.transpile();
78
79    println!("{:#?}", process.metadata());
80
81    Ok(())
82}