Maintain a saved record of each match (the game played, who played,
their forms of augmentation, the outcome), and of each choice made
during the match. Allow users to see game stats per form of augmentation
for each player (time since the player last played, number of matches
played, % won, % draw, and average time to finish their turn). For
example, Lora’s win rate at Tic-Tac-Toe when reviewing.
Maintain a skill-level rating estimate for each player with form of
augmentation per game (e.g. Lora’s skill at Tic-Tac-Toe when
reviewing), and add the conservate estimate to player stats along with
top burst (i.e largest single-game increase in conservative estimate). To
each record of a match, add the estimated ratings of each player before
the match, the standard deviation in each estimate, and whether the
outcome seemed “strategic” or “unstrategic” for each player twenty matches
later.
At the beginning of each game, calculate skill “warning
flags” for each player in the match. By researching play history,
human players could get the information in these flags and could use
it to their advantage (e.g. to cooperate across multiple matches);
we level the playing-field by making the information available to all
players.
To each record of a match, add each player’s expected probability of
winning, and the expected probability of a draw. When maintaining skill
level estimates, also maintain an account of favors “owed” for each pair
of players with form of augmentation (per game). Allow users to view
Favoritism Stats for each player, game with form of augmentation and
partner/opponent (Win Boost, Kick Back, Draw Boost, Relative Rating,
Preference, Favors Owed, and time since last match together.
Test each of the clickable elements. Play the Random players against
each other for at least 20 games and confirm that Rating Diff,
Win Boost, Draw Boost, Kick Back are small. Play against them in a
favoring way, letting one win and making the other lose and confirm
that you can detect the favoritism. Close Python and reopen it to
confirm that it remembers the stats.
Shown as of 1.2 Recorded Tic-Tac-Toe (to show the evolution of the page).
The checkboxes, “Document Social History” button, and “Profile
Selected Players” button do not display until 1.8 Educated AI.
The game dropdown offers one option for each combination of
game this player has played and form of augmentation used.
The rows are sorted by Last Match (most recent on top). The
“Sort by this Column” buttons re-display the table sorted by
the values in the associated column; if already sorted by that
column, reverse the order.
The “Show Player” buttons (fa-address-card-o) save the record
and navigate to the Stats tab of the associated Player.
The Relative Rating numbers are “Show Evolution” buttons which
save the current record and navigate to the Evolution Page with
the selected rule set and “Rating” selected for both the player
and the associated other player.
Shown as of 1.13 Corp Games (to show the evolution of the page).
The “Profile Selected Players” button (fa-bar-chart) and score
options other than “Rating” apear in 1.8 Educated AI, and
“Show Game Tree” buttons (fa-sitemap) show only for members of
a Team or Corp (1.12 Team Games)
The player combobox offers all players. If the selected game is
not available for the new player, then select the first game
available for the new player.
The game combobox offers all games played by the selected player.
Selecting a game adds the curve to the graph.
The score select offers only “Rating” for now, the title is
“Rating History”, and the x-axis is observed to date.
The “Add Curve” button (fa-plus) inserts an identical row (same
player, rule_set, and score) with its own “Add Curve” button,
and replaces itself with a “Delete Curve” button. If multiple
curves display, also display a legend.
The “Delete Curve” button (fa-trash-o) removes that row (and
adds an “Add Curve” button to the last).
The mean skill estimate for player \(a\) on
game \(g\). \(\hat{\mu}_{random, g}\) is the mean skill
estimate for the random player, \(\hat{\mu}_{a, g, m}\) is the
mean skill estimate going into match \(m\), and
hat{mu}_{max, g, m} is the highest skill estimate among all
players at that time.
\(\hat{\sigma}_{a, g}\) :
The standard deviation in the skill estimate for player
\(a\) on game \(g\). \(\hat{\sigma}_{a, g, m}\) is the
standard deviation going into match \(m\).
\(R_{a, g}\) :
The conservative skill estimate of player \(a\) on
game \(g\)
The favor player performed by \(a\) for player \(b\) in match
\(m\).
\[\begin{split}\text{favor}_{a, b, m} =
\begin{cases}
E_m(win_a) + E_m(draw) & \quad
\text{if player } b \text{ wins match } m \\
- E_m(win_b) - E_m(draw) & \quad
\text{if player } a \text{ wins match } m \\
E_m(win_a) - E_m(win_b) & \quad
\text{if they draw}
\end{cases}\end{split}\]
\(\text{favors owed}_{a, b, m}\) :
The favors player \(a\) owes player \(b\) in match
\(m\)
True if player \(a\) presents as a novice in match \(m\)
\[\begin{split}\text{ if }
\hat{\mu}_{a, \text{game}_m}
< min \{ & ( min \{ \hat{\mu}_{\text{players}_m, \text{game}_m, m} \}
+ \hat{\sigma}_{a, \text{game}_m}), \\
& ( max \{ \hat{\mu}_{\text{players}_m, \text{game}_m, m} \}
- \hat{\sigma}_{a, \text{game}_m}) \}\end{split}\]
If player \(a\) is a teammate of the user (e.g. Partner), or is
not the first on its team to play after the user, calculate the flag
as follows instead:
True if player \(a\) presents as an expert in match \(m\)
\[\begin{split}\text{ if }
\hat{\mu}_{a, \text{game}_m}
> max \{ & ( min \{ \hat{\mu}_{\text{players}_m, \text{game}_m, m} \}
+ \hat{\sigma}_{a, \text{game}_m}), \\
& ( max \{ \hat{\mu}_{\text{players}_m, \text{game}_m, m} \}
- \hat{\sigma}_{a, \text{game}_m}) \}\end{split}\]
If player \(a\) is a teammate of the user (e.g. Partner), or is
not the first on its team to play after the user, calculate the flag
as follows instead:
match_id int NOT NULL FOREIGN KEY(games.match_id)
move_num int NOT NULL AUTO_INCREMENT
created_ts timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
creator_id int NOT NULL FOREIGN KEY(players.player_id)
game_id int NOT NULL FOREIGN KEY (games.game_id)
decision_interval int NOT NULL DEFAULT 0
to_spot int NOT NULL DEFAULT 0
rel_color_cat tinyint NOT NULL DEFAULT 0 (player color, next color,…)
shape_cat tinyint NOT NULL DEFAULT 0
from_spot int NOT NULL DEFAULT 0
outcome_cat tinyint NOT NULL DEFAULT 0
predicted_outcome_cat tintyint NOT NULL DEFAULT 0
UNIQUE INDEX creator_id, created_ts, outcome_cat, predicted_outcome_cat
INDEX match_id
stats: PRIMARY KEY is player_id, aug_cat , game_id:
Social Flags
True if player \(a\) presents as random in match \(m\)
True if player \(a\) presents as a novice in match \(m\)
If player \(a\) is a teammate of the user (e.g. Partner), or is not the first on its team to play after the user, calculate the flag as follows instead:
True if player \(a\) presents as an expert in match \(m\)
If player \(a\) is a teammate of the user (e.g. Partner), or is not the first on its team to play after the user, calculate the flag as follows instead:
The favors owed by player \(a\) to all other players in match \(m\)
True if player \(a\) presents as richer than the user in match \(m\)
A set of flags describing player \(a\) relative to the user on match \(m\)