Skip to content

Commit

Permalink
Remove simulator virtual calls
Browse files Browse the repository at this point in the history
  • Loading branch information
WorkingRobot committed Nov 10, 2023
1 parent a8c3f34 commit 34f783d
Show file tree
Hide file tree
Showing 56 changed files with 315 additions and 290 deletions.
1 change: 1 addition & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ dotnet_diagnostic.CA1825.severity = warning
dotnet_diagnostic.CA1841.severity = suggestion
dotnet_diagnostic.CA1845.severity = suggestion
dotnet_diagnostic.MA0011.severity = silent
dotnet_diagnostic.MA0018.severity = silent
dotnet_diagnostic.MA0076.severity = silent
dotnet_diagnostic.MA0046.severity = silent
dotnet_diagnostic.MA0002.severity = silent
Expand Down
9 changes: 6 additions & 3 deletions Benchmark/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,9 +102,12 @@ private static async Task RunOther()
MaxStepCount = 30,
};

var sim = new SimulatorNoRandom(new(input));
(_, var state) = sim.Execute(new(input), ActionType.MuscleMemory);
(_, state) = sim.Execute(state, ActionType.PrudentTouch);
var state = new SimulationState(input);
state.ExecuteMultiple<SimulatorNoRandom>(new[]
{
ActionType.MuscleMemory,
ActionType.PrudentTouch
});
//(_, state) = sim.Execute(state, ActionType.Manipulation);
//(_, state) = sim.Execute(state, ActionType.Veneration);
//(_, state) = sim.Execute(state, ActionType.WasteNot);
Expand Down
38 changes: 21 additions & 17 deletions Craftimizer/Windows/MacroEditor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -904,7 +904,8 @@ private void DrawIngredientHQEntry(int idx)

private void DrawActionHotbars()
{
var sim = new Sim(State);
var state = State;
var sim = new Simulator<Sim>(ref state);

var imageSize = ImGui.GetFrameHeight() * 2;
var spacing = ImGui.GetStyle().ItemSpacing.Y;
Expand Down Expand Up @@ -1130,10 +1131,7 @@ private void DrawMacro()
ImGui.PopClipRect();
}
if (ImGui.IsItemHovered(ImGuiHoveredFlags.AllowWhenDisabled))
{
var sim = new Sim(lastState);
ImGui.SetTooltip($"{action.GetName(RecipeData!.ClassJob)}\n{actionBase.GetTooltip(sim, true)}");
}
ImGui.SetTooltip($"{action.GetName(RecipeData!.ClassJob)}\n{actionBase.GetTooltip(new Simulator<Sim>(ref lastState), true)}");
lastState = state;
}
}
Expand Down Expand Up @@ -1483,10 +1481,12 @@ private void SaveMacro()
private void RecalculateState()
{
InitialState = new SimulationState(new(CharacterStats, RecipeData.RecipeInfo, StartingQuality));
var sim = new Sim(InitialState);
var lastState = InitialState;
foreach (var step in Macro)
lastState = ((step.Response, step.State) = sim.Execute(lastState, step.Action)).State;
{
(step.Response, _, _) = lastState.ExecuteOn<Sim>(step.Action);
step.State = lastState;
}
}

private void AddStep(ActionType action, int index = -1, bool isSolver = false)
Expand All @@ -1500,19 +1500,20 @@ private void AddStep(ActionType action, int index = -1, bool isSolver = false)

if (index == -1)
{
var sim = new Sim(State);
var resp = sim.Execute(State, action);
Macro.Add(new() { Action = action, Response = resp.Response, State = resp.NewState });
var (resp, _, _, newState) = State.Execute<Sim>(action);
Macro.Add(new() { Action = action, Response = resp, State = newState });
}
else
{
var state = index == 0 ? InitialState : Macro[index - 1].State;
var sim = new Sim(state);
var resp = sim.Execute(state, action);
Macro.Insert(index, new() { Action = action, Response = resp.Response, State = resp.NewState });
state = resp.NewState;
var (resp, _, _) = state.ExecuteOn<Sim>(action);
Macro.Insert(index, new() { Action = action, Response = resp, State = state });
for (var i = index + 1; i < Macro.Count; i++)
state = ((Macro[i].Response, Macro[i].State) = sim.Execute(state, Macro[i].Action)).State;
{
var step = Macro[i];
(step.Response, _, _) = state.ExecuteOn<Sim>(step.Action);
step.State = state;
}
}
}

Expand All @@ -1527,9 +1528,12 @@ private void RemoveStep(int index)
Macro.RemoveAt(index);

var state = index == 0 ? InitialState : Macro[index - 1].State;
var sim = new Sim(state);
for (var i = index; i < Macro.Count; i++)
state = ((Macro[i].Response, Macro[i].State) = sim.Execute(state, Macro[i].Action)).State;
{
var step = Macro[i];
(step.Response, _, _) = state.ExecuteOn<Sim>(step.Action);
step.State = state;
}
}

public void Dispose()
Expand Down
3 changes: 1 addition & 2 deletions Craftimizer/Windows/MacroList.cs
Original file line number Diff line number Diff line change
Expand Up @@ -329,8 +329,7 @@ private void OnMacroListChanged()
return state;

state = new SimulationState(new(CharacterStats, RecipeData.RecipeInfo));
var sim = new Sim(state);
(_, state, _) = sim.ExecuteMultiple(state, macro.Actions);
state.ExecuteMultipleOn<Sim>(macro.Actions);
return MacroStateCache[macro] = state;
}

Expand Down
5 changes: 2 additions & 3 deletions Craftimizer/Windows/RecipeNote.cs
Original file line number Diff line number Diff line change
Expand Up @@ -824,7 +824,6 @@ private void CalculateBestMacrosTask(CancellationToken token)
var state = new SimulationState(input);
var config = Service.Configuration.SimulatorSolverConfig;
var mctsConfig = new MCTSConfig(config);
var simulator = new SimulatorNoRandom(state);
List<Macro> macros = new(Service.Configuration.Macros);

token.ThrowIfCancellationRequested();
Expand All @@ -835,9 +834,9 @@ private void CalculateBestMacrosTask(CancellationToken token)
var bestSaved = macros
.Select(macro =>
{
var (resp, outState, failedIdx) = simulator.ExecuteMultiple(state, macro.Actions);
var (resp, completionState, _, failedIdx, outState) = state.ExecuteMultiple<SimulatorNoRandom>(macro.Actions);
outState.ActionCount = macro.Actions.Count;
var score = SimulationNode.CalculateScoreForState(outState, simulator.CompletionState, mctsConfig) ?? 0;
var score = SimulationNode.CalculateScoreForState(outState, completionState, mctsConfig) ?? 0;
if (resp != ActionResponse.SimulationComplete)
{
if (failedIdx != -1)
Expand Down
6 changes: 0 additions & 6 deletions Simulator/Actions/ActionType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,12 +63,6 @@ static ActionUtils()
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static BaseAction Base(this ActionType me) => Actions[(int)me];

public static IEnumerable<ActionType> AvailableActions(Simulator simulation) =>
simulation.IsComplete
? Enumerable.Empty<ActionType>()
: Enum.GetValues<ActionType>()
.Where(a => a.Base().CanUse(simulation));

public static int Level(this ActionType me) =>
me.Base().Level;

Expand Down
4 changes: 2 additions & 2 deletions Simulator/Actions/AdvancedTouch.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ internal sealed class AdvancedTouch : BaseAction

public override bool IncreasesQuality => true;

public override int CPCost(Simulator s) => s.ActionStates.TouchComboIdx == 2 ? 18 : 46;
public override int Efficiency(Simulator s) => 150;
public override int CPCost<S>(Simulator<S> s) => s.ActionStates.TouchComboIdx == 2 ? 18 : 46;
public override int Efficiency<S>(Simulator<S> s) => 150;
}
14 changes: 7 additions & 7 deletions Simulator/Actions/BaseAction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,14 @@ public abstract class BaseAction
public virtual bool IncreasesStepCount => true;

// Instanced properties
public abstract int CPCost(Simulator s);
public virtual int Efficiency(Simulator s) => 0;
public virtual float SuccessRate(Simulator s) => 1f;
public abstract int CPCost<S>(Simulator<S> s) where S : ISimulator;
public virtual int Efficiency<S>(Simulator<S> s) where S : ISimulator => 0;
public virtual float SuccessRate<S>(Simulator<S> s) where S : ISimulator => 1f;

public virtual bool CanUse(Simulator s) =>
public virtual bool CanUse<S>(Simulator<S> s) where S : ISimulator =>
s.Input.Stats.Level >= Level && s.CP >= CPCost(s);

public virtual void Use(Simulator s)
public virtual void Use<S>(Simulator<S> s) where S : ISimulator
{
if (s.RollSuccess(SuccessRate(s)))
UseSuccess(s);
Expand All @@ -52,7 +52,7 @@ public virtual void Use(Simulator s)
s.ActiveEffects.DecrementDuration();
}

public virtual void UseSuccess(Simulator s)
public virtual void UseSuccess<S>(Simulator<S> s) where S : ISimulator
{
if (Efficiency(s) != 0f)
{
Expand All @@ -63,7 +63,7 @@ public virtual void UseSuccess(Simulator s)
}
}

public virtual string GetTooltip(Simulator s, bool addUsability)
public virtual string GetTooltip<S>(Simulator<S> s, bool addUsability) where S : ISimulator
{
var builder = new StringBuilder();
if (addUsability && !CanUse(s))
Expand Down
6 changes: 3 additions & 3 deletions Simulator/Actions/BaseBuffAction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,16 @@ internal abstract class BaseBuffAction : BaseAction

public sealed override int DurabilityCost => 0;

public override void UseSuccess(Simulator s) =>
public override void UseSuccess<S>(Simulator<S> s) =>
s.AddEffect(Effect, Duration);

public override string GetTooltip(Simulator s, bool addUsability)
public override string GetTooltip<S>(Simulator<S> s, bool addUsability)
{
var builder = new StringBuilder(base.GetTooltip(s, addUsability));
builder.AppendLine($"{Duration} Steps");
return builder.ToString();
}

protected string GetBaseTooltip(Simulator s, bool addUsability) =>
protected string GetBaseTooltip<S>(Simulator<S> s, bool addUsability) where S : ISimulator =>
base.GetTooltip(s, addUsability);
}
8 changes: 1 addition & 7 deletions Simulator/Actions/BaseComboAction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ public abstract class BaseComboAction : BaseAction

public sealed override ActionCategory Category => ActionCategory.Combo;

protected bool BaseCanUse(Simulator s) =>
protected bool BaseCanUse<S>(Simulator<S> s) where S : ISimulator =>
base.CanUse(s);

private static bool VerifyDurability2(int durabilityA, int durability, Effects effects)
Expand All @@ -26,9 +26,6 @@ private static bool VerifyDurability2(int durabilityA, int durability, Effects e
public static bool VerifyDurability2(SimulationState s, int durabilityA) =>
VerifyDurability2(durabilityA, s.Durability, s.ActiveEffects);

public static bool VerifyDurability2(Simulator s, int durabilityA) =>
VerifyDurability2(durabilityA, s.Durability, s.ActiveEffects);

public static bool VerifyDurability3(int durabilityA, int durabilityB, int durability, Effects effects)
{
var wasteNots = Math.Max(effects.GetDuration(EffectType.WasteNot), effects.GetDuration(EffectType.WasteNot2));
Expand All @@ -54,9 +51,6 @@ public static bool VerifyDurability3(int durabilityA, int durabilityB, int durab
return true;
}

public static bool VerifyDurability3(Simulator s, int durabilityA, int durabilityB) =>
VerifyDurability3(durabilityA, durabilityB, s.Durability, s.ActiveEffects);

public static bool VerifyDurability3(SimulationState s, int durabilityA, int durabilityB) =>
VerifyDurability3(durabilityA, durabilityB, s.Durability, s.ActiveEffects);
}
8 changes: 4 additions & 4 deletions Simulator/Actions/BaseComboActionImpl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,17 @@ namespace Craftimizer.Simulator.Actions;
public override bool IncreasesProgress => ActionA.IncreasesProgress || ActionB.IncreasesProgress;
public override bool IncreasesQuality => ActionA.IncreasesQuality || ActionB.IncreasesQuality;

public override int CPCost(Simulator s) => ActionA.CPCost(s) + ActionB.CPCost(s);
public override int CPCost<S>(Simulator<S> s) => ActionA.CPCost(s) + ActionB.CPCost(s);

public override bool CanUse(Simulator s) =>
public override bool CanUse<S>(Simulator<S> s) =>
BaseCanUse(s) && VerifyDurability2(s, ActionA.DurabilityCost);

public override void Use(Simulator s)
public override void Use<S>(Simulator<S> s)
{
ActionA.Use(s);
ActionB.Use(s);
}

public override string GetTooltip(Simulator s, bool addUsability) =>
public override string GetTooltip<S>(Simulator<S> s, bool addUsability) =>
$"{ActionA.GetTooltip(s, addUsability)}\n\n{ActionB.GetTooltip(s, addUsability)}";
}
4 changes: 2 additions & 2 deletions Simulator/Actions/BasicSynthesis.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ internal sealed class BasicSynthesis : BaseAction

public override bool IncreasesProgress => true;

public override int CPCost(Simulator s) => 0;
public override int CPCost<S>(Simulator<S> s) => 0;
// Basic Synthesis Mastery Trait
public override int Efficiency(Simulator s) => s.Input.Stats.Level >= 31 ? 120 : 100;
public override int Efficiency<S>(Simulator<S> s) => s.Input.Stats.Level >= 31 ? 120 : 100;
}
4 changes: 2 additions & 2 deletions Simulator/Actions/BasicTouch.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ internal sealed class BasicTouch : BaseAction

public override bool IncreasesQuality => true;

public override int CPCost(Simulator s) => 18;
public override int Efficiency(Simulator s) => 100;
public override int CPCost<S>(Simulator<S> s) => 18;
public override int Efficiency<S>(Simulator<S> s) => 100;
}
8 changes: 4 additions & 4 deletions Simulator/Actions/ByregotsBlessing.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ internal sealed class ByregotsBlessing : BaseAction

public override bool IncreasesQuality => true;

public override int CPCost(Simulator s) => 24;
public override int Efficiency(Simulator s) => 100 + (20 * s.GetEffectStrength(EffectType.InnerQuiet));
public override int CPCost<S>(Simulator<S> s) => 24;
public override int Efficiency<S>(Simulator<S> s) => 100 + (20 * s.GetEffectStrength(EffectType.InnerQuiet));

public override bool CanUse(Simulator s) => s.HasEffect(EffectType.InnerQuiet) && base.CanUse(s);
public override bool CanUse<S>(Simulator<S> s) => s.HasEffect(EffectType.InnerQuiet) && base.CanUse(s);

public override void UseSuccess(Simulator s)
public override void UseSuccess<S>(Simulator<S> s)
{
base.UseSuccess(s);
s.RemoveEffect(EffectType.InnerQuiet);
Expand Down
8 changes: 4 additions & 4 deletions Simulator/Actions/CarefulObservation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ internal sealed class CarefulObservation : BaseAction
public override int DurabilityCost => 0;
public override bool IncreasesStepCount => false;

public override int CPCost(Simulator s) => 0;
public override int CPCost<S>(Simulator<S> s) => 0;

public override bool CanUse(Simulator s) => s.Input.Stats.IsSpecialist && s.ActionStates.CarefulObservationCount < 3;
public override bool CanUse<S>(Simulator<S> s) => s.Input.Stats.IsSpecialist && s.ActionStates.CarefulObservationCount < 3;

public override void UseSuccess(Simulator s) => s.StepCondition();
public override void UseSuccess<S>(Simulator<S> s) => s.StepCondition();

public override string GetTooltip(Simulator s, bool addUsability) =>
public override string GetTooltip<S>(Simulator<S> s, bool addUsability) =>
$"{base.GetTooltip(s, addUsability)}Specialist Only";
}
4 changes: 2 additions & 2 deletions Simulator/Actions/CarefulSynthesis.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ internal sealed class CarefulSynthesis : BaseAction

public override bool IncreasesProgress => true;

public override int CPCost(Simulator s) => 7;
public override int CPCost<S>(Simulator<S> s) => 7;
// Careful Synthesis Mastery Trait
public override int Efficiency(Simulator s) => s.Input.Stats.Level >= 82 ? 180 : 150;
public override int Efficiency<S>(Simulator<S> s) => s.Input.Stats.Level >= 82 ? 180 : 150;
}
4 changes: 2 additions & 2 deletions Simulator/Actions/DelicateSynthesis.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@ internal sealed class DelicateSynthesis : BaseAction
public override bool IncreasesProgress => true;
public override bool IncreasesQuality => true;

public override int CPCost(Simulator s) => 32;
public override int Efficiency(Simulator s) => 100;
public override int CPCost<S>(Simulator<S> s) => 32;
public override int Efficiency<S>(Simulator<S> s) => 100;
}
2 changes: 1 addition & 1 deletion Simulator/Actions/FinalAppraisal.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,5 @@ internal sealed class FinalAppraisal : BaseBuffAction
public override EffectType Effect => EffectType.FinalAppraisal;
public override byte Duration => 5;

public override int CPCost(Simulator s) => 1;
public override int CPCost<S>(Simulator<S> s) => 1;
}
6 changes: 3 additions & 3 deletions Simulator/Actions/FocusedSynthesis.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ internal sealed class FocusedSynthesis : BaseAction

public override bool IncreasesProgress => true;

public override int CPCost(Simulator s) => 5;
public override int Efficiency(Simulator s) => 200;
public override float SuccessRate(Simulator s) => s.ActionStates.Observed ? 1.00f : 0.50f;
public override int CPCost<S>(Simulator<S> s) => 5;
public override int Efficiency<S>(Simulator<S> s) => 200;
public override float SuccessRate<S>(Simulator<S> s) => s.ActionStates.Observed ? 1.00f : 0.50f;
}
6 changes: 3 additions & 3 deletions Simulator/Actions/FocusedTouch.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ internal sealed class FocusedTouch : BaseAction

public override bool IncreasesQuality => true;

public override int CPCost(Simulator s) => 18;
public override int Efficiency(Simulator s) => 150;
public override float SuccessRate(Simulator s) => s.ActionStates.Observed ? 1.00f : 0.50f;
public override int CPCost<S>(Simulator<S> s) => 18;
public override int Efficiency<S>(Simulator<S> s) => 150;
public override float SuccessRate<S>(Simulator<S> s) => s.ActionStates.Observed ? 1.00f : 0.50f;
}
2 changes: 1 addition & 1 deletion Simulator/Actions/GreatStrides.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ internal sealed class GreatStrides : BaseBuffAction
public override EffectType Effect => EffectType.GreatStrides;
public override byte Duration => 3;

public override int CPCost(Simulator s) => 32;
public override int CPCost<S>(Simulator<S> s) => 32;
}
4 changes: 2 additions & 2 deletions Simulator/Actions/Groundwork.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ internal sealed class Groundwork : BaseAction
public override bool IncreasesProgress => true;
public override int DurabilityCost => 20;

public override int CPCost(Simulator s) => 18;
public override int Efficiency(Simulator s)
public override int CPCost<S>(Simulator<S> s) => 18;
public override int Efficiency<S>(Simulator<S> s)
{
// Groundwork Mastery Trait
var ret = s.Input.Stats.Level >= 86 ? 360 : 300;
Expand Down
6 changes: 3 additions & 3 deletions Simulator/Actions/HastyTouch.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ internal sealed class HastyTouch : BaseAction

public override bool IncreasesQuality => true;

public override int CPCost(Simulator s) => 0;
public override int Efficiency(Simulator s) => 100;
public override float SuccessRate(Simulator s) => 0.60f;
public override int CPCost<S>(Simulator<S> s) => 0;
public override int Efficiency<S>(Simulator<S> s) => 100;
public override float SuccessRate<S>(Simulator<S> s) => 0.60f;
}
Loading

1 comment on commit 34f783d

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: 34f783d Previous: a8c3f34 Ratio
Craftimizer.Benchmark.Bench.Solve(State: SimulationState { Input = SimulationInput { Stats = CharacterStats { Craftsmanship = 3290, Control = 3541, CP = 649, Level = 90, CanUseManipulation = True, HasSplendorousBuff = False, IsSpecialist = False, CLvl = 560 }, Recipe = RecipeInfo { IsExpert = False, ClassJobLevel = 90, RLvl = 580, ConditionsFlag = 15, MaxDurability = 70, MaxQuality = 10920, MaxProgress = 3900, QualityModifier = 70, QualityDivider = 115, ProgressModifier = 80, ProgressDivider = 130 }, Random = System.Random, StartingQuality = 0, BaseProgressGain = 204, BaseQualityGain = 240 }, ActionCount = 0, StepCount = 0, Progress = 0, Quality = 0, Durability = 70, CP = 649, Condition = Normal, ActiveEffects = Effects { InnerQuiet = 0, WasteNot = 0, Veneration = 0, GreatStrides = 0, Innovation = 0, FinalAppraisal = 0, WasteNot2 = 0, MuscleMemory = 0, Manipulation = 0, HeartAndSoul = False }, ActionStates = ActionStates { TouchComboIdx = 0, CarefulObservationCount = 0, UsedHeartAndSoul = False, Observed = False }, HQPercent = 1, Collectability = 1, MaxCollectability = 1092, IsFirstStep = True }, Config: SolverConfig { Iterations = 30000, ScoreStorageThreshold = 1, MaxScoreWeightingConstant = 0.1, ExplorationConstant = 4, MaxStepCount = 30, MaxRolloutStepCount = 99, MaxThreadCount = 1, ForkCount = 32, FurcatedActionCount = 16, StrictActions = True, ScoreProgress = 0.2, ScoreQuality = 0.65, ScoreDurability = 0.05, ScoreCP = 0.05, ScoreSteps = 0.05, Algorithm = Stepwise }) 3703333073.3333335 ns (± 25768283.642478753) 1615357033.3333333 ns (± 25782653.001018967) 2.29
Craftimizer.Benchmark.Bench.Solve(State: SimulationState { Input = SimulationInput { Stats = CharacterStats { Craftsmanship = 3304, Control = 3374, CP = 575, Level = 90, CanUseManipulation = True, HasSplendorousBuff = False, IsSpecialist = False, CLvl = 560 }, Recipe = RecipeInfo { IsExpert = False, ClassJobLevel = 90, RLvl = 560, ConditionsFlag = 15, MaxDurability = 80, MaxQuality = 7200, MaxProgress = 3500, QualityModifier = 80, QualityDivider = 115, ProgressModifier = 90, ProgressDivider = 130 }, Random = System.Random, StartingQuality = 0, BaseProgressGain = 230, BaseQualityGain = 262 }, ActionCount = 0, StepCount = 0, Progress = 0, Quality = 0, Durability = 80, CP = 575, Condition = Normal, ActiveEffects = Effects { InnerQuiet = 0, WasteNot = 0, Veneration = 0, GreatStrides = 0, Innovation = 0, FinalAppraisal = 0, WasteNot2 = 0, MuscleMemory = 0, Manipulation = 0, HeartAndSoul = False }, ActionStates = ActionStates { TouchComboIdx = 0, CarefulObservationCount = 0, UsedHeartAndSoul = False, Observed = False }, HQPercent = 1, Collectability = 1, MaxCollectability = 720, IsFirstStep = True }, Config: SolverConfig { Iterations = 30000, ScoreStorageThreshold = 1, MaxScoreWeightingConstant = 0.1, ExplorationConstant = 4, MaxStepCount = 30, MaxRolloutStepCount = 99, MaxThreadCount = 1, ForkCount = 32, FurcatedActionCount = 16, StrictActions = True, ScoreProgress = 0.2, ScoreQuality = 0.65, ScoreDurability = 0.05, ScoreCP = 0.05, ScoreSteps = 0.05, Algorithm = Stepwise }) 4140185646.6666665 ns (± 35980624.48703402) 1789215973.6842105 ns (± 38215823.53474426) 2.31

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.