From b8afcc6fddc10673f8833b95e0b8e2f3f4bc2ac2 Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Mon, 5 Oct 2026 00:29:47 -0400 Subject: [PATCH] perf(cutting): build finished ordinals once per search expansion The readiness filter rebuilt the finished-part list for every candidate. Build one set per expanded node; the candidates and their order are unchanged. --- OpenNest.Engine/CuttingPlanning/JointCuttingPlanSearch.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/OpenNest.Engine/CuttingPlanning/JointCuttingPlanSearch.cs b/OpenNest.Engine/CuttingPlanning/JointCuttingPlanSearch.cs index fa4c732..f18b21e 100644 --- a/OpenNest.Engine/CuttingPlanning/JointCuttingPlanSearch.cs +++ b/OpenNest.Engine/CuttingPlanning/JointCuttingPlanSearch.cs @@ -58,9 +58,10 @@ internal static class JointCuttingPlanSearch IEnumerable Expand(Node node) { + var finished = node.Order.Select(o => o.SourceOrdinal).ToHashSet(); var sources = node.Active is { } active ? new[] { active.Source } - : snapshot.Placements.Where(p => !node.Order.Any(o => o.SourceOrdinal == p.SourceOrdinal) - && snapshot.Dependencies.IsReady(p.SourceOrdinal, node.Order.Select(o => o.SourceOrdinal).ToArray()) + : snapshot.Placements.Where(p => !finished.Contains(p.SourceOrdinal) + && snapshot.Dependencies.IsReady(p.SourceOrdinal, finished) && (!snapshot.PreservePartOrder || p.SourceOrdinal == node.Order.Length)); foreach (var source in sources) {