use std::collections::HashMap;
use scirs2_core::ndarray::Array1;
use scirs2_core::Complex64;
use crate::DeviceError;
use super::{CorrectionOperation, LogicalOperator, StabilizerGroup, SyndromePattern};
pub type QECResult<T> = Result<T, DeviceError>;
pub trait SyndromeDetector {
fn detect_syndromes(
&self,
measurements: &HashMap<String, Vec<i32>>,
stabilizers: &[StabilizerGroup],
) -> QECResult<Vec<SyndromePattern>>;
fn validate_syndrome(
&self,
syndrome: &SyndromePattern,
history: &[SyndromePattern],
) -> QECResult<bool>;
}
pub trait ErrorCorrector {
fn correct_errors(
&self,
syndromes: &[SyndromePattern],
code: &dyn QuantumErrorCode,
) -> QECResult<Vec<CorrectionOperation>>;
fn estimate_correction_fidelity(
&self,
correction: &CorrectionOperation,
current_state: Option<&Array1<Complex64>>,
) -> QECResult<f64>;
}
pub trait QuantumErrorCode {
fn get_stabilizers(&self) -> Vec<StabilizerGroup>;
fn get_logical_operators(&self) -> Vec<LogicalOperator>;
fn distance(&self) -> usize;
fn num_data_qubits(&self) -> usize;
fn num_ancilla_qubits(&self) -> usize;
fn logical_qubit_count(&self) -> usize;
fn encode_logical_state(
&self,
logical_state: &Array1<Complex64>,
) -> QECResult<Array1<Complex64>>;
}