qft/
qft.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::PI;
6
7use ket::{
8    execution::{Capability, ExecutionProtocol},
9    ir::qubit::LogicalQubit,
10    prelude::*,
11};
12
13fn qft(process: &mut Process, qubits: &[LogicalQubit], do_swap: bool) -> Result<(), KetError> {
14    if qubits.len() == 1 {
15        return process.gate(QuantumGate::Hadamard, qubits[0]);
16    }
17
18    let init = &qubits[..qubits.len() - 1];
19    let last = qubits[qubits.len() - 1];
20    process.gate(QuantumGate::Hadamard, last)?;
21    for (i, c) in init.iter().enumerate() {
22        c1gate(
23            process,
24            QuantumGate::Phase((PI / 2.0_f64.powi(i as i32 + 1)).into()),
25            *c,
26            last,
27        )?;
28    }
29    qft(process, init, false)?;
30
31    if do_swap {
32        for i in 0..qubits.len() / 2 {
33            swap(process, qubits[i], qubits[qubits.len() - i - 1])?;
34        }
35    }
36
37    Ok(())
38}
39
40fn main() -> Result<(), KetError> {
41    let config = ExecutionTarget {
42        num_qubits: 12,
43        qpu: Some(QPU {
44            coupling_graph: Some(ket::ex_arch::GRID12.to_vec()),
45            u2_gates: U2Gates::RzSx,
46            u4_gate: U4Gate::CZ,
47        }),
48        execution_protocol: ExecutionProtocol::ManagedByTarget {
49            sample: Capability::Basic,
50            measure: Capability::Unsupported,
51            exp_value: Capability::Unsupported,
52            dump: Capability::Unsupported,
53        },
54        gradient: None,
55    };
56
57    let mut process = Process::new(config, None);
58
59    let size = 12;
60    let qubits: Vec<_> = (0..size).map(|_| process.alloc().unwrap()).collect();
61
62    qft(&mut process, &qubits, true)?;
63
64    println!("{:#?}", process.metadata());
65
66    Ok(())
67}