sklears_inspection/
lib.rs

1#![allow(dead_code)]
2#![allow(non_snake_case)]
3#![allow(missing_docs)]
4#![allow(deprecated)]
5#![allow(clippy::all)]
6#![allow(clippy::pedantic)]
7#![allow(clippy::nursery)]
8#![allow(unused_imports)]
9#![allow(unused_variables)]
10#![allow(unused_mut)]
11#![allow(unused_assignments)]
12#![allow(unused_doc_comments)]
13#![allow(unused_parens)]
14#![allow(unused_comparisons)]
15//! Model inspection and interpretation tools
16//!
17//! This crate provides comprehensive tools for understanding and interpreting machine learning models,
18//! including feature importance, partial dependence plots, SHAP values, counterfactual explanations,
19//! anchors, model complexity analysis, and model-agnostic explanations.
20
21// #![warn(missing_docs)]
22
23// Re-export core types and traits
24pub use sklears_core::{
25    error::{Result as SklResult, SklearsError},
26    types::Float,
27};
28
29// Module declarations
30pub mod adversarial;
31pub mod anchors;
32pub mod attention;
33pub mod benchmarking;
34pub mod builder;
35pub mod causal;
36pub mod complexity;
37pub mod computer_vision;
38pub mod counterfactual;
39pub mod dashboard;
40pub mod deep_learning;
41pub mod distributed;
42pub mod enterprise;
43pub mod external_visualizations;
44pub mod fairness;
45pub mod federated;
46pub mod framework;
47pub mod gnn;
48pub mod gpu;
49pub mod hooks;
50pub mod information_theoretic;
51pub mod lazy;
52pub mod llm;
53pub mod local_explanations;
54pub mod memory;
55pub mod metrics_registry;
56pub mod model_agnostic;
57pub mod model_comparison;
58pub mod multimodal;
59pub mod nlp;
60pub mod occlusion;
61pub mod parallel;
62pub mod partial_dependence;
63pub mod permutation;
64pub mod perturbation;
65pub mod plugins;
66pub mod probabilistic;
67pub mod profiling;
68pub mod quantum;
69pub mod reporting;
70pub mod rules;
71pub mod sensitivity;
72pub mod serialization;
73pub mod shapley;
74pub mod streaming;
75pub mod testing;
76pub mod time_series;
77pub mod types;
78pub mod uncertainty;
79pub mod validation;
80pub mod visualization;
81pub mod visualization_backend;
82#[cfg(feature = "wasm")]
83pub mod wasm;
84
85// Re-export commonly used types
86pub use types::*;
87
88// Re-export type safety features
89pub use types::{
90    explanation_methods, explanation_states, ExplanationConfig, ExplanationConstraint,
91    ExplanationMethodValidator, ExplanationProperties, ExplanationValidator,
92    FeatureImportanceConstraint, FixedSizeExplanation, GlobalGradientConfig,
93    GlobalModelAgnosticConfig, GradientCompatible, LimeCompatible, LocalGradientConfig,
94    LocalModelAgnosticConfig, ModelIntrospectable, ShapCompatible, ShapConstraint,
95    TypedExplanation,
96};
97
98// Re-export main functions
99pub use adversarial::{
100    analyze_explanation_stability, compute_certified_robustness, generate_adversarial_examples,
101    test_explanation_robustness, AdversarialAttack, AdversarialConfig, AdversarialExampleResult,
102    CertificationMethod, CertifiedRobustnessResult, ExplanationRobustnessResult, RobustnessMetric,
103    StabilityAnalysisResult, StabilityTrend, VerificationStatus,
104};
105pub use anchors::{explain_with_anchors, AnchorsConfig};
106pub use attention::{
107    analyze_attention, compute_gradcam, dissect_network, maximize_activation, visualize_features,
108    ActivationMaximizationResult, AttentionAnalyzer, AttentionConfig, AttentionResult,
109    AttentionType, FeatureVisualizationResult, GradCAMConfig,
110    GradCAMResult as AttentionGradCAMResult, NetworkDissectionResult,
111};
112pub use benchmarking::{
113    BenchmarkCategory, BenchmarkConfig, BenchmarkReport, BenchmarkResult, BenchmarkingSuite,
114    CategorySummary, InsightSeverity, InsightType, MemoryStatistics, PerformanceInsight,
115    ProblemType, QualityMetrics, ReferenceComparison, TestConfiguration, TimingStatistics,
116};
117pub use builder::{
118    ComparisonResult, ComparisonResults, ComparisonStudy, ComparisonStudyBuilder,
119    CounterfactualConfig as BuilderCounterfactualConfig, ExplanationBuilder,
120    ExplanationPipelineExecutor, FeatureSelection, LimeConfig, OptimizationMethod,
121    PermutationConfig as BuilderPermutationConfig, PipelineBuilder, PipelineExecutionResult,
122    PipelineStep, ScoreFunction as BuilderScoreFunction, ShapConfig, StepMetadata,
123};
124pub use causal::{
125    analyze_instrumental_variables, analyze_mediation, apply_do_calculus,
126    discover_causal_structure, estimate_causal_effect, CausalConfig, CausalEffectMethod,
127    CausalEffectResult, CausalGraph, InstrumentalVariableResult, MediationResult,
128};
129pub use complexity::{analyze_model_complexity, ComplexityConfig};
130pub use computer_vision::{
131    explain_image_with_lime, explain_object_detection, explain_segmentation, generate_gradcam,
132    generate_saliency_map, ComputerVisionConfig, DetectedObject, GradCAMResult, GradCAMStats,
133    Image, ImageLimeResult, KeyFeature, ObjectDetectionExplanation, SaliencyMapResult,
134    SaliencyMethod, SegmentExplanation, SegmentationExplanation, Superpixel,
135};
136pub use counterfactual::{
137    generate_actionable_counterfactual, generate_causal_counterfactual, generate_counterfactual,
138    generate_diverse_counterfactuals, generate_feasible_counterfactual,
139    generate_nearest_counterfactual, CounterfactualConfig, FeasibilityConfig,
140};
141pub use dashboard::{
142    Alert, AlertSeverity, AlertThresholds, AlertType, Dashboard, DashboardConfig,
143    DashboardDataPoint, DashboardLayout, DashboardState, DashboardTheme, DashboardUpdate,
144    WidgetConfig, WidgetType,
145};
146pub use deep_learning::{
147    ConceptActivationVector, ConceptDatabase, ConceptDiscoveryMethod, ConceptHierarchy,
148    DeepLearningAnalyzer, DeepLearningConfig, DetectedConcept, DisentanglementMetrics,
149    NetworkDissectionResult as DeepNetworkDissectionResult, TCAVResult,
150};
151pub use distributed::{
152    ClusterConfig, ClusterExplanationOrchestrator, ClusterHealth, ClusterStatistics,
153    DistributedCoordinator, DistributedTask, HealthStatus, LoadBalancingStrategy, TaskResult,
154    TaskStatus, TaskType, WorkerConfig, WorkerNode,
155};
156pub use enterprise::{
157    AccessControl, AccessControlConfig, AccessLevel, ActionItem, AlertRule, AuditEvent,
158    AuditEventType, AuditLogger, AuditRecord, AuditSeverity, AuditTrail, ComplianceFramework,
159    ComplianceReport, ComplianceReporter, ComplianceRule, ComplianceStatus, EnterpriseConfig,
160    ExplanationLineage, ExplanationQualityMonitor, LineageNode, LineageRelation, LineageTracker,
161    OperationType, Permission, PermissionSet, QualityAlert, QualityDataPoint, QualityLevel,
162    QualityMetric, QualityMonitorConfig, QualityStatistics, QualityThreshold, QualityTrend,
163    QualityTrendDirection, RegulatoryRequirement, RiskLevel, Role, RoleManager,
164    SecureExplanationExecutor, SecurityContext, User, UserGroup,
165};
166pub use external_visualizations::{
167    D3Backend, D3Config, PlotlyBackend, PlotlyConfig, PlotlyPlotConfig, VegaLiteBackend,
168    VegaLiteConfig, VegaLiteDefaultConfig,
169};
170pub use fairness::{
171    analyze_demographic_parity, analyze_equalized_odds, analyze_individual_fairness,
172    assess_fairness, compute_group_fairness_metrics, detect_bias, BiasDetectionResult,
173    DemographicParityResult, DistanceMetric, EqualizedOddsResult, FairnessConfig, FairnessMetrics,
174    FairnessResult, IndividualFairnessResult,
175};
176pub use federated::{
177    AggregationStats, FederatedConfig, FederatedExplainer, FederatedExplanation, PrivacyMechanism,
178};
179pub use framework::{
180    ChainedConfig, ChainedStrategy, CombinedConfig, CombinedOutput, CombinedStrategy,
181    CounterfactualExplainer, Explainer, ExplanationMetadata, ExplanationPipeline,
182    ExplanationPostProcessor, ExplanationStrategy, FeatureAttributor, FeatureExplainer,
183    GlobalExplainer, GradientAttributor, LocalExplainer, PipelineResult, UncertainExplanation,
184    UncertaintyAwareExplainer, ValidationResult, ValidationViolation, ViolationSeverity,
185};
186pub use gnn::{
187    GNNExplainer, GNNExplainerConfig, GNNExplanation, GNNTask, Graph, MessagePassingExplanation,
188};
189pub use gpu::{
190    utils as gpu_utils, GpuBackend, GpuBuffer, GpuConfig, GpuContext, GpuDevice,
191    GpuExplanationComputer, GpuPerformanceStats,
192};
193pub use hooks::{
194    CustomEvent, ErrorInfo, ExecutionMetrics, ExplanationHook, HookContext, HookEvent,
195    HookRegistry, HookRegistryStatistics, HookResult, HookedExplanationExecutor, LogLevel,
196    LoggingHook, MemoryInfo, MetricsHook, ProgressInfo, TimingInfo,
197};
198pub use information_theoretic::{
199    analyze_information_bottleneck, analyze_mutual_information, apply_minimum_description_length,
200    compute_information_gain_attribution, generate_entropy_explanations, EntropyExplanationResult,
201    EstimationMethod, InformationBottleneckResult, InformationGainResult,
202    InformationTheoreticConfig, MDLResult, MutualInformationResult,
203};
204pub use lazy::{
205    LazyComputationManager, LazyConfig, LazyExecutionStats, LazyExplanation,
206    LazyExplanationPipeline, LazyFeatureImportance, LazyShapValues,
207};
208pub use llm::{
209    CounterfactualText, LLMAttentionExplanation, LLMExplainer, LLMExplainerConfig, LLMExplanation,
210    LLMTask, LayerImportance, LayerType, NeuronActivation, PromptSensitivity, PromptVariation,
211    TokenizedInput, VariationType,
212};
213pub use local_explanations::{explain_locally, LocalExplanationConfig, LocalExplanationMethod};
214pub use memory::{
215    cache_friendly_permutation_importance, cache_friendly_shap_computation, CacheConfig, CacheKey,
216    CacheStatistics, ExplanationCache, ExplanationDataLayout, MemoryLayoutManager,
217};
218pub use metrics_registry::{
219    CompletenessMetric, ComputationMetadata, ComputationalComplexity, ExplanationData,
220    ExplanationMetric, ExplanationType, FidelityMetric, MetricCategory, MetricInput,
221    MetricMetadata, MetricOutput, MetricProperties, MetricRegistry, RegistryStatistics,
222    StabilityMetric,
223};
224pub use model_agnostic::{explain_model_agnostic, ModelAgnosticConfig};
225pub use model_comparison::{
226    analyze_ensemble, assess_prediction_stability, compare_models, compute_model_agreement,
227    BiasVarianceDecomposition, DiversityMetrics, EnsembleAnalysisResult, EnsembleMethod,
228    ModelComparisonConfig, ModelComparisonResult, ModelMetrics, StabilityMetrics,
229};
230pub use multimodal::{
231    CrossModalAttention, FusionExplanation, FusionStrategy, InteractionType, ModalityContributions,
232    ModalityInteraction, ModalityType, MultiModalConfig, MultiModalExplainer,
233    MultiModalExplanation, MultiModalInput,
234};
235pub use nlp::{
236    analyze_text_attention, explain_semantic_similarity, explain_syntax, explain_text_with_lime,
237    visualize_word_importance, AttentionExplanation, AttentionPattern, AttentionPatternType,
238    NLPConfig, SemanticCluster, SemanticExplanation, SemanticRelation, SyntacticExplanation,
239    SyntacticNode, SyntacticPattern, SyntacticTree, Token, WordImportanceResult,
240};
241pub use occlusion::{analyze_occlusion, OcclusionConfig, OcclusionMethod};
242#[cfg(feature = "parallel")]
243pub use parallel::{
244    compute_shap_parallel, process_batches_optimized, process_batches_parallel,
245    AdaptiveBatchConfig, BatchConfig, BatchStats, CacheAwareExplanationStore, CompressedBatch,
246    HighPerformanceBatchProcessor, MemoryPool, ParallelConfig, ParallelExplanation,
247    ParallelPermutationImportance, PermutationInput, ProgressCallback, StreamingBatchProcessor,
248};
249pub use partial_dependence::partial_dependence;
250pub use permutation::permutation_importance;
251pub use perturbation::{
252    analyze_robustness, generate_perturbations, PerturbationConfig, PerturbationStrategy,
253};
254pub use plugins::{
255    ExampleCustomPlugin, ExecutionMetadata, ExecutionStatistics, ExplanationPlugin, InputType,
256    LogLevel as PluginLogLevel, OutputType, PluginCapabilities, PluginCapabilityFilter,
257    PluginConfig, PluginData, PluginExecution, PluginInput, PluginManager, PluginMetadata,
258    PluginOutput, PluginOutputData, PluginParameter, PluginRegistry, PluginRegistryStatistics,
259};
260pub use probabilistic::{
261    bayesian_model_averaging, generate_bayesian_explanation,
262    generate_probabilistic_counterfactuals, quantify_explanation_uncertainty,
263    BayesianExplanationResult, BayesianModelAveragingResult, ProbabilisticConfig,
264    ProbabilisticCounterfactualResult, UncertainExplanationResult,
265};
266pub use profiling::{
267    BottleneckType, HotPath, MethodProfile, OptimizationComplexity, OptimizationConfig,
268    OptimizationOpportunity, OptimizationType, PerformanceBottleneck, ProfileGuidedOptimizer,
269    RuntimeStatistics, Severity,
270};
271pub use quantum::{
272    CircuitComplexity, GateInstance, QuantumCircuit, QuantumExplainer, QuantumExplainerConfig,
273    QuantumExplanation, QuantumGate,
274};
275pub use reporting::{
276    export_report, generate_quick_report, CaveatsAndRecommendations, DatasetInfo,
277    EthicalConsiderations, EvaluationData, ExplanationSummary, Factor, IntendedUse,
278    InterpretabilityReport, InterpretabilityScorecard, ModelCard, ModelDetails, OutputFormat,
279    QuantitativeAnalysis, ReportConfig, ReportGenerator, ReportMetadata, ReportModelMetrics,
280    TemplateStyle, TrainingData,
281};
282pub use rules::{
283    extract_rules_from_model, generate_decision_rules, generate_logical_explanations,
284    mine_association_rules, simplify_rules, AssociationRule, ComparisonOperator, DecisionRule,
285    RuleCondition, RuleExtractionConfig,
286};
287pub use sensitivity::{analyze_sensitivity, SensitivityConfig, SensitivityMethod};
288pub use serialization::{
289    BatchSummary, CompressionType, DataStatistics, DatasetMetadata, ExplanationBatch,
290    ExplanationConfiguration, ModelMetadata, SerializableExplanationResult, SerializationConfig,
291    SerializationFormat, SerializationSummary,
292};
293pub use shapley::{
294    compute_deep_shap, compute_kernel_shap, compute_linear_shap, compute_partition_shap,
295    compute_tree_shap, FeaturePartition, ShapleyConfig, ShapleyMetadata, ShapleyMethod,
296    ShapleyResult, Tree, TreeNode,
297};
298pub use streaming::{
299    create_data_chunks, BackgroundStatistics, OnlineAggregator, StreamingConfig,
300    StreamingDataIterator, StreamingExplainer, StreamingExplanationResult, StreamingShapExplainer,
301    StreamingStatistics,
302};
303pub use testing::{
304    validate_explanation_output, ConsistencyTestConfig, FidelityTestConfig, PropertyTestConfig,
305    PropertyTestResult, PropertyViolation, RobustnessTestConfig, TestingSuite,
306};
307pub use time_series::{
308    AlignmentSegment, AlignmentType, DTWExplanation, DecompositionMethod, LagImportance,
309    SeasonalDecomposition, TemporalImportance, TimeSeriesAnalyzer, TimeSeriesConfig, TrendAnalysis,
310    TrendDirection, TrendSegment,
311};
312pub use uncertainty::{
313    analyze_prediction_uncertainty, calibrate_predictions, compute_calibration_metrics,
314    quantify_uncertainty, CalibratedModel, CalibrationMethod, CalibrationMetrics,
315    UncertaintyAnalysis, UncertaintyConfig, UncertaintyEstimator, UncertaintyResult,
316    UncertaintyType,
317};
318pub use validation::{
319    AutomatedTestingResult, CaseStudyMetadata, CaseStudyValidationResult,
320    ConsistencyValidationResult, DatasetValidationResult, FeedbackSeverity, HumanEvaluationResult,
321    MethodAgreement, PerformanceBenchmark, QualitativeFeedback, StatisticalTest,
322    SyntheticValidationResult, TestResult, ValidationConfig, ValidationFramework,
323};
324pub use visualization::{
325    create_3d_plot, create_3d_shap_plot, create_3d_surface_plot, create_comparative_plot,
326    create_feature_importance_plot, create_partial_dependence_plot, create_shap_visualization,
327    Animation3D, ColorScheme, ComparativePlot, ComparisonType, EasingType, FeatureImportancePlot,
328    FeatureImportanceType, MobileConfig, PartialDependencePlot, Plot3D, Plot3DType, PlotConfig,
329    ShapPlot, ShapPlotType, Surface3D,
330};
331pub use visualization_backend::{
332    AsciiBackend, BackendCapabilities, BackendConfig, BackendRegistry, ComparativeData,
333    CustomPlotData, FeatureImportanceData, HtmlBackend, JsonBackend, PartialDependenceData,
334    PlotType, RenderedVisualization, ShapData, Theme, VisualizationBackend, VisualizationMetadata,
335    VisualizationRenderer,
336};
337// Temporarily disabled due to compilation issues
338// #[cfg(feature = "wasm")]
339// pub use wasm::{
340//     BrowserCapabilities, JsInterop, WasmConfig, WasmExplainer, WasmMemoryManager, WasmShapComputer,
341//     WasmSupportLevel, WasmVisualizer, WebGlSupport,
342// };
343
344// Additional utility functions and re-exports would go here
345// (The rest of the original lib.rs content like SHAP, ICE plots, etc.)
346
347// For now, let's include a few key functions from the original lib.rs
348// that weren't moved to modules yet
349
350// ✅ SciRS2 Policy Compliant Imports
351use scirs2_core::ndarray::{ArrayView1, ArrayView2};
352
353// Re-export the compute_score function from permutation module
354pub use permutation::compute_score;
355
356/// Feature Importance Data
357///
358/// This function creates feature importance data suitable for plotting from permutation importance results.
359pub fn create_feature_importance_data(
360    result: &PermutationImportanceResult,
361    feature_names: Option<Vec<String>>,
362) -> FeatureImportance {
363    let feature_indices: Vec<usize> = (0..result.importances_mean.len()).collect();
364
365    FeatureImportance::new(
366        feature_indices,
367        result.importances_mean.clone(),
368        Some(result.importances_std.clone()),
369        feature_names,
370    )
371}
372
373/// Utility function to compute feature statistics
374pub fn compute_feature_statistics(X: &ArrayView2<Float>) -> Vec<(Float, Float, Float, Float)> {
375    let mut stats = Vec::new();
376
377    for col_idx in 0..X.ncols() {
378        let column = X.column(col_idx);
379        let mean = column.mean().unwrap_or(0.0);
380
381        let mut sorted_values: Vec<Float> = column.to_vec();
382        sorted_values.sort_by(|a, b| a.partial_cmp(b).unwrap());
383
384        let min_val = sorted_values.first().copied().unwrap_or(0.0);
385        let max_val = sorted_values.last().copied().unwrap_or(0.0);
386
387        let variance =
388            column.iter().map(|&x| (x - mean).powi(2)).sum::<Float>() / column.len() as Float;
389        let std_dev = variance.sqrt();
390
391        stats.push((mean, std_dev, min_val, max_val));
392    }
393
394    stats
395}
396
397/// Utility function to validate input dimensions
398pub fn validate_input_dimensions(X: &ArrayView2<Float>, y: &ArrayView1<Float>) -> SklResult<()> {
399    if X.nrows() != y.len() {
400        return Err(SklearsError::InvalidInput(
401            "X and y must have the same number of samples".to_string(),
402        ));
403    }
404
405    if X.nrows() == 0 {
406        return Err(SklearsError::InvalidInput(
407            "Input data cannot be empty".to_string(),
408        ));
409    }
410
411    if X.ncols() == 0 {
412        return Err(SklearsError::InvalidInput(
413            "Input data must have at least one feature".to_string(),
414        ));
415    }
416
417    Ok(())
418}
419
420/// Utility function to generate feature names if not provided
421pub fn generate_feature_names(n_features: usize) -> Vec<String> {
422    (0..n_features).map(|i| format!("feature_{}", i)).collect()
423}
424
425#[cfg(test)]
426mod tests {
427    use super::*;
428    // ✅ SciRS2 Policy Compliant Import
429    use scirs2_core::ndarray::array;
430
431    #[test]
432    fn test_feature_importance_plot_creation() {
433        let result = PermutationImportanceResult {
434            importances: vec![vec![0.1, 0.2], vec![0.3, 0.4]],
435            importances_mean: array![0.15, 0.35],
436            importances_std: array![0.05, 0.05],
437        };
438
439        let feature_data = create_feature_importance_data(&result, None);
440        assert_eq!(feature_data.importances.len(), 2);
441        assert_eq!(feature_data.feature_indices.len(), 2);
442    }
443
444    #[test]
445    #[allow(non_snake_case)]
446    fn test_feature_statistics() {
447        let X = array![[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]];
448        let stats = compute_feature_statistics(&X.view());
449
450        assert_eq!(stats.len(), 2);
451        // First column: mean=3.0, min=1.0, max=5.0
452        assert_eq!(stats[0].0, 3.0); // mean
453        assert_eq!(stats[0].2, 1.0); // min
454        assert_eq!(stats[0].3, 5.0); // max
455    }
456
457    #[test]
458    #[allow(non_snake_case)]
459    fn test_input_validation() {
460        let X = array![[1.0, 2.0], [3.0, 4.0]];
461        let y = array![1.0, 2.0];
462
463        assert!(validate_input_dimensions(&X.view(), &y.view()).is_ok());
464
465        let y_wrong = array![1.0]; // Wrong length
466        assert!(validate_input_dimensions(&X.view(), &y_wrong.view()).is_err());
467    }
468
469    #[test]
470    fn test_feature_name_generation() {
471        let names = generate_feature_names(3);
472        assert_eq!(names, vec!["feature_0", "feature_1", "feature_2"]);
473    }
474}