diff --git a/Craftimizer/Windows/SynthHelper.cs b/Craftimizer/Windows/SynthHelper.cs index d1853c8..3eb70b7 100644 --- a/Craftimizer/Windows/SynthHelper.cs +++ b/Craftimizer/Windows/SynthHelper.cs @@ -427,7 +427,7 @@ private void DrawMacroActions() } if (ImGui.Button("Open in Macro Editor", new(-1, 0))) - Service.Plugin.OpenMacroEditor(CharacterStats!, RecipeData!, new(Service.ClientState.LocalPlayer!.StatusList), Enumerable.Empty(), null); + Service.Plugin.OpenMacroEditor(CharacterStats!, RecipeData!, new(Service.ClientState.LocalPlayer!.StatusList), [], null); } private void OnStartCrafting(ushort recipeId) diff --git a/Simulator/SimulationState.cs b/Simulator/SimulationState.cs index 8147cdb..2fdc631 100644 --- a/Simulator/SimulationState.cs +++ b/Simulator/SimulationState.cs @@ -18,12 +18,12 @@ public record struct SimulationState public ActionStates ActionStates; // https://github.com/ffxiv-teamcraft/simulator/blob/0682dfa76043ff4ccb38832c184d046ceaff0733/src/model/tables.ts#L2 - private static ReadOnlySpan HQPercentTable => new[] { + private static ReadOnlySpan 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, 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, 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 Collectability => Math.Max(Quality / 10, 1); public readonly int MaxCollectability => Math.Max(Input.Recipe.MaxQuality / 10, 1); diff --git a/Solver/MCTS.cs b/Solver/MCTS.cs index b2030c4..8732110 100644 --- a/Solver/MCTS.cs +++ b/Solver/MCTS.cs @@ -176,9 +176,8 @@ private Node Select() } } - [MethodImpl(MethodImplOptions.NoInlining)] [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 actionBuffer) { ref var initialState = ref initialNode.State; // expand once @@ -194,7 +193,7 @@ private Node Select() var currentActions = expandedNode.State.AvailableActions; byte actionCount = 0; - Span 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 && actionCount < actions.Length) { @@ -260,16 +259,18 @@ static bool NodesIncomplete(Node node, Stack path) 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 random = rootNode.State.State.Input.Random; var staleCounter = 0; var i = 0; + Span actionBuffer = stackalloc ActionType[Math.Min(config.MaxStepCount, config.MaxRolloutStepCount)]; for (; i < iterations || MaxScore == 0; i++) { var selectedNode = Select(); - var (endNode, score) = ExpandAndRollout(random, simulator, selectedNode); + var (endNode, score) = ExpandAndRollout(random, simulator, selectedNode, actionBuffer); if (MaxScore == 0) { if (endNode == selectedNode) diff --git a/Solver/Simulator.cs b/Solver/Simulator.cs index a7be9be..d8ba790 100644 --- a/Solver/Simulator.cs +++ b/Solver/Simulator.cs @@ -29,7 +29,7 @@ public Simulator(ActionType[] actionPool, int maxStepCount, SimulationState? fil State = state; pool = pool.Where(x => x.Item1.IsPossible(this)); } - actionPoolObjects = pool.OrderBy(x => x.x).ToArray(); + actionPoolObjects = [.. pool.OrderBy(x => x.x)]; this.maxStepCount = maxStepCount; } diff --git a/Solver/SolverConfig.cs b/Solver/SolverConfig.cs index 8241ea8..e2f300a 100644 --- a/Solver/SolverConfig.cs +++ b/Solver/SolverConfig.cs @@ -62,7 +62,7 @@ public SolverConfig() } public static ActionType[] OptimizeActionPool(IEnumerable actions) => - actions.Order().ToArray(); + [.. actions.Order()]; public static readonly ActionType[] DeterministicActionPool = OptimizeActionPool(new[] {