1use 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}