From 8c73796b75334b22bce0e817f57ac58a7b811321 Mon Sep 17 00:00:00 2001 From: Asriel Camora Date: Fri, 21 Jul 2023 15:51:52 +0400 Subject: [PATCH] Solver token handling fixes, formatting tweaks --- Solver/Crafty/Simulator.cs | 2 +- Solver/Crafty/Solver.cs | 22 +++++++++++++--------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/Solver/Crafty/Simulator.cs b/Solver/Crafty/Simulator.cs index 4aceeb5..1b532e5 100644 --- a/Solver/Crafty/Simulator.cs +++ b/Solver/Crafty/Simulator.cs @@ -82,7 +82,7 @@ public sealed class Simulator : SimulatorNoRandom if (strict) { - // always used Trained Eye if it's available + // always use Trained Eye if it's available if (action == ActionType.TrainedEye) return baseAction.CanUse(this); diff --git a/Solver/Crafty/Solver.cs b/Solver/Crafty/Solver.cs index 041e36e..25041fc 100644 --- a/Solver/Crafty/Solver.cs +++ b/Solver/Crafty/Solver.cs @@ -283,7 +283,7 @@ public sealed class Solver } else { - for(var i = 0; i < node.Children.Count; ++i) + for (var i = 0; i < node.Children.Count; ++i) { var n = node.ChildAt((i >> 3, i & 7))!; if (NodesIncomplete(n, path)) @@ -350,23 +350,24 @@ public sealed class Solver break; var s = Stopwatch.StartNew(); - var tasks = new List>(config.ForkCount); + var tasks = new Task<(float MaxScore, int FurcatedActionIdx, SolverSolution Solution)>[config.ForkCount]; for (var i = 0; i < config.ForkCount; i++) { var stateIdx = (int)((float)i / config.ForkCount * activeStates.Count); var st = activeStates[stateIdx]; - tasks.Add( - Task.Run(() => + tasks[i] = Task.Run(() => { var solver = new Solver(config, activeStates[stateIdx].State); solver.Search(config.Iterations / config.ForkCount, token); return (solver.MaxScore, stateIdx, solver.Solution()); - }, token) - ); + }, token); } - Task.WaitAll(tasks.ToArray(), CancellationToken.None); + Task.WaitAll(tasks, token); s.Stop(); + if (token.IsCancellationRequested) + break; + var bestActions = tasks.Select(t => t.Result).OrderByDescending(r => r.MaxScore).Take(config.FurcatedActionCount).ToArray(); var bestAction = bestActions[0]; @@ -403,7 +404,7 @@ public sealed class Solver var definiteCount = definiteActionCount; var equalCount = int.MaxValue; var refActions = newStates[0].Actions; - for(var i = 1; i < newStates.Count; ++i) + for (var i = 1; i < newStates.Count; ++i) { var cmpActions = newStates[i].Actions; var possibleCount = Math.Min(Math.Min(refActions.Count, cmpActions.Count), equalCount); @@ -469,9 +470,12 @@ public sealed class Solver solver.Search(config.Iterations / config.ForkCount, token); return (solver.MaxScore, solver.Solution()); }, token); - Task.WaitAll(tasks, CancellationToken.None); + Task.WaitAll(tasks, token); s.Stop(); + if (token.IsCancellationRequested) + break; + var (maxScore, solution) = tasks.Select(t => t.Result).MaxBy(r => r.MaxScore); if (maxScore >= config.ScoreStorageThreshold)