quantrs2_sim/quantum_chemistry/
functions.rs1use 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
16pub 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}