Skip to content

Commit

Permalink
Merge pull request #21 from Macr0Nerd/generations
Browse files Browse the repository at this point in the history
Generations
  • Loading branch information
Macr0Nerd authored Dec 27, 2023
2 parents 12c5455 + 1769c09 commit 0be7964
Show file tree
Hide file tree
Showing 78 changed files with 511 additions and 147 deletions.
12 changes: 10 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ Inspired by [this Veritasium](https://youtu.be/mScpHTIi-kM?si=7pe8XjmjjWLhMup6)
* [Dynamic Imports](#dynamic-imports)
* [Algorithms](#algorithms)
* [Simulations](#simulations)
* [Generational Simulations](#generational-simulations)

## Installation
### PyPi
Expand Down Expand Up @@ -99,7 +100,7 @@ The function should return `True` for cooperation, and `False` for defection.

If you want to add mutations, set the static mutation list *after* defining the class as to avoid circular imports.

A template has been provided us `templates/algorithm_template.py` for ease of use.
A template has been provided in `templates/algorithm_template.py` for ease of use.

## Simulations
Simulations a more complicated to configure as compared to algorithms.
Expand All @@ -109,7 +110,14 @@ You only need to override the `run_simulation` and `process_simulation` methods,
`process_simulation` to get the results.

For example, the provided standard simulations process the rounds data to calculate scores for each node
A template can be found in `templates/simulation_template.py`
A template can be found in `templates/simulation_template.py`.

### Generational Simulations
Generational Simulations are deceptively simple.
There is only one function to override: `generational_hook`.
However, this means that all the generational processing must be done in this function.

A template has been provided in `templates/generational_simulation_template.py`.

## License
Copyright 2023 Gabriele Ron
Expand Down
14 changes: 14 additions & 0 deletions examples/config/complete_generational_mss.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
simulation_id = "Complete StandardGenerationalSimulation for MultiprocessStandardSimulation"
algorithms_directory = "examples/algorithms/"
nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", object = "AlwaysCooperate" } },
{ node_id = "always_defect", algorithm = { file = "simple.py", object = "AlwaysDefect" } },
{ node_id = "grim_trigger", algorithm = { file = "grudge.py", object = "GrimTrigger" } },
{ node_id = "random_cooperation", algorithm = { file = "simple.py", object = "RandomCooperation" } },
{ node_id = "tit_for_tat", algorithm = { file = "tit_for_tat.py", object = "TitForTat" } },
{ node_id = "tit_for_two_tats", algorithm = { file = "tit_for_tat.py", object = "TitForTwoTats" } },
{ node_id = "two_tits_for_tat", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" } } ]
simulation = { object = "StandardGenerationalSimulation" }
generational_simulation = { object = 'MultiprocessStandardSimulation' }
simulation_arguments = { generations = 10, rounds = 200 }
simulation_data_output = "examples/rounds/complete_generational_mss.json"
simulation_results_output = "examples/results/complete_generational_mss.json"
14 changes: 14 additions & 0 deletions examples/config/complete_generational_ss.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
simulation_id = "Complete StandardGenerationalSimulation for StandardSimulation"
algorithms_directory = "examples/algorithms/"
nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", object = "AlwaysCooperate" } },
{ node_id = "always_defect", algorithm = { file = "simple.py", object = "AlwaysDefect" } },
{ node_id = "grim_trigger", algorithm = { file = "grudge.py", object = "GrimTrigger" } },
{ node_id = "random_cooperation", algorithm = { file = "simple.py", object = "RandomCooperation" } },
{ node_id = "tit_for_tat", algorithm = { file = "tit_for_tat.py", object = "TitForTat" } },
{ node_id = "tit_for_two_tats", algorithm = { file = "tit_for_tat.py", object = "TitForTwoTats" } },
{ node_id = "two_tits_for_tat", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" } } ]
simulation = { object = "StandardGenerationalSimulation" }
generational_simulation = { object = 'StandardSimulation' }
simulation_arguments = { generations = 10, rounds = 200 }
simulation_data_output = "examples/rounds/complete_generational_ss.json"
simulation_results_output = "examples/results/complete_generational_ss.json"
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", obje
{ node_id = "two_tits_for_tat", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" } } ]
simulation = { object = "MultiprocessStandardSimulation" }
simulation_arguments = { rounds = 200 }
rounds_output = "examples/rounds/complete_multiprocess_standard_simulation.json"
simulation_output = "examples/results/complete_multiprocess_standard_simulation.json"
simulation_data_output = "examples/rounds/complete_mss.json"
simulation_results_output = "examples/results/complete_mss.json"
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", obje
{ node_id = "two_tits_for_tat", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" } } ]
simulation = { object = "StandardSimulation" }
simulation_arguments = { rounds = 200 }
rounds_output = "examples/rounds/complete_standard_simulation.json"
simulation_output = "examples/results/complete_standard_simulation.json"
simulation_data_output = "examples/rounds/complete_ss.json"
simulation_results_output = "examples/results/complete_ss.json"
14 changes: 14 additions & 0 deletions examples/config/mutable_complete_generational_mss.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
simulation_id = "Mutable Complete StandardGenerationalSimulation for MultiprocessStandardSimulation"
algorithms_directory = "examples/algorithms/"
nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", object = "AlwaysCooperate" } },
{ node_id = "always_defect", algorithm = { file = "simple.py", object = "AlwaysDefect" } },
{ node_id = "grim_trigger", algorithm = { file = "grudge.py", object = "GrimTrigger" } },
{ node_id = "random_cooperation", algorithm = { file = "simple.py", object = "RandomCooperation" } },
{ node_id = "tit_for_tat", algorithm = { file = "tit_for_tat.py", object = "TitForTat" } },
{ node_id = "tit_for_two_tats", algorithm = { file = "tit_for_tat.py", object = "TitForTwoTats" } },
{ node_id = "two_tits_for_tat", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" } } ]
simulation = { object = "StandardGenerationalSimulation" }
generational_simulation = { object = 'MultiprocessStandardSimulation' }
simulation_arguments = { generations = 10, rounds = 200, simulation_mutations = true, mutations_per_mille = 100 }
simulation_data_output = "examples/rounds/mutable_complete_generational_mss.json"
simulation_results_output = "examples/results/mutable_complete_generational_mss.json"
14 changes: 14 additions & 0 deletions examples/config/mutable_complete_generational_ss.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
simulation_id = "Mutable Complete StandardGenerationalSimulation for StandardSimulation"
algorithms_directory = "examples/algorithms/"
nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", object = "AlwaysCooperate" } },
{ node_id = "always_defect", algorithm = { file = "simple.py", object = "AlwaysDefect" } },
{ node_id = "grim_trigger", algorithm = { file = "grudge.py", object = "GrimTrigger" } },
{ node_id = "random_cooperation", algorithm = { file = "simple.py", object = "RandomCooperation" } },
{ node_id = "tit_for_tat", algorithm = { file = "tit_for_tat.py", object = "TitForTat" } },
{ node_id = "tit_for_two_tats", algorithm = { file = "tit_for_tat.py", object = "TitForTwoTats" } },
{ node_id = "two_tits_for_tat", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" } } ]
simulation = { object = "StandardGenerationalSimulation" }
generational_simulation = { object = 'StandardSimulation' }
simulation_arguments = { generations = 10, rounds = 200, simulation_mutations = true, mutations_per_mille = 100 }
simulation_data_output = "examples/rounds/mutable_complete_generational_ss.json"
simulation_results_output = "examples/results/mutable_complete_generational_ss.json"
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", obje
{ node_id = "two_tits_for_tat", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" } } ]
simulation = { object = "MultiprocessStandardSimulation" }
simulation_arguments = { rounds = 200, round_mutations = true, mutations_per_mille = 100 }
rounds_output = "examples/rounds/mutable_complete_multiprocess_standard_simulation.json"
simulation_output = "examples/results/mutable_complete_multiprocess_standard_simulation.json"
simulation_data_output = "examples/rounds/mutable_complete_mss.json"
simulation_results_output = "examples/results/mutable_complete_mss.json"
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", obje
{ node_id = "two_tits_for_tat", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" } } ]
simulation = { object = "StandardSimulation" }
simulation_arguments = { rounds = 200, round_mutations = true, mutations_per_mille = 100 }
rounds_output = "examples/rounds/mutable_complete_standard_simulation.json"
simulation_output = "examples/results/mutable_complete_standard_simulation.json"
simulation_data_output = "examples/rounds/mutable_complete_ss.json"
simulation_results_output = "examples/results/mutable_complete_ss.json"
14 changes: 14 additions & 0 deletions examples/config/mutable_noisy_complete_generational_mss.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
simulation_id = "Mutable Noisy Complete StandardGenerationalSimulation for MultiprocessStandardSimulation"
algorithms_directory = "examples/algorithms/"
nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", object = "AlwaysCooperate" } },
{ node_id = "always_defect", algorithm = { file = "simple.py", object = "AlwaysDefect" } },
{ node_id = "grim_trigger", algorithm = { file = "grudge.py", object = "GrimTrigger" } },
{ node_id = "random_cooperation", algorithm = { file = "simple.py", object = "RandomCooperation" } },
{ node_id = "tit_for_tat", algorithm = { file = "tit_for_tat.py", object = "TitForTat" } },
{ node_id = "tit_for_two_tats", algorithm = { file = "tit_for_tat.py", object = "TitForTwoTats" } },
{ node_id = "two_tits_for_tat", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" } } ]
simulation = { object = "StandardGenerationalSimulation" }
generational_simulation = { object = 'MultiprocessStandardSimulation' }
simulation_arguments = { generations = 10, rounds = 200, noise = true, noise_per_mille = 250, simulation_mutations = true, mutations_per_mille = 100 }
simulation_data_output = "examples/rounds/mutable_noisy_complete_generational_mss.json"
simulation_results_output = "examples/results/mutable_noisy_complete_generational_mss.json"
14 changes: 14 additions & 0 deletions examples/config/mutable_noisy_complete_generational_ss.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
simulation_id = "Mutable Noisy Complete StandardGenerationalSimulation for StandardSimulation"
algorithms_directory = "examples/algorithms/"
nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", object = "AlwaysCooperate" } },
{ node_id = "always_defect", algorithm = { file = "simple.py", object = "AlwaysDefect" } },
{ node_id = "grim_trigger", algorithm = { file = "grudge.py", object = "GrimTrigger" } },
{ node_id = "random_cooperation", algorithm = { file = "simple.py", object = "RandomCooperation" } },
{ node_id = "tit_for_tat", algorithm = { file = "tit_for_tat.py", object = "TitForTat" } },
{ node_id = "tit_for_two_tats", algorithm = { file = "tit_for_tat.py", object = "TitForTwoTats" } },
{ node_id = "two_tits_for_tat", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" } } ]
simulation = { object = "StandardGenerationalSimulation" }
generational_simulation = { object = 'StandardSimulation' }
simulation_arguments = { generations = 10, rounds = 200, noise = true, noise_per_mille = 250, simulation_mutations = true, mutations_per_mille = 100 }
simulation_data_output = "examples/rounds/mutable_noisy_complete_generational_ss.json"
simulation_results_output = "examples/results/mutable_noisy_complete_generational_ss.json"
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", obje
{ node_id = "two_tits_for_tat", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" } } ]
simulation = { object = "MultiprocessStandardSimulation" }
simulation_arguments = { rounds = 200, noise = true, noise_per_mille = 250, round_mutations = true, mutations_per_mille = 100 }
rounds_output = "examples/rounds/mutable_noisy_complete_multiprocess_standard_simulation.json"
simulation_output = "examples/results/mutable_noisy_complete_multiprocess_standard_simulation.json"
simulation_data_output = "examples/rounds/mutable_noisy_complete_mss.json"
simulation_results_output = "examples/results/mutable_noisy_complete_mss.json"
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", obje
{ node_id = "two_tits_for_tat", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" } } ]
simulation = { object = "StandardSimulation" }
simulation_arguments = { rounds = 200, noise = true, noise_per_mille = 250, round_mutations = true, mutations_per_mille = 100 }
rounds_output = "examples/rounds/mutable_noisy_complete_standard_simulation.json"
simulation_output = "examples/results/mutable_noisy_complete_standard_simulation.json"
simulation_data_output = "examples/rounds/mutable_noisy_complete_ss.json"
simulation_results_output = "examples/results/mutable_noisy_complete_ss.json"
14 changes: 14 additions & 0 deletions examples/config/noisy_complete_generational_mss.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
simulation_id = "Noisy Complete StandardGenerationalSimulation for MultiprocessStandardSimulation"
algorithms_directory = "examples/algorithms/"
nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", object = "AlwaysCooperate" } },
{ node_id = "always_defect", algorithm = { file = "simple.py", object = "AlwaysDefect" } },
{ node_id = "grim_trigger", algorithm = { file = "grudge.py", object = "GrimTrigger" } },
{ node_id = "random_cooperation", algorithm = { file = "simple.py", object = "RandomCooperation" } },
{ node_id = "tit_for_tat", algorithm = { file = "tit_for_tat.py", object = "TitForTat" } },
{ node_id = "tit_for_two_tats", algorithm = { file = "tit_for_tat.py", object = "TitForTwoTats" } },
{ node_id = "two_tits_for_tat", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" } } ]
simulation = { object = "StandardGenerationalSimulation" }
generational_simulation = { object = 'MultiprocessStandardSimulation' }
simulation_arguments = { generations = 10, rounds = 200, noise = true, noise_per_mille = 250 }
simulation_data_output = "examples/rounds/noisy_complete_generational_mss.json"
simulation_results_output = "examples/results/noisy_complete_generational_mss.json"
14 changes: 14 additions & 0 deletions examples/config/noisy_complete_generational_ss.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
simulation_id = "Noisy Complete StandardGenerationalSimulation for StandardSimulation"
algorithms_directory = "examples/algorithms/"
nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", object = "AlwaysCooperate" } },
{ node_id = "always_defect", algorithm = { file = "simple.py", object = "AlwaysDefect" } },
{ node_id = "grim_trigger", algorithm = { file = "grudge.py", object = "GrimTrigger" } },
{ node_id = "random_cooperation", algorithm = { file = "simple.py", object = "RandomCooperation" } },
{ node_id = "tit_for_tat", algorithm = { file = "tit_for_tat.py", object = "TitForTat" } },
{ node_id = "tit_for_two_tats", algorithm = { file = "tit_for_tat.py", object = "TitForTwoTats" } },
{ node_id = "two_tits_for_tat", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" } } ]
simulation = { object = "StandardGenerationalSimulation" }
generational_simulation = { object = 'StandardSimulation' }
simulation_arguments = { generations = 10, rounds = 200, noise = true, noise_per_mille = 250 }
simulation_data_output = "examples/rounds/noisy_complete_generational_ss.json"
simulation_results_output = "examples/results/noisy_complete_generational_ss.json"
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", obje
{ node_id = "two_tits_for_tat", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" } } ]
simulation = { object = "MultiprocessStandardSimulation" }
simulation_arguments = { rounds = 200, noise = true, noise_per_mille = 250}
rounds_output = "examples/rounds/noisy_complete_multiprocess_standard_simulation.json"
simulation_output = "examples/results/noisy_complete_multiprocess_standard_simulation.json"
simulation_data_output = "examples/rounds/noisy_complete_mss.json"
simulation_results_output = "examples/results/noisy_complete_mss.json"
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", obje
{ node_id = "two_tits_for_tat", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" } } ]
simulation = { object = "StandardSimulation" }
simulation_arguments = { rounds = 200, noise = true, noise_per_mille = 250}
rounds_output = "examples/rounds/noisy_complete_standard_simulation.json"
simulation_output = "examples/results/noisy_complete_standard_simulation.json"
simulation_data_output = "examples/rounds/noisy_complete_ss.json"
simulation_results_output = "examples/results/noisy_complete_ss.json"
1 change: 1 addition & 0 deletions examples/results/complete_generational_mss.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"generation_0": {"always_cooperate": 2706, "always_defect": 4804, "grim_trigger": 3188, "random_cooperation": 3393, "tit_for_tat": 2727, "tit_for_two_tats": 2706, "two_tits_for_tat": 2685}, "generation_1": {"always_cooperate_0": 2721, "always_defect_0": 4816, "grim_trigger_0": 3180, "random_cooperation_0": 3425, "tit_for_tat_0": 2709, "tit_for_two_tats_0": 2679, "two_tits_for_tat_0": 2673}, "generation_2": {"always_cooperate_0": 2697, "always_defect_0": 4868, "grim_trigger_0": 3240, "random_cooperation_0": 3386, "tit_for_tat_0": 2679, "tit_for_two_tats_0": 2688, "two_tits_for_tat_0": 2727}, "generation_3": {"always_cooperate_0": 2703, "always_defect_0": 4796, "grim_trigger_0": 3178, "random_cooperation_0": 3441, "tit_for_tat_0": 2667, "two_tits_for_tat_0": 2703, "tit_for_two_tats_0": 2682}, "generation_4": {"always_cooperate_0": 2697, "always_defect_0": 4792, "grim_trigger_0": 3242, "tit_for_tat_0": 2691, "random_cooperation_0": 3434, "tit_for_two_tats_0": 2655, "two_tits_for_tat_0": 2700}, "generation_5": {"always_cooperate_0": 2727, "always_defect_0": 4784, "grim_trigger_0": 3238, "random_cooperation_0": 3365, "tit_for_tat_0": 2721, "tit_for_two_tats_0": 2706, "two_tits_for_tat_0": 2697}, "generation_6": {"always_cooperate_0": 2667, "always_defect_0": 4828, "grim_trigger_0": 3154, "random_cooperation_0": 3419, "tit_for_two_tats_0": 2700, "two_tits_for_tat_0": 2718, "tit_for_tat_0": 2700}, "generation_7": {"always_cooperate_0": 2730, "always_defect_0": 4772, "grim_trigger_0": 3198, "random_cooperation_0": 3408, "tit_for_tat_0": 2685, "two_tits_for_tat_0": 2712, "tit_for_two_tats_0": 2679}, "generation_8": {"always_cooperate_0": 2676, "always_defect_0": 4828, "grim_trigger_0": 3198, "tit_for_tat_0": 2712, "random_cooperation_0": 3426, "tit_for_two_tats_0": 2691, "two_tits_for_tat_0": 2679}, "generation_9": {"always_cooperate_0": 2706, "always_defect_0": 4764, "grim_trigger_0": 3180, "tit_for_tat_0": 2682, "random_cooperation_0": 3409, "tit_for_two_tats_0": 2730, "two_tits_for_tat_0": 2700}}
Loading

0 comments on commit 0be7964

Please sign in to comment.