grover/
grover.rs

1// SPDX-FileCopyrightText: 2024 Evandro Chagas Ribeiro da Rosa <evandro@quantuloop.com>
2//
3// SPDX-License-Identifier: Apache-2.0
4
5use std::f64::consts::FRAC_PI_4;
6
7use ket::prelude::*;
8
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}