pub mod centrality;
pub mod graph;
pub mod pagerank;
pub mod statistics;
pub use centrality::{
CentralityCalculator, CentralityConfig, CentralityResults, ImportDetectionStats,
ImportResolutionConfig, IntegrationConfig, IntegrationMetadata, NormalizationMethod,
};
pub use pagerank::{
PageRankComputer, PageRankConfig, PageRankResults, PerformanceMetrics, ScoreStatistics,
};
pub use graph::{
ConcurrentDependencyGraph, DegreeInfo, DependencyGraph, GraphStatistics, NodeMetadata,
TraversalDirection,
};
pub use statistics::{
ConnectivityAnalysis, DegreeDistribution, GraphAnalysisResults, GraphStatisticsAnalyzer,
ImportInsights, PerformanceProfile, StatisticsConfig, StructuralPatterns,
};
pub use graph::DependencyGraph as CodeGraph;
use scribe_analysis::heuristics::ScanResult;
use scribe_core::Result;
use std::collections::HashMap;
pub struct PageRankAnalysis {
calculator: CentralityCalculator,
}
impl PageRankAnalysis {
pub fn new() -> Result<Self> {
Ok(Self {
calculator: CentralityCalculator::new()?,
})
}
pub fn with_config(config: CentralityConfig) -> Result<Self> {
Ok(Self {
calculator: CentralityCalculator::with_config(config)?,
})
}
pub fn for_code_analysis() -> Result<Self> {
Ok(Self {
calculator: CentralityCalculator::new()?,
})
}
pub fn for_large_codebases() -> Result<Self> {
Ok(Self {
calculator: CentralityCalculator::for_large_codebases()?,
})
}
pub fn compute_centrality<T>(&self, scan_results: &[T]) -> Result<CentralityResults>
where
T: ScanResult + Sync,
{
self.calculator.calculate_centrality(scan_results)
}
pub fn integrate_with_heuristics(
&self,
centrality_results: &CentralityResults,
heuristic_scores: &HashMap<String, f64>,
) -> Result<HashMap<String, f64>> {
self.calculator
.integrate_with_heuristics(centrality_results, heuristic_scores)
}
pub fn summarize_results(&self, results: &CentralityResults) -> String {
results.summary()
}
}
impl Default for PageRankAnalysis {
fn default() -> Self {
Self::new().expect("Failed to create PageRankAnalysis")
}
}
pub mod utils {
use super::*;
pub fn compute_file_centrality<T>(scan_results: &[T]) -> Result<HashMap<String, f64>>
where
T: ScanResult + Sync,
{
let analysis = PageRankAnalysis::for_code_analysis()?;
let results = analysis.compute_centrality(scan_results)?;
Ok(results.pagerank_scores)
}
pub fn get_top_important_files<T>(
scan_results: &[T],
top_k: usize,
) -> Result<Vec<(String, f64)>>
where
T: ScanResult + Sync,
{
let analysis = PageRankAnalysis::for_code_analysis()?;
let results = analysis.compute_centrality(scan_results)?;
Ok(results.top_files_by_centrality(top_k))
}
pub fn combine_scores<T>(
scan_results: &[T],
heuristic_scores: &HashMap<String, f64>,
) -> Result<HashMap<String, f64>>
where
T: ScanResult + Sync,
{
let analysis = PageRankAnalysis::for_code_analysis()?;
let centrality_results = analysis.compute_centrality(scan_results)?;
analysis.integrate_with_heuristics(¢rality_results, heuristic_scores)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_pagerank_analysis_creation() {
let analysis = PageRankAnalysis::new();
assert!(analysis.is_ok());
}
}