diff --git a/README.md b/README.md index a38908b..ca0dd18 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,69 @@ -# Paper revisiting Axelrod's second tournament +# Reviving, Reproducing, and Revisiting Axelrod's Second Tournament -## Setting up the environment +This repository contains the code and manuscript source files for the project +***Reviving, Reproducing, and Revisiting Axelrod's Second Tournament***. -- Install https://github.com/Axelrod-Python/TourExec (see instructions there). -- Create the conda environment: +The project reproduces Robert Axelrod’s second Iterated Prisoner’s Dilemma +tournament, originally run in the early 1980s, using the original Fortran +implementations of the submitted strategies. It uses +[**Axelrod-Python**](https://github.com/Axelrod-Python/Axelrod) and +[**TourExec**](https://github.com/Axelrod-Python/TourExec) to run the computer +tournament simulations. - conda env create -f environment.yml +A preprint of this work is available at: https://arxiv.org/abs/2510.15438. + + +## Requirements + +* Install [TourExec](https://github.com/Axelrod-Python/TourExec) (see + installation instructions in that repository). +* You will also need Python. + + +## Setting up the Environment + +To install all necessary Python dependencies, we recommend creating a **conda +environment** using the provided configuration file `src/environment.yml`. From +the root of this repository run: + +```bash +conda env create -f src/environment.yml +conda activate axelrod_tournament +``` + + +## Source Code + +* The code for generating and reproducing the original tournaments is located in + the `src/` directory. +* It includes: + + * **Tournament execution scripts** to reproduce Axelrod’s results. + * **Analysis scripts and Jupyter notebooks** for generating all figures used + in the manuscript. + +To rerun the original tournaments, refer to the +[documentation](https://github.com/Axelrod-Python/revisiting-axelrod-second/tree/main/src) +in `src/`. + + +## Data + +Running the simulations will generate the tournament data. + +If you prefer **not to rerun** the entire simulation, you can download the +archived data from Zenodo: + +1. Download the dataset archive from https://doi.org/10.5281/zenodo.17250038. +2. Unzip it into the `data/` folder. + +This will allow you to reproduce the analysis and figures directly. + + +## Analysis and Figures + +All data analysis and manuscript figures were generated using **Python** and +**Jupyter notebooks**, available under `src/`. + +If you have downloaded the archived data, you can simply open and run the +notebooks to reproduce all figures without rerunning the full simulations. \ No newline at end of file diff --git a/assets/Figure1.key b/assets/Figure1.key index 621d089..cf8207d 100644 Binary files a/assets/Figure1.key and b/assets/Figure1.key differ diff --git a/assets/Figure1.pdf b/assets/Figure1.pdf index 26d8ce2..fae56cf 100644 Binary files a/assets/Figure1.pdf and b/assets/Figure1.pdf differ diff --git a/assets/Figure_linear_regression_results.key b/assets/Figure_linear_regression_results.key new file mode 100644 index 0000000..217e78d Binary files /dev/null and b/assets/Figure_linear_regression_results.key differ diff --git a/assets/Figure_linear_regression_results.pdf b/assets/Figure_linear_regression_results.pdf new file mode 100644 index 0000000..5c7a8a0 Binary files /dev/null and b/assets/Figure_linear_regression_results.pdf differ diff --git a/assets/original_ranks_boxplots.pdf b/assets/original_ranks_boxplots.pdf index e0f475b..1b09fcb 100644 Binary files a/assets/original_ranks_boxplots.pdf and b/assets/original_ranks_boxplots.pdf differ diff --git a/assets/original_scores_boxplots.pdf b/assets/original_scores_boxplots.pdf index 4505ecb..c7e22a0 100644 Binary files a/assets/original_scores_boxplots.pdf and b/assets/original_scores_boxplots.pdf differ diff --git a/assets/original_tournament_r_squared_versus_number_of_features.pdf b/assets/original_tournament_r_squared_versus_number_of_features.pdf index 075f2ba..7e4e2d3 100644 Binary files a/assets/original_tournament_r_squared_versus_number_of_features.pdf and b/assets/original_tournament_r_squared_versus_number_of_features.pdf differ diff --git a/assets/original_tournament_rankings.tex b/assets/original_tournament_rankings.tex index 04e8eb5..5858632 100644 --- a/assets/original_tournament_rankings.tex +++ b/assets/original_tournament_rankings.tex @@ -1,21 +1,21 @@ -\begin{tabular}{llcccc} +\begin{tabular}{llccccr} \toprule - & \makecell[c]{Author} & \makecell[c]{Average Score} & \makecell[c]{Reproduced Rank} & \makecell[c]{Original Rank} & \makecell[c]{Average\\Cooperation Rate} \\ + & \makecell[c]{Author} & \makecell[c]{Average Score} & \makecell[c]{Reproduced Rank} & \makecell[c]{Original Rank} & \makecell[c]{Average\\Cooperation Rate} & \makecell[c]{Win\\proportion} \\ \midrule -k92r & Anatol Rapoport & 2.878 & 1 & 1 & 0.922 \\ -k61r & Danny C Champion & 2.791 & 12 & 2 & 0.954 \\ -k42r & Otto Borufsen & 2.861 & 2 & 3 & 0.916 \\ -k49r & Rob Cave & 2.826 & 4 & 4 & 0.892 \\ -k44r & William Adams & 2.826 & 3 & 5 & 0.882 \\ -k60r & Jim Graaskamp and Ken Katzen & 2.810 & 9 & 6 & 0.844 \\ -k41r & Herb Weiner & 2.811 & 8 & 7 & 0.865 \\ -k75r & Paul D Harrington & 2.826 & 5 & 8 & 0.802 \\ -k84r & T Nicolaus Tideman and Paula Chieruzz & 2.812 & 7 & 9 & 0.882 \\ -k32r & Charles Kluepfel & 2.817 & 6 & 10 & 0.873 \\ -k35r & Abraham Getzler & 2.801 & 11 & 11 & 0.888 \\ -k68r & Fransois Leyvraz & 2.808 & 10 & 12 & 0.917 \\ -k72r & Edward C White Jr & 2.776 & 13 & 13 & 0.924 \\ -k46r & Graham J Eatherley & 2.772 & 14 & 14 & 0.948 \\ -k83r & Paul E Black & 2.743 & 15 & 15 & 0.935 \\ +k92r & Anatol Rapoport & 2.8785 & 1 & 1 & 0.9218 & 0.6306 \\ +k61r & Danny C Champion & 2.7907 & 12 & 2 & 0.9542 & 0.0000 \\ +k42r & Otto Borufsen & 2.8607 & 2 & 3 & 0.9161 & 0.3149 \\ +k49r & Rob Cave & 2.8260 & 4 & 4 & 0.8922 & 0.0000 \\ +k44r & William Adams & 2.8260 & 3 & 5 & 0.8819 & 0.0038 \\ +k60r & Jim Graaskamp and Ken Katzen & 2.8102 & 9 & 6 & 0.8440 & 0.0102 \\ +k41r & Herb Weiner & 2.8107 & 8 & 7 & 0.8650 & 0.0000 \\ +k75r & Paul D Harrington & 2.8258 & 5 & 8 & 0.8019 & 0.0224 \\ +k84r & T Nicolaus Tideman and Paula Chieruzz & 2.8124 & 7 & 9 & 0.8818 & 0.0000 \\ +k32r & Charles Kluepfel & 2.8170 & 6 & 10 & 0.8726 & 0.0080 \\ +k35r & Abraham Getzler & 2.8010 & 11 & 11 & 0.8878 & 0.0002 \\ +k68r & Fransois Leyvraz & 2.8085 & 10 & 12 & 0.9169 & 0.0000 \\ +k72r & Edward C White Jr & 2.7762 & 13 & 13 & 0.9242 & 0.0000 \\ +k46r & Graham J Eatherley & 2.7722 & 14 & 14 & 0.9483 & 0.0000 \\ +k83r & Paul E Black & 2.7425 & 15 & 15 & 0.9347 & 0.0000 \\ \bottomrule \end{tabular} diff --git a/assets/original_tournament_reproducing.pdf b/assets/original_tournament_reproducing.pdf index ada7b4d..2393809 100644 Binary files a/assets/original_tournament_reproducing.pdf and b/assets/original_tournament_reproducing.pdf differ diff --git a/bibliography.bib b/bibliography.bib index 2b4854a..59e901f 100644 --- a/bibliography.bib +++ b/bibliography.bib @@ -99,11 +99,11 @@ @article{Stewart2012 @misc{AxelrodProject, author = {{The Axelrod project developers}}, - title = {Axelrod-Python/Axelrod: v3.3.0}, - month = jul, - year = 2017, - doi = {10.5281/zenodo.836439}, - howpublished = {https://doi.org/10.5281/zenodo.836439} + title = {Axelrod-Python/Axelrod: v4.10.0}, + month = aug, + version = {v4.10.0}, + doi = {10.5281/zenodo.3980654}, + howpublished = {https://doi.org/10.5281/zenodo.3980654}, } @article{Knight2017, @@ -489,3 +489,90 @@ @dataset{knight_2025_17250038 doi = {10.5281/zenodo.17250038}, url = {https://doi.org/10.5281/zenodo.17250038}, } + +@article{open_science_collaboration2015, + title={Estimating the reproducibility of psychological science}, + author={{Open Science Collaboration}}, + journal={Science}, + year={2015}, + volume={349}, + number={6251}, + pages={aac4716}, +} + +@article{camerer2016, + title={Evaluating replicability of laboratory experiments in economics}, + author={Camerer, Colin F. and others}, + journal={Science}, + year={2016}, + volume={351}, + number={6280}, + pages={1433--1436}, +} + +@article{camerer2018, + title={Evaluating the replicability of social science experiments in Nature and Science between 2010 and 2015}, + author={Camerer, Colin F. and others}, + journal={Nature Human Behaviour}, + year={2018}, + volume={2}, + pages={637--644}, +} + + +@article{silberzahn2018, + title={Many analysts, one dataset: Making transparent how variations in analytical choices affect results}, + author={Silberzahn, Raphael and others}, + journal={Advances in Methods and Practices in Psychological Science}, + year={2018}, + volume={1}, + number={3}, + pages={337--356}, +} + +@article{breznau2022, + title={Observing many researchers using the same data and hypothesis reveals a hidden universe of uncertainty}, + author={Breznau, Nate and others}, + journal={PNAS}, + year={2022}, + volume={119}, + number={44}, + pages={e2203150119}, +} + +@article{sandve2013, + title={Ten simple rules for reproducible computational research}, + author={Sandve, Geir Kjetil and others}, + journal={PLoS Computational Biology}, + year={2013}, + volume={9}, + number={10}, + pages={e1003285}, +} + +@article{wilson2017, + title={Good enough practices in scientific computing}, + author={Wilson, Greg and others}, + journal={PLoS Computational Biology}, + year={2017}, + volume={13}, + number={6}, + pages={e1005510}, +} + +@article{stodden2018, + title={Enhancing reproducibility for computational methods}, + author={Stodden, Victoria and Seiler, Jennifer and Ma, Zhaokun}, + journal={PNAS}, + year={2018}, + volume={115}, + number={11}, + pages={2561--2570}, +} + +@book{turingway2022, + title={The Turing Way: A Handbook for Reproducible, Ethical and Collaborative Data Science}, + author={{The Turing Way Community}}, + year={2022}, + note={Zenodo. DOI: 10.5281/zenodo.3233853} +} diff --git a/paper/main.pdf b/paper/main.pdf index e0d3eee..2cf9334 100644 Binary files a/paper/main.pdf and b/paper/main.pdf differ diff --git a/paper/main.tex b/paper/main.tex index b9db8ab..ffbd4d2 100644 --- a/paper/main.tex +++ b/paper/main.tex @@ -30,6 +30,8 @@ \newcommand{\AXLFortran}{\texttt{Axelrod\_fortran}} \newcommand{\SI}{\textbf{Supplementary Information}} +\renewcommand{\figurename}{Fig.} + \title{Reviving, reproducing, and revisiting Axelrod's second tournament} \author[1, $*$]{Vincent Knight} \author[2]{Owen Campbell} @@ -37,12 +39,12 @@ \author[4]{T. J. Gaffney} \author[5, 6]{Nikoleta E. Glynatsi} -\affil[1]{School of Mathematics, Cardiff University} +\affil[1]{School of Mathematics, Cardiff University, United Kingdom} \affil[2]{Independent Researcher, Cardiff, United Kingdom} -\affil[3]{Google Inc.} +\affil[3]{Google Inc., California, USA} \affil[4]{Independent Researcher, Nevada, USA} -\affil[5]{Discrete Event Simulations Teams, RIKEN Center for Computational Science} -\affil[6]{Mathematical Social Science Team, RIKEN Center for Interdisciplinary Theoretical and Mathematical Sciences} +\affil[5]{Discrete Event Simulations Teams, RIKEN Center for Computational Science, Kobe, Japan} +\affil[6]{Mathematical Social Science Team, RIKEN Center for Interdisciplinary Theoretical and Mathematical Sciences, Wako, Japan} \affil[$*$]{Corresponding author: KnightVA@cardiff.ac.uk.} \date{} @@ -53,34 +55,28 @@ \begin{abstract} Direct reciprocity, typically studied using the Iterated Prisoner's Dilemma -(\IPD), is central to understanding how cooperation evolves. In the 1980s, Robert -Axelrod organized two influential \IPD{} computer tournaments, where Tit for Tat -(\TFT) emerged as the winner. Yet the archival record is incomplete: for the -first tournament only a report survives, and for the second the submitted -Fortran strategies remain but not the final tournament code. This gap raises -questions about the reproducibility of these historically influential results. +(\IPD), is central to explaining cooperation. In the 1980s Robert Axelrod ran +two computer tournaments in which Tit for Tat (\TFT) emerged as the winner. +Yet the archival record is incomplete: for the first tournament only a report survives, +and for the second the submitted Fortran strategies remain but not the final tournament code. +This gap raises questions about the reproducibility of these historically influential results. We recreate the second tournament by restoring the surviving Fortran -implementations to compile with modern compilers and by building a Python -interface that calls the original strategy functions without modification. Using -the open-source \AXL{} library to run tournaments, we reproduce Axelrod's main +implementations to compile with modern compilers and by building an +interface that calls the original strategy functions without modification. +We reproduce Axelrod's main findings: \TFT{} prevails, and successful play tends to be cooperative, responsive to defection, and willing to forgive. Strategy rankings remain mostly unchanged. -We then assess the robustness of the originally submitted strategies by -incorporating additional strategies, and we run one of the largest \IPD{} tournaments -to date. We find that the original tournament was especially -favorable to \TFT{} and that it is difficult to dethrone \TFT{} when the original -submissions make up the majority of the field. We also observe that several -lesser-known submissions perform strongly in more diverse settings and +We then enlarge the field with additional strategies and one of the largest \IPD{} tournaments to date, +showing the original setting favored \TFT{} and that several lesser-known submissions perform strongly in more diverse settings and under noise. -Our contributions are: (i) the first systematic reproduction of Axelrod's second -tournament; (ii) a contemporary reassessment of the original results in light of -new strategies and settings; and (iii) a preserved, easy-to-use implementation -of the second-tournament strategies within \AXL{} to support future research. - \end{abstract} +\textbf{keywords:} iterated prisoner's dilemma, evolution of cooperation, +replication study, reproducible social science. + -\section{Introduction}\label{sec:introduction} + +\section*{Main}\label{sec:introduction} Cooperation is fundamental to the organization of societies, yet its persistence remains a central puzzle in evolutionary biology and the social @@ -142,9 +138,9 @@ \section{Introduction}\label{sec:introduction} archival record surrounding them is incomplete. For the first tournament, only the published report survives; the original source code has been lost. For the second tournament, the Fortran implementation of the submitted strategies -remains available online,\footnote{See +remains available online\footnote{See \url{http://www-personal.umich.edu/~axe/research/Software/CC/CC2/TourExec1.1.f.html} -accessed on 2025-09-30.} +accessed on 2025-09-30.}, but the final code used in Axelrod's reported tournaments has not been preserved. This highlights a broader challenge of software reproducibility in @@ -155,11 +151,26 @@ \section{Introduction}\label{sec:introduction} strategies against small, unrepresentative sets of opponents. Such practices bias conclusions and weaken claims about the relative performance of new strategies. + +These challenges are not limited to the \IPD{} literature. +Reproducibility failures have been widely documented across the social sciences +and economics, with large-scale replication projects revealing that only around +half of published findings hold up under independent +scrutiny~\cite{open_science_collaboration2015, camerer2016, camerer2018}. Computational +research adds further complexity, as analytic flexibility and non-transparent +workflows can yield highly variable conclusions even from identical +data~\cite{silberzahn2018, breznau2022}. Within game theory and related modelling work, +the challenge of reproducibility intersects with simulation code, algorithmic +implementation, and data provenance. An important step toward addressing this issue has been the \texttt{Axelrod-Python} project~\cite{AxelrodProject}, an open-source Python package that provides a comprehensive framework for implementing and testing \IPD{} strategies. The library includes a wide variety of strategies from the -literature, together with detailed documentation and usage examples. By +literature, together with detailed documentation and usage examples. +This project illustrates best practice by providing fully open, tested, and version-controlled +artifacts, embodying community principles outlined in reproducibility +guides~\cite{wilson2014, sandve2013, wilson2017, stodden2018, turingway2022}. +By providing open, executable implementations, \AXL{} makes it possible to test strategies under common conditions and compare their performance systematically, and it has therefore been used in ongoing research~\cite{Harper2017, @@ -189,126 +200,63 @@ \section{Introduction}\label{sec:introduction} original code and making it accessible through the \AXL{} library, we preserve for future use the strategies of his second tournament. -\section{Reviving the tournament}\label{sec:reviving} -As noted above, Axelrod's original tournaments cannot be fully replicated. For -the first tournament, the only surviving record is the published report, while -the source code has been lost. For the second tournament, however, -implementations of the 63 submitted strategies remain available. In this work, -we aim to revive the second tournament using these historical -implementations, rather than re-implementing them ourselves. The surviving code -was written in Fortran and is hosted online by the University of Michigan Center -for the Study of Complex Systems~\cite{Axelrod1980bCode}, where it was last -updated in 1996. The source code for all strategies is contained in a single file, -\texttt{TourExec1.1.f}, embedded in an HTML page. - -Our first step was to ensure that this code could be executed with modern -software. We stripped the HTML formatting to recover the raw Fortran source and -applied only minimal modifications to enable compilation with contemporary -Fortran compilers. Each strategy was then extracted into its own modular file. -To streamline the build process, we created a dedicated \texttt{Makefile} that -compiles all strategy files into a single shared library -(\texttt{libstrategies.so}). Once installed in a standard location on a -POSIX-compliant operating system (e.g., \texttt{/usr/local/lib/}), this library -is automatically located at runtime. The modified source code is openly -available at \url{https://github.com/Axelrod-Python/TourExec} and has been -archived at~\cite{TourExec}, ensuring long-term accessibility. - -Each Fortran strategy was implemented as a function with a fixed set of input -arguments that encode the state of the match: - -\begin{itemize} - \item \texttt{J}: Opponent's previous move (0 = cooperate, 1 = defect), - \item \texttt{M}: Current turn number (starting at 1), - \item \texttt{K}: Player's cumulative score, - \item \texttt{L}: Opponent's cumulative score, - \item \texttt{R}: Random number between 0 and 1 (for stochastic strategies), - \item \texttt{JA}: Player's previous move. -\end{itemize} - -Given these inputs, the function outputs either 0 (cooperate) or 1 (defect). An -illustrative example is provided by the original implementation of \TFT{} -(\texttt{k92r.f}), shown in Figure~\ref{fig:tft_fortran}. - -\begin{figure}[!hbtp] - \begin{center} - \begin{lstlisting}[language=Fortran, - basicstyle=\ttfamily\scriptsize, - frame=single, - keywordstyle=\color{red}\bfseries, - commentstyle=\color{teal}\itshape] - FUNCTION K92R(J,M,K,L,R,JA) - C BY ANATOL RAPOPORT - C TYPED BY AX 3/27/79 (SAME AS ROUND ONE TIT FOR TAT) - c replaced by actual code, Ax 7/27/93 - c T=0 - c K92R=ITFTR(J,M,K,L,T,R) - k92r=0 - k92r=j - c test 7/30 - c write(6,77) j, k92r - c77 format(' test k92r. j,k92r: ', 2i3) - RETURN - END - \end{lstlisting} - \caption{\textbf{Fortran source code for the Tit For Tat strategy - (\texttt{k92r.f}).} Each strategy takes as input the state of the match - (\texttt{J}, \texttt{M}, \texttt{K}, \texttt{L}, \texttt{R}, \texttt{JA}) - and outputs either 0 (cooperate) or 1 (defect). This code corresponds to - the \TFT{} strategy submitted to Axelrod's second tournament.} - \label{fig:tft_fortran} - \end{center} +\section*{Results}\label{sec:reviving} + +% \section{Reviving the tournament}\label{sec:reviving} + +\textbf{Reviving the tournament.} +Axelrod's original tournaments cannot be fully replicated. For the first +tournament, the only surviving record is the published report; the source code +has been lost. For the second tournament, however, the implementations of the 63 +submitted strategies remain available. As an example, the Fortran implementation +of \TFT{} (the implemented function is named \texttt{k92r}) is shown in +Fig.~\ref{fig:reviving_diagram}\textbf{a}. In this work, we revive the second +tournament using these original implementations rather than re-implementing +them. To this end, we updated the surviving Fortran code to compile with modern +compilers and connected it to the \AXL{} framework via a Python interface that +calls the original functions. The workflow is: (i) build a shared library of the +historical strategies; (ii) use the adapter to format the match state, invoke +the Fortran routine, and return the action; (iii) let \AXL{} run matches and +assemble tournaments (Fig.~\ref{fig:reviving_diagram}\textbf{b},\textbf{c}). For +details on recovering, packaging, and releasing the original source code, see +\textbf{Methods}. + + +\begin{figure}[t] + \begin{center} + \includegraphics[width=.755\textwidth]{../assets/Figure1.pdf} + \caption{\textbf{Reviving Axelrod's second tournament code.} + \textbf{a,} Fortran code for \TFT{} (\texttt{k92r.f}). Each strategy takes as input the match state + (\texttt{J}: opponent's previous move; \texttt{M}: current turn number; \texttt{K}: player's cumulative score; \texttt{L}: opponent's cumulative score; \texttt{R}: random number in $[0,1]$; \texttt{JA}: player's previous move) and returns 0 (cooperate) or 1 (defect). + \textbf{b,} Overview of how the three codebases interact. \AXLFortran{} creates strategy instances for each + player. Tournaments and matches are managed by \AXL{}, which, at each turn, calls + the corresponding \AXLFortran{} instance; this, in turn, invokes the original + Fortran code to produce a decision from the match history. + \textbf{c,} Turn-by-turn execution. On the first turn, \AXLFortran{} initializes + the parameters required by the Fortran implementation, queries it for a + decision, and returns the move to \AXL{}, which plays it and updates the + history. On each subsequent turn: (1) the previous outcome is recorded and the + history updated; (2) \AXLFortran{} accesses the updated history; (3) formats it + into the inputs expected by the Fortran code; (4) calls the Fortran function and + receives a decision; and (5) \AXL{} plays the decision. The process repeats until + the match ends.} + \label{fig:reviving_diagram} + \end{center} \end{figure} -With the strategies executable again, the next challenge was to run the -tournament. For this we rely on the open-source \AXL{} library, which provides a -modern implementation of \IPD{} tournaments. In this framework, a -\emph{tournament} is a collection of matches, and each \emph{match} is a -repeated game between two strategies. A tournament class manages the overall -structure (pairing strategies, scheduling matches, aggregating results), while -strategy classes determine actions turn by turn based on the recorded history of -play. - -To integrate the original Fortran strategies into this environment, we developed -a Python package, \AXLFortran~\cite{Axelrod_fortran}. The \AXLFortran{} adapter -class inherits from the base \AXL{} strategy class and translates between the two -languages: it constructs the required inputs, calls the Fortran function, and -returns the chosen move to the Python environment -(Figure~\ref{fig:strategy_diagram}). The adapter also handles the initial moves -of both players -required by the Fortran strategies, which is fixed to cooperation in the original -code. - -\begin{figure}[!hbtp] - \begin{center} - \includegraphics[width=.7\textwidth]{../assets/Figure1.pdf} -\caption{\textbf{Diagrammatic representation of the interaction between \AXL{}, -\AXLFortran{}, and the original Fortran code.} \textbf{a,} Overview of how the -three codebases interact. \AXLFortran{} creates strategy instances for each -player. Tournaments and matches are managed by \AXL{}, which at each turn calls -the corresponding \AXLFortran{} instance; this in turn invokes the original -Fortran code to produce a decision from the match history. \textbf{b,} Turn-by-turn execution. -On the first turn, \AXLFortran{} -initialises the parameters required by the Fortran implementation, queries it -for the first decision, and returns this to \AXL{}, which plays the move and -updates the history. On each subsequent turn: (1) the previous turn is recorded -and the history updated; (2) \AXLFortran{} access the updated history and (3) -formats its into the inputs required by the Fortran code; (4) the Fortran code is called and returns -a decision; (5) \AXL{} plays the decision. The process repeats until the match -ends.}\label{fig:strategy_diagram} - \end{center} -\end{figure} The major advantage of this approach is that no subjective reinterpretation was -introduced in reproducing Axelrod's second tournament. The only modifications -made were minimal adjustments to ensure compatibility with modern compilers. For -several strategies, the Fortran source code is the only surviving description; -these strategies are therefore run and evaluated exactly as originally written. -This constitutes the most faithful reproduction of Axelrod's -work to date. +introduced. The only modifications were minimal adjustments for compiler +compatibility. For several strategies, the Fortran source code is the only +surviving description; these strategies are therefore run and evaluated exactly +as originally written. This constitutes the most faithful reproduction of +Axelrod's work to date. -\section{Reproducing Axelrod's second tournament}\label{sec:reproducing} +\noindent +\subsection*{Reproducing Axelrod's second tournament.} +\noindent \textbf{Running the tournament.} Axelrod's second tournament included 63 strategies. While Axelrod named a few explicitly, most were referred to only by their ranking in the @@ -350,18 +298,18 @@ \section{Reproducing Axelrod's second tournament}\label{sec:reproducing} exactly. To obtain smoother estimates of each strategy's performance, we run Axelrod's second tournament a total of \input{../assets/number_of_original_repetitions.tex} times. For each run of the tournament, we use the same five match lengths -(\(63, 77, 151, 156, 308\)) for every pairing of strategies. +(\(63, 77, 151, 156, 308\)) for every pairing of strategies. \\ \noindent \textbf{The winners, the losers, and the differences.} -In Figure~\ref{fig:replicated_tournament}\textbf{a}, we compare the original rankings with +In Fig.~\ref{fig:replicated_tournament}\textbf{a}, we compare the original rankings with those obtained in our replication, with strategies sorted according to their original ranks. As we can see, the winner of the tournament remains \TFT, while the strategy \texttt{k36r}, authored by Roger Hotz, again ranks last. The overall outcomes of most strategies are reproduced, though some do not retain their exact rankings. Notably, the bottom ranking strategies are replicated quite well, consistently -performing poorly in both tournaments. Figure~\ref{fig:replicated_tournament}\textbf{b} +performing poorly in both tournaments. Fig.~\ref{fig:replicated_tournament}\textbf{b} shows the difference in rank between the reproduced and original tournaments, ordered from the most negative to the most positive change. We find that 40 out of 63 strategies exhibit a shift in ranking. Most of these changes are modest, @@ -381,60 +329,58 @@ \section{Reproducing Axelrod's second tournament}\label{sec:reproducing} assumption no longer holds, meaning that while in the first match \texttt{ICOOP} starts at $0$ and increases as expected, in subsequent matches its (undefined) value can persist across calls. The corrected version of this strategy is shown in -Figure~\ref{fig:k61r}. It is unclear whether this bug affected the tournament +\textbf{Extended Data Fig. 1}. It is unclear whether this bug affected the tournament results reported in 1980. One possibility is that each match was run in isolation, which would have prevented the error from arising. In our analysis we use the corrected version of the strategy. -In Figure~\ref{fig:replicated_tournament}\textbf{c}, we examine the average scores of the +In Fig.~\ref{fig:replicated_tournament}\textbf{c}, we examine the average scores of the strategies. Champion shows a noticeable drop relative to the now second and third ranked strategies. However, its mean score remains very close to that -of the rest of the top ten (Table~\ref{tbl:original_tournament_rankings}). -Figure~\ref{fig:replicated_tournament}\textbf{d} presents violin plots of the +of the rest of the top ten (see \textbf{Extended Data Table 1}). +Fig.~\ref{fig:replicated_tournament}\textbf{d} presents violin plots of the score distributions for these top 15 strategies across the \input{../assets/number_of_original_repetitions.tex} repetitions. Champion rarely outperforms the second or third ranked strategies, doing so in only a single tournament, confirming that, at least in this version, Champion is not as strong as originally reported. -\begin{table}[!hbtp] - \centering - \resizebox{.9\textwidth}{!}{ - \input{../assets/original_tournament_rankings.tex}} - \caption{\textbf{Top 15 strategies in the reproduced tournament.} - The table lists the top 15 strategies from Axelrod's original tournament - along with their rankings in our tournament. For each strategy we also - report the average score and average cooperation rate in the reproduced - tournament.} - \label{tbl:original_tournament_rankings} -\end{table} +\begin{figure}[!hbtp] + \centering + \includegraphics[width=.9\textwidth]{../assets/original_tournament_reproducing.pdf} +\caption{\textbf{Reproducing Axelrod's second tournament.} +\textbf{a,} Comparison of the original rankings and the replicated rankings. +Strategies are ordered by their original ranks; \TFT{} again +emerges as the overall winner, while \texttt{k36r} again ranks last. +\textbf{b,} Differences in rank between the original and reproduced tournaments, +ordered from most negative to most positive change. Most strategies shift by +only 1-3 positions, though a few exhibit larger changes, including Champion +(\texttt{k61r}). +\textbf{c,} Mean scores of all strategies. Champion's +average score drops relative to the other three strategies but remains close to +the rest of the top ten. +\textbf{d,} Violin plots showing the distribution of scores for the top 15 +strategies across all repetitions. +\textbf{e,} Results under alternative replication approaches, including with and +without self-interactions and using a Python re-implementation of Champion. +Across all settings, \TFT{} remains the winner, while Champion exhibits the +largest change in ranking.} + \label{fig:replicated_tournament} +\end{figure} An interesting observation is that strategies such as \texttt{k32r} and \texttt{k75r} occasionally achieve the maximum possible score of 2.9. Across all repetitions, these strategies won 0.8\% and 2.3\% of the tournaments, -respectively (Table~\ref{tbl:original_tournament_win_proportion}). +respectively (\textbf{Extended Data Table 1}). They received little attention in the original tournament, likely because their high variance obscured their potential relative to consistently strong performers such as \TFT{}. Another strong and comparatively stable strategy is \texttt{k42r}, which won 31.5\% of our replicated tournaments; for comparison, -\TFT{} won 63.3\% (Table~\ref{tbl:original_tournament_win_proportion}). +\TFT{} won 63.3\% (\textbf{Extended Data Table 1}). Because the original tournament is a single realization, a different random seed could plausibly have produced a different winner: namely, on another roll of the dice, \texttt{k42r} (Otto Borufsen) might well have been crowned the winner. -\begin{table}[!hbtp] - \centering - \input{../assets/original_tournament_win_proportion.tex} - \caption{\textbf{The proportion of reproduced tournaments won by each - strategy.} - The table shows all strategies who won one of the - repetitions of the - original tournament. \TFT{} wins 63.3\% of them indicating that 36.7\% of - used random seeds lead to a different winner.} - \label{tbl:original_tournament_win_proportion} -\end{table} - - The source code for \texttt{k42r}, together with a description of the strategy's behaviour, is provided in the \SI~(S6). In summary, the strategy has two states: @@ -451,7 +397,7 @@ \section{Reproducing Axelrod's second tournament}\label{sec:reproducing} and highly cooperative environment. We also explored alternative approaches in our attempt to replicate the -original ranking (Figure~\ref{fig:replicated_tournament}\textbf{e}). These include running +original ranking (Fig.~\ref{fig:replicated_tournament}\textbf{e}). These include running the tournament with and without self-interactions, as well as testing a Python implementation of Champion that we developed from the textual description in~\cite{Axelrod1980b}. Across all approaches, Champion @@ -471,62 +417,6 @@ \section{Reproducing Axelrod's second tournament}\label{sec:reproducing} interact as expected. \end{itemize} -\begin{figure}[!hbtp] - \begin{center} - \begin{lstlisting}[language=Fortran, - basicstyle=\ttfamily\scriptsize, - frame=single, - keywordstyle=\color{red}\bfseries, - commentstyle=\color{teal}\itshape] - FUNCTION K61R(ISPICK,ITURN,K,L,R, JA) -C BY DANNY C. CHAMPION -C TYPED BY JM 3/27/79 - k61r=ja ! Added 7/27/93 to report own old value - IF (ITURN .EQ. 1) ICOOP = 0 ! Added 10/8/2017 to fix bug for multiple runs - IF (ITURN .EQ. 1) K61R = 0 - IF (ISPICK .EQ. 0) ICOOP = ICOOP + 1 - IF (ITURN .LE. 10) RETURN - K61R = ISPICK - IF (ITURN .LE. 25) RETURN - K61R = 0 - COPRAT = FLOAT(ICOOP) / FLOAT(ITURN) - IF (ISPICK .EQ. 1 .AND. COPRAT .LT. .6 .AND. R .GT. COPRAT) - +K61R = 1 - RETURN - END - \end{lstlisting} - \caption{\textbf{Fortran source code for \texttt{k61r} (Champion).} - The original implementation contained a bug: the variable \texttt{ICOOP} was not - initialized within the function. In the first match it effectively started at 0, - but in subsequent matches it could have kept its value from the previous match or be reset to 0, - depending on the compiler and runtime environment. Line~5 shows the fix, which - explicitly initializes \texttt{ICOOP} at the start of each match.} - \label{fig:k61r} - \end{center} -\end{figure} - -\begin{figure}[!hbtp] - \centering - \includegraphics[width=.85\textwidth]{../assets/original_tournament_reproducing.pdf} -\caption{\textbf{Reproducing Axelrod's second tournament.} -\textbf{a,} Comparison of the original rankings and the replicated rankings. -Strategies are ordered by their original ranks; \TFT{} again -emerges as the overall winner, while \texttt{k36r} again ranks last. -\textbf{b,} Differences in rank between the original and reproduced tournaments, -ordered from most negative to most positive change. Most strategies shift by -only 1-3 positions, though a few exhibit larger changes, including Champion -(\texttt{k61r}). -\textbf{c,} Mean scores of all strategies. Champion's -average score drops relative to the other three strategies but remains close to -the rest of the top ten. -\textbf{d,} Violin plots showing the distribution of scores for the top 15 -strategies across all repetitions. -\textbf{e,} Results under alternative replication approaches, including with and -without self-interactions and using a Python re-implementation of Champion. -Across all settings, \TFT{} remains the winner, while Champion exhibits the -largest change in ranking.} - \label{fig:replicated_tournament} -\end{figure} \noindent \textbf{The representative strategies.} @@ -540,7 +430,7 @@ \section{Reproducing Axelrod's second tournament}\label{sec:reproducing} indicating that 97\% of the variance in overall performance could be explained by the model. For completeness, the coefficients of this regression (as reported in~\cite{Axelrod1980b}) are listed in -Table~\ref{tbl:original_tournament_representative_model}. +\textbf{Extended Data Fig. 2}. We replicated Axelrod's linear regression analysis and evaluated the predictive power of the original model using our reproduced tournament data. We @@ -552,44 +442,22 @@ \section{Reproducing Axelrod's second tournament}\label{sec:reproducing} To further assess the robustness of the model, we performed a backward elimination procedure to examine how \(R^2\) changes as the number of predictor strategies increases. We find that the largest gain occurs when five predictors -are included, after which improvements are small. This suggests that +are included, after which improvements are small (\textbf{Extended Data Fig. 2}.). This suggests that Axelrod's choice of five representative strategies was reasonable. Whether this selection was the outcome of a systematic feature selection procedure or a -judgment call remains unclear; in either case, it appears well chosen. The -results of this elimination analysis are reported in the \SI~(S5). - +judgment call remains unclear; in either case, it appears well chosen.\\ -\begin{table}[!hbtp] -\centering -\begin{tabular}{lc|cll} -\toprule -Strategies & \makecell{Originally Reported\\Coefficients} & \makecell{Replicated\\Coefficients} & $p$-value & $F$-value\\ -\midrule -k60r (S$_6$) & 0.202000 & 0.232010 & 0.000000 & 298.163936 \\ -k91r (Revered State Transition) & 0.198000 & 0.187930 & 0.000000 & 56.667196 \\ -k40r (Ruler) & 0.110000 & 0.071870 & 0.000000 & 78.191831 \\ -k76r (Tester) & 0.072000 & 0.063670 & 0.025992 & 5.207451 \\ -k67r (Tranquilizer) & 0.086000 & 0.113650 & 0.000002 & 27.893148 \\ -Intercept & 0.795000 & 0.790880 & NA & NA \\ -\bottomrule -\end{tabular} -\caption{\textbf{The representatives and their effect on average score.} Linear -model described in~\cite{Axelrod1980b} with \(R^2=0.979\), Fitting a new model -to the same 5 strategies gives the coefficients gives -\(R^2=\protect\input{../assets/original_tournament_predictive_with_axelrod_5_r_squared.tex}\).} -\label{tbl:original_tournament_representative_model} -\end{table} \noindent \textbf{Cooperation in the original tournament.} Here we ask: \emph{what was the original tournament like?} The answer is that it was, in fact, highly cooperative. The mean cooperation rate across the tournaments is 75\%. When we plot cooperation rates against the original -rankings (Figure~\ref{fig:original_tournament_cooperation}\textbf{a}), most strategies are +rankings (Fig.~\ref{fig:original_tournament_cooperation}\textbf{a}), most strategies are indeed highly cooperative, with the exception of those in the bottom 14\% of the ranking, which display cooperation rates below 0.5. -In Figure~\ref{fig:original_tournament_cooperation}\textbf{b}, we show that the +In Fig.~\ref{fig:original_tournament_cooperation}\textbf{b}, we show that the top performing strategies cooperate almost perfectly with one another, one of Axelrod's key observations. He also emphasized the importance of \emph{provocability} (willingness to punish defection) and \emph{forgiveness} @@ -597,7 +465,7 @@ \section{Reproducing Axelrod's second tournament}\label{sec:reproducing} immediately to the opponent's last move: \TFT{} retaliates after defection and resumes cooperation after cooperation. As a result, \TFT{} achieves the same cooperation rate as its opponent. To capture this notion, in -Figure~\ref{fig:original_tournament_cooperation}\textbf{c} we plot the difference between +Fig.~\ref{fig:original_tournament_cooperation}\textbf{c} we plot the difference between pairwise cooperation rates and their transposes, that is, the deviation from symmetry. A value of 0 indicates that two strategies cooperate at exactly the same rate with one another. The top performing strategies cluster near 0, @@ -609,7 +477,7 @@ \section{Reproducing Axelrod's second tournament}\label{sec:reproducing} \TFT{} was widely recognized. As a consequence, many newly submitted strategies were explicitly designed to resemble \TFT{} or to cooperate effectively with \TFT{}-like rules, hence their high levels of cooperation and the -symmetry in their interactions. +symmetry in their interactions.\\ \begin{figure}[!hbtp] @@ -626,7 +494,7 @@ \section{Reproducing Axelrod's second tournament}\label{sec:reproducing} \label{fig:original_tournament_cooperation} \end{figure} -\section{Revisiting the tournament}\label{sec:extending} +\subsection*{Revisiting the tournament.} \noindent \textbf{Extra invitations.} @@ -672,7 +540,7 @@ \section{Revisiting the tournament}\label{sec:extending} The next most successful strategy, \texttt{k42r}, remains competitive (e.g., winning up to \(\sim\)37\% with three additional invitees), whereas strategies such as \texttt{k32r} and \texttt{k75r}, which can achieve high mean scores in -some realizations, tend to be even less effective as more entrants are introduced. +some realizations, tend to be even less effective as more entrants are introduced. \\ \begin{table}[!hbtp] \centering @@ -703,14 +571,14 @@ \section{Revisiting the tournament}\label{sec:extending} \TFT{} is not robust to accidental defections~\cite{molander1985optimal, bendor1993uncertainty, wu1995cope, do2017combination}. -Figure~\ref{fig:reproduced_with_noise} summarizes the results for a noise probability of -\(0.01\). Figure~\ref{fig:reproduced_with_noise}\textbf{a} shows rank changes among the 63 original +Fig.~\ref{fig:reproduced_with_noise} summarizes the results for a noise probability of +\(0.01\). Fig.~\ref{fig:reproduced_with_noise}\textbf{a} shows rank changes among the 63 original submissions: the left column orders strategies by their original rank, while the right column lists ranks \(1\)-\(63\), with arrows indicating each strategy's rank in the noisy tournament. As expected, noise leads to substantial reordering, with several mid ranking strategies moving into top positions and some former top performers dropping. The mean cooperation rate declines from \(0.75\) (noiseless) to \(0.65\) -under noise (Figure~\ref{fig:reproduced_with_noise}\textbf{c}). Correspondingly, the new +under noise (Fig.~\ref{fig:reproduced_with_noise}\textbf{c}). Correspondingly, the new winning strategy in this setting cooperates at \(0.61\), slightly \emph{below} the noisy-tournament mean, whereas \TFT{} cooperates at \(0.70\), \emph{above} the mean. This pattern reinforces the idea that \emph{cooperating slightly less than the @@ -724,7 +592,7 @@ \section{Revisiting the tournament}\label{sec:extending} We emphasize that evaluating the original submissions under noise is not entirely fair: many authors would likely have incorporated explicit error-correction or forgiveness mechanisms had noise been part of the original -rules. +rules.\\ \noindent @@ -742,26 +610,15 @@ \section{Revisiting the tournament}\label{sec:extending} \cite{Stewart2012} presented a focused tournament pitting ZD strategies against a small collection of other rules. When all S \& P strategies are added to Axelrod's second tournament, the resulting relative rank changes for the original -strategies are modest (Figure~\ref{fig:rank_change_in_sp_tournament}). The overall +strategies are modest (Fig.~\ref{fig:rank_change_in_sp_tournament}). The overall level of cooperation remains high (mean \(\approx 0.73\)), and the leading strategies are highly cooperative with one another, mirroring the qualitative -pattern of the original tournament. Table~\ref{tbl:sp_tournament_rankings_top_fifteen} +pattern of the original tournament. \textbf{Extended Data Table 2} lists the top-performing strategies (see the \SI~(S3) for the full ranking). In this new tournament, ZD strategies are distributed across the ranking rather than concentrated at the top (\SI~(S3)), while \TFT{}, \texttt{k42r}, and generous variants (e.g., GTFT~\cite{nowak1992tit} and ZD-GTFT-2) perform particularly well. -\begin{table}[!hbtp] - \centering - \resizebox{.8\textwidth}{!}{ - \input{../assets/sp_tournament_rankings_top_fifteen.tex}} - \caption{\textbf{Top 15 strategies in the Stewart and Plotkin tournament.} - We report the mean score, rank, and mean cooperation rate. For comparison, - we also include the cooperation rate from our reproduced tournament, - alongside the cooperation rates originally reported by Stewart and Plotkin.} - \label{tbl:sp_tournament_rankings_top_fifteen} -\end{table} - The \AXL{} library contains more than 200 strategies and regularly hosts the largest \IPD{} tournaments to date (each time a new strategy is contributed, @@ -769,10 +626,10 @@ \section{Revisiting the tournament}\label{sec:extending} including all of the original Fortran strategies (omitting the Python duplicates). This produces a tournament with \input{../assets/number_of_strategies_in_full_tournament.tex} strategies. +\textbf{Extended Data Table 3} shows the top 16 strategies of the tournament. -Table~\ref{tbl:full_tournament_rankings} shows the top 16 strategies of the tournament. Rank changes relative to the reproduced tournament are shown in -Figure~\ref{fig:rank_change_in_axelrod_python_tournament}\textbf{a}. +Fig.~\ref{fig:rank_change_in_axelrod_python_tournament}\textbf{a}. Several mid performing strategies from the original tournament rise into top positions in this more complex environment. Notably, \texttt{k42r} performs best among the original strategies, ranking 16th overall. The cooperation rate @@ -780,10 +637,10 @@ \section{Revisiting the tournament}\label{sec:extending} \input{../assets/library_tournament_cooperation_rate.tex}\unskip. By contrast, the overall cooperation rate of the expanded tournament that includes the Fortran strategies is \input{../assets/full_tournament_overall_cooperation_rate.tex} -(see Figure~\ref{fig:rank_change_in_axelrod_python_tournament}\textbf{c}). +(see Fig.~\ref{fig:rank_change_in_axelrod_python_tournament}\textbf{c}). Pairwise interactions are shown in -Figures~\ref{fig:rank_change_in_axelrod_python_tournament}\textbf{d}--\textbf{e}, +Figs.~\ref{fig:rank_change_in_axelrod_python_tournament}\textbf{d}--\textbf{e}, where top strategies are seen to cooperate strongly with one another, but do not when facing lower ranking opponents. The new winners appear to exploit weaker strategies, which contributes to their success. @@ -807,23 +664,9 @@ \section{Revisiting the tournament}\label{sec:extending} \end{enumerate} -\begin{table}[!hbtp] - \centering - \resizebox{.9\textwidth}{!}{ - \input{../assets/axelord_python_tournament_rankings_top_sixteen.tex}} - \caption{\textbf{Top 16 strategies in the \AXL{} tournament.} This - tournament includes all strategies from the \AXL{} library alongside the - original Fortran strategies. In total, there are 272 strategies competing. - Strategies denoted by $^\dagger$ were not designed but, they were trained - via reinforcement learning, as described in~\cite{Harper2017}.} - \label{tbl:full_tournament_rankings} -\end{table} - - Finally, we consider the \AXL{} tournament with noise, using noise probabilities of \(1\%\) and \(5\%\). The results are shown in -Figures~\ref{fig:rank_change_in_axelrod_python_tournament_noise_1} and -\ref{fig:rank_change_in_axelrod_python_tournament_noise_5}. As expected, the +\textbf{Extended Data Figs. 3--4}. As expected, the overall cooperation rate is lower than in the noiseless, reproduced, and reproduced with noise tournaments. Notably, several of the original submissions perform very well: the best performer from the original set ranks 5th with @@ -835,7 +678,7 @@ \section{Revisiting the tournament}\label{sec:extending} more complex competitors, these strategies make use of their additional mechanisms to maintain competitive payoffs and robust rankings. -\section{Discussion}\label{sec:discussion} +\section*{Conclusion}\label{sec:discussion} Our study revisits one of the most influential computational experiments in the social sciences: Axelrod's second Iterated Prisoner's Dilemma (\IPD) tournament. @@ -885,7 +728,7 @@ \section{Discussion}\label{sec:discussion} the first effort to package and reproduce, according to contemporary best practices, code originally written in the 1980s. The archived materials~\cite{knight_2025_17250038} (at \url{https://doi.org/10.5281/zenodo.17250038}) -are curated to high standards of reproducible research~\cite{wilson2014} and +are curated to high standards of reproducible research~\cite{wilson2014, sandve2013, wilson2017, stodden2018, turingway2022} and accompanied by a fully automated test suite. All changes to the original code were made systematically and transparently, with complete records available at (\url{https://github.com/Axelrod-Python/axelrod-fortran}). @@ -905,7 +748,85 @@ \section{Discussion}\label{sec:discussion} experiments into alignment with modern standards of reproducibility, and to advance reproducible software and science. +\section*{Methods} + +The surviving code of Axelrod's second tournament was written in Fortran and is +hosted online by the University of Michigan Center for the Study of Complex +Systems~\cite{Axelrod1980bCode}, where it was last updated in 1996. The source +code for all strategies is contained in a single file, \texttt{TourExec1.1.f}, +embedded in an HTML page. + +Our first step was to ensure that this code could be executed with modern +software. We stripped the HTML formatting to recover the raw Fortran source and +applied only minimal modifications to enable compilation with contemporary +Fortran compilers. Each strategy was then extracted into its own modular file. +To streamline the build process, we created a dedicated \texttt{Makefile} that +compiles all strategy files into a single shared library +(\texttt{libstrategies.so}). Once installed in a standard location on a +POSIX-compliant operating system (e.g., \texttt{/usr/local/lib/}), this library +is automatically located at runtime. The modified source code is openly +available at \url{https://github.com/Axelrod-Python/TourExec} and has been +archived at~\cite{TourExec}, ensuring long-term accessibility. + +Each Fortran strategy was implemented as a function with a fixed set of input +arguments that encode the state of the match: + +\begin{itemize} + \item \texttt{J}: Opponent's previous move (0 = cooperate, 1 = defect), + \item \texttt{M}: Current turn number (starting at 1), + \item \texttt{K}: Player's cumulative score, + \item \texttt{L}: Opponent's cumulative score, + \item \texttt{R}: Random number between 0 and 1 (for stochastic strategies), + \item \texttt{JA}: Player's previous move. +\end{itemize} +Given these inputs, the function outputs either 0 (cooperate) or 1 (defect). + +With the strategies executable again, the next challenge was to run the +tournament. For this we rely on the open-source \AXL{} library, which provides a +modern implementation of \IPD{} tournaments. In this framework, a +\emph{tournament} is a collection of matches, and each \emph{match} is a +repeated game between two strategies. A tournament class manages the overall +structure (pairing strategies, scheduling matches, aggregating results), while +strategy classes determine actions turn by turn based on the recorded history of +play. + +To integrate the original Fortran strategies into this environment, we developed +a Python package, \AXLFortran~\cite{Axelrod_fortran}. The \AXLFortran{} adapter +class inherits from the base \AXL{} strategy class and translates between the two +languages: it constructs the required inputs, calls the Fortran function, and +returns the chosen move to the Python environment +(Fig.~\ref{fig:reviving_diagram}). The adapter also handles the initial moves +of both players +required by the Fortran strategies, which is fixed to cooperation in the original +code. + +\section*{Data availability} +The data generated and analysed in this study are available in the Zenodo repository~\cite{knight_2025_17250038} at +\url{https://doi.org/10.5281/zenodo.17250038}. + +\section*{Code availability} +The code used to generate and run the tournaments, as well as all analysis +scripts, has been archived alongside the data at the same Zenodo repository and +is also accessible via the project's online repository: +\url{https://github.com/Axelrod-Python/revisiting-axelrod-second/}. Instructions for +installation and reproduction are provided in the repository README. + +\section*{Acknowledgements} +We thank all contributors to the \AXL{} library. We also acknowledge the +open source ecosystem that enabled this work, including NumPy, pandas, and +Matplotlib. This study would not have been possible without the broader +open source community. + + +\section*{Author contributions} +V.K., O.C., M.H., and N.E.G. designed the study. +V.K., O.C., T.J.G., and M.H. wrote the \AXLFortran{} software. +V.K. and N.E.G. performed the analysis. +V.K., M.H., and N.E.G. discussed the results and wrote the manuscript. + + +%%%% FIGURES %%%% \begin{figure}[!hbtp] \centering \includegraphics[width=.88\textwidth]{../assets/reproduced_with_noise.pdf} @@ -950,27 +871,122 @@ \section{Discussion}\label{sec:discussion} \label{fig:rank_change_in_axelrod_python_tournament} \end{figure} +\newpage + +%%%% REFERENCES %%%% +\bibliographystyle{naturemag} +\bibliography{../bibliography.bib} + + +%%%% EXTENDED DATA %%%% +\section*{Extended Data} + +\begin{table}[!hbtp] + \centering + \resizebox{.9\textwidth}{!}{ + \input{../assets/original_tournament_rankings.tex}} + \caption*{\textbf{Extended Data Table 1. Top 15 strategies in the reproduced tournament.} + The table lists the top 15 strategies from Axelrod's original tournament + along with their rankings in our reproduced tournament. For each strategy, we + report the average score and the average cooperation rate in the reproduced + tournament, as well as the proportion of wins across our repetitions of the + original tournament. \TFT{} wins 63.3\% of these repetitions, indicating that + in 36.7\% of runs a different winner emerges.} +\end{table} + + + +\begin{figure}[!hbtp] + \begin{center} + \begin{lstlisting}[language=Fortran, + basicstyle=\ttfamily\scriptsize, + frame=single, + keywordstyle=\color{red}\bfseries, + commentstyle=\color{teal}\itshape] + FUNCTION K61R(ISPICK,ITURN,K,L,R, JA) +C BY DANNY C. CHAMPION +C TYPED BY JM 3/27/79 + k61r=ja ! Added 7/27/93 to report own old value + IF (ITURN .EQ. 1) ICOOP = 0 ! Added 10/8/2017 to fix bug for multiple runs + IF (ITURN .EQ. 1) K61R = 0 + IF (ISPICK .EQ. 0) ICOOP = ICOOP + 1 + IF (ITURN .LE. 10) RETURN + K61R = ISPICK + IF (ITURN .LE. 25) RETURN + K61R = 0 + COPRAT = FLOAT(ICOOP) / FLOAT(ITURN) + IF (ISPICK .EQ. 1 .AND. COPRAT .LT. .6 .AND. R .GT. COPRAT) + +K61R = 1 + RETURN + END + \end{lstlisting} + \caption*{\textbf{Extended Data Fig 1. Fortran source code for \texttt{k61r} (Champion).} + The original implementation contained a bug: the variable \texttt{ICOOP} was not + initialized within the function. In the first match it effectively started at 0, + but in subsequent matches it could have kept its value from the previous match or be reset to 0, + depending on the compiler and runtime environment. Line~5 shows the fix, which + explicitly initializes \texttt{ICOOP} at the start of each match.} + \end{center} +\end{figure} + + +\begin{figure}[!hbtp] + \centering + \includegraphics[width=\textwidth]{../assets/Figure_linear_regression_results.pdf} + \caption*{\textbf{Extended Data Fig.~2. Reproduction of Axelrod's linear model.} + \textbf{a,} The representative strategies and their effect on average score. + We reproduce the linear model described in~\cite{Axelrod1980b}, which reports + \(R^2 = 0.979\). Fitting a new model to the same five strategies yields + \(R^2 = \protect\input{../assets/original_tournament_predictive_with_axelrod_5_r_squared.tex}\). + \textbf{b,} \(R^2\) as a function of the number of strategies included (subset size), + obtained using recursive feature elimination (RFE)~\cite{guyon2002gene}. + Starting from the full set of strategies, we iteratively remove the least + informative one, refit the model, and record the resulting \(R^2\). + For each subset size (from 1 to 25), the subset yielding the highest \(R^2\) + is retained. The estimated \(R^2\) rises rapidly from about 0.75 to 0.95 as + the number of included strategies increases from 1 to 5, after which + improvements are smaller.} +\end{figure} + + +\begin{table}[!hbtp] + \centering + \resizebox{.8\textwidth}{!}{ + \input{../assets/sp_tournament_rankings_top_fifteen.tex}} + \caption*{\textbf{Extended Data Table 2. Top 15 strategies in the Stewart and Plotkin tournament.} + We report the mean score, rank, and mean cooperation rate. For comparison, + we also include the cooperation rate from our reproduced tournament, + alongside the cooperation rates originally reported by Stewart and Plotkin.} +\end{table} + + +\begin{table}[!hbtp] + \centering + \resizebox{.9\textwidth}{!}{ + \input{../assets/axelord_python_tournament_rankings_top_sixteen.tex}} + \caption*{\textbf{Extended Data Table 3. Top 16 strategies in the \AXL{} tournament.} This + tournament includes all strategies from the \AXL{} library alongside the + original Fortran strategies. In total, there are 272 strategies competing. + Strategies denoted by $^\dagger$ were not designed but, they were trained + via reinforcement learning, as described in~\cite{Harper2017}.} +\end{table} + + \begin{figure}[!hbtp] \centering \includegraphics[width=.90\textwidth]{../assets/axelrod_python_tournament_noise_1.pdf} - \caption{\textbf{Reproduction of Axelrod's second tournament with the addition + \caption*{\textbf{Extended Data Fig. 3. Reproduction of Axelrod's second tournament with the addition of the strategies from the \AXL and with noise 1\%.} Similar to Figure~\ref{fig:rank_change_in_sp_tournament}.} - \label{fig:rank_change_in_axelrod_python_tournament_noise_1} \end{figure} \begin{figure}[!hbtp] \centering \includegraphics[width=.90\textwidth]{../assets/axelrod_python_tournament_noise_5.pdf} - \caption{\textbf{Reproduction of Axelrod's second tournament with the addition + \caption*{\textbf{Extended Data Fig. 4. Reproduction of Axelrod's second tournament with the addition of the strategies from the \AXL and with noise 5\%.} Similar to Figure~\ref{fig:rank_change_in_sp_tournament}.} - \label{fig:rank_change_in_axelrod_python_tournament_noise_5} \end{figure} - -\bibliographystyle{naturemag} -\bibliography{../bibliography.bib} - \end{document} diff --git a/si/main.pdf b/si/main.pdf index 1d81218..3f9e5b4 100644 Binary files a/si/main.pdf and b/si/main.pdf differ diff --git a/si/main.tex b/si/main.tex index 7369097..5150f53 100644 --- a/si/main.tex +++ b/si/main.tex @@ -40,12 +40,12 @@ \author[4]{T. J. Gaffney} \author[5, 6]{Nikoleta E. Glynatsi} -\affil[1]{School of Mathematics, Cardiff University} -\affil[2]{Independent Researcher, Chester, United Kingdom} -\affil[3]{Google Inc.} -\affil[4]{TBC} -\affil[5]{Discrete Event Simulations Teams, RIKEN Center for Computational Science} -\affil[6]{Mathematical Social Science Team, RIKEN Center for Interdisciplinary Theoretical and Mathematical Sciences} +\affil[1]{School of Mathematics, Cardiff University, United Kingdom} +\affil[2]{Independent Researcher, Cardiff, United Kingdom} +\affil[3]{Google Inc., California, USA} +\affil[4]{Independent Research, Nevada, USA} +\affil[5]{Discrete Event Simulations Teams, RIKEN Center for Computational Science, Kobe, Japan} +\affil[6]{Mathematical Social Science Team, RIKEN Center for Interdisciplinary Theoretical and Mathematical Sciences, Wako, Japan} \affil[$*$]{Corresponding author: KnightVA@cardiff.ac.uk.} \date{} @@ -78,11 +78,6 @@ ranks for the comprehensive \AXL{} tournament (including the original submissions), available online. - \item \textbf{Section~\ref{app:linear_model}} details the linear-model analysis - using recursive feature elimination to identify subsets of strategies - that best predict average scores. We show the resulting \(R^2\) as a function - of the number of strategies included (Figure~\ref{fig:original_tournament_r_squared_versus_number_of_features}). - \item \textbf{Section~\ref{app:k42r_fortran}} shows the original Fortran source code of \texttt{k42r} and summarizes its behavior. @@ -151,31 +146,6 @@ \section{Full list of strategies and ranks for \AXL{} tournament}\label{app:axl} with and without noise. -\section{Linear regression analysis}\label{app:linear_model} - -Using recursive feature elimination (RFE)~\cite{guyon2002gene}, we select -subsets of strategies to include in a simple linear model to predict average -score. We begin with the full set of strategies. We estimate how useful each strategy is -for predicting average scores, remove the least useful one, refit the model, and -repeat. In this way, for any chosen number of strategies to include, -we obtain the corresponding best subset. - -We run this procedure for subset sizes from 1 to 25. For each size, we keep the -subset that gives the highest \(R^2\), as shown in -Figure~\ref{fig:original_tournament_r_squared_versus_number_of_features}. The -estimated \(R^2\) rises from about 0.75 to about 0.95 when moving from 1 to 5 -included strategies, after which improvements are smaller. - -\begin{figure}[!hbtp] - \centering - \includegraphics[width=.8\textwidth]{../assets/original_tournament_r_squared_versus_number_of_features.pdf} - \caption{\(R^2\) versus the \emph{number of strategies to include} (subset - size), obtained with recursive feature elimination using strategies. For each - size, the shown value corresponds to the subset with the highest \(R^2\) - when predicting a strategy's average score (and thus its rank).} - \label{fig:original_tournament_r_squared_versus_number_of_features} -\end{figure} - \section{Fortran source code for k42r}\label{app:k42r_fortran} From inspection of the diff --git a/src/Extra_invitations.ipynb b/src/Extra_invitations.ipynb index 97dbe40..55489fd 100644 --- a/src/Extra_invitations.ipynb +++ b/src/Extra_invitations.ipynb @@ -1393,7 +1393,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.0" + "version": "3.12.7" } }, "nbformat": 4, diff --git a/src/Reproducing_tournament.ipynb b/src/Reproducing_tournament.ipynb index 3149d01..a80eebe 100644 --- a/src/Reproducing_tournament.ipynb +++ b/src/Reproducing_tournament.ipynb @@ -339,24 +339,38 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 27, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "k92r 0.63064\n", + "k42r 0.31488\n", + "k75r 0.02244\n", + "k60r 0.01024\n", + "k82r 0.00824\n", + "k32r 0.00800\n", + "k44r 0.00384\n", + "k78r 0.00156\n", + "k35r 0.00016\n", + "Name: proportion, dtype: float64" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "max_score_per_tournament = original_tournament_scores.max(axis=1, skipna=True) \n", - "is_max = original_tournament_scores.eq(row_max, axis=0)\n", - "denominator = mask.sum(axis=1) \n", - "shares = mask.div(den.replace(0, np.nan), axis=0).fillna(0.0) \n", - "proportion_of_wins = shares.mean()\n", - "with open(\"../assets/original_tournament_win_proportion.tex\", \"w\") as f:\n", - " f.write(\n", - " pd.DataFrame(proportion_of_wins[proportion_of_wins > 0], columns=(\"Win proportion\",)).round(4).to_latex(float_format=\"%.4f\")\n", - " )" + "winners = original_tournament_scores.idxmax(axis=1)\n", + "proportions = winners.value_counts(normalize=True)\n", + "proportions" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -484,7 +498,7 @@ "k60r 2.864055 2.890169 Jim Graaskamp and Ken Katzen 6 " ] }, - "execution_count": 7, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -524,7 +538,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 29, "metadata": {}, "outputs": [], "source": [ @@ -556,7 +570,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -577,7 +591,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -865,7 +879,7 @@ "k72r Edward C White Jr 13 " ] }, - "execution_count": 10, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -899,7 +913,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -921,7 +935,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 31, "metadata": {}, "outputs": [], "source": [ @@ -940,7 +954,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 32, "metadata": {}, "outputs": [], "source": [ @@ -949,7 +963,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 33, "metadata": {}, "outputs": [ { @@ -1322,7 +1336,7 @@ "[63 rows x 63 columns]" ] }, - "execution_count": 14, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -1336,7 +1350,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 34, "metadata": {}, "outputs": [], "source": [ @@ -1349,7 +1363,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 35, "metadata": {}, "outputs": [ { @@ -1442,7 +1456,7 @@ "[1 rows x 67 columns]" ] }, - "execution_count": 16, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -1453,7 +1467,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 36, "metadata": {}, "outputs": [ { @@ -1651,7 +1665,7 @@ "[5 rows x 67 columns]" ] }, - "execution_count": 17, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -1673,7 +1687,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 37, "metadata": {}, "outputs": [], "source": [ @@ -1687,7 +1701,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 38, "metadata": {}, "outputs": [ { @@ -2088,7 +2102,7 @@ "[63 rows x 67 columns]" ] }, - "execution_count": 19, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -2107,7 +2121,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 39, "metadata": {}, "outputs": [], "source": [ @@ -2118,7 +2132,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 40, "metadata": {}, "outputs": [], "source": [ @@ -2133,7 +2147,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 41, "metadata": {}, "outputs": [ { @@ -2506,7 +2520,7 @@ "[63 rows x 67 columns]" ] }, - "execution_count": 22, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } @@ -2526,7 +2540,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 42, "metadata": {}, "outputs": [], "source": [ @@ -2540,7 +2554,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 43, "metadata": {}, "outputs": [ { @@ -2955,7 +2969,7 @@ "[63 rows x 67 columns]" ] }, - "execution_count": 24, + "execution_count": 43, "metadata": {}, "output_type": "execute_result" } @@ -2975,7 +2989,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 33, "metadata": {}, "outputs": [ { @@ -3149,7 +3163,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 44, "metadata": {}, "outputs": [ { @@ -3168,7 +3182,7 @@ "dtype: int64" ] }, - "execution_count": 27, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } @@ -3180,7 +3194,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 45, "metadata": {}, "outputs": [ { @@ -3199,7 +3213,7 @@ "dtype: int64" ] }, - "execution_count": 28, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } @@ -3210,7 +3224,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 46, "metadata": {}, "outputs": [ { @@ -3219,7 +3233,7 @@ "" ] }, - "execution_count": 29, + "execution_count": 46, "metadata": {}, "output_type": "execute_result" } @@ -3237,7 +3251,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 47, "metadata": {}, "outputs": [ { @@ -3610,7 +3624,7 @@ "[63 rows x 65 columns]" ] }, - "execution_count": 30, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } @@ -3628,7 +3642,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 38, "metadata": {}, "outputs": [ { @@ -3720,7 +3734,7 @@ "k44r 0.881894 " ] }, - "execution_count": 31, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -3733,9 +3747,48 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": null, "metadata": {}, "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "6\n", + "7\n", + "8\n", + "9\n", + "10\n", + "11\n", + "12\n", + "13\n", + "14\n", + "15\n", + "16\n", + "17\n", + "18\n", + "19\n", + "20\n", + "21\n", + "22\n", + "23\n", + "24\n", + "25\n" + ] + } + ], "source": [ "r_squared_values = []\n", "max_n_features_to_select = 25\n", @@ -3758,14 +3811,14 @@ }, { "cell_type": "code", - "execution_count": 142, + "execution_count": 74, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ - "
" + "
" ] }, "metadata": {}, @@ -3773,19 +3826,24 @@ } ], "source": [ - "plt.subplots(1, figsize=(5.5, 3))\n", + "fig, ax = plt.subplots(1, figsize=(4.5, 3))\n", "\n", - "plt.plot(range(1, max_n_features_to_select + 1), r_squared_values, '-o')\n", + "plt.plot(range(1, max_n_features_to_select + 1), r_squared_values, '--o', color='brown', markersize=5)\n", "\n", - "plt.axhline(.96, label=\"$R^2=.96$\", color=\"grey\", linestyle='--', alpha=0.5)\n", - "plt.axhline(.99, label=\"$R^2=.99$\", color=\"black\", linestyle='--', zorder=-1, alpha=0.5)\n", + "plt.axhline(.96, label=\"$R^2=.96$\", color=\"grey\", alpha=0.5)\n", + "plt.axhline(.99, label=\"$R^2=.99$\", color=\"black\", zorder=-1, alpha=0.5)\n", "\n", "plt.xlabel(\"Number of selected strategies\")\n", "plt.ylabel(\"$R^2$\")\n", "\n", - "plt.legend()\n", "plt.tight_layout()\n", "\n", + "ax.spines[['right', 'top']].set_visible(False)\n", + "\n", + "ax.text(21, 0.967, \"$R^2=0.96$\", color=\"black\")\n", + "\n", + "ax.text(19, 0.937, \"$R^2=0.96$\", color=\"grey\");\n", + "\n", "plt.savefig(\"../assets/original_tournament_r_squared_versus_number_of_features.pdf\",\n", " transparent=True)" ] @@ -4144,7 +4202,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 48, "metadata": {}, "outputs": [], "source": [ @@ -4156,7 +4214,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 67, "metadata": {}, "outputs": [ { @@ -4185,6 +4243,7 @@ " Reproduced Rank\n", " Original Rank\n", " Mean Cooperation Rate\n", + " proportion\n", " \n", " \n", " \n", @@ -4195,6 +4254,7 @@ " 1\n", " 1\n", " 0.921831\n", + " 0.63064\n", " \n", " \n", " k61r\n", @@ -4203,6 +4263,7 @@ " 12\n", " 2\n", " 0.954240\n", + " NaN\n", " \n", " \n", " k42r\n", @@ -4211,6 +4272,7 @@ " 2\n", " 3\n", " 0.916128\n", + " 0.31488\n", " \n", " \n", " k49r\n", @@ -4219,6 +4281,7 @@ " 4\n", " 4\n", " 0.892220\n", + " NaN\n", " \n", " \n", " k44r\n", @@ -4227,6 +4290,7 @@ " 3\n", " 5\n", " 0.881894\n", + " 0.00384\n", " \n", " \n", "\n", @@ -4240,15 +4304,15 @@ "k49r Rob Cave 2.8260 4 4 \n", "k44r William Adams 2.8260 3 5 \n", "\n", - " Mean Cooperation Rate \n", - "k92r 0.921831 \n", - "k61r 0.954240 \n", - "k42r 0.916128 \n", - "k49r 0.892220 \n", - "k44r 0.881894 " + " Mean Cooperation Rate proportion \n", + "k92r 0.921831 0.63064 \n", + "k61r 0.954240 NaN \n", + "k42r 0.916128 0.31488 \n", + "k49r 0.892220 NaN \n", + "k44r 0.881894 0.00384 " ] }, - "execution_count": 51, + "execution_count": 67, "metadata": {}, "output_type": "execute_result" } @@ -4256,32 +4320,35 @@ "source": [ "ranking_df = scores[[\"Author\", \"Scores\", \"Reproduced Rank\", \"Original Rank\"]].round(4)\n", "ranking_df = ranking_df.join(original_cooperation_rates[[\"Mean Cooperation Rate\"]])\n", + "ranking_df = ranking_df.join(proportions)\n", "ranking_df.head()" ] }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 68, "metadata": {}, "outputs": [], "source": [ "ranking_df = ranking_df.rename(columns={'Scores': 'Average Score'})\n", - "ranking_df = ranking_df.rename(columns={\"Mean Cooperation Rate\": 'Average / Cooperation Rate'})" + "ranking_df = ranking_df.rename(columns={\"Mean Cooperation Rate\": 'Average / Cooperation Rate'})\n", + "ranking_df = ranking_df.rename(columns={\"proportion\": 'Win / proportion'})\n", + "ranking_df = ranking_df.fillna(0)" ] }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 69, "metadata": {}, "outputs": [], "source": [ "with open(\"../assets/original_tournament_rankings.tex\", \"w\") as f:\n", - " f.write(ranking_df.rename(columns=break_header).head(15).to_latex(float_format=\"%.3f\").replace(\"rrrr\", \"cccc\"))" + " f.write(ranking_df.rename(columns=break_header).head(15).to_latex(float_format=\"%.4f\").replace(\"rrrr\", \"cccc\"))" ] }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 70, "metadata": {}, "outputs": [ { @@ -4310,6 +4377,7 @@ " Reproduced Rank\n", " Original Rank\n", " Average / Cooperation Rate\n", + " Win / proportion\n", " \n", " \n", " \n", @@ -4320,6 +4388,7 @@ " 53\n", " 53\n", " 0.499545\n", + " 0.0\n", " \n", " \n", " k77r\n", @@ -4328,6 +4397,7 @@ " 55\n", " 55\n", " 0.332062\n", + " 0.0\n", " \n", " \n", " k89r\n", @@ -4336,6 +4406,7 @@ " 56\n", " 56\n", " 0.497671\n", + " 0.0\n", " \n", " \n", " k54r\n", @@ -4344,6 +4415,7 @@ " 57\n", " 58\n", " 0.466780\n", + " 0.0\n", " \n", " \n", " k33r\n", @@ -4352,6 +4424,7 @@ " 59\n", " 59\n", " 0.410634\n", + " 0.0\n", " \n", " \n", " k71r\n", @@ -4360,6 +4433,7 @@ " 60\n", " 60\n", " 0.157546\n", + " 0.0\n", " \n", " \n", " k74r\n", @@ -4368,14 +4442,16 @@ " 61\n", " 61\n", " 0.173823\n", + " 0.0\n", " \n", " \n", " krandomc\n", - " None\n", + " 0\n", " 1.6215\n", " 62\n", " 62\n", " 0.499971\n", + " 0.0\n", " \n", " \n", " k36r\n", @@ -4384,6 +4460,7 @@ " 63\n", " 63\n", " 0.091591\n", + " 0.0\n", " \n", " \n", "\n", @@ -4398,22 +4475,22 @@ "k33r Harold Rabbie 2.0157 59 59 \n", "k71r James E Hall 1.9831 60 60 \n", "k74r Edward Friedland 1.8426 61 61 \n", - "krandomc None 1.6215 62 62 \n", + "krandomc 0 1.6215 62 62 \n", "k36r Roger Hotz 1.4640 63 63 \n", "\n", - " Average / Cooperation Rate \n", - "k48r 0.499545 \n", - "k77r 0.332062 \n", - "k89r 0.497671 \n", - "k54r 0.466780 \n", - "k33r 0.410634 \n", - "k71r 0.157546 \n", - "k74r 0.173823 \n", - "krandomc 0.499971 \n", - "k36r 0.091591 " + " Average / Cooperation Rate Win / proportion \n", + "k48r 0.499545 0.0 \n", + "k77r 0.332062 0.0 \n", + "k89r 0.497671 0.0 \n", + "k54r 0.466780 0.0 \n", + "k33r 0.410634 0.0 \n", + "k71r 0.157546 0.0 \n", + "k74r 0.173823 0.0 \n", + "krandomc 0.499971 0.0 \n", + "k36r 0.091591 0.0 " ] }, - "execution_count": 65, + "execution_count": 70, "metadata": {}, "output_type": "execute_result" } @@ -4467,7 +4544,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.0" + "version": "3.12.7" } }, "nbformat": 4, diff --git a/src/Revisiting_tournament.ipynb b/src/Revisiting_tournament.ipynb index 0e540c4..9e28983 100644 --- a/src/Revisiting_tournament.ipynb +++ b/src/Revisiting_tournament.ipynb @@ -1925,7 +1925,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.0" + "version": "3.12.7" } }, "nbformat": 4,