quantrs2-tytan 0.1.3

High-level quantum annealing interface inspired by Tytan for the QuantRS2 framework
Documentation
//! Auto-generated module
//!
//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)

use scirs2_core::random::prelude::*;
use std::collections::HashMap;

use super::types::{
    CacheOptimization, CompressionConfig, CompressionMethod, LoadBalancingStrategy, MemoryConfig,
    NetworkTopology, OptimizationResult, ParallelConfig, QualityAssessment, Tensor, TensorNetwork,
    TensorNetworkConfig, TensorNetworkError, TensorNetworkMetrics, TensorNetworkSampler,
    TensorNetworkType, TopologyType,
};

/// Tensor symmetry trait
pub trait TensorSymmetry: Send + Sync + std::fmt::Debug {
    /// Apply symmetry transformation
    fn apply_symmetry(&self, tensor: &Tensor) -> Result<Tensor, TensorNetworkError>;
    /// Check if tensor respects symmetry
    fn check_symmetry(&self, tensor: &Tensor) -> bool;
    /// Get symmetry quantum numbers
    fn get_quantum_numbers(&self) -> Vec<i32>;
    /// Get symmetry name
    fn get_symmetry_name(&self) -> &str;
}
/// Tensor optimization algorithm trait
pub trait TensorOptimizationAlgorithm: Send + Sync + std::fmt::Debug {
    /// Optimize tensor network
    fn optimize(
        &self,
        network: &mut TensorNetwork,
        target: &Tensor,
    ) -> Result<OptimizationResult, TensorNetworkError>;
    /// Get algorithm name
    fn get_algorithm_name(&self) -> &str;
    /// Get algorithm parameters
    fn get_parameters(&self) -> HashMap<String, f64>;
}
/// Convergence monitor trait
pub trait ConvergenceMonitor: Send + Sync + std::fmt::Debug {
    /// Check convergence
    fn check_convergence(&self, iteration: usize, energy: f64, gradient_norm: f64) -> bool;
    /// Get monitor name
    fn get_monitor_name(&self) -> &str;
}
/// Performance tracker trait
pub trait PerformanceTracker: Send + Sync + std::fmt::Debug {
    /// Track performance metrics
    fn track_performance(&self, iteration: usize, metrics: &TensorNetworkMetrics);
    /// Get tracker name
    fn get_tracker_name(&self) -> &str;
}
/// Compression algorithm trait
pub trait CompressionAlgorithm: Send + Sync + std::fmt::Debug {
    /// Compress tensor
    fn compress(
        &self,
        tensor: &Tensor,
        target_dimension: usize,
    ) -> Result<Tensor, TensorNetworkError>;
    /// Get compression method name
    fn get_method_name(&self) -> &str;
    /// Estimate compression quality
    fn estimate_quality(&self, original: &Tensor, compressed: &Tensor) -> f64;
}
/// Compression quality assessor trait
pub trait CompressionQualityAssessor: Send + Sync + std::fmt::Debug {
    /// Assess compression quality
    fn assess_quality(&self, original: &Tensor, compressed: &Tensor) -> QualityAssessment;
    /// Get assessor name
    fn get_assessor_name(&self) -> &str;
}
/// Create default tensor network configuration
pub const fn create_default_tensor_config() -> TensorNetworkConfig {
    TensorNetworkConfig {
        network_type: TensorNetworkType::MPS { bond_dimension: 64 },
        max_bond_dimension: 128,
        compression_tolerance: 1e-10,
        num_sweeps: 100,
        convergence_tolerance: 1e-8,
        use_gpu: false,
        parallel_config: ParallelConfig {
            num_threads: 4,
            distributed: false,
            chunk_size: 1000,
            load_balancing: LoadBalancingStrategy::Dynamic,
        },
        memory_config: MemoryConfig {
            max_memory_gb: 8.0,
            memory_mapping: false,
            gc_frequency: 100,
            cache_optimization: CacheOptimization::Combined,
        },
    }
}
/// Create MPS-based tensor network sampler
pub fn create_mps_sampler(bond_dimension: usize) -> TensorNetworkSampler {
    let mut config = create_default_tensor_config();
    config.network_type = TensorNetworkType::MPS { bond_dimension };
    config.max_bond_dimension = bond_dimension * 2;
    TensorNetworkSampler::new(config)
}
/// Create PEPS-based tensor network sampler
pub fn create_peps_sampler(
    bond_dimension: usize,
    lattice_shape: (usize, usize),
) -> TensorNetworkSampler {
    let mut config = create_default_tensor_config();
    config.network_type = TensorNetworkType::PEPS {
        bond_dimension,
        lattice_shape,
    };
    config.max_bond_dimension = bond_dimension * 2;
    TensorNetworkSampler::new(config)
}
/// Create MERA-based tensor network sampler
pub fn create_mera_sampler(layers: usize) -> TensorNetworkSampler {
    let mut config = create_default_tensor_config();
    config.network_type = TensorNetworkType::MERA {
        layers,
        branching_factor: 2,
    };
    TensorNetworkSampler::new(config)
}
#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn test_tensor_network_sampler_creation() {
        let sampler = create_mps_sampler(32);
        assert_eq!(sampler.config.max_bond_dimension, 64);
        if let TensorNetworkType::MPS { bond_dimension } = sampler.config.network_type {
            assert_eq!(bond_dimension, 32);
        } else {
            panic!("Expected MPS network type ");
        }
    }
    #[test]
    fn test_peps_sampler_creation() {
        let sampler = create_peps_sampler(16, (4, 4));
        if let TensorNetworkType::PEPS {
            bond_dimension,
            lattice_shape,
        } = sampler.config.network_type
        {
            assert_eq!(bond_dimension, 16);
            assert_eq!(lattice_shape, (4, 4));
        } else {
            panic!("Expected PEPS network type ");
        }
    }
    #[test]
    fn test_mera_sampler_creation() {
        let sampler = create_mera_sampler(3);
        if let TensorNetworkType::MERA {
            layers,
            branching_factor,
        } = sampler.config.network_type
        {
            assert_eq!(layers, 3);
            assert_eq!(branching_factor, 2);
        } else {
            panic!("Expected MERA network type ");
        }
    }
    #[test]
    fn test_tensor_network_topology() {
        let mut config = create_default_tensor_config();
        let topology = NetworkTopology::new(&config.network_type);
        assert_eq!(topology.topology_type, TopologyType::Chain);
    }
    #[test]
    fn test_compression_config() {
        let mut config = CompressionConfig::default();
        assert_eq!(config.target_compression_ratio, 0.5);
        assert_eq!(config.method, CompressionMethod::SVD);
    }
}