LotSizingDataModel.Solver 2.0.1
Solver-independent modeling, execution, monitoring and adapter infrastructure.
Loading...
Searching...
No Matches
InventoryAdditionalCapacityCostObjectiveTermBuilder.cs
Go to the documentation of this file.
1using System;
2using System.Threading;
3using System.Threading.Tasks;
4using LotSizingDataModel.Core.Relationships;
5using LotSizingDataModel.Instance;
8
10
11/// <summary>
12/// Adds item-specific additional inventory-capacity costs.
13/// </summary>
16{
17 /// <summary>
18 /// Gets the objective-term family identifier.
19 /// </summary>
20 public override string TermFamilyId =>
21 "inventoryAdditionalCapacityCost";
22
23 /// <summary>
24 /// Determines whether additional-capacity costs are enabled.
25 /// </summary>
26 public override bool IsEnabled(
27 LotSizingInstance instance,
29 {
30 ArgumentNullException.ThrowIfNull(instance);
31 ArgumentNullException.ThrowIfNull(options);
32
33 return options.IncludeAdditionalCapacity;
34 }
35
36 /// <summary>
37 /// Builds item-specific additional-capacity cost terms.
38 /// </summary>
39 protected override ValueTask BuildTermsAsync(
40 LotSizingInstance instance,
42 LinearExpressionBuilder expressionBuilder,
44 CancellationToken cancellationToken)
45 {
46 foreach (
47 Inventory inventory
48 in instance.SupplyChain.Inventories)
49 {
50 if (inventory.AdditionalCapacity is null)
51 {
52 continue;
53 }
54
55 for (
56 int period = 1;
57 period <= instance.PlanningHorizon;
58 period++)
59 {
60 cancellationToken.ThrowIfCancellationRequested();
61
62 double upperBound =
63 inventory.AdditionalCapacity[period];
64
65 if (options.RemoveStructurallyZeroVariables &&
66 double.IsFinite(upperBound) &&
67 upperBound <= options.StructuralZeroTolerance)
68 {
69 continue;
70 }
71
72 var keyBuilder =
75 .InventoryAdditionalCapacity)
76 .Add(
78 inventory.ItemId);
79
81 keyBuilder,
82 inventory.Warehouse);
83
85 context,
86 expressionBuilder,
87 keyBuilder
88 .Add(
90 period)
91 .Build(),
92 inventory.AdditionalCapacityCost?[period] ??
93 0.0);
94 }
95 }
96
97 return ValueTask.CompletedTask;
98 }
99}
Provides a fluent builder for linear expressions.
Builds stable business-domain keys for mathematical variables and constraints.
MathematicalDomainKeyBuilder Add(string name, string value)
Adds a text segment.
Provides the shared state required while constructing a solver-independent mathematical model.
override ValueTask BuildTermsAsync(LotSizingInstance instance, MathematicalModelBuildContext context, LinearExpressionBuilder expressionBuilder, StandardLotSizingFormulationOptions options, CancellationToken cancellationToken)
Builds item-specific additional-capacity cost terms.
override bool IsEnabled(LotSizingInstance instance, StandardLotSizingFormulationOptions options)
Determines whether additional-capacity costs are enabled.
Creates canonical domain-key fragments shared by standard formulation builders and provides warehouse...
static MathematicalDomainKeyBuilder AddWarehouse(MathematicalDomainKeyBuilder builder, WarehouseReference warehouse)
Adds a warehouse reference using the generic warehouse or plant segment.
Configures the standard solver-independent mixed-integer lot-sizing formulation.
bool IncludeAdditionalCapacity
Gets or sets whether additional capacities are included.
Provides common validation and helper methods for one objective-term family of the standard lot-sizin...
static void AddCostTerm(MathematicalModelBuildContext context, LinearExpressionBuilder expressionBuilder, string domainKey, double coefficient)
Adds one variable cost term to the shared objective.
Provides the canonical mathematical domain-key categories used to identify lot-sizing decision famili...
Provides the canonical mathematical domain-key segment names used by lot-sizing variables and constra...