lift-config 0.2.0

LIFT-CONFIG: .lith configuration language parser and validator
Documentation
use serde::{Serialize, Deserialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LithConfig {
    pub target: TargetConfig,
    pub budget: BudgetConfig,
    pub optimisation: OptimisationConfig,
    pub simulation: SimulationConfig,
    pub quantum: Option<QuantumConfig>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TargetConfig {
    pub backend: String,
    pub device: Option<String>,
    pub precision: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BudgetConfig {
    pub max_flops: Option<u64>,
    pub max_memory_bytes: Option<u64>,
    pub max_time_ms: Option<f64>,
    pub min_fidelity: Option<f64>,
    pub max_circuit_depth: Option<usize>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OptimisationConfig {
    pub level: OptLevel,
    pub passes: Vec<String>,
    pub disabled_passes: Vec<String>,
    pub max_iterations: usize,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum OptLevel {
    O0,
    O1,
    O2,
    O3,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SimulationConfig {
    pub enable_shape_propagation: bool,
    pub enable_flop_counting: bool,
    pub enable_memory_analysis: bool,
    pub enable_noise_simulation: bool,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QuantumConfig {
    pub topology: String,
    pub num_qubits: usize,
    pub error_mitigation: Option<String>,
    pub shots: Option<usize>,
}

impl Default for LithConfig {
    fn default() -> Self {
        Self {
            target: TargetConfig {
                backend: "llvm".into(),
                device: None,
                precision: Some("fp32".into()),
            },
            budget: BudgetConfig {
                max_flops: None,
                max_memory_bytes: None,
                max_time_ms: None,
                min_fidelity: None,
                max_circuit_depth: None,
            },
            optimisation: OptimisationConfig {
                level: OptLevel::O2,
                passes: vec![
                    "canonicalize".into(),
                    "constant-folding".into(),
                    "dce".into(),
                    "tensor-fusion".into(),
                ],
                disabled_passes: Vec::new(),
                max_iterations: 10,
            },
            simulation: SimulationConfig {
                enable_shape_propagation: true,
                enable_flop_counting: true,
                enable_memory_analysis: true,
                enable_noise_simulation: true,
            },
            quantum: None,
        }
    }
}

impl LithConfig {
    pub fn with_quantum(mut self, topology: &str, num_qubits: usize) -> Self {
        self.quantum = Some(QuantumConfig {
            topology: topology.into(),
            num_qubits,
            error_mitigation: None,
            shots: Some(1024),
        });
        self
    }
}