Skip to content

Commit c3ecc6b

Browse files
committed
Add win % to simulation output
1 parent ce42603 commit c3ecc6b

1 file changed

Lines changed: 8 additions & 5 deletions

File tree

src/apologies/simulation.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
"Median Duration (ms)",
4242
"Mean Duration (ms)",
4343
"Wins",
44+
"Win %",
4445
]
4546

4647

@@ -76,6 +77,7 @@ class _Statistics:
7677
median_duration = attr.ib(type=Optional[float])
7778
mean_duration = attr.ib(type=Optional[float])
7879
wins = attr.ib(type=int)
80+
win_percent = attr.ib(type=float)
7981

8082
@staticmethod
8183
def for_results(name: Optional[str], results: List[_Result]) -> _Statistics:
@@ -87,7 +89,8 @@ def for_results(name: Optional[str], results: List[_Result]) -> _Statistics:
8789
median_duration = _median(durations)
8890
mean_duration = _mean(durations)
8991
wins = len(in_scope)
90-
return _Statistics(name, median_turns, mean_turns, median_duration, mean_duration, wins)
92+
win_percent = 0.0 if len(results) == 0 else 100.0 * (wins / len(results))
93+
return _Statistics(name, median_turns, mean_turns, median_duration, mean_duration, wins, win_percent)
9194

9295

9396
@attr.s
@@ -106,13 +109,13 @@ class _Analysis:
106109
def _analyze_scenario(
107110
scenario: int,
108111
mode: GameMode,
112+
iterations: int,
109113
players: int,
110114
sources: Sequence[CharacterInputSource],
111115
combination: Sequence[CharacterInputSource],
112116
results: List[_Result],
113117
) -> _Analysis:
114118
"""Analyze a scenario, generating data that can be written to the CSV file."""
115-
iterations = len(results)
116119
playernames = [source.name for source in combination] + [""] * (MAX_PLAYERS - len(combination))
117120
overall_stats = _Statistics.for_results(None, results)
118121
source_stats = {name: _Statistics.for_results(name, results) for name in sorted(list({source.name for source in sources}))}
@@ -130,7 +133,7 @@ def _write_header(csvwriter, sources: List[CharacterInputSource]) -> None: # ty
130133

131134
def _write_scenario(csvwriter, analysis: _Analysis) -> None: # type: ignore
132135
"""Write analysis results for a scenario into the CSV file."""
133-
row = [analysis.scenario, analysis.mode, analysis.players]
136+
row = [analysis.scenario, analysis.mode, analysis.iterations, analysis.players]
134137
row += analysis.playernames
135138
row += [
136139
analysis.overall_stats.median_turns,
@@ -139,7 +142,7 @@ def _write_scenario(csvwriter, analysis: _Analysis) -> None: # type: ignore
139142
analysis.overall_stats.mean_duration,
140143
]
141144
for stats in analysis.source_stats.values():
142-
row += [stats.median_turns, stats.mean_turns, stats.median_duration, stats.mean_duration, stats.wins]
145+
row += [stats.median_turns, stats.mean_turns, stats.median_duration, stats.mean_duration, stats.wins, stats.win_percent]
143146
csvwriter.writerow(row)
144147

145148

@@ -192,7 +195,7 @@ def run_simulation(iterations: int, output: str, sources: List[CharacterInputSou
192195
print("%sstarting" % prefix, end="\r", flush=True)
193196
results = _run_scenario(prefix, iterations, engine)
194197
print("%sanalyzing" % prefix, end="\r", flush=True)
195-
analysis = _analyze_scenario(scenario, mode, players, sources, combination, results)
198+
analysis = _analyze_scenario(scenario, mode, iterations, players, sources, combination, results)
196199
print("%swriting CSV" % prefix, end="\r", flush=True)
197200
_write_scenario(csvwriter, analysis)
198201
print("%sdone" % prefix, end="\r", flush=True)

0 commit comments

Comments
 (0)