quantrs2_sim/
optimized_simulator.rs1use quantrs2_circuit::builder::{Circuit, Simulator};
7use quantrs2_core::{error::QuantRS2Result, register::Register};
8
9#[derive(Debug, Clone)]
12pub struct OptimizedSimulator {
13 _use_simd: bool,
15 memory_efficient: bool,
17 memory_efficient_threshold: usize,
19}
20
21impl OptimizedSimulator {
22 pub fn new() -> Self {
24 Self {
25 _use_simd: cfg!(feature = "simd"),
26 memory_efficient: cfg!(feature = "memory_efficient"),
27 memory_efficient_threshold: 25, }
29 }
30
31 pub fn with_options(
33 use_simd: bool,
34 memory_efficient: bool,
35 memory_efficient_threshold: usize,
36 ) -> Self {
37 Self {
38 _use_simd: use_simd,
39 memory_efficient,
40 memory_efficient_threshold,
41 }
42 }
43
44 pub fn high_performance() -> Self {
46 Self {
47 _use_simd: true,
48 memory_efficient: true,
49 memory_efficient_threshold: 28, }
51 }
52
53 pub fn memory_efficient() -> Self {
55 Self {
56 _use_simd: true,
57 memory_efficient: true,
58 memory_efficient_threshold: 20, }
60 }
61
62 pub fn is_simd_available() -> bool {
64 use quantrs2_core::platform::PlatformCapabilities;
65 let platform = PlatformCapabilities::detect();
66 platform.cpu.simd.avx2 || platform.cpu.simd.avx512 || platform.cpu.simd.sse4_1
67 }
68}
69
70impl Default for OptimizedSimulator {
71 fn default() -> Self {
72 Self::new()
73 }
74}
75
76impl<const N: usize> Simulator<N> for OptimizedSimulator {
77 fn run(&self, circuit: &Circuit<N>) -> QuantRS2Result<Register<N>> {
78 if N >= 30 && self.memory_efficient {
80 let chunked_simulator =
82 crate::optimized_simulator_chunked::OptimizedSimulatorChunked::new();
83 return chunked_simulator.run(circuit);
84 }
85
86 if N >= self.memory_efficient_threshold && self.memory_efficient {
88 let chunked_simulator =
90 crate::optimized_simulator_chunked::OptimizedSimulatorChunked::new();
91 return chunked_simulator.run(circuit);
92 }
93
94 let standard_simulator = crate::optimized_simulator_simple::OptimizedSimulatorSimple::new();
96 standard_simulator.run(circuit)
97 }
98}