Skip to main content

quantrs2_core/circuit_synthesis/
grovertemplate_traits.rs

1//! # GroverTemplate - Trait Implementations
2//!
3//! This module contains trait implementations for `GroverTemplate`.
4//!
5//! ## Implemented Traits
6//!
7//! - `AlgorithmTemplate`
8//!
9//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
10
11use 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}