quantrs2_core/circuit_synthesis/
grovertemplate_traits.rs1use super::functions::AlgorithmTemplate;
12use super::types::{
13 AlgorithmSpecification, GateMetadata, GroverTemplate, QAOATemplate, QuantumAlgorithmType,
14 ResourceEstimates, SynthesizedCircuit, SynthesizedGate, TemplateInfo,
15};
16use crate::error::{QuantRS2Error, QuantRS2Result};
17use crate::QubitId;
18use std::collections::HashMap;
19use std::time::Duration;
20
21impl AlgorithmTemplate for GroverTemplate {
22 fn synthesize(&self, spec: &AlgorithmSpecification) -> QuantRS2Result<SynthesizedCircuit> {
23 let num_qubits = spec.parameters.num_qubits;
24 let mut gates = Vec::new();
25 for i in 0..num_qubits {
26 gates.push(SynthesizedGate {
27 name: "H".to_string(),
28 qubits: vec![QubitId::new(i as u32)],
29 parameters: vec![],
30 matrix: None,
31 metadata: GateMetadata {
32 layer: 0,
33 purpose: "Initial superposition".to_string(),
34 hints: vec!["single_qubit".to_string()],
35 hardware_preferences: vec!["any".to_string()],
36 },
37 });
38 }
39 QAOATemplate::new().create_circuit_from_gates(
40 gates,
41 num_qubits,
42 QuantumAlgorithmType::Grover,
43 )
44 }
45 fn estimate_resources(
46 &self,
47 spec: &AlgorithmSpecification,
48 ) -> QuantRS2Result<ResourceEstimates> {
49 let num_qubits = spec.parameters.num_qubits;
50 let num_items = 2_usize.pow(num_qubits as u32);
51 let iterations = (std::f64::consts::PI / 4.0 * (num_items as f64).sqrt()) as usize;
52 Ok(ResourceEstimates {
53 gate_count: num_qubits + iterations * (num_qubits + 1),
54 circuit_depth: 1 + iterations * 2,
55 qubit_count: num_qubits,
56 gate_breakdown: HashMap::new(),
57 estimated_execution_time: Duration::from_micros((iterations * num_qubits * 100) as u64),
58 memory_requirements: 1 << num_qubits,
59 parallelization_factor: 0.3,
60 })
61 }
62 fn get_template_info(&self) -> TemplateInfo {
63 TemplateInfo {
64 name: "Grover".to_string(),
65 supported_parameters: vec!["num_qubits".to_string(), "oracle".to_string()],
66 required_parameters: vec!["num_qubits".to_string()],
67 complexity_scaling: "O(√N)".to_string(),
68 hardware_compatibility: vec!["all".to_string()],
69 }
70 }
71 fn validate_specification(&self, spec: &AlgorithmSpecification) -> QuantRS2Result<()> {
72 if spec.parameters.num_qubits == 0 {
73 return Err(QuantRS2Error::InvalidParameter(
74 "num_qubits must be > 0".to_string(),
75 ));
76 }
77 Ok(())
78 }
79}