quantrs2_core/circuit_synthesis/
qfttemplate_traits.rs1use super::functions::AlgorithmTemplate;
12use super::types::{
13 AlgorithmSpecification, QAOATemplate, QFTTemplate, QuantumAlgorithmType, ResourceEstimates,
14 SynthesizedCircuit, TemplateInfo,
15};
16use crate::error::{QuantRS2Error, QuantRS2Result};
17use crate::QubitId;
18use std::collections::HashMap;
19use std::time::Duration;
20
21impl AlgorithmTemplate for QFTTemplate {
22 fn synthesize(&self, spec: &AlgorithmSpecification) -> QuantRS2Result<SynthesizedCircuit> {
23 QAOATemplate::new().create_circuit_from_gates(
24 vec![],
25 spec.parameters.num_qubits,
26 QuantumAlgorithmType::QFT,
27 )
28 }
29 fn estimate_resources(
30 &self,
31 spec: &AlgorithmSpecification,
32 ) -> QuantRS2Result<ResourceEstimates> {
33 let n = spec.parameters.num_qubits;
34 Ok(ResourceEstimates {
35 gate_count: n * (n + 1) / 2,
36 circuit_depth: n,
37 qubit_count: n,
38 gate_breakdown: HashMap::new(),
39 estimated_execution_time: Duration::from_micros((n * n * 50) as u64),
40 memory_requirements: 1 << n,
41 parallelization_factor: 0.4,
42 })
43 }
44 fn get_template_info(&self) -> TemplateInfo {
45 TemplateInfo {
46 name: "QFT".to_string(),
47 supported_parameters: vec!["num_qubits".to_string()],
48 required_parameters: vec!["num_qubits".to_string()],
49 complexity_scaling: "O(n^2)".to_string(),
50 hardware_compatibility: vec!["all".to_string()],
51 }
52 }
53 fn validate_specification(&self, spec: &AlgorithmSpecification) -> QuantRS2Result<()> {
54 if spec.parameters.num_qubits == 0 {
55 return Err(QuantRS2Error::InvalidParameter(
56 "num_qubits must be > 0".to_string(),
57 ));
58 }
59 Ok(())
60 }
61}