56 CancellationToken cancellationToken =
default)
58 ArgumentNullException.ThrowIfNull(problem);
59 cancellationToken.ThrowIfCancellationRequested();
63 var buffer = ArrayPool<int>.Shared.Rent(horizon);
67 var cycleEnds = buffer.AsSpan(0, horizon);
74 var epp = holdingCost == 0.0
75 ? double.PositiveInfinity
81 while (start < horizon)
83 cancellationToken.ThrowIfCancellationRequested();
85 if (
double.IsPositiveInfinity(epp))
87 cycleEnds[start] = horizon - 1;
92 var partPeriods = 0.0;
93 var bestDifference = epp;
95 for (var end = start + 1; end < horizon; end++)
102 Math.Abs(epp - partPeriods);
104 if (difference < bestDifference ||
105 (difference == bestDifference &&
108 bestDifference = difference;
112 if (partPeriods >= epp)
118 cycleEnds[start] = bestEnd;
133 ArrayPool<int>.Shared.Return(buffer, clearArray:
false);