Fix crashes
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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[]
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user