From df72386f193e7e8a9974ee19eab009520a386c37 Mon Sep 17 00:00:00 2001 From: Asriel Camora Date: Thu, 13 Jul 2023 13:02:39 +0200 Subject: [PATCH] Fix edge case exceptions when input simulation is invalid --- Solver/Crafty/Solver.cs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Solver/Crafty/Solver.cs b/Solver/Crafty/Solver.cs index 6ff7771..e54d675 100644 --- a/Solver/Crafty/Solver.cs +++ b/Solver/Crafty/Solver.cs @@ -5,7 +5,6 @@ using System.Diagnostics.Contracts; using System.Numerics; using System.Runtime.CompilerServices; using System.Text; -using System.Threading.Tasks; using Node = Craftimizer.Solver.Crafty.ArenaNode; namespace Craftimizer.Solver.Crafty; @@ -75,10 +74,10 @@ public sealed class Solver actions.Add(node.State.Action.Value); } - var at = node.ChildIdx; - ref var sum = ref node.ParentScores!.Value.Data[at.arrayIdx].ScoreSum.Span[at.subIdx]; - ref var max = ref node.ParentScores!.Value.Data[at.arrayIdx].MaxScore.Span[at.subIdx]; - ref var visits = ref node.ParentScores!.Value.Data[at.arrayIdx].Visits.Span[at.subIdx]; + //var at = node.ChildIdx; + //ref var sum = ref node.ParentScores!.Value.Data[at.arrayIdx].ScoreSum.Span[at.subIdx]; + //ref var max = ref node.ParentScores!.Value.Data[at.arrayIdx].MaxScore.Span[at.subIdx]; + //ref var visits = ref node.ParentScores!.Value.Data[at.arrayIdx].Visits.Span[at.subIdx]; //Console.WriteLine($"{sum} {max} {visits}"); return (actions, node.State); @@ -384,6 +383,9 @@ public sealed class Solver for (var i = 0; i < bestActions.Length; ++i) { var (maxScore, furcatedActionIdx, (solutionActions, solutionNode)) = bestActions[i]; + if (solutionActions.Count == 0) + continue; + var (activeActions, activeState) = activeStates[furcatedActionIdx]; var chosenAction = solutionActions[0]; @@ -432,6 +434,9 @@ public sealed class Solver Console.WriteLine($"{s.Elapsed.TotalMilliseconds:0.00}ms {config.Iterations / config.ForkCount / s.Elapsed.TotalSeconds / 1000:0.00} kI/s/t"); } + if (bestSims.Count == 0) + return (new(), state); + var result = bestSims.MaxBy(s => s.Score).Result; for (var i = definiteActionCount; i < result.Actions.Count; ++i) actionCallback?.Invoke(result.Actions[i]);