The evolution of complex organismal traits is obvious as a historical fact, but the underlying causes—including the role of natural selection—are contested. Gould argued that a random walk from a necessarily simple beginning would produce the appearance of increasing complexity over time. Others contend that selection, including coevolutionary arms races, can systematically push organisms toward more complex traits. Methodological challenges have largely precluded experimental tests of these hypotheses. Using the Avida platform for digital evolution, we show that coevolution of hosts and parasites greatly increases organismal complexity relative to that otherwise achieved. As parasites evolve to counter the rise of resistant hosts, parasite populations retain a genetic record of past coevolutionary states. As a consequence, hosts differentially escape by performing progressively more complex functions. We show that coevolution's unique feedback between host and parasite frequencies is a key process in the evolution of complexity. Strikingly, the hosts evolve genomes that are also more phenotypically evolvable, similar to the phenomenon of contingency loci observed in bacterial pathogens. Because coevolution is ubiquitous in nature, our results support a general model whereby antagonistic interactions and natural selection together favor both increased complexity and evolvability.
Avida Configuration Files for the Original Experiments
This compressed archive contains the configuration files required to perform the original experiments in full. Avida is available for free from https://github.com/devosoft/avida/. More information can be found about each of these files as part of the Avida documentation at https://github.com/devosoft/avida/wiki/Configuration-and-Command-Reference.
coevolving-complexity-config_files.zip
coevolving-complexity-original
This file contains the time series data used to generate Figure 2 and Figure 3, as well as some additional details recorded over time. These data were summarized from several individual output files generated by Avida experiments.
1. update - The update (point in time) when this row of data was collected
2. parasite_treatment - Were parasites included in these experiments? (0/1)
3. remove_parasites - Were parasites experimentally removed? (0/1)
4. replicate - The replicate within a group of runs the data are from
5. num_parasites - The density of parasites
6. num_hosts - The density of hosts
7. average_host_nands - Number of NANDs required to perform the hosts average function, averaged across all hosts
8. host_max_task_nands - Number of NANDs required to perform the most complex host function, averaged across all hosts
9. average_number_of_host_tasks - Average number of tasks hosts perform
10. average_number_of_parasite_tasks - Average number of tasks parasites perform
11. lost_parasites - Were parasites driven extinct in this replicate? (0/1)
12. treatment - Number id that identifies the treatment (0 - Evolved, 1 - Coevolved, 2 - Cured)
coevolving-complexity-equ_ancestors
coevolving-complexity-equ-distribution_detail
This file contains a breakdown of the frequency at which hosts's most complex functions require 1, 2, 3, 4, or 5 NANDs (Column named N.nand). These data are recorded much more frequently, but for an overall shorter length of time. These data were used to generate Figure S1.
coevolving-complexity-dominant_genotype_landscaping
These data are used to make Figure 9 in the manuscript. It contains data generated by systematically mutating the most abundant genotype from each replicate population. Every possible point mutation is made and run through Avida to identify which tasks it now performs. That data is then summarized into the following columns:
1. Treatment - The name of the treatment genotypes came from (Evolved/Coevolved)
3. Replicate - The replicate within the treatment these data are about
4. Point_Decrease - The number of point mutations that decrease the number of tasks this genotype performs
5. Point_Increase - The number of point mutations that increase the number of tasks this genotype performs
6. Point_Neutral - The number of point mutations that change the identity of the tasks performed while keeping the number of tasks the same
7. Point_Viable - The number of point mutations that produce a viable genotype regardless of changes to phenotype
8. Point_Inviable - The number of point mutations that produce inviable genotypes
9. Dominant_Genotype - The sequence of the genotype being analyzed
coevolving-complexity-matching_phenotype_genetic_landscaping
These data specifically pair genotypes from coevolved and evolved populations performing the same exact set of tasks. These data are used to generate Figure 10.
1. ReplicateEvo - The replicate population which the evolved genotype came from
2. ReplicateCoevo - The replicate population which the coevolved genotype came from
3. MatchingPhenotype - The phenotype that was matched between the evolved and coevolved treatments
4. Point_Decrease.Evo - The number of point mutations that decrease the number of tasks this evolved genotype performs
5. Point_Increase.Evo - The number of point mutations that increase the number of tasks this evolved genotype performs
6. Point_Neutral.Evo- The number of point mutations that change the identity of the tasks performed while keeping the number of tasks the same in the evolved genotype
7. Point_Viable.Evo - The number of point mutations that produce a viable genotype regardless of changes to phenotype for the evolved genotype
8. Point_Inviable.Evo - The number of point mutations that produce an inviable genotype for the evolved genotype
9. NumUniqueReachable.Evo - The number of unique phenotypes reachable by only single point mutations from the evolved genotype
10. Point_Decrease.Coevo - The number of point mutations that decrease the number of tasks this coevolved genotype performs
11. Point_Increase.Coevo - The number of point mutations that increase the number of tasks this coevolved genotype performs
12. Point_Neutral.Coevo - The number of point mutations that change the identity of the tasks performed while keeping the number of tasks the same in the coevolved genotype
13. Point_Viable.Coevo - The number of point mutations that produce a viable genotype regardless of changes to phenotype for the coevolved genotype
14. Point_Inviable.Coevo - The number of point mutations that produce an inviable genotype for the coevolved genotype
15. NumUniqueReachable.Coevo - The number of unique phenotypes reachable by only single point mutations from the coevolved genotype
coevolving-complexity-time_to_MRCA
These data are used to generate Figure 8 in the manuscript. The MRCA is identified by essentially building the phylogenetic tree of all living Avida programs at the end of each run and identifying the first branching event. The tree is constructed using data included in the **detail** files, which are provided in the compressed files coevolving-complexity-details_and_phenotype_grids.tar.gz. These detail files record the parent/offspring relationship for every genotype alive as well as their entire line of decent. The summarized data are summarized with the following columns:
1. Treatment - Name of the treatment where these data are from (Coevolved/Evolved)
2. Replicate - The replicate population within the treatment
3. UpdateLCABorn - The update that the last common ancestor of all the organisms present at the end of the experiment (MRCA) was born
4. lost_parasites - Did this population drive parasites extinct? (0/1)
coevolving-complexity-details_and_phenotype_grids.tar
This compressed archive contains raw data output from Avida that was used to generate the MRCA data above as well as part of the raw data summarized in coevolving-complexity-original.csv. The detail files were used to generate Figure 7, the phylogenetic tree of example populations, as described above. The GridDump files were used to generate the data panels of Figure 4 (E-H).
A more detailed description of these data files can be found with the Avida documentation:
https://github.com/devosoft/avida/wiki/PrintData-Options
https://github.com/devosoft/avida/wiki/List-of-actions#DumpParasiteTaskGrid
https://github.com/devosoft/avida/wiki/List-of-actions#DumpHostTaskGrid
coevolving-complexity-replay_parasites
These two files contain the same data columns as the original experiments, but here the parasite genotypes were replayed exactly from a coevolving population while hosts evolved anew to the changing but non-coevolving parasites (replay treatment). Along with coevolving-complexity-original.csv, these data were used to make Figure 5.
coevolving-complexity-freeze_parasites
These two files contain the same data columns as the original experiments, but here the parasite genotypes were either kept constant (freeze treatment) while hosts evolved anew to the changing but non-coevolving parasites (replay treatment). Along with coevolving-complexity-original.csv, these data were used to make Figure 5.
coevolving-complexity-challenge-data-nands
These data were generated through the challenge experiment, where host and parasite lineages were coevolved through successive "challenge" bouts. The following columns are contained in the csv:
1. replicate - The replicate challenge experiment
2. completed - Were all 50 rounds of challenges complete?
3. step - The round that the data row is from
4. host_phenotype - The integer phenotype for the host - computed by considering the phenotype bitstring (e.g., 10100000 = 4)
5. parasite_phenotype - The integer phenotype for the parasite
6. host_iterations - The number of iterations of generating random host populations that were required to find a succesful mutant
7. parasite_iterations - The number of iterations of generating random parasite populations that were required to find a successful mutant
8. host_sequence - The genetic sequence of the successful host
9. parasite_sequence - The genetic sequence of the successful parasite
10. host_avg_task_nands - The number of NANDs required to compute the hosts average task
11. host_max_task_nands - The number of NANDs required to compute the hosts most complex task