13 IEnumerable<CuttingPlaneIterationStatistics> iterations,
14 double? finalMipObjective)
16 ArgumentNullException.ThrowIfNull(iterations);
33 throw new ArgumentException(
34 "Iteration identifiers must be unique.",
38 if (finalMipObjective.HasValue &&
39 !
double.IsFinite(finalMipObjective.Value))
41 throw new ArgumentOutOfRangeException(
42 nameof(finalMipObjective));
49 public IReadOnlyList<CuttingPlaneIterationStatistics>
Iterations =>
54 _iterations.Length == 0
56 : _iterations[0].LpObjective;
60 _iterations.Length == 0
62 : _iterations[^1].LpObjective;
69 InitialLpObjective.HasValue &&
70 FinalRootLpObjective.HasValue
71 ? FinalRootLpObjective.Value -
72 InitialLpObjective.Value
91 FinalMipObjective.Value -
100 if (Math.Abs(denominator) <=
118 item.LpSolveTime.Ticks));
125 item.SeparationTime.Ticks));
131 item.GeneratedCandidates);
int TotalGeneratedCandidates
Gets total candidate count across root iterations.
IReadOnlyList< CuttingPlaneIterationStatistics > Iterations
Gets root iterations in ascending order.
TimeSpan TotalLpSolveTime
Gets total root LP solver time.
double? FinalMipObjective
Gets the final exact MILP objective, when available.
int TotalSelectedCuts
Gets total selected cuts across root iterations.
CuttingPlaneConvergenceReport(IEnumerable< CuttingPlaneIterationStatistics > iterations, double? finalMipObjective)
Initializes a convergence report.
double? RootGapClosedFraction
Gets the fraction of the initial LP-to-MIP gap closed by root cutting planes. Returns null when the d...
double? FinalRootLpObjective
Gets the objective of the last solved strengthened root LP.
double? InitialLpObjective
Gets the objective of the first root LP.
TimeSpan TotalSeparationTime
Gets total separator time.
double? RootBoundImprovement
Gets absolute improvement of the root lower bound.
Numerical convergence statistics for one root cutting-plane iteration.