Fix crashes

This commit is contained in:
Asriel Camora
2024-05-06 00:05:49 -07:00
parent 869a27bf3a
commit b5ed17dc15
5 changed files with 11 additions and 10 deletions
+1 -1
View File
@@ -427,7 +427,7 @@ public sealed unsafe class SynthHelper : Window, IDisposable
} }
if (ImGui.Button("Open in Macro Editor", new(-1, 0))) if (ImGui.Button("Open in Macro Editor", new(-1, 0)))
Service.Plugin.OpenMacroEditor(CharacterStats!, RecipeData!, new(Service.ClientState.LocalPlayer!.StatusList), Enumerable.Empty<ActionType>(), null); Service.Plugin.OpenMacroEditor(CharacterStats!, RecipeData!, new(Service.ClientState.LocalPlayer!.StatusList), [], null);
} }
private void OnStartCrafting(ushort recipeId) private void OnStartCrafting(ushort recipeId)
+2 -2
View File
@@ -18,12 +18,12 @@ public record struct SimulationState
public ActionStates ActionStates; public ActionStates ActionStates;
// https://github.com/ffxiv-teamcraft/simulator/blob/0682dfa76043ff4ccb38832c184d046ceaff0733/src/model/tables.ts#L2 // https://github.com/ffxiv-teamcraft/simulator/blob/0682dfa76043ff4ccb38832c184d046ceaff0733/src/model/tables.ts#L2
private static ReadOnlySpan<int> HQPercentTable => new[] { private static ReadOnlySpan<int> HQPercentTable => [
1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8,
9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 17, 17, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 17, 17,
17, 18, 18, 18, 19, 19, 20, 20, 21, 22, 23, 24, 26, 28, 31, 34, 38, 42, 47, 52, 58, 64, 68, 71, 17, 18, 18, 18, 19, 19, 20, 20, 21, 22, 23, 24, 26, 28, 31, 34, 38, 42, 47, 52, 58, 64, 68, 71,
74, 76, 78, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 94, 96, 98, 100 74, 76, 78, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 94, 96, 98, 100
}; ];
public readonly int HQPercent => HQPercentTable[(int)Math.Clamp((float)Quality / Input.Recipe.MaxQuality * 100, 0, 100)]; public readonly int HQPercent => HQPercentTable[(int)Math.Clamp((float)Quality / Input.Recipe.MaxQuality * 100, 0, 100)];
public readonly int Collectability => Math.Max(Quality / 10, 1); public readonly int Collectability => Math.Max(Quality / 10, 1);
public readonly int MaxCollectability => Math.Max(Input.Recipe.MaxQuality / 10, 1); public readonly int MaxCollectability => Math.Max(Input.Recipe.MaxQuality / 10, 1);
+6 -5
View File
@@ -176,9 +176,8 @@ public sealed class MCTS
} }
} }
[MethodImpl(MethodImplOptions.NoInlining)]
[SkipLocalsInit] [SkipLocalsInit]
private (Node ExpandedNode, float Score) ExpandAndRollout(Random random, Simulator simulator, Node initialNode) private (Node ExpandedNode, float Score) ExpandAndRollout(Random random, Simulator simulator, Node initialNode, Span<ActionType> actionBuffer)
{ {
ref var initialState = ref initialNode.State; ref var initialState = ref initialNode.State;
// expand once // expand once
@@ -194,7 +193,7 @@ public sealed class MCTS
var currentActions = expandedNode.State.AvailableActions; var currentActions = expandedNode.State.AvailableActions;
byte actionCount = 0; byte actionCount = 0;
Span<ActionType> actions = stackalloc ActionType[Math.Min(config.MaxStepCount - currentState.ActionCount, config.MaxRolloutStepCount)]; var actions = actionBuffer[..Math.Min(config.MaxStepCount - currentState.ActionCount, config.MaxRolloutStepCount)];
while (SimulationNode.GetCompletionState(currentCompletionState, currentActions) == CompletionState.Incomplete && while (SimulationNode.GetCompletionState(currentCompletionState, currentActions) == CompletionState.Incomplete &&
actionCount < actions.Length) actionCount < actions.Length)
{ {
@@ -260,16 +259,18 @@ public sealed class MCTS
return !NodesIncomplete(rootNode, new()); return !NodesIncomplete(rootNode, new());
} }
public void Search(int iterations, ref int progress, CancellationToken token) [SkipLocalsInit]
public unsafe void Search(int iterations, ref int progress, CancellationToken token)
{ {
var simulator = new Simulator(config.ActionPool, config.MaxStepCount, rootNode.State.State); var simulator = new Simulator(config.ActionPool, config.MaxStepCount, rootNode.State.State);
var random = rootNode.State.State.Input.Random; var random = rootNode.State.State.Input.Random;
var staleCounter = 0; var staleCounter = 0;
var i = 0; var i = 0;
Span<ActionType> actionBuffer = stackalloc ActionType[Math.Min(config.MaxStepCount, config.MaxRolloutStepCount)];
for (; i < iterations || MaxScore == 0; i++) for (; i < iterations || MaxScore == 0; i++)
{ {
var selectedNode = Select(); var selectedNode = Select();
var (endNode, score) = ExpandAndRollout(random, simulator, selectedNode); var (endNode, score) = ExpandAndRollout(random, simulator, selectedNode, actionBuffer);
if (MaxScore == 0) if (MaxScore == 0)
{ {
if (endNode == selectedNode) if (endNode == selectedNode)
+1 -1
View File
@@ -29,7 +29,7 @@ internal sealed class Simulator : SimulatorNoRandom
State = state; State = state;
pool = pool.Where(x => x.Item1.IsPossible(this)); pool = pool.Where(x => x.Item1.IsPossible(this));
} }
actionPoolObjects = pool.OrderBy(x => x.x).ToArray(); actionPoolObjects = [.. pool.OrderBy(x => x.x)];
this.maxStepCount = maxStepCount; this.maxStepCount = maxStepCount;
} }
+1 -1
View File
@@ -62,7 +62,7 @@ public readonly record struct SolverConfig
} }
public static ActionType[] OptimizeActionPool(IEnumerable<ActionType> actions) => public static ActionType[] OptimizeActionPool(IEnumerable<ActionType> actions) =>
actions.Order().ToArray(); [.. actions.Order()];
public static readonly ActionType[] DeterministicActionPool = OptimizeActionPool(new[] public static readonly ActionType[] DeterministicActionPool = OptimizeActionPool(new[]
{ {