From 71fc1e61ef4c4c40589049ae7ba472385392e9eb Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Sat, 14 Mar 2026 20:25:33 -0400 Subject: [PATCH] feat(training): enable forced full angle sweep and store per-angle results Co-Authored-By: Claude Sonnet 4.6 --- OpenNest.Engine/ML/BruteForceRunner.cs | 3 ++- OpenNest.Training/Program.cs | 11 ++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/OpenNest.Engine/ML/BruteForceRunner.cs b/OpenNest.Engine/ML/BruteForceRunner.cs index efaa6e8..f273e94 100644 --- a/OpenNest.Engine/ML/BruteForceRunner.cs +++ b/OpenNest.Engine/ML/BruteForceRunner.cs @@ -25,9 +25,10 @@ namespace OpenNest.Engine.ML public static class BruteForceRunner { - public static BruteForceResult Run(Drawing drawing, Plate plate) + public static BruteForceResult Run(Drawing drawing, Plate plate, bool forceFullAngleSweep = false) { var engine = new NestEngine(plate); + engine.ForceFullAngleSweep = forceFullAngleSweep; var item = new NestItem { Drawing = drawing }; var sw = Stopwatch.StartNew(); diff --git a/OpenNest.Training/Program.cs b/OpenNest.Training/Program.cs index 6859c80..421e00c 100644 --- a/OpenNest.Training/Program.cs +++ b/OpenNest.Training/Program.cs @@ -200,7 +200,7 @@ int RunDataCollection(string dir, string dbPath, string saveDir, double s, strin } var sizeSw = Stopwatch.StartNew(); - var result = BruteForceRunner.Run(drawing, runPlate); + var result = BruteForceRunner.Run(drawing, runPlate, forceFullAngleSweep: true); sizeSw.Stop(); if (result == null) @@ -215,7 +215,12 @@ int RunDataCollection(string dir, string dbPath, string saveDir, double s, strin bestCount = result.PartCount; } - Console.WriteLine($" {size.Length}x{size.Width} - {result.PartCount}pcs, {result.Utilization:P1}, {sizeSw.ElapsedMilliseconds}ms"); + var engineInfo = $"{result.WinnerEngine}({result.WinnerTimeMs}ms)"; + if (!string.IsNullOrEmpty(result.RunnerUpEngine)) + engineInfo += $", 2nd={result.RunnerUpEngine}({result.RunnerUpPartCount}pcs/{result.RunnerUpTimeMs}ms)"; + if (!string.IsNullOrEmpty(result.ThirdPlaceEngine)) + engineInfo += $", 3rd={result.ThirdPlaceEngine}({result.ThirdPlacePartCount}pcs/{result.ThirdPlaceTimeMs}ms)"; + Console.WriteLine($" {size.Length}x{size.Width} - {result.PartCount}pcs, {result.Utilization:P1}, {sizeSw.ElapsedMilliseconds}ms [{engineInfo}] angles={result.AngleResults.Count}"); string savedFilePath = null; if (saveDir != null) @@ -258,7 +263,7 @@ int RunDataCollection(string dir, string dbPath, string saveDir, double s, strin writer.Write(savedFilePath); } - db.AddRun(partId, size.Width, size.Length, s, result, savedFilePath); + db.AddRun(partId, size.Width, size.Length, s, result, savedFilePath, result.AngleResults); runsThisPart++; totalRuns++; }