60 SupplyChain supplyChain,
61 string instanceIdentifier =
"",
63 string instanceFingerprint =
"",
64 bool validateSupplyChain =
true)
66 ArgumentNullException.ThrowIfNull(supplyChain);
68 if (supplyChain.PlanningHorizon <= 0)
70 throw new ArgumentOutOfRangeException(
72 supplyChain.PlanningHorizon,
73 "The supply-chain planning horizon must be " +
74 "strictly positive.");
77 if (validateSupplyChain)
80 new SupplyChainValidator();
82 validator.ThrowIfInvalid(
88 name: name ??
string.Empty,
90 instanceIdentifier ??
string.Empty,
92 supplyChain.PlanningHorizon)
95 instanceFingerprint ??
string.Empty,
101 CreateProductionDecisions(
105 CreateInventoryDecisions(
109 CreateTransportDecisions(
113 CreatePurchaseDecisions(
117 CreateDistributionDecisions(
121 CreateWorkCenterCapacityDecisions(
125 CreateWarehouseCapacityDecisions(
129 CreateTransportResourceCapacityDecisions(
139 solution.Completeness =
145 private static void CreateProductionDecisions(
146 SupplyChain supplyChain,
150 in supplyChain.ProductionRoutings)
154 routingId: routing.Id,
156 supplyChain.PlanningHorizon);
163 private static void CreateInventoryDecisions(
164 SupplyChain supplyChain,
167 foreach (var inventory
168 in supplyChain.Inventories)
172 itemId: inventory.ItemId,
174 CopyWarehouseReference(
175 inventory.Warehouse),
177 supplyChain.PlanningHorizon);
184 private static void CreateTransportDecisions(
185 SupplyChain supplyChain,
186 LotSizingSolution solution)
195 foreach (var characteristic
196 in supplyChain.TransportCharacteristics)
198 var transportResource =
199 supplyChain.TransportResources
204 .TransportResourceId);
206 if (transportResource is
null)
208 throw new InvalidOperationException(
209 $
"Transport resource " +
210 $
"{characteristic.TransportResourceId} " +
211 $
"referenced by item " +
212 $
"{characteristic.ItemId} does not exist.");
216 in supplyChain.GetTransportLanes(transportResource.Id))
219 new TransportDecision(
221 characteristic.ItemId,
225 .TransportResourceId,
228 CopyWarehouseReference(
232 CopyWarehouseReference(
236 supplyChain.PlanningHorizon);
244 private static void CreatePurchaseDecisions(
245 SupplyChain supplyChain,
246 LotSizingSolution solution)
248 foreach (var delivery
249 in supplyChain.SupplierDeliveries)
252 new PurchaseDecision(
259 destinationWarehouse:
260 CopyWarehouseReference(
264 supplyChain.PlanningHorizon);
271 private static void CreateDistributionDecisions(
272 SupplyChain supplyChain,
273 LotSizingSolution solution)
275 foreach (var sourcing
277 .DistributionCenterSourcings)
280 new DistributionDecision(
281 distributionCenterId:
282 sourcing.DistributionCenterId,
288 CopyWarehouseReference(
292 supplyChain.PlanningHorizon);
300 CreateWorkCenterCapacityDecisions(
301 SupplyChain supplyChain,
302 LotSizingSolution solution)
305 in supplyChain.Plants)
307 foreach (var workCenter
308 in plant.WorkCenters)
311 new WorkCenterReference
321 new WorkCenterCapacityDecision(
322 workCenter: reference,
324 supplyChain.PlanningHorizon);
333 CreateWarehouseCapacityDecisions(
334 SupplyChain supplyChain,
335 LotSizingSolution solution)
342 in supplyChain.Plants)
344 WarehouseReference reference =
350 new WarehouseCapacityDecision(
351 warehouse: reference,
353 supplyChain.PlanningHorizon);
359 foreach (var warehouse
360 in supplyChain.StandaloneWarehouses)
362 WarehouseReference reference =
364 .ForStandaloneWarehouse(
368 new WarehouseCapacityDecision(
369 warehouse: reference,
371 supplyChain.PlanningHorizon);
379 CreateTransportResourceCapacityDecisions(
380 SupplyChain supplyChain,
381 LotSizingSolution solution)
383 foreach (var transportResource
384 in supplyChain.TransportResources)
387 new TransportResourceCapacityDecision(
389 transportResource.Id,
392 supplyChain.PlanningHorizon);
400 private static WarehouseReference
401 CopyWarehouseReference(
402 WarehouseReference source)
404 ArgumentNullException.ThrowIfNull(source);
406 return source.Kind
switch
408 WarehouseReferenceKind
409 .StandaloneWarehouse =>
411 .ForStandaloneWarehouse(
414 WarehouseReferenceKind
421 throw new InvalidOperationException(
422 $
"Unsupported warehouse-reference kind: " +