Refactor reliability

This commit is contained in:
Asriel Camora
2023-11-12 18:25:48 -08:00
parent 44700abd4e
commit f63483c9bd
+31 -26
View File
@@ -99,7 +99,9 @@ public sealed class MacroEditor : Window, IDisposable
public void Finalize(int count) public void Finalize(int count)
{ {
if (count != 0) if (count == 0)
Average = Max = Min = 0;
else
Average /= count; Average /= count;
} }
} }
@@ -138,16 +140,33 @@ public sealed class MacroEditor : Window, IDisposable
private sealed record SimulatedActionStep private sealed record SimulatedActionStep
{ {
public ActionType Action { get; init; } public ActionType Action { get; }
// State *after* executing the action // State *after* executing the action
public ActionResponse Response { get; set; } public ActionResponse Response { get; private set; }
public SimulationState State { get; set; } public SimulationState State { get; private set; }
public SimulationReliablity Reliability { get; set; } private SimulationReliablity? Reliability { get; set; }
public SimulatedActionStep(ActionType action, Sim sim, in SimulationState lastState, out SimulationState newState)
{
Action = action;
newState = Recalculate(sim, lastState);
}
public SimulationState Recalculate(Sim sim, in SimulationState lastState)
{
(Response, State) = sim.Execute(lastState, Action);
Reliability = null;
return State;
}
public SimulationReliablity GetReliability(in SimulationState initialState, IEnumerable<ActionType> actionSet, RecipeData recipeData) =>
Reliability ??= new(initialState, actionSet, Service.Configuration.ReliabilitySimulationCount, recipeData);
}; };
private List<SimulatedActionStep> Macro { get; set; } = new(); private List<SimulatedActionStep> Macro { get; set; } = new();
private SimulationState InitialState { get; set; } private SimulationState InitialState { get; set; }
private SimulationState State => Macro.Count > 0 ? Macro[^1].State : InitialState; private SimulationState State => Macro.Count > 0 ? Macro[^1].State : InitialState;
private SimulationReliablity Reliability => Macro.Count > 0 ? Macro[^1].Reliability : new(InitialState, Array.Empty<ActionType>(), 0, RecipeData); private SimulationReliablity Reliability => Macro.Count > 0 ? Macro[^1].GetReliability(InitialState, Macro.Select(m => m.Action), RecipeData) : new(InitialState, Array.Empty<ActionType>(), 0, RecipeData);
private ActionType[] DefaultActions { get; } private ActionType[] DefaultActions { get; }
private Action<IEnumerable<ActionType>>? MacroSetter { get; set; } private Action<IEnumerable<ActionType>>? MacroSetter { get; set; }
@@ -1587,10 +1606,7 @@ public sealed class MacroEditor : Window, IDisposable
var sim = new Sim(InitialState); var sim = new Sim(InitialState);
var lastState = InitialState; var lastState = InitialState;
for (var i = 0; i < Macro.Count; i++) for (var i = 0; i < Macro.Count; i++)
{ lastState = Macro[i].Recalculate(sim, lastState);
lastState = ((Macro[i].Response, Macro[i].State) = sim.Execute(lastState, Macro[i].Action)).State;
Macro[i].Reliability = new(InitialState, Macro.Take(i + 1).Select(s => s.Action), Service.Configuration.ReliabilitySimulationCount, RecipeData);
}
} }
private void AddStep(ActionType action, int index = -1, bool isSolver = false) private void AddStep(ActionType action, int index = -1, bool isSolver = false)
@@ -1605,24 +1621,16 @@ public sealed class MacroEditor : Window, IDisposable
if (index == -1) if (index == -1)
{ {
var sim = new Sim(State); var sim = new Sim(State);
var resp = sim.Execute(State, action); Macro.Add(new(action, sim, State, out _));
Macro.Add(new() { Action = action, Response = resp.Response, State = resp.NewState });
Macro[^1].Reliability = new(InitialState, Macro.Select(s => s.Action), Service.Configuration.ReliabilitySimulationCount, RecipeData);
} }
else else
{ {
var state = index == 0 ? InitialState : Macro[index - 1].State; var state = index == 0 ? InitialState : Macro[index - 1].State;
var sim = new Sim(state); var sim = new Sim(state);
var resp = sim.Execute(state, action); Macro.Insert(index, new(action, sim, state, out state));
Macro.Insert(index, new() { Action = action, Response = resp.Response, State = resp.NewState });
Macro[index].Reliability = new(InitialState, Macro.Take(index + 1).Select(s => s.Action), Service.Configuration.ReliabilitySimulationCount, RecipeData);
state = resp.NewState;
for (var i = index + 1; i < Macro.Count; i++) for (var i = index + 1; i < Macro.Count; i++)
{ state = Macro[i].Recalculate(sim, state);
state = ((Macro[i].Response, Macro[i].State) = sim.Execute(state, Macro[i].Action)).State;
Macro[i].Reliability = new(InitialState, Macro.Take(i + 1).Select(s => s.Action), Service.Configuration.ReliabilitySimulationCount, RecipeData);
}
} }
} }
@@ -1639,10 +1647,7 @@ public sealed class MacroEditor : Window, IDisposable
var state = index == 0 ? InitialState : Macro[index - 1].State; var state = index == 0 ? InitialState : Macro[index - 1].State;
var sim = new Sim(state); var sim = new Sim(state);
for (var i = index; i < Macro.Count; i++) for (var i = index; i < Macro.Count; i++)
{ state = Macro[i].Recalculate(sim, state);
state = ((Macro[i].Response, Macro[i].State) = sim.Execute(state, Macro[i].Action)).State;
Macro[i].Reliability = new(InitialState, Macro.Take(i + 1).Select(s => s.Action), Service.Configuration.ReliabilitySimulationCount, RecipeData);
}
} }
public void Dispose() public void Dispose()