pub mod dependency_analysis;
pub mod performance_analysis;
pub mod trait_explorer_core;
pub mod trait_registry;
pub use trait_explorer_core::{
AnalysisCache, CompilationImpact, DependencyAnalysis, EdgeType, ExampleCategory,
ExampleDifficulty, ExplorationEventHandler, ExplorationMetadata, ExplorationMetrics,
ExplorationSummary, ExplorerConfig, GraphExportFormat, MemoryFootprint, OptimizationLevel,
PerformanceAnalysis, RuntimeOverhead, SimilarTrait, TraitAnalyzer, TraitExplorationResult,
TraitExplorer, TraitGraph, TraitGraphEdge, TraitGraphMetadata, TraitGraphNode, TraitNodeType,
UsageExample,
};
pub use trait_explorer_core::{
DependencyAnalyzer, ExampleGenerator, TraitGraphGenerator, TraitPerformanceAnalyzer,
};
pub use trait_registry::{
CompilationImpact as TraitRegistryCompilationImpact,
DependencyAnalysis as TraitRegistryDependencyAnalysis, EdgeType as TraitRegistryEdgeType,
ExampleCategory as TraitRegistryExampleCategory,
ExampleDifficulty as TraitRegistryExampleDifficulty,
GraphExportFormat as TraitRegistryGraphExportFormat,
MemoryFootprint as TraitRegistryMemoryFootprint,
PerformanceAnalysis as TraitRegistryPerformanceAnalysis,
RuntimeOverhead as TraitRegistryRuntimeOverhead,
TraitExplorationResult as TraitRegistryExplorationResult, TraitGraph as TraitRegistryGraph,
TraitGraphEdge as TraitRegistryGraphEdge, TraitGraphMetadata as TraitRegistryGraphMetadata,
TraitGraphNode as TraitRegistryGraphNode, TraitNodeType as TraitRegistryNodeType,
TraitRegistry, UsageExample as TraitRegistryUsageExample,
};
pub use dependency_analysis::{
DependencyAnalysis as EnhancedDependencyAnalysis,
DependencyAnalyzer as EnhancedDependencyAnalyzer, DependencyGraph, ImpactAnalysis,
OptimizationSuggestion, OptimizationType, PerformanceAnalysis as EnhancedPerformanceAnalysis,
Priority, RiskAssessment, RiskAssessmentConfig, RiskFactor, RiskFactorType, RiskLevel,
};
pub use performance_analysis::{
AnalysisMetadata, BenchmarkResult, BenchmarkResults, CachePressureLevel,
ComparisonRecommendation, ComparisonResult, ComparisonSignificance, ComparisonWinner,
CompilationImpact as AdvancedCompilationImpact, FragmentationRisk, ImplementationDifficulty,
MemoryAccessPattern, MemoryFootprint as AdvancedMemoryFootprint, OptimizationCategory,
OptimizationHint, OptimizationPriority, PerformanceAnalysis as AdvancedPerformanceAnalysis,
PerformanceArea, PerformanceComparison, PerformanceConfig, PerformanceImpact,
RecommendationChoice, RuntimeOverhead as AdvancedRuntimeOverhead,
TraitPerformanceAnalyzer as AdvancedTraitPerformanceAnalyzer,
};
use crate::api_data_structures::TraitInfo;
use crate::error::{Result, SklearsError};
use std::collections::HashMap;
pub struct TraitExplorerFactory {
config: IntegratedAnalysisConfig,
core_explorer: TraitExplorer,
trait_registry: TraitRegistry,
dependency_analyzer: EnhancedDependencyAnalyzer,
performance_analyzer: AdvancedTraitPerformanceAnalyzer,
}
impl TraitExplorerFactory {
pub fn new(config: IntegratedAnalysisConfig) -> Self {
Self {
core_explorer: TraitExplorer::new(config.explorer_config.clone())
.expect("Failed to create TraitExplorer"),
trait_registry: TraitRegistry::new(),
dependency_analyzer: EnhancedDependencyAnalyzer::new(),
performance_analyzer: AdvancedTraitPerformanceAnalyzer::new(
config.performance_config.clone(),
),
config,
}
}
pub fn comprehensive() -> Self {
Self::new(IntegratedAnalysisConfig::comprehensive())
}
pub fn performance_focused() -> Self {
Self::new(IntegratedAnalysisConfig::performance_focused())
}
pub fn security_focused() -> Self {
Self::new(IntegratedAnalysisConfig::security_focused())
}
pub fn comprehensive_analysis(
&mut self,
trait_name: &str,
) -> Result<ComprehensiveAnalysisResult> {
let trait_info = self
.trait_registry
.get_trait(trait_name)
.ok_or_else(|| SklearsError::TraitNotFound(trait_name.to_string()))?;
let core_analysis = self.core_explorer.explore_trait(trait_name)?;
let dependency_analysis = if self.config.enable_dependency_analysis {
Some(self.dependency_analyzer.analyze_dependencies(trait_info)?)
} else {
None
};
let performance_analysis = if self.config.enable_performance_analysis {
Some(
self.performance_analyzer
.analyze_trait_performance(trait_info)?,
)
} else {
None
};
let _graph_visualization: Option<()> = None;
let _ml_recommendations: Option<Vec<()>> = None;
let _security_analysis: Option<()> = None;
let _platform_compatibility: Option<()> = None;
Ok(ComprehensiveAnalysisResult {
trait_name: trait_name.to_string(),
core_analysis,
dependencies: dependency_analysis,
performance: performance_analysis,
analysis_metadata: ExplorationAnalysisMetadata {
timestamp: std::time::SystemTime::now(),
config_hash: self.config.config_hash(),
modules_used: self.config.enabled_modules(),
},
})
}
pub fn trait_registry(&self) -> &TraitRegistry {
&self.trait_registry
}
pub fn trait_registry_mut(&mut self) -> &mut TraitRegistry {
&mut self.trait_registry
}
pub fn load_traits_from_crate(&mut self, crate_name: &str) -> Result<usize> {
self.core_explorer.load_from_crate(crate_name)?;
self.trait_registry.load_sklears_traits()?;
Ok(self.trait_registry.trait_count())
}
pub fn batch_analyze(&mut self, trait_names: &[String]) -> Result<BatchAnalysisResult> {
let mut results = HashMap::new();
let mut errors = Vec::new();
for trait_name in trait_names {
match self.comprehensive_analysis(trait_name) {
Ok(analysis) => {
results.insert(trait_name.clone(), analysis);
}
Err(e) => {
errors.push((trait_name.clone(), e));
}
}
}
let summary = self.generate_batch_summary(&results)?;
Ok(BatchAnalysisResult {
successful_analyses: results,
failed_analyses: errors,
summary,
})
}
pub fn compare_traits(&mut self, trait_names: &[String]) -> Result<TraitComparisonResult> {
let mut analyses = Vec::new();
for name in trait_names {
analyses.push(self.comprehensive_analysis(name)?);
}
Ok(TraitComparisonResult {
traits: trait_names.to_vec(),
performance_comparison: self.compare_performance(&analyses)?,
security_comparison: self.compare_security(&analyses)?,
platform_comparison: self.compare_platforms(&analyses)?,
recommendations: self.generate_comparison_recommendations(&analyses)?,
})
}
#[allow(dead_code)]
fn calculate_complexity_score(&self, trait_info: &TraitInfo) -> f64 {
trait_info.methods.len() as f64 * 0.3
+ trait_info.associated_types.len() as f64 * 0.5
+ trait_info.generics.len() as f64 * 0.2
}
fn generate_batch_summary(
&self,
results: &HashMap<String, ComprehensiveAnalysisResult>,
) -> Result<BatchSummary> {
let total_traits = results.len();
let avg_complexity = results
.values()
.map(|r| r.core_analysis.complexity_score)
.sum::<f64>()
/ total_traits as f64;
let high_risk_traits = results
.values()
.filter(|_r| {
false
})
.count();
Ok(BatchSummary {
total_traits_analyzed: total_traits,
average_complexity_score: avg_complexity,
high_risk_security_traits: high_risk_traits,
analysis_duration: std::time::Duration::from_secs(0), })
}
fn compare_performance(
&self,
analyses: &[ComprehensiveAnalysisResult],
) -> Result<PerformanceComparisonSummary> {
let performance_data: Vec<_> = analyses
.iter()
.filter_map(|a| a.performance.as_ref())
.collect();
if performance_data.is_empty() {
return Ok(PerformanceComparisonSummary::default());
}
let avg_compile_time = performance_data
.iter()
.map(|p| p.compilation_impact.estimated_compile_time_ms as f64)
.sum::<f64>()
/ performance_data.len() as f64;
let avg_memory_overhead = performance_data
.iter()
.map(|p| p.memory_footprint.total_overhead as f64)
.sum::<f64>()
/ performance_data.len() as f64;
Ok(PerformanceComparisonSummary {
average_compile_time_ms: avg_compile_time,
average_memory_overhead_bytes: avg_memory_overhead,
performance_leader: analyses[0].trait_name.clone(), performance_summary: "Performance comparison completed".to_string(),
})
}
fn compare_security(
&self,
analyses: &[ComprehensiveAnalysisResult],
) -> Result<SecurityComparisonSummary> {
let _security_data: Vec<_> = analyses
.iter()
.filter_map(|_a| None::<&()>)
.collect();
let high_risk_count = 0;
Ok(SecurityComparisonSummary {
high_risk_traits: high_risk_count,
total_vulnerabilities: 0, security_leader: analyses[0].trait_name.clone(), security_summary: "Security comparison completed".to_string(),
})
}
fn compare_platforms(
&self,
analyses: &[ComprehensiveAnalysisResult],
) -> Result<PlatformComparisonSummary> {
let _platform_data: Vec<_> = analyses
.iter()
.map(|a| &a.trait_name) .collect();
Ok(PlatformComparisonSummary {
cross_platform_compatibility_score: 0.85, problematic_platforms: vec!["wasm32-unknown-unknown".to_string()],
compatibility_leader: analyses[0].trait_name.clone(), platform_summary: "Platform comparison completed".to_string(),
})
}
fn generate_comparison_recommendations(
&self,
_analyses: &[ComprehensiveAnalysisResult],
) -> Result<Vec<String>> {
Ok(vec![
"Consider using traits with lower compilation overhead for performance-critical applications".to_string(),
"Implement security measures for traits handling sensitive data".to_string(),
"Test WebAssembly compatibility if targeting web deployment".to_string(),
])
}
}
#[derive(Debug, Clone)]
pub struct IntegratedAnalysisConfig {
pub explorer_config: ExplorerConfig,
pub performance_config: PerformanceConfig,
pub enable_dependency_analysis: bool,
pub enable_performance_analysis: bool,
pub enable_graph_visualization: bool,
pub enable_ml_recommendations: bool,
pub enable_security_analysis: bool,
pub enable_platform_analysis: bool,
}
impl IntegratedAnalysisConfig {
pub fn comprehensive() -> Self {
Self {
explorer_config: ExplorerConfig::new()
.with_performance_analysis(true)
.with_visual_graph(true),
performance_config: PerformanceConfig::new()
.with_advanced_analysis(true)
.with_optimization_hints(true)
.with_benchmarking(true),
enable_dependency_analysis: true,
enable_performance_analysis: true,
enable_graph_visualization: true,
enable_ml_recommendations: true,
enable_security_analysis: true,
enable_platform_analysis: true,
}
}
pub fn performance_focused() -> Self {
Self {
enable_performance_analysis: true,
enable_dependency_analysis: true,
enable_platform_analysis: true,
..Self::minimal()
}
}
pub fn security_focused() -> Self {
Self {
enable_security_analysis: true,
enable_dependency_analysis: true,
enable_platform_analysis: true,
..Self::minimal()
}
}
pub fn minimal() -> Self {
Self {
explorer_config: ExplorerConfig::new(),
performance_config: PerformanceConfig::new(),
enable_dependency_analysis: false,
enable_performance_analysis: false,
enable_graph_visualization: false,
enable_ml_recommendations: false,
enable_security_analysis: false,
enable_platform_analysis: false,
}
}
pub fn config_hash(&self) -> u64 {
42
}
pub fn enabled_modules(&self) -> Vec<String> {
let mut modules = vec!["core".to_string()];
if self.enable_dependency_analysis {
modules.push("dependency".to_string());
}
if self.enable_performance_analysis {
modules.push("performance".to_string());
}
if self.enable_graph_visualization {
modules.push("graph".to_string());
}
if self.enable_ml_recommendations {
modules.push("ml".to_string());
}
if self.enable_security_analysis {
modules.push("security".to_string());
}
if self.enable_platform_analysis {
modules.push("platform".to_string());
}
modules
}
}
impl Default for IntegratedAnalysisConfig {
fn default() -> Self {
Self::comprehensive()
}
}
#[derive(Debug)]
pub struct ComprehensiveAnalysisResult {
pub trait_name: String,
pub core_analysis: TraitExplorationResult,
pub dependencies: Option<EnhancedDependencyAnalysis>,
pub performance: Option<AdvancedPerformanceAnalysis>,
pub analysis_metadata: ExplorationAnalysisMetadata,
}
#[derive(Debug)]
pub struct ExplorationAnalysisMetadata {
pub timestamp: std::time::SystemTime,
pub config_hash: u64,
pub modules_used: Vec<String>,
}
#[derive(Debug)]
pub struct BatchAnalysisResult {
pub successful_analyses: HashMap<String, ComprehensiveAnalysisResult>,
pub failed_analyses: Vec<(String, SklearsError)>,
pub summary: BatchSummary,
}
#[derive(Debug)]
pub struct BatchSummary {
pub total_traits_analyzed: usize,
pub average_complexity_score: f64,
pub high_risk_security_traits: usize,
pub analysis_duration: std::time::Duration,
}
#[derive(Debug)]
pub struct TraitComparisonResult {
pub traits: Vec<String>,
pub performance_comparison: PerformanceComparisonSummary,
pub security_comparison: SecurityComparisonSummary,
pub platform_comparison: PlatformComparisonSummary,
pub recommendations: Vec<String>,
}
#[derive(Debug, Default)]
pub struct PerformanceComparisonSummary {
pub average_compile_time_ms: f64,
pub average_memory_overhead_bytes: f64,
pub performance_leader: String,
pub performance_summary: String,
}
#[derive(Debug)]
pub struct SecurityComparisonSummary {
pub high_risk_traits: usize,
pub total_vulnerabilities: usize,
pub security_leader: String,
pub security_summary: String,
}
#[derive(Debug)]
pub struct PlatformComparisonSummary {
pub cross_platform_compatibility_score: f64,
pub problematic_platforms: Vec<String>,
pub compatibility_leader: String,
pub platform_summary: String,
}
pub mod workflows {
use super::*;
pub fn quick_analyze(trait_name: &str) -> Result<ComprehensiveAnalysisResult> {
let mut factory = TraitExplorerFactory::comprehensive();
factory.comprehensive_analysis(trait_name)
}
pub fn performance_analysis(trait_name: &str) -> Result<Option<AdvancedPerformanceAnalysis>> {
let mut factory = TraitExplorerFactory::performance_focused();
let result = factory.comprehensive_analysis(trait_name)?;
Ok(result.performance)
}
pub fn compare_performance(trait_names: &[String]) -> Result<PerformanceComparisonSummary> {
let mut factory = TraitExplorerFactory::performance_focused();
let comparison = factory.compare_traits(trait_names)?;
Ok(comparison.performance_comparison)
}
}
#[allow(non_snake_case)]
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_integrated_config_creation() {
let config = IntegratedAnalysisConfig::comprehensive();
assert!(config.enable_performance_analysis);
assert!(config.enable_security_analysis);
assert!(config.enable_platform_analysis);
}
#[test]
fn test_config_variations() {
let perf_config = IntegratedAnalysisConfig::performance_focused();
assert!(perf_config.enable_performance_analysis);
assert!(!perf_config.enable_ml_recommendations);
let security_config = IntegratedAnalysisConfig::security_focused();
assert!(security_config.enable_security_analysis);
assert!(!security_config.enable_graph_visualization);
let minimal_config = IntegratedAnalysisConfig::minimal();
assert!(!minimal_config.enable_performance_analysis);
assert!(!minimal_config.enable_security_analysis);
}
#[test]
fn test_trait_explorer_factory_creation() {
let config = IntegratedAnalysisConfig::comprehensive();
let _factory = TraitExplorerFactory::new(config);
let _factory2 = TraitExplorerFactory::comprehensive();
let _factory3 = TraitExplorerFactory::performance_focused();
let _factory4 = TraitExplorerFactory::security_focused();
}
#[test]
fn test_config_enabled_modules() {
let config = IntegratedAnalysisConfig::comprehensive();
let modules = config.enabled_modules();
assert!(modules.contains(&"core".to_string()));
assert!(modules.contains(&"performance".to_string()));
assert!(modules.contains(&"security".to_string()));
assert!(modules.contains(&"platform".to_string()));
}
#[test]
fn test_batch_summary_creation() {
let summary = BatchSummary {
total_traits_analyzed: 5,
average_complexity_score: 2.5,
high_risk_security_traits: 1,
analysis_duration: std::time::Duration::from_millis(500),
};
assert_eq!(summary.total_traits_analyzed, 5);
assert_eq!(summary.high_risk_security_traits, 1);
}
#[test]
fn test_workflow_functions_exist() {
}
#[test]
fn test_comparison_result_structure() {
let comparison = TraitComparisonResult {
traits: vec!["Trait1".to_string(), "Trait2".to_string()],
performance_comparison: PerformanceComparisonSummary::default(),
security_comparison: SecurityComparisonSummary {
high_risk_traits: 0,
total_vulnerabilities: 0,
security_leader: "Trait1".to_string(),
security_summary: "Test".to_string(),
},
platform_comparison: PlatformComparisonSummary {
cross_platform_compatibility_score: 0.95,
problematic_platforms: vec![],
compatibility_leader: "Trait1".to_string(),
platform_summary: "Test".to_string(),
},
recommendations: vec!["Use Trait1 for better performance".to_string()],
};
assert_eq!(comparison.traits.len(), 2);
assert_eq!(comparison.recommendations.len(), 1);
}
#[test]
fn test_analysis_metadata() {
let metadata = performance_analysis::AnalysisMetadata {
analyzer_version: "1.0.0".to_string(),
analysis_timestamp: chrono::Utc::now(),
analysis_duration: std::time::Duration::from_millis(100),
config_used: performance_analysis::PerformanceConfig::default(),
};
assert_eq!(metadata.analyzer_version, "1.0.0");
assert!(metadata.analysis_duration.as_millis() >= 100);
}
}