LotSizingDataModel.Instance 2.0.1
Lot-sizing instance representation, descriptors and problem characterization.
Loading...
Searching...
No Matches
UniversalNotationTokenCatalog.cs
Go to the documentation of this file.
4
6
7/// <summary>
8/// Stable canonical token mapping for notation scheme version 1.
9/// </summary>
10internal static class UniversalNotationTokenCatalog
11{
12 private static readonly IReadOnlyDictionary<
14 string> FeatureToToken =
15 new Dictionary<UniversalNotationFeature, string>
16 {
17 [UniversalNotationFeature.Demand] = "Dem",
18 [UniversalNotationFeature.DeterministicDemand] = "Det",
19 [UniversalNotationFeature.TimeVaryingDemand] = "DVar",
20 [UniversalNotationFeature.Production] = "Prod",
21 [UniversalNotationFeature.UncapacitatedProduction] = "Uncap:P",
22
23 [UniversalNotationFeature.ProductionCapacity] = "Cap:P",
24 [UniversalNotationFeature.SharedProductionCapacity] = "Cap:Shared",
25 [UniversalNotationFeature.TimeVaryingProductionCapacity] = "Cap:Var",
26 [UniversalNotationFeature.SupplierCapacity] = "Cap:S",
27 [UniversalNotationFeature.TransportCapacity] = "Cap:T",
28 [UniversalNotationFeature.WarehouseCapacity] = "Cap:W",
29
30 [UniversalNotationFeature.SetupCost] = "SC",
31 [UniversalNotationFeature.SetupTime] = "ST",
32 [UniversalNotationFeature.StartUpCost] = "SU",
33 [UniversalNotationFeature.ProductionLeadTime] = "LT:P",
34 [UniversalNotationFeature.StartUpTime] = "SUT",
35
36 [UniversalNotationFeature.MinimumLotSize] = "MinLot",
37 [UniversalNotationFeature.MaximumLotSize] = "MaxLot",
38 [UniversalNotationFeature.LotSizeMultiple] = "LotMult",
39
40 [UniversalNotationFeature.AdditionalProductionCapacity] = "AddCap:P",
41 [UniversalNotationFeature.AdditionalWarehouseCapacity] = "AddCap:W",
42 [UniversalNotationFeature.AdditionalTransportCapacity] = "AddCap:T",
43
44 [UniversalNotationFeature.InitialInventory] = "InitInv",
45 [UniversalNotationFeature.SafetyStock] = "SS",
46 [UniversalNotationFeature.Backlogging] = "BL",
47 [UniversalNotationFeature.LostSales] = "LS",
48
49 [UniversalNotationFeature.Purchasing] = "Buy",
50 [UniversalNotationFeature.SupplierLeadTime] = "LT:S",
51 [UniversalNotationFeature.Transportation] = "Tr",
52 [UniversalNotationFeature.TransportLeadTime] = "LT:T",
53 [UniversalNotationFeature.Distribution] = "Dist",
54
55 [UniversalNotationFeature.FinancialConstraint] = "Fin",
56
57 [UniversalNotationFeature.IntegratedScheduling] = "Sched",
58 [UniversalNotationFeature.BigBucketScheduling] = "Bucket:BB",
59 [UniversalNotationFeature.SmallBucketScheduling] = "Bucket:SB",
60 [UniversalNotationFeature.MacroMicroScheduling] = "Bucket:MM",
61 [UniversalNotationFeature.InitialSetupState] = "InitSetup",
62 [UniversalNotationFeature.SetupCarryOver] = "SCO",
63 [UniversalNotationFeature.SequenceDependentChangeoverTime] = "SDCT",
64 [UniversalNotationFeature.SequenceDependentChangeoverCost] = "SDCC",
65 [UniversalNotationFeature.MaximumSetupCount] = "MaxSetup",
66
67 [UniversalNotationFeature.SingleSchedulingResource] = "SchedRes:1",
68 [UniversalNotationFeature.SmallBucketAllOrNothingProduction] = "SBProd:0F",
69 [UniversalNotationFeature.SmallBucketContinuousProduction] = "SBProd:Cont",
70 [UniversalNotationFeature.AtMostOneProducedItemPerBucket] = "BucketItems:1",
71 [UniversalNotationFeature.AtMostTwoProducedItemsPerBucket] = "BucketItems:2",
72 [UniversalNotationFeature.AtMostOneSetupTransitionPerBucket] = "SetupTrans:1",
73
74 [UniversalNotationFeature.ExplicitMicroPeriodGrid] = "MicroGrid",
75 [UniversalNotationFeature.VariableLengthMicroPeriods] = "MicroLen:Var",
76 [UniversalNotationFeature.FixedLengthMicroPeriods] = "MicroLen:Fix",
77 [UniversalNotationFeature.SingleItemPerMicroPeriod] = "MicroItem:1",
78 [UniversalNotationFeature.MultipleItemsPerMicroPeriod] = "MicroItem:N",
79 [UniversalNotationFeature.VariableMicroPeriodCount] = "MicroN:Var",
80 [UniversalNotationFeature.SetupCarryOverForbidden] = "SCO:0",
81 [UniversalNotationFeature.GroupingConstraint] = "Group",
82 [UniversalNotationFeature.ProductionSetupFamily] = "SetupFam",
83 [UniversalNotationFeature.ProductionSetupFamilyTime] = "SetupFamT"
84 };
85
86 private static readonly IReadOnlyDictionary<
87 string,
88 UniversalNotationFeature> TokenToFeature =
89 FeatureToToken.ToDictionary(
90 pair => pair.Value,
91 pair => pair.Key,
92 StringComparer.OrdinalIgnoreCase);
93
94 public static string GetFeatureToken(
96 {
97 if (!FeatureToToken.TryGetValue(feature, out string? token))
98 {
99 throw new ArgumentOutOfRangeException(
100 nameof(feature),
101 feature,
102 "No canonical beta token is registered.");
103 }
104
105 return token;
106 }
107
108 public static bool TryParseFeature(
109 string token,
110 out UniversalNotationFeature feature)
111 {
112 return TokenToFeature.TryGetValue(
113 token,
114 out feature);
115 }
116
117 public static string GetProductStructureCode(
119 {
120 return type switch
121 {
128 _ => throw new ArgumentOutOfRangeException(
129 nameof(type),
130 type,
131 "Unknown product-structure type.")
132 };
133 }
134
136 string code)
137 {
138 return code.ToUpperInvariant() switch
139 {
140 "?" => ProductStructureType.Unknown,
141 "IND" => ProductStructureType.IndependentItems,
142 "SER" => ProductStructureType.Serial,
143 "ASM" => ProductStructureType.Assembly,
144 "ARB" => ProductStructureType.Arborescent,
145 "GEN" => ProductStructureType.General,
146 _ => throw new FormatException(
147 $"Unknown product-structure token '{code}'.")
148 };
149 }
150
151 public static string GetNetworkTopologyCode(
153 {
154 return topology switch
155 {
163 _ => throw new ArgumentOutOfRangeException(
164 nameof(topology),
165 topology,
166 "Unknown supply-network topology.")
167 };
168 }
169
171 string code)
172 {
173 return code.ToUpperInvariant() switch
174 {
175 "UNK" => SupplyNetworkTopologyType.Unknown,
176 "IND" => SupplyNetworkTopologyType.Independent,
177 "SER" => SupplyNetworkTopologyType.Serial,
178 "CONV" => SupplyNetworkTopologyType.Convergent,
179 "DIV" => SupplyNetworkTopologyType.Divergent,
180 "TREE" => SupplyNetworkTopologyType.Tree,
181 "GEN" => SupplyNetworkTopologyType.General,
182 _ => throw new FormatException(
183 $"Unknown supply-network topology token '{code}'.")
184 };
185 }
186
187 public static string GetTemporalParameterCode(
189 {
190 return parameter switch
191 {
201 _ => throw new ArgumentOutOfRangeException(
202 nameof(parameter),
203 parameter,
204 "Unknown temporal-parameter family.")
205 };
206 }
207
209 string code)
210 {
211 return code.ToUpperInvariant() switch
212 {
213 "DEM" => UniversalTemporalParameter.Demand,
214 "SC" => UniversalTemporalParameter.SetupCost,
215 "HC" => UniversalTemporalParameter.HoldingCost,
216 "PC" => UniversalTemporalParameter.ProductionCost,
217 "CAPP" => UniversalTemporalParameter.ProductionCapacity,
218 "MINLOT" => UniversalTemporalParameter.MinimumLotSize,
219 "SUT" => UniversalTemporalParameter.StartUpTime,
220 "MAXLOT" => UniversalTemporalParameter.MaximumLotSize,
221 "CAPS" => UniversalTemporalParameter.SupplierCapacity,
222 _ => throw new FormatException(
223 $"Unknown temporal-parameter token '{code}'.")
224 };
225 }
226
227 public static string GetTemporalPatternCode(
228 TemporalPatternType pattern)
229 {
230 return pattern switch
231 {
237 _ => throw new ArgumentOutOfRangeException(
238 nameof(pattern),
239 pattern,
240 "Unknown temporal pattern.")
241 };
242 }
243
245 string code)
246 {
247 return code.ToUpperInvariant() switch
248 {
249 "Z" => TemporalPatternType.Zero,
250 "C" => TemporalPatternType.Constant,
251 "NI" => TemporalPatternType.NonIncreasing,
252 "ND" => TemporalPatternType.NonDecreasing,
253 "G" => TemporalPatternType.General,
254 _ => throw new FormatException(
255 $"Unknown temporal-pattern token '{code}'.")
256 };
257 }
258
259 public static string GetTemporalQualifierToken(
261 {
262 ArgumentNullException.ThrowIfNull(qualifier);
263
264 return
265 "TP:" +
267 qualifier.Parameter) +
268 "=" +
270 qualifier.Pattern);
271 }
272
273 public static bool TryParseTemporalQualifier(
274 string token,
275 out UniversalTemporalQualifier? qualifier)
276 {
277 qualifier = null;
278
279 if (!token.StartsWith(
280 "TP:",
281 StringComparison.OrdinalIgnoreCase))
282 {
283 return false;
284 }
285
286 string body = token[3..];
287
288 int separatorIndex = body.IndexOf('=');
289
290 if (separatorIndex <= 0 ||
291 separatorIndex >= body.Length - 1)
292 {
293 throw new FormatException(
294 $"Invalid temporal qualifier '{token}'.");
295 }
296
297 string parameterCode =
298 body[..separatorIndex];
299
300 string patternCode =
301 body[(separatorIndex + 1)..];
302
303 qualifier =
306 parameterCode),
308 patternCode));
309
310 return true;
311 }
312
313
314 public static string GetSemanticConditionToken(
316 {
317 return condition switch
318 {
320 .NonSpeculativeProductionHoldingCosts =>
321 "Cost:NS",
322
324 .ZeroOrFullCapacityProduction =>
325 "ProdMode:0F",
326
327 _ => throw new ArgumentOutOfRangeException(
328 nameof(condition),
329 condition,
330 "Unknown universal semantic condition.")
331 };
332 }
333
334 public static bool TryParseSemanticCondition(
335 string token,
336 out UniversalSemanticCondition condition)
337 {
338 switch (token.ToUpperInvariant())
339 {
340 case "COST:NS":
341 condition =
343 .NonSpeculativeProductionHoldingCosts;
344 return true;
345
346 case "PRODMODE:0F":
347 condition =
349 .ZeroOrFullCapacityProduction;
350 return true;
351
352 default:
353 condition = default;
354 return false;
355 }
356 }
357
358}
Stable canonical token mapping for notation scheme version 1.
static string GetSemanticConditionToken(UniversalSemanticCondition condition)
static bool TryParseTemporalQualifier(string token, out UniversalTemporalQualifier? qualifier)
static string GetTemporalQualifierToken(UniversalTemporalQualifier qualifier)
static bool TryParseFeature(string token, out UniversalNotationFeature feature)
static bool TryParseSemanticCondition(string token, out UniversalSemanticCondition condition)
static string GetTemporalParameterCode(UniversalTemporalParameter parameter)
ProductStructureType
Identifies the structural category of a product bill-of-materials graph.
@ General
The acyclic bill-of-materials graph does not satisfy the serial, assembly or arborescent restrictions...
@ IndependentItems
The instance contains no component-to-parent bill-of-materials relationship.
@ Arborescent
The bill-of-materials graph has an arborescent structure.
@ Serial
Every connected component of the bill-of-materials graph is a directed chain.
@ Unknown
The product-structure type is unknown or has not yet been analyzed.
@ Assembly
The bill-of-materials graph has an assembly structure.
SupplyNetworkTopologyType
Classifies the directed physical topology of a supply-flow network.
TemporalPatternType
Canonical temporal-pattern categories used by historical lot-sizing classifications such as Bitran-Ya...
UniversalSemanticCondition
Generic derived semantic conditions that may be required by a universal problem specification.
UniversalTemporalParameter
Identifies a time-varying model parameter that may be qualified by a generic temporal pattern in univ...
UniversalNotationFeature
Feature vocabulary represented in the beta field of notation v1. Enum order is the canonical renderin...
record UniversalTemporalQualifier
Qualifies one universal model-parameter family with a generic temporal pattern.