pub(crate) mod engine;
mod results;
pub use results::SimulationResult;
use crate::circuits::Circuit;
use crate::core::OnqError;
use crate::operations::Operation;
use engine::SimulationEngine;
#[derive(Default)] pub struct Simulator {
}
impl Simulator {
pub fn new() -> Self {
Self::default()
}
pub fn run(&self, circuit: &Circuit) -> Result<SimulationResult, OnqError> {
if circuit.is_empty() {
return Ok(SimulationResult::new());
}
let mut engine = SimulationEngine::init(circuit.qdus())?;
let mut result = SimulationResult::new();
for op in circuit.operations() {
match op {
Operation::Stabilize { targets } => {
engine.stabilize(targets, &mut result)?;
}
_ => {
engine.apply_operation(op)?;
}
}
}
Ok(result)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::core::{QduId, StableState};
use crate::simulation::engine::SimulationEngine;
use num_complex::Complex;
use std::collections::HashSet;
#[test]
fn test_geometric_stabilization() {
let mut qdus = HashSet::new();
qdus.insert(QduId(0));
let mut engine = SimulationEngine::init(&qdus).unwrap();
let mut result = SimulationResult::new();
engine.stabilize(&[QduId(0)], &mut result).unwrap();
let outcome = result.get_stable_state(&QduId(0)).unwrap();
assert_eq!(outcome, &StableState::ResolvedQuality(0));
}
#[test]
fn test_superposition_collapse() {
let mut qdus = HashSet::new();
qdus.insert(QduId(0));
let mut engine = SimulationEngine::init(&qdus).unwrap();
if let Some(tensor) = engine.get_state_mut_for_test().network.get_mut(&0) {
tensor.core_state = [Complex::new(0.0, 0.0), Complex::new(1.0, 0.0)];
}
let mut result = SimulationResult::new();
engine.stabilize(&[QduId(0)], &mut result).unwrap();
let outcome = result.get_stable_state(&QduId(0)).unwrap();
assert_eq!(outcome, &StableState::ResolvedQuality(1));
}
}