1use serde::{Deserialize, Serialize};
10use std::fmt;
11
12#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
19#[non_exhaustive]
20pub enum Domain {
21 GraphAnalytics,
23
24 StatisticalML,
26
27 Compliance,
29
30 TemporalAnalysis,
32
33 RiskAnalytics,
35
36 Banking,
38
39 BehavioralAnalytics,
41
42 OrderMatching,
44
45 ProcessIntelligence,
47
48 Clearing,
50
51 TreasuryManagement,
53
54 Accounting,
56
57 PaymentProcessing,
59
60 FinancialAudit,
62
63 Core,
65}
66
67impl Domain {
68 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 pub const P1: &'static [Domain] = &[
89 Domain::GraphAnalytics,
90 Domain::StatisticalML,
91 Domain::Compliance,
92 Domain::TemporalAnalysis,
93 Domain::RiskAnalytics,
94 ];
95
96 pub const P2: &'static [Domain] = &[
98 Domain::Banking,
99 Domain::BehavioralAnalytics,
100 Domain::OrderMatching,
101 Domain::ProcessIntelligence,
102 Domain::Clearing,
103 ];
104
105 pub const P3: &'static [Domain] = &[
107 Domain::TreasuryManagement,
108 Domain::Accounting,
109 Domain::PaymentProcessing,
110 Domain::FinancialAudit,
111 ];
112
113 #[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 #[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 #[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
178pub mod features {
182 pub const GRAPH_PAGERANK: &str = "GraphAnalytics.PageRank";
185 pub const GRAPH_BETWEENNESS: &str = "GraphAnalytics.BetweennessCentrality";
187 pub const GRAPH_CLOSENESS: &str = "GraphAnalytics.ClosenessCentrality";
189 pub const GRAPH_DEGREE: &str = "GraphAnalytics.DegreeCentrality";
191 pub const GRAPH_EIGENVECTOR: &str = "GraphAnalytics.EigenvectorCentrality";
193 pub const GRAPH_KATZ: &str = "GraphAnalytics.KatzCentrality";
195 pub const GRAPH_COMMUNITY: &str = "GraphAnalytics.CommunityDetection";
197 pub const GRAPH_MOTIF: &str = "GraphAnalytics.MotifDetection";
199 pub const GRAPH_SIMILARITY: &str = "GraphAnalytics.Similarity";
201
202 pub const ML_KMEANS: &str = "StatisticalML.KMeans";
205 pub const ML_DBSCAN: &str = "StatisticalML.DBSCAN";
207 pub const ML_ISOLATION_FOREST: &str = "StatisticalML.IsolationForest";
209 pub const ML_LOF: &str = "StatisticalML.LocalOutlierFactor";
211 pub const ML_ENSEMBLE: &str = "StatisticalML.Ensemble";
213 pub const ML_REGRESSION: &str = "StatisticalML.Regression";
215
216 pub const COMPLIANCE_AML: &str = "Compliance.AML";
219 pub const COMPLIANCE_SANCTIONS: &str = "Compliance.SanctionsScreening";
221 pub const COMPLIANCE_KYC: &str = "Compliance.KYC";
223 pub const COMPLIANCE_MONITORING: &str = "Compliance.TransactionMonitoring";
225
226 pub const RISK_CREDIT: &str = "RiskAnalytics.CreditRisk";
229 pub const RISK_MARKET: &str = "RiskAnalytics.MarketRisk";
231 pub const RISK_VAR: &str = "RiskAnalytics.VaR";
233 pub const RISK_PORTFOLIO: &str = "RiskAnalytics.PortfolioRisk";
235 pub const RISK_STRESS: &str = "RiskAnalytics.StressTesting";
237
238 pub const TEMPORAL_ARIMA: &str = "TemporalAnalysis.ARIMA";
241 pub const TEMPORAL_PROPHET: &str = "TemporalAnalysis.Prophet";
243 pub const TEMPORAL_CHANGEPOINT: &str = "TemporalAnalysis.ChangePoint";
245 pub const TEMPORAL_SEASONAL: &str = "TemporalAnalysis.Seasonal";
247 pub const TEMPORAL_VOLATILITY: &str = "TemporalAnalysis.Volatility";
249
250 pub const BANKING_FRAUD: &str = "Banking.FraudDetection";
253
254 pub const ORDERBOOK_MATCHING: &str = "OrderMatching.OrderMatching";
257
258 pub const PROCINT_MINING: &str = "ProcessIntelligence.ProcessMining";
261 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 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}