Skip to main content

quantrs2_sim/quantum_chemistry/
functions.rs

1//! Auto-generated module
2//!
3//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
4
5use crate::circuit_interfaces::{InterfaceCircuit, InterfaceGate, InterfaceGateType};
6use crate::error::{Result, SimulatorError};
7use scirs2_core::ndarray::{Array1, Array2, Array4};
8use scirs2_core::random::prelude::*;
9
10use super::quantumchemistrysimulator_type::QuantumChemistrySimulator;
11use super::types::{
12    ChemistryOptimizer, ElectronicStructureConfig, FermionMapper, FermionMapping, Molecule,
13    VQEOptimizer,
14};
15
16/// Benchmark function for quantum chemistry simulation
17pub fn benchmark_quantum_chemistry() -> Result<()> {
18    println!("Benchmarking Quantum Chemistry Simulation...");
19    let h2_molecule = Molecule {
20        atomic_numbers: vec![1, 1],
21        positions: Array2::from_shape_vec((2, 3), vec![0.0, 0.0, 0.0, 0.0, 0.0, 1.4])?,
22        charge: 0,
23        multiplicity: 1,
24        basis_set: "STO-3G".to_string(),
25    };
26    let config = ElectronicStructureConfig::default();
27    let mut simulator = QuantumChemistrySimulator::new(config)?;
28    simulator.set_molecule(h2_molecule)?;
29    let start_time = std::time::Instant::now();
30    let result = simulator.run_calculation()?;
31    let duration = start_time.elapsed();
32    println!("✅ Quantum Chemistry Results:");
33    println!(
34        "   Ground State Energy: {:.6} Hartree",
35        result.ground_state_energy
36    );
37    println!("   Converged: {}", result.converged);
38    println!("   Iterations: {}", result.iterations);
39    println!("   Hamiltonian Terms: {}", result.stats.hamiltonian_terms);
40    println!(
41        "   Circuit Evaluations: {}",
42        result.stats.circuit_evaluations
43    );
44    println!("   Total Time: {:.2}ms", duration.as_millis());
45    println!("   VQE Time: {:.2}ms", result.stats.vqe_time_ms);
46    Ok(())
47}
48#[cfg(test)]
49mod tests {
50    use super::*;
51    #[test]
52    fn test_quantum_chemistry_simulator_creation() {
53        let config = ElectronicStructureConfig::default();
54        let simulator = QuantumChemistrySimulator::new(config);
55        assert!(simulator.is_ok());
56    }
57    #[test]
58    fn test_h2_molecule_creation() {
59        let h2 = Molecule {
60            atomic_numbers: vec![1, 1],
61            positions: Array2::from_shape_vec((2, 3), vec![0.0, 0.0, 0.0, 0.0, 0.0, 1.4])
62                .expect("Failed to create H2 molecule positions array"),
63            charge: 0,
64            multiplicity: 1,
65            basis_set: "STO-3G".to_string(),
66        };
67        assert_eq!(h2.atomic_numbers, vec![1, 1]);
68        assert_eq!(h2.charge, 0);
69        assert_eq!(h2.multiplicity, 1);
70    }
71    #[test]
72    fn test_molecular_hamiltonian_construction() {
73        let config = ElectronicStructureConfig::default();
74        let mut simulator = QuantumChemistrySimulator::new(config)
75            .expect("Failed to create quantum chemistry simulator");
76        let h2 = Molecule {
77            atomic_numbers: vec![1, 1],
78            positions: Array2::from_shape_vec((2, 3), vec![0.0, 0.0, 0.0, 0.0, 0.0, 1.4])
79                .expect("Failed to create H2 molecule positions array"),
80            charge: 0,
81            multiplicity: 1,
82            basis_set: "STO-3G".to_string(),
83        };
84        simulator.set_molecule(h2).expect("Failed to set molecule");
85        let molecule_clone = simulator.molecule.clone().expect("Molecule should be set");
86        let result = simulator.construct_molecular_hamiltonian(&molecule_clone);
87        assert!(result.is_ok());
88    }
89    #[test]
90    fn test_fermion_mapper_creation() {
91        let mapper = FermionMapper::new(FermionMapping::JordanWigner, 4);
92        assert_eq!(mapper.method, FermionMapping::JordanWigner);
93        assert_eq!(mapper.num_spin_orbitals, 4);
94    }
95    #[test]
96    fn test_vqe_optimizer_initialization() {
97        let mut optimizer = VQEOptimizer::new(ChemistryOptimizer::GradientDescent);
98        optimizer.initialize_parameters(10);
99        assert_eq!(optimizer.parameters.len(), 10);
100        assert_eq!(optimizer.bounds.len(), 10);
101    }
102    #[test]
103    fn test_ansatz_parameter_counting() {
104        let config = ElectronicStructureConfig::default();
105        let simulator = QuantumChemistrySimulator::new(config)
106            .expect("Failed to create quantum chemistry simulator");
107        let mut circuit = InterfaceCircuit::new(4, 0);
108        circuit.add_gate(InterfaceGate::new(InterfaceGateType::RY(0.0), vec![0]));
109        circuit.add_gate(InterfaceGate::new(InterfaceGateType::RZ(0.0), vec![1]));
110        circuit.add_gate(InterfaceGate::new(InterfaceGateType::CNOT, vec![0, 1]));
111        let param_count = simulator.get_ansatz_parameter_count(&circuit);
112        assert_eq!(param_count, 2);
113    }
114}