LotSizingDataModel.Instance 2.0.1
Lot-sizing instance representation, descriptors and problem characterization.
Loading...
Searching...
No Matches
HistoricalMappingRule.cs
Go to the documentation of this file.
2
3public sealed class HistoricalMappingRule
4{
5 private readonly string[] _universalTokens;
6
8 string ruleId,
10 string historicalToken,
11 IEnumerable<string> universalTokens,
13 bool allowsInverse,
14 string sourceReference,
15 string notes = "")
16 {
17 RuleId = NormalizeRequired(ruleId, nameof(ruleId));
18 Family = family;
19 HistoricalToken = NormalizeRequired(historicalToken, nameof(historicalToken));
20 ArgumentNullException.ThrowIfNull(universalTokens);
21
22 _universalTokens = universalTokens
23 .Select(NormalizeToken)
24 .Where(token => token.Length > 0)
25 .Distinct(StringComparer.Ordinal)
26 .OrderBy(token => token, StringComparer.Ordinal)
27 .ToArray();
28
29 Confidence = confidence;
30 AllowsInverse = allowsInverse;
31 SourceReference = NormalizeRequired(sourceReference, nameof(sourceReference));
32 Notes = notes?.Trim() ?? string.Empty;
34 }
35
36 public string RuleId { get; }
38 public string HistoricalToken { get; }
39 public IReadOnlyList<string> UniversalTokens => _universalTokens;
41 public bool AllowsInverse { get; }
42 public string SourceReference { get; }
43 public string Notes { get; }
44
45 public void EnsureValid()
46 {
47 if (!Enum.IsDefined(typeof(HistoricalClassificationFamily), Family))
48 {
49 throw new InvalidOperationException(
50 "Historical classification family is invalid.");
51 }
52
53 if (!Enum.IsDefined(typeof(HistoricalMappingConfidence), Confidence))
54 {
55 throw new InvalidOperationException(
56 "Historical mapping confidence is invalid.");
57 }
58
59 if (Confidence == HistoricalMappingConfidence.SourceOnly &&
60 _universalTokens.Length != 0)
61 {
62 throw new InvalidOperationException(
63 "Source-only rules cannot contain universal projections.");
64 }
65
66 if (Confidence != HistoricalMappingConfidence.SourceOnly &&
67 _universalTokens.Length == 0)
68 {
69 throw new InvalidOperationException(
70 "Projected rules require at least one universal token.");
71 }
72
73 if (AllowsInverse &&
75 {
76 throw new InvalidOperationException(
77 "Only exact mappings can participate in inverse detection.");
78 }
79 }
80
82 IEnumerable<string> universalTokens)
83 {
84 string[] normalized = universalTokens
85 .Select(NormalizeToken)
86 .Where(token => token.Length > 0)
87 .Distinct(StringComparer.Ordinal)
88 .OrderBy(token => token, StringComparer.Ordinal)
89 .ToArray();
90
91 return _universalTokens.SequenceEqual(
92 normalized,
93 StringComparer.Ordinal);
94 }
95
96 internal static string NormalizeToken(string? value) =>
97 value?.Trim() ?? string.Empty;
98
99 private static string NormalizeRequired(
100 string? value,
101 string parameterName)
102 {
103 string normalized = NormalizeToken(value);
104
105 if (normalized.Length == 0)
106 {
107 throw new ArgumentException(
108 "A non-empty historical mapping value is required.",
109 parameterName);
110 }
111
112 return normalized;
113 }
114}
bool MatchesUniversalTokenSet(IEnumerable< string > universalTokens)
HistoricalMappingRule(string ruleId, HistoricalClassificationFamily family, string historicalToken, IEnumerable< string > universalTokens, HistoricalMappingConfidence confidence, bool allowsInverse, string sourceReference, string notes="")