#![deny(clippy::unwrap_used)]
#![allow(clippy::field_reassign_with_default)]
#![allow(clippy::too_many_arguments)]
#![allow(clippy::upper_case_acronyms)]
pub mod benchmarks;
pub mod config;
pub mod enhancement;
pub mod error;
pub mod gates;
pub mod privacy;
pub mod coherence;
pub mod ml;
pub mod quality;
pub mod report;
pub mod statistical;
pub mod tuning;
pub mod banking;
pub mod causal;
pub mod diff_engine;
pub mod enrichment;
pub mod process_mining;
pub mod scenario_diff;
pub use config::{EvaluationConfig, EvaluationThresholds, PrivacyEvaluationConfig};
pub use error::{EvalError, EvalResult};
pub use statistical::{
AmountDistributionAnalysis, AmountDistributionAnalyzer, AnomalyRealismEvaluation,
AnomalyRealismEvaluator, BenfordAnalysis, BenfordAnalyzer, BenfordConformity,
CorrelationAnalysis, CorrelationAnalyzer, CorrelationCheckResult, DetectionDifficulty,
DriftDetectionAnalysis, DriftDetectionAnalyzer, DriftDetectionEntry, DriftDetectionMetrics,
DriftEventCategory, ExpectedCorrelation, LabeledDriftEvent, LabeledEventAnalysis,
LineItemAnalysis, LineItemAnalyzer, LineItemEntry, SecondDigitAnalysis, StatisticalEvaluation,
TemporalAnalysis, TemporalAnalyzer, TemporalEntry,
};
pub use coherence::{
AccountType,
ApprovalLevelData,
AuditEvaluation,
AuditEvaluator,
AuditFindingData,
AuditRiskData,
AuditTrailEvaluation,
AuditTrailGap,
BalanceSheetEvaluation,
BalanceSheetEvaluator,
BalanceSnapshot,
BankReconciliationEvaluation,
BankReconciliationEvaluator,
BidEvaluationData,
BudgetVarianceData,
CashPositionData,
CoherenceEvaluation,
ConcentrationMetrics,
CountryPackData,
CountryPackEvaluation,
CountryPackEvaluator,
CountryPackThresholds,
CovenantData,
CrossProcessEvaluation,
CrossProcessEvaluator,
CycleCountData,
DocumentChainEvaluation,
DocumentChainEvaluator,
DocumentReferenceData,
EarnedValueData,
EntityReferenceData,
EsgEvaluation,
EsgEvaluator,
EsgThresholds,
ExpenseReportData,
FairValueEvaluation,
FinancialRatios,
FinancialReportingEvaluation,
FinancialReportingEvaluator,
FinancialStatementData,
FrameworkViolation,
GovernanceData,
HedgeEffectivenessData,
HolidayData,
HrPayrollEvaluation,
HrPayrollEvaluator,
ICMatchingData,
ICMatchingEvaluation,
ICMatchingEvaluator,
ImpairmentEvaluation,
IsaComplianceEvaluation,
JeRiskScoringResult,
KpiData,
LeaseAccountingEvaluation,
LeaseAccountingEvaluator,
LeaseEvaluation,
ManufacturingEvaluation,
ManufacturingEvaluator,
MaterialityData,
NettingData,
NetworkEdge,
NetworkEvaluation,
NetworkEvaluator,
NetworkNode,
NetworkThresholds,
O2CChainData,
P2PChainData,
PayrollHoursData,
PayrollLineItemData,
PayrollRunData,
PcaobComplianceEvaluation,
PerformanceObligation,
ProductionOrderData,
ProjectAccountingEvaluation,
ProjectAccountingEvaluator,
ProjectAccountingThresholds,
ProjectRevenueData,
QualityInspectionData,
QuoteLineData,
RatioAnalysisResult,
RatioCheck,
ReconciliationData,
ReferentialData,
ReferentialIntegrityEvaluation,
ReferentialIntegrityEvaluator,
RetainageData,
RevenueContract,
RevenueRecognitionEvaluation,
RevenueRecognitionEvaluator,
RiskAttributeStats,
RiskDistribution,
RoutingOperationData,
SafetyMetricData,
SalesQuoteData,
SalesQuoteEvaluation,
SalesQuoteEvaluator,
SalesQuoteThresholds,
ScorecardCoverageData,
SourcingEvaluation,
SourcingEvaluator,
SourcingProjectData,
SoxComplianceEvaluation,
SpendAnalysisData,
StandardsComplianceEvaluation,
StandardsThresholds,
StrengthStats,
SubledgerEvaluator,
SubledgerReconciliationEvaluation,
SupplierEsgData,
TaxEvaluation,
TaxEvaluator,
TaxLineData,
TaxRateData,
TaxReturnData,
TaxThresholds,
TimeEntryData,
TreasuryEvaluation,
TreasuryEvaluator,
TreasuryThresholds,
UnmatchedICItem,
VariableConsideration,
ViolationSeverity,
WaterUsageData,
WithholdingData,
WorkpaperData,
};
pub use quality::{
CompletenessAnalysis, CompletenessAnalyzer, ConsistencyAnalysis, ConsistencyAnalyzer,
ConsistencyRule, DuplicateInfo, FieldCompleteness, FieldDefinition, FieldValue, FormatAnalysis,
FormatAnalyzer, FormatVariation, QualityEvaluation, UniqueRecord, UniquenessAnalysis,
UniquenessAnalyzer,
};
pub use ml::{
AnomalyScoringAnalysis, AnomalyScoringAnalyzer, CrossModalAnalysis, CrossModalAnalyzer,
DomainGapAnalysis, DomainGapAnalyzer, EmbeddingReadinessAnalysis, EmbeddingReadinessAnalyzer,
FeatureAnalysis, FeatureAnalyzer, FeatureQualityAnalysis, FeatureQualityAnalyzer, FeatureStats,
GnnReadinessAnalysis, GnnReadinessAnalyzer, GraphAnalysis, GraphAnalyzer, GraphMetrics,
LabelAnalysis, LabelAnalyzer, LabelDistribution, MLReadinessEvaluation,
SchemeDetectabilityAnalysis, SchemeDetectabilityAnalyzer, SplitAnalysis, SplitAnalyzer,
SplitMetrics, TemporalFidelityAnalysis, TemporalFidelityAnalyzer,
};
pub use report::{
BaselineComparison, ComparisonResult, EvaluationReport, HtmlReportGenerator,
JsonReportGenerator, MetricChange, ReportMetadata, ThresholdChecker, ThresholdResult,
};
pub use tuning::{
ConfigSuggestion, ConfigSuggestionGenerator, TuningAnalyzer, TuningCategory, TuningOpportunity,
};
pub use enhancement::{
AutoTuneResult, AutoTuner, ConfigPatch, EnhancementReport, Recommendation,
RecommendationCategory, RecommendationEngine, RecommendationPriority, RootCause,
SuggestedAction,
};
pub use privacy::{
LinkageAttack, LinkageConfig, LinkageResults, MembershipInferenceAttack, MiaConfig, MiaResults,
NistAlignmentReport, NistCriterion, PrivacyEvaluation, SynQPMatrix, SynQPQuadrant,
};
pub use benchmarks::{
acfe_calibrated_1k,
acfe_collusion_5k,
acfe_management_override_2k,
all_acfe_benchmarks,
all_benchmarks,
all_industry_benchmarks,
anomaly_bench_1k,
data_quality_100k,
entity_match_5k,
financial_services_fraud_5k,
fraud_detect_10k,
get_benchmark,
get_industry_benchmark,
graph_fraud_10k,
healthcare_fraud_5k,
manufacturing_fraud_5k,
retail_fraud_10k,
technology_fraud_3k,
AcfeAlignment,
AcfeCalibration,
AcfeCategoryDistribution,
BaselineModelType,
BaselineResult,
BenchmarkBuilder,
BenchmarkSuite,
BenchmarkTaskType,
CostMatrix,
DatasetSpec,
EvaluationSpec,
FeatureSet,
IndustryBenchmarkAnalysis,
LeaderboardEntry,
MetricType,
SplitRatios,
};
pub use banking::{
AmlDetectabilityAnalysis, AmlDetectabilityAnalyzer, AmlTransactionData, BankingEvaluation,
KycCompletenessAnalysis, KycCompletenessAnalyzer, KycProfileData, TypologyData,
};
pub use process_mining::{
EventSequenceAnalysis, EventSequenceAnalyzer, ProcessEventData, ProcessMiningEvaluation,
VariantAnalysis, VariantAnalyzer, VariantData,
};
pub use causal::{CausalModelEvaluation, CausalModelEvaluator};
pub use enrichment::{EnrichmentQualityEvaluation, EnrichmentQualityEvaluator};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComprehensiveEvaluation {
pub statistical: StatisticalEvaluation,
pub coherence: CoherenceEvaluation,
pub quality: QualityEvaluation,
pub ml_readiness: MLReadinessEvaluation,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub privacy: Option<PrivacyEvaluation>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub banking: Option<BankingEvaluation>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub process_mining: Option<ProcessMiningEvaluation>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub causal: Option<CausalModelEvaluation>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enrichment_quality: Option<EnrichmentQualityEvaluation>,
pub passes: bool,
pub failures: Vec<String>,
pub tuning_opportunities: Vec<TuningOpportunity>,
pub config_suggestions: Vec<ConfigSuggestion>,
}
impl ComprehensiveEvaluation {
pub fn new() -> Self {
Self {
statistical: StatisticalEvaluation::default(),
coherence: CoherenceEvaluation::default(),
quality: QualityEvaluation::default(),
ml_readiness: MLReadinessEvaluation::default(),
privacy: None,
banking: None,
process_mining: None,
causal: None,
enrichment_quality: None,
passes: true,
failures: Vec::new(),
tuning_opportunities: Vec::new(),
config_suggestions: Vec::new(),
}
}
pub fn check_all_thresholds(&mut self, thresholds: &EvaluationThresholds) {
self.failures.clear();
self.statistical.check_thresholds(thresholds);
self.failures.extend(self.statistical.failures.clone());
self.coherence.check_thresholds(thresholds);
self.failures.extend(self.coherence.failures.clone());
self.quality.check_thresholds(thresholds);
self.failures.extend(self.quality.failures.clone());
self.ml_readiness.check_thresholds(thresholds);
self.failures.extend(self.ml_readiness.failures.clone());
if let Some(ref mut privacy) = self.privacy {
privacy.update_status();
self.failures.extend(privacy.failures.clone());
}
if let Some(ref mut banking) = self.banking {
banking.check_thresholds();
self.failures.extend(banking.issues.clone());
}
if let Some(ref mut pm) = self.process_mining {
pm.check_thresholds();
self.failures.extend(pm.issues.clone());
}
if let Some(ref causal) = self.causal {
if !causal.passes {
self.failures.extend(causal.issues.clone());
}
}
if let Some(ref enrichment) = self.enrichment_quality {
if !enrichment.passes {
self.failures.extend(enrichment.issues.clone());
}
}
self.passes = self.failures.is_empty();
}
}
impl Default for ComprehensiveEvaluation {
fn default() -> Self {
Self::new()
}
}
pub struct Evaluator {
config: EvaluationConfig,
}
impl Evaluator {
pub fn new(config: EvaluationConfig) -> Self {
Self { config }
}
pub fn with_defaults() -> Self {
Self::new(EvaluationConfig::default())
}
pub fn config(&self) -> &EvaluationConfig {
&self.config
}
pub fn run_evaluation(&self) -> ComprehensiveEvaluation {
let mut evaluation = ComprehensiveEvaluation::new();
evaluation.check_all_thresholds(&self.config.thresholds);
evaluation
}
pub fn run_evaluation_with_amounts(
&self,
je_amounts: &[rust_decimal::Decimal],
) -> ComprehensiveEvaluation {
let mut evaluation = ComprehensiveEvaluation::new();
if !je_amounts.is_empty() {
let analyzer = BenfordAnalyzer::new(self.config.thresholds.benford_p_value_min);
match analyzer.analyze(je_amounts) {
Ok(benford) => {
evaluation.statistical.benford = Some(benford);
}
Err(e) => {
evaluation
.failures
.push(format!("Benford analysis failed: {e}"));
evaluation.passes = false;
}
}
}
evaluation.check_all_thresholds(&self.config.thresholds);
evaluation
}
}
#[cfg(test)]
#[allow(clippy::unwrap_used)]
mod tests {
use super::*;
#[test]
fn test_comprehensive_evaluation_new() {
let eval = ComprehensiveEvaluation::new();
assert!(eval.passes);
assert!(eval.failures.is_empty());
}
#[test]
fn test_evaluator_creation() {
let evaluator = Evaluator::with_defaults();
assert_eq!(evaluator.config().thresholds.benford_p_value_min, 0.05);
}
}