quantrs2_sim/automatic_parallelization/
functions.rs1use quantrs2_circuit::builder::{Circuit, Simulator};
6use quantrs2_core::{
7 error::{QuantRS2Error, QuantRS2Result},
8 gate::GateOp,
9 qubit::QubitId,
10};
11use std::time::{Duration, Instant};
12
13use super::autoparallelengine_type::AutoParallelEngine;
14use super::types::{AutoParallelBenchmarkResults, AutoParallelConfig, CircuitParallelResult};
15
16pub fn benchmark_automatic_parallelization<const N: usize>(
18 circuits: Vec<Circuit<N>>,
19 config: AutoParallelConfig,
20) -> QuantRS2Result<AutoParallelBenchmarkResults> {
21 let engine = AutoParallelEngine::new(config);
22 let mut results = Vec::new();
23 let start_time = Instant::now();
24 for circuit in circuits {
25 let analysis_start = Instant::now();
26 let analysis = engine.analyze_circuit(&circuit)?;
27 let analysis_time = analysis_start.elapsed();
28 results.push(CircuitParallelResult {
29 circuit_size: circuit.num_gates(),
30 num_qubits: circuit.num_qubits(),
31 analysis_time,
32 efficiency: analysis.efficiency,
33 max_parallelism: analysis.max_parallelism,
34 num_tasks: analysis.tasks.len(),
35 });
36 }
37 let total_time = start_time.elapsed();
38 Ok(AutoParallelBenchmarkResults {
39 total_time,
40 average_efficiency: results.iter().map(|r| r.efficiency).sum::<f64>()
41 / results.len() as f64,
42 average_parallelism: results.iter().map(|r| r.max_parallelism).sum::<usize>()
43 / results.len(),
44 circuit_results: results,
45 })
46}