feat(engine): add FixedStrategyNestingEngine adapting IPlateNester strategies to INestingEngine
Implements a sealed adapter class that forces a fixed IPlateNester strategy onto any NestJob, overriding the job's own PlacementStrategy while preserving MaxPlates. Delegates all multi-plate allocation and stock selection to NestJobRunner. This allows single-plate nesting strategies to compete as full whole-job INestingEngine solvers in benchmarks, enabling comparative performance testing of placement algorithms across various job configurations. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
using System;
|
||||
using System.Threading;
|
||||
|
||||
namespace OpenNest;
|
||||
|
||||
/// <summary>
|
||||
/// Adapts one fixed IPlateNester strategy to the whole-job INestingEngine contract, so it can compete
|
||||
/// as a full job solver alongside model-submitted engines. Delegates all multi-plate/size selection to
|
||||
/// NestJobRunner; only the placement strategy key is forced, overriding whatever the job itself declared.
|
||||
/// </summary>
|
||||
public sealed class FixedStrategyNestingEngine : INestingEngine
|
||||
{
|
||||
private readonly string strategy;
|
||||
private readonly NestJobRunner runner = new(PlateNesterFactory.Create);
|
||||
|
||||
public FixedStrategyNestingEngine(string strategy)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(strategy))
|
||||
throw new ArgumentException("Strategy cannot be null or whitespace.", nameof(strategy));
|
||||
this.strategy = strategy;
|
||||
}
|
||||
|
||||
public NestJobResult Solve(NestJob job, IProgress<NestJobProgress> progress = null, CancellationToken token = default)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(job);
|
||||
var forced = new NestJob(job.Parts, job.Plates, new NestJobOptions(strategy, job.Options.MaxPlates));
|
||||
return runner.Solve(forced, progress, token);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user