mirror of
https://github.com/ajisaacs/OpenNest.git
synced 2026-10-12 22:04:12 -04:00
perf(cutting): try a bounded entry catalogue before full search
This commit is contained in:
1 parent
d328c5f691
commit
1c6d02c480
4 files changed
+93
-1
No files matched your search
@@ -43,6 +43,10 @@ public sealed class CuttingPlanBatch
|
||||
/// </summary>
|
||||
public const int ExpansionsPerPart = 400;
|
||||
|
||||
// Extra bounded work on hard/refused plates; the full-cap search still gets its whole budget.
|
||||
internal const int FirstPassBudget = 1000;
|
||||
internal const int FirstPassEntries = 8;
|
||||
|
||||
private readonly Entry[] entries;
|
||||
private readonly CuttingParameters ownedParameters;
|
||||
|
||||
@@ -142,7 +146,7 @@ public sealed class CuttingPlanBatch
|
||||
if (entry.Reorder != null)
|
||||
{
|
||||
progress?.Report(new(index, entries.Length, entry.Number, CuttingPlanPhase.Reordering));
|
||||
reorder = CuttingPlanService.Plan(entry.Reorder, token);
|
||||
reorder = PlanReorder(entry.Reorder, token);
|
||||
if (reorder.Status != CuttingPlanStatus.NoSolutionWithinBudget)
|
||||
{
|
||||
plans[index] = new(entry.Plate, entry.Number, WithFallback(entry, reorder, token), null, overlap);
|
||||
@@ -156,6 +160,22 @@ public sealed class CuttingPlanBatch
|
||||
return new(plans, ownedParameters);
|
||||
}
|
||||
|
||||
internal static CuttingPlanResult PlanReorder(CuttingPlanSnapshot snapshot, CancellationToken token,
|
||||
int firstPassBudget = FirstPassBudget)
|
||||
{
|
||||
// A failed first pass is not a proof of impossibility: retain all original
|
||||
// full-cap alternatives and the complete original budget for the retry.
|
||||
if (snapshot.Failure == null && snapshot.Regeneration && snapshot.MaxEntries > FirstPassEntries
|
||||
&& snapshot.ExpansionBudget > firstPassBudget)
|
||||
{
|
||||
var first = CuttingPlanService.Plan(snapshot.WithSearchLimits(firstPassBudget, FirstPassEntries), token);
|
||||
if ((first.Status == CuttingPlanStatus.Ready && first.IndependentlyReplayed)
|
||||
|| first.Status == CuttingPlanStatus.Cancelled)
|
||||
return first;
|
||||
}
|
||||
return CuttingPlanService.Plan(snapshot, token);
|
||||
}
|
||||
|
||||
private static CuttingPlanResult WithFallback(Entry entry, CuttingPlanResult strict, CancellationToken token)
|
||||
{
|
||||
if (strict.Status != CuttingPlanStatus.UnsupportedGeometry || entry.Fallback.Failure != null)
|
||||
|
||||
@@ -93,6 +93,13 @@ public sealed class CuttingPlanSnapshot
|
||||
public int ExpansionBudget { get; }
|
||||
internal CuttingPlanStatus? Failure { get; }
|
||||
internal IReadOnlyList<CuttingPlanFinding> Findings { get; }
|
||||
|
||||
// A worker-only search variant over the same owned capture. Never recapture the live plate:
|
||||
// both proposals retain the identical freshness record and confirmed settings.
|
||||
internal CuttingPlanSnapshot WithSearchLimits(int expansionBudget, int maxEntries) =>
|
||||
new(Placements, StartPoint, expansionBudget, Failure, Findings, Regeneration,
|
||||
PreservePartOrder, maxEntries, ExpansionObserver, PlateState, OwnedParameters,
|
||||
Dependencies, BestEffort);
|
||||
}
|
||||
|
||||
public sealed class FixedProgramPlacement
|
||||
|
||||
Reference in new issue
Block a user