48 LotSizingInstance instance,
51 ArgumentNullException.ThrowIfNull(instance);
52 ArgumentNullException.ThrowIfNull(options);
54 return instance.SupplyChain.Inventories.Count > 0;
61 LotSizingInstance instance,
64 CancellationToken cancellationToken)
66 foreach (Inventory inventory
in instance.SupplyChain.Inventories)
69 period <= instance.PlanningHorizon;
72 cancellationToken.ThrowIfCancellationRequested();
85 ? context.GetVariable(
92 : inventory.InitialInventoryDecisionMode ==
93 InitialInventoryDecisionMode.VariableDecision
94 ? context.GetVariable(
128 AddDistributionOutflows(
136 inventory.ScheduledReceipt?[period] ??
140 inventory.InitialInventoryDecisionMode !=
141 InitialInventoryDecisionMode.FixedParameter &&
142 inventory.InitialInventory != 0.0)
144 throw new InvalidOperationException(
145 "DLS/DLSI initial-stock semantics require the fixed " +
146 "InitialInventory value to be zero.");
149 double rightHandSide =
152 inventory.InitialInventoryDecisionMode ==
153 InitialInventoryDecisionMode.FixedParameter
154 ? inventory.InitialInventory
157 context.AddConstraint(
158 $
"inventoryBalance_i{inventory.ItemId}" +
159 $
"_w{inventory.Warehouse.ReferenceId}_t{period}",
160 balance.BuildExpression(),
164 "Corrected physical inventory-flow " +
169 return ValueTask.CompletedTask;
172 private static void AddProductionFlows(
173 LotSizingInstance instance,
180 if (inventory.Warehouse.Kind !=
181 WarehouseReferenceKind.PlantWarehouse)
187 inventory.Warehouse.ReferenceId;
189 foreach (ProductionRouting routing
190 in instance.SupplyChain.ProductionRoutings)
192 if (routing.PlantId != plantId)
197 if (routing.ItemId == inventory.ItemId)
200 period - routing.LeadTime;
202 if (startPeriod >= 1)
206 StandardFormulationVariableKeyFactory
207 .CreateProductionKey(
218 foreach (ComponentRequirement requirement
219 in instance.SupplyChain.ComponentRequirements)
221 if (requirement.ComponentItemId != inventory.ItemId ||
222 requirement.ParentItemId != routing.ItemId)
229 StandardFormulationVariableKeyFactory
230 .CreateProductionKey(
233 requirement.Quantity);
238 private static void AddSupplierFlows(
239 LotSizingInstance instance,
240 MathematicalModelBuildContext context,
243 InventoryBalanceConstraintBuilder balance,
244 StandardLotSizingFormulationOptions options)
246 if (!options.IncludeProcurement)
251 foreach (SupplierDelivery delivery
252 in instance.SupplyChain.SupplierDeliveries)
254 if (delivery.ItemId != inventory.ItemId ||
255 !StandardFormulationDomainKeyFactory.AreSameWarehouse(
257 inventory.Warehouse))
263 period - delivery.LeadTime;
272 StandardFormulationVariableKeyFactory
273 .CreateProcurementKey(
281 private static void AddTransportFlows(
282 LotSizingInstance instance,
283 MathematicalModelBuildContext context,
286 InventoryBalanceConstraintBuilder balance,
287 StandardLotSizingFormulationOptions options)
289 if (!options.IncludeTransport)
294 foreach (TransportCharacteristic characteristic
295 in instance.SupplyChain.TransportCharacteristics)
297 if (characteristic.ItemId != inventory.ItemId)
302 TransportResource resource =
303 instance.SupplyChain.TransportResources
307 characteristic.TransportResourceId);
309 foreach (AssignedTransportLane lane
in instance.SupplyChain.GetTransportLanes(resource.Id))
311 if (StandardFormulationDomainKeyFactory.AreSameWarehouse(
313 inventory.Warehouse))
317 StandardFormulationVariableKeyFactory
326 if (!StandardFormulationDomainKeyFactory.AreSameWarehouse(
328 inventory.Warehouse))
333 int departurePeriod =
334 period - lane.LeadTime;
336 if (departurePeriod < 1)
343 StandardFormulationVariableKeyFactory
354 private static void AddDistributionOutflows(
355 LotSizingInstance instance,
356 MathematicalModelBuildContext context,
359 InventoryBalanceConstraintBuilder balance)
361 foreach (DistributionCenterSourcing sourcing
362 in instance.SupplyChain.DistributionCenterSourcings)
364 if (sourcing.ItemId != inventory.ItemId ||
365 !StandardFormulationDomainKeyFactory.AreSameWarehouse(
367 inventory.Warehouse))
374 StandardFormulationVariableKeyFactory
375 .CreateDistributionKey(
376 MathematicalDecisionCategory.Delivery,
377 sourcing.DistributionCenterId,
Provides the shared state required while constructing a solver-independent mathematical model.
MathematicalVariable GetVariable(string domainKey)
Gets a required mathematical variable from its business-domain key.