rustkernel_core/
domain.rs

1//! Domain definitions for kernel categorization.
2//!
3//! Kernels are organized into domains representing different business/analytical areas.
4//! Domains are used for:
5//! - License enforcement (licensing per domain)
6//! - Kernel discovery and organization
7//! - Feature gating
8
9use serde::{Deserialize, Serialize};
10use std::fmt;
11
12/// Business/analytical domain for kernel categorization.
13///
14/// Each domain represents a distinct area of functionality:
15/// - Financial services (banking, compliance, risk, treasury)
16/// - Analytics (graph, ML, temporal, behavioral)
17/// - Operations (clearing, payments, order matching)
18#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
19#[non_exhaustive]
20pub enum Domain {
21    /// Graph analytics: centrality, community detection, motifs, similarity
22    GraphAnalytics,
23
24    /// Statistical machine learning: clustering, anomaly detection, regression
25    StatisticalML,
26
27    /// Compliance: AML, KYC, sanctions screening, transaction monitoring
28    Compliance,
29
30    /// Temporal analysis: forecasting, change detection, decomposition
31    TemporalAnalysis,
32
33    /// Risk analytics: credit risk, VaR, portfolio risk, stress testing
34    RiskAnalytics,
35
36    /// Banking: fraud detection and pattern matching
37    Banking,
38
39    /// Behavioral analytics: profiling, forensics, event correlation
40    BehavioralAnalytics,
41
42    /// Order matching: high-frequency order book matching
43    OrderMatching,
44
45    /// Process intelligence: process mining, conformance checking
46    ProcessIntelligence,
47
48    /// Clearing: settlement, netting, DVP matching
49    Clearing,
50
51    /// Treasury management: cash flow, collateral, hedging, liquidity
52    TreasuryManagement,
53
54    /// Accounting: chart of accounts, journal transformation, reconciliation
55    Accounting,
56
57    /// Payment processing: transaction execution, flow analysis
58    PaymentProcessing,
59
60    /// Financial audit: feature extraction, hypergraph construction
61    FinancialAudit,
62
63    /// Core: test kernels and infrastructure validation
64    Core,
65}
66
67impl Domain {
68    /// All available domains.
69    pub const ALL: &'static [Domain] = &[
70        Domain::GraphAnalytics,
71        Domain::StatisticalML,
72        Domain::Compliance,
73        Domain::TemporalAnalysis,
74        Domain::RiskAnalytics,
75        Domain::Banking,
76        Domain::BehavioralAnalytics,
77        Domain::OrderMatching,
78        Domain::ProcessIntelligence,
79        Domain::Clearing,
80        Domain::TreasuryManagement,
81        Domain::Accounting,
82        Domain::PaymentProcessing,
83        Domain::FinancialAudit,
84        Domain::Core,
85    ];
86
87    /// Priority 1 domains (high-value, implement first).
88    pub const P1: &'static [Domain] = &[
89        Domain::GraphAnalytics,
90        Domain::StatisticalML,
91        Domain::Compliance,
92        Domain::TemporalAnalysis,
93        Domain::RiskAnalytics,
94    ];
95
96    /// Priority 2 domains (medium priority).
97    pub const P2: &'static [Domain] = &[
98        Domain::Banking,
99        Domain::BehavioralAnalytics,
100        Domain::OrderMatching,
101        Domain::ProcessIntelligence,
102        Domain::Clearing,
103    ];
104
105    /// Priority 3 domains (lower priority).
106    pub const P3: &'static [Domain] = &[
107        Domain::TreasuryManagement,
108        Domain::Accounting,
109        Domain::PaymentProcessing,
110        Domain::FinancialAudit,
111    ];
112
113    /// Returns the domain name as a string slice.
114    #[must_use]
115    pub const fn as_str(&self) -> &'static str {
116        match self {
117            Domain::GraphAnalytics => "GraphAnalytics",
118            Domain::StatisticalML => "StatisticalML",
119            Domain::Compliance => "Compliance",
120            Domain::TemporalAnalysis => "TemporalAnalysis",
121            Domain::RiskAnalytics => "RiskAnalytics",
122            Domain::Banking => "Banking",
123            Domain::BehavioralAnalytics => "BehavioralAnalytics",
124            Domain::OrderMatching => "OrderMatching",
125            Domain::ProcessIntelligence => "ProcessIntelligence",
126            Domain::Clearing => "Clearing",
127            Domain::TreasuryManagement => "TreasuryManagement",
128            Domain::Accounting => "Accounting",
129            Domain::PaymentProcessing => "PaymentProcessing",
130            Domain::FinancialAudit => "FinancialAudit",
131            Domain::Core => "Core",
132        }
133    }
134
135    /// Parse a domain from a string.
136    #[must_use]
137    pub fn parse(s: &str) -> Option<Self> {
138        match s {
139            "GraphAnalytics" => Some(Domain::GraphAnalytics),
140            "StatisticalML" => Some(Domain::StatisticalML),
141            "Compliance" => Some(Domain::Compliance),
142            "TemporalAnalysis" => Some(Domain::TemporalAnalysis),
143            "RiskAnalytics" => Some(Domain::RiskAnalytics),
144            "Banking" => Some(Domain::Banking),
145            "BehavioralAnalytics" => Some(Domain::BehavioralAnalytics),
146            "OrderMatching" => Some(Domain::OrderMatching),
147            "ProcessIntelligence" => Some(Domain::ProcessIntelligence),
148            "Clearing" => Some(Domain::Clearing),
149            "TreasuryManagement" => Some(Domain::TreasuryManagement),
150            "Accounting" => Some(Domain::Accounting),
151            "PaymentProcessing" => Some(Domain::PaymentProcessing),
152            "FinancialAudit" => Some(Domain::FinancialAudit),
153            "Core" => Some(Domain::Core),
154            _ => None,
155        }
156    }
157
158    /// Returns true if this is a P1 (high priority) domain.
159    #[must_use]
160    pub const fn is_p1(&self) -> bool {
161        matches!(
162            self,
163            Domain::GraphAnalytics
164                | Domain::StatisticalML
165                | Domain::Compliance
166                | Domain::TemporalAnalysis
167                | Domain::RiskAnalytics
168        )
169    }
170}
171
172impl fmt::Display for Domain {
173    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
174        write!(f, "{}", self.as_str())
175    }
176}
177
178/// Feature strings for fine-grained licensing.
179///
180/// Format: `Domain.Feature` (e.g., `GraphAnalytics.PageRank`)
181pub mod features {
182    // GraphAnalytics domain
183    /// PageRank centrality calculation
184    pub const GRAPH_PAGERANK: &str = "GraphAnalytics.PageRank";
185    /// Betweenness centrality calculation
186    pub const GRAPH_BETWEENNESS: &str = "GraphAnalytics.BetweennessCentrality";
187    /// Closeness centrality calculation
188    pub const GRAPH_CLOSENESS: &str = "GraphAnalytics.ClosenessCentrality";
189    /// Degree centrality calculation
190    pub const GRAPH_DEGREE: &str = "GraphAnalytics.DegreeCentrality";
191    /// Eigenvector centrality calculation
192    pub const GRAPH_EIGENVECTOR: &str = "GraphAnalytics.EigenvectorCentrality";
193    /// Katz centrality calculation
194    pub const GRAPH_KATZ: &str = "GraphAnalytics.KatzCentrality";
195    /// Community detection algorithms
196    pub const GRAPH_COMMUNITY: &str = "GraphAnalytics.CommunityDetection";
197    /// Motif detection algorithms
198    pub const GRAPH_MOTIF: &str = "GraphAnalytics.MotifDetection";
199    /// Similarity metrics
200    pub const GRAPH_SIMILARITY: &str = "GraphAnalytics.Similarity";
201
202    // StatisticalML domain
203    /// K-Means clustering
204    pub const ML_KMEANS: &str = "StatisticalML.KMeans";
205    /// DBSCAN clustering
206    pub const ML_DBSCAN: &str = "StatisticalML.DBSCAN";
207    /// Isolation Forest anomaly detection
208    pub const ML_ISOLATION_FOREST: &str = "StatisticalML.IsolationForest";
209    /// Local Outlier Factor anomaly detection
210    pub const ML_LOF: &str = "StatisticalML.LocalOutlierFactor";
211    /// Ensemble methods
212    pub const ML_ENSEMBLE: &str = "StatisticalML.Ensemble";
213    /// Regression models
214    pub const ML_REGRESSION: &str = "StatisticalML.Regression";
215
216    // Compliance domain
217    /// Anti-Money Laundering pattern detection
218    pub const COMPLIANCE_AML: &str = "Compliance.AML";
219    /// Sanctions screening
220    pub const COMPLIANCE_SANCTIONS: &str = "Compliance.SanctionsScreening";
221    /// Know Your Customer scoring
222    pub const COMPLIANCE_KYC: &str = "Compliance.KYC";
223    /// Transaction monitoring
224    pub const COMPLIANCE_MONITORING: &str = "Compliance.TransactionMonitoring";
225
226    // RiskAnalytics domain
227    /// Credit risk scoring
228    pub const RISK_CREDIT: &str = "RiskAnalytics.CreditRisk";
229    /// Market risk / VaR
230    pub const RISK_MARKET: &str = "RiskAnalytics.MarketRisk";
231    /// Value at Risk calculation
232    pub const RISK_VAR: &str = "RiskAnalytics.VaR";
233    /// Portfolio risk aggregation
234    pub const RISK_PORTFOLIO: &str = "RiskAnalytics.PortfolioRisk";
235    /// Stress testing
236    pub const RISK_STRESS: &str = "RiskAnalytics.StressTesting";
237
238    // TemporalAnalysis domain
239    /// ARIMA forecasting
240    pub const TEMPORAL_ARIMA: &str = "TemporalAnalysis.ARIMA";
241    /// Prophet-style decomposition
242    pub const TEMPORAL_PROPHET: &str = "TemporalAnalysis.Prophet";
243    /// Change point detection
244    pub const TEMPORAL_CHANGEPOINT: &str = "TemporalAnalysis.ChangePoint";
245    /// Seasonal decomposition
246    pub const TEMPORAL_SEASONAL: &str = "TemporalAnalysis.Seasonal";
247    /// Volatility analysis
248    pub const TEMPORAL_VOLATILITY: &str = "TemporalAnalysis.Volatility";
249
250    // Banking domain
251    /// Fraud detection
252    pub const BANKING_FRAUD: &str = "Banking.FraudDetection";
253
254    // OrderMatching domain
255    /// Order book matching
256    pub const ORDERBOOK_MATCHING: &str = "OrderMatching.OrderMatching";
257
258    // ProcessIntelligence domain
259    /// Process mining
260    pub const PROCINT_MINING: &str = "ProcessIntelligence.ProcessMining";
261    /// Conformance checking
262    pub const PROCINT_CONFORMANCE: &str = "ProcessIntelligence.ConformanceChecking";
263}
264
265#[cfg(test)]
266mod tests {
267    use super::*;
268
269    #[test]
270    fn test_domain_all_count() {
271        assert_eq!(Domain::ALL.len(), 15);
272    }
273
274    #[test]
275    fn test_domain_priority_coverage() {
276        let p1_count = Domain::P1.len();
277        let p2_count = Domain::P2.len();
278        let p3_count = Domain::P3.len();
279        // Core is P0, not in P1/P2/P3
280        assert_eq!(p1_count + p2_count + p3_count + 1, Domain::ALL.len());
281    }
282
283    #[test]
284    fn test_domain_from_str() {
285        assert_eq!(
286            Domain::parse("GraphAnalytics"),
287            Some(Domain::GraphAnalytics)
288        );
289        assert_eq!(Domain::parse("Unknown"), None);
290    }
291
292    #[test]
293    fn test_domain_display() {
294        assert_eq!(Domain::GraphAnalytics.to_string(), "GraphAnalytics");
295        assert_eq!(Domain::RiskAnalytics.to_string(), "RiskAnalytics");
296    }
297}