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)]
15pub use sklears_core::{
25 error::{Result as SklResult, SklearsError},
26 types::Float,
27};
28
29pub 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
85pub use types::*;
87
88pub 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
98pub 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};
337use scirs2_core::ndarray::{ArrayView1, ArrayView2};
352
353pub use permutation::compute_score;
355
356pub 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
373pub 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
397pub 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
420pub 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 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 assert_eq!(stats[0].0, 3.0); assert_eq!(stats[0].2, 1.0); assert_eq!(stats[0].3, 5.0); }
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]; 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}