Solver token handling fixes, formatting tweaks

This commit is contained in:
Asriel Camora
2023-07-21 15:51:52 +04:00
parent 807e0838a2
commit 8c73796b75
2 changed files with 14 additions and 10 deletions
+1 -1
View File
@@ -82,7 +82,7 @@ public sealed class Simulator : SimulatorNoRandom
if (strict) if (strict)
{ {
// always used Trained Eye if it's available // always use Trained Eye if it's available
if (action == ActionType.TrainedEye) if (action == ActionType.TrainedEye)
return baseAction.CanUse(this); return baseAction.CanUse(this);
+13 -9
View File
@@ -283,7 +283,7 @@ public sealed class Solver
} }
else 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))!; var n = node.ChildAt((i >> 3, i & 7))!;
if (NodesIncomplete(n, path)) if (NodesIncomplete(n, path))
@@ -350,23 +350,24 @@ public sealed class Solver
break; break;
var s = Stopwatch.StartNew(); var s = Stopwatch.StartNew();
var tasks = new List<Task<(float MaxScore, int FurcatedActionIdx, SolverSolution Solution)>>(config.ForkCount); var tasks = new Task<(float MaxScore, int FurcatedActionIdx, SolverSolution Solution)>[config.ForkCount];
for (var i = 0; i < config.ForkCount; i++) for (var i = 0; i < config.ForkCount; i++)
{ {
var stateIdx = (int)((float)i / config.ForkCount * activeStates.Count); var stateIdx = (int)((float)i / config.ForkCount * activeStates.Count);
var st = activeStates[stateIdx]; var st = activeStates[stateIdx];
tasks.Add( tasks[i] = Task.Run(() =>
Task.Run(() =>
{ {
var solver = new Solver(config, activeStates[stateIdx].State); var solver = new Solver(config, activeStates[stateIdx].State);
solver.Search(config.Iterations / config.ForkCount, token); solver.Search(config.Iterations / config.ForkCount, token);
return (solver.MaxScore, stateIdx, solver.Solution()); return (solver.MaxScore, stateIdx, solver.Solution());
}, token) }, token);
);
} }
Task.WaitAll(tasks.ToArray(), CancellationToken.None); Task.WaitAll(tasks, token);
s.Stop(); s.Stop();
if (token.IsCancellationRequested)
break;
var bestActions = tasks.Select(t => t.Result).OrderByDescending(r => r.MaxScore).Take(config.FurcatedActionCount).ToArray(); var bestActions = tasks.Select(t => t.Result).OrderByDescending(r => r.MaxScore).Take(config.FurcatedActionCount).ToArray();
var bestAction = bestActions[0]; var bestAction = bestActions[0];
@@ -403,7 +404,7 @@ public sealed class Solver
var definiteCount = definiteActionCount; var definiteCount = definiteActionCount;
var equalCount = int.MaxValue; var equalCount = int.MaxValue;
var refActions = newStates[0].Actions; 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 cmpActions = newStates[i].Actions;
var possibleCount = Math.Min(Math.Min(refActions.Count, cmpActions.Count), equalCount); 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); solver.Search(config.Iterations / config.ForkCount, token);
return (solver.MaxScore, solver.Solution()); return (solver.MaxScore, solver.Solution());
}, token); }, token);
Task.WaitAll(tasks, CancellationToken.None); Task.WaitAll(tasks, token);
s.Stop(); s.Stop();
if (token.IsCancellationRequested)
break;
var (maxScore, solution) = tasks.Select(t => t.Result).MaxBy(r => r.MaxScore); var (maxScore, solution) = tasks.Select(t => t.Result).MaxBy(r => r.MaxScore);
if (maxScore >= config.ScoreStorageThreshold) if (maxScore >= config.ScoreStorageThreshold)