Skip to content

Commit

Permalink
Add Pavlov algorithm
Browse files Browse the repository at this point in the history
  • Loading branch information
Macr0Nerd committed Jan 10, 2025
1 parent c67ceda commit 425893e
Show file tree
Hide file tree
Showing 17 changed files with 57 additions and 16 deletions.
25 changes: 25 additions & 0 deletions examples/algorithms/pavlov.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from collections.abc import Sequence
from typing import Self

from project_dilemma.interfaces import Algorithm, Rounds


class Pavlov(Algorithm):
algorithm_name = "pavlov"

def __init__(self, mutations: Sequence[Self]):
super().__init__(mutations)

@staticmethod
def decide(rounds: Rounds, *, node_id: str, **kwargs) -> bool:
if not rounds:
return True

for iter_node_id, cooperation in rounds[-1].items():
if node_id == iter_node_id:
continue

if not cooperation:
return not rounds[-1][node_id]

return rounds[-1][node_id]
3 changes: 2 additions & 1 deletion examples/config/complete_generational_mss.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ nodes = [ { node_id = "always_cooperate_", algorithm = { file = "simple.py", obj
{ node_id = "tit_for_tat_", algorithm = { file = "tit_for_tat.py", object = "TitForTat" }, quantity = 10 },
{ node_id = "tit_for_two_tats_", algorithm = { file = "tit_for_tat.py", object = "TitForTwoTats" }, quantity = 10 },
{ node_id = "two_tits_for_tat_", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" }, quantity = 10 },
{ node_id = "firm_but_fair_", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" }, quantity = 10 } ]
{ node_id = "firm_but_fair_", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" }, quantity = 10 },
{ node_id = "pavlov_", algorithm = { file = "pavlov.py", object = "Pavlov" }, quantity = 10 } ]
simulation = { object = "StandardGenerationalSimulation" }
generational_simulation = { object = 'MultiprocessStandardSimulation' }
simulation_arguments = { generations = 10, rounds = 200, pool_size = 4 }
Expand Down
3 changes: 2 additions & 1 deletion examples/config/complete_generational_ss.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ nodes = [ { node_id = "always_cooperate_", algorithm = { file = "simple.py", obj
{ node_id = "tit_for_tat_", algorithm = { file = "tit_for_tat.py", object = "TitForTat" }, quantity = 10 },
{ node_id = "tit_for_two_tats_", algorithm = { file = "tit_for_tat.py", object = "TitForTwoTats" }, quantity = 10 },
{ node_id = "two_tits_for_tat_", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" }, quantity = 10 },
{ node_id = "firm_but_fair_", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" }, quantity = 10 } ]
{ node_id = "firm_but_fair_", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" }, quantity = 10 },
{ node_id = "pavlov_", algorithm = { file = "pavlov.py", object = "Pavlov" }, quantity = 10 } ]
simulation = { object = "StandardGenerationalSimulation" }
generational_simulation = { object = 'StandardSimulation' }
simulation_arguments = { generations = 10, rounds = 200 }
Expand Down
3 changes: 2 additions & 1 deletion examples/config/complete_mss.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", obje
{ 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" } },
{ node_id = "firm_but_fair", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" } } ]
{ node_id = "firm_but_fair", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" } },
{ node_id = "pavlov", algorithm = { file = "pavlov.py", object = "Pavlov" } }]
simulation = { object = "MultiprocessStandardSimulation" }
simulation_arguments = { rounds = 200 }
simulation_data_output = "examples/rounds/complete_mss.json"
Expand Down
3 changes: 2 additions & 1 deletion examples/config/complete_ss.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", obje
{ 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" } },
{ node_id = "firm_but_fair", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" } } ]
{ node_id = "firm_but_fair", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" } },
{ node_id = "pavlov", algorithm = { file = "pavlov.py", object = "Pavlov" } } ]
simulation = { object = "StandardSimulation" }
simulation_arguments = { rounds = 200 }
simulation_data_output = "examples/rounds/complete_ss.json"
Expand Down
3 changes: 2 additions & 1 deletion examples/config/mutable_complete_generational_mss.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ nodes = [ { node_id = "always_cooperate_", algorithm = { file = "simple.py", obj
{ node_id = "tit_for_tat_", algorithm = { file = "tit_for_tat.py", object = "TitForTat" }, quantity = 10 },
{ node_id = "tit_for_two_tats_", algorithm = { file = "tit_for_tat.py", object = "TitForTwoTats" }, quantity = 10 },
{ node_id = "two_tits_for_tat_", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" }, quantity = 10 },
{ node_id = "firm_but_fair_", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" }, quantity = 10 } ]
{ node_id = "firm_but_fair_", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" }, quantity = 10 },
{ node_id = "pavlov_", algorithm = { file = "pavlov.py", object = "Pavlov" }, quantity = 10 } ]
simulation = { object = "StandardGenerationalSimulation" }
generational_simulation = { object = 'MultiprocessStandardSimulation' }
simulation_arguments = { generations = 10, rounds = 200, simulation_mutations = true, mutations_per_mille = 100, pool_size = 4 }
Expand Down
3 changes: 2 additions & 1 deletion examples/config/mutable_complete_generational_ss.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ nodes = [ { node_id = "always_cooperate_", algorithm = { file = "simple.py", obj
{ node_id = "tit_for_tat_", algorithm = { file = "tit_for_tat.py", object = "TitForTat" }, quantity = 10 },
{ node_id = "tit_for_two_tats_", algorithm = { file = "tit_for_tat.py", object = "TitForTwoTats" }, quantity = 10 },
{ node_id = "two_tits_for_tat_", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" }, quantity = 10 },
{ node_id = "firm_but_fair_", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" }, quantity = 10 } ]
{ node_id = "firm_but_fair_", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" }, quantity = 10 },
{ node_id = "pavlov_", algorithm = { file = "pavlov.py", object = "Pavlov" }, quantity = 10 } ]
simulation = { object = "StandardGenerationalSimulation" }
generational_simulation = { object = 'StandardSimulation' }
simulation_arguments = { generations = 10, rounds = 200, simulation_mutations = true, mutations_per_mille = 100 }
Expand Down
3 changes: 2 additions & 1 deletion examples/config/mutable_complete_mss.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", obje
{ 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" } },
{ node_id = "firm_but_fair", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" } } ]
{ node_id = "firm_but_fair", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" } },
{ node_id = "pavlov", algorithm = { file = "pavlov.py", object = "Pavlov" } } ]
simulation = { object = "MultiprocessStandardSimulation" }
simulation_arguments = { rounds = 200, round_mutations = true, mutations_per_mille = 100 }
simulation_data_output = "examples/rounds/mutable_complete_mss.json"
Expand Down
3 changes: 2 additions & 1 deletion examples/config/mutable_complete_ss.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", obje
{ 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" } },
{ node_id = "firm_but_fair", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" } } ]
{ node_id = "firm_but_fair", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" } },
{ node_id = "pavlov", algorithm = { file = "pavlov.py", object = "Pavlov" } } ]
simulation = { object = "StandardSimulation" }
simulation_arguments = { rounds = 200, round_mutations = true, mutations_per_mille = 100 }
simulation_data_output = "examples/rounds/mutable_complete_ss.json"
Expand Down
3 changes: 2 additions & 1 deletion examples/config/mutable_noisy_complete_generational_mss.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ nodes = [ { node_id = "always_cooperate_", algorithm = { file = "simple.py", obj
{ node_id = "tit_for_tat_", algorithm = { file = "tit_for_tat.py", object = "TitForTat" }, quantity = 10 },
{ node_id = "tit_for_two_tats_", algorithm = { file = "tit_for_tat.py", object = "TitForTwoTats" }, quantity = 10 },
{ node_id = "two_tits_for_tat_", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" }, quantity = 10 },
{ node_id = "firm_but_fair_", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" }, quantity = 10 } ]
{ node_id = "firm_but_fair_", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" }, quantity = 10 },
{ node_id = "pavlov_", algorithm = { file = "pavlov.py", object = "Pavlov" }, quantity = 10 } ]
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, pool_size = 4 }
Expand Down
3 changes: 2 additions & 1 deletion examples/config/mutable_noisy_complete_generational_ss.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ nodes = [ { node_id = "always_cooperate_", algorithm = { file = "simple.py", obj
{ node_id = "tit_for_tat_", algorithm = { file = "tit_for_tat.py", object = "TitForTat" }, quantity = 10 },
{ node_id = "tit_for_two_tats_", algorithm = { file = "tit_for_tat.py", object = "TitForTwoTats" }, quantity = 10 },
{ node_id = "two_tits_for_tat_", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" }, quantity = 10 },
{ node_id = "firm_but_fair_", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" }, quantity = 10 } ]
{ node_id = "firm_but_fair_", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" }, quantity = 10 },
{ node_id = "pavlov_", algorithm = { file = "pavlov.py", object = "Pavlov" }, quantity = 10 } ]
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 }
Expand Down
3 changes: 2 additions & 1 deletion examples/config/mutable_noisy_complete_mss.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", obje
{ 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" } },
{ node_id = "firm_but_fair", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" } } ]
{ node_id = "firm_but_fair", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" } },
{ node_id = "pavlov", algorithm = { file = "pavlov.py", object = "Pavlov" } } ]
simulation = { object = "MultiprocessStandardSimulation" }
simulation_arguments = { rounds = 200, noise = true, noise_per_mille = 250, round_mutations = true, mutations_per_mille = 100 }
simulation_data_output = "examples/rounds/mutable_noisy_complete_mss.json"
Expand Down
3 changes: 2 additions & 1 deletion examples/config/mutable_noisy_complete_ss.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", obje
{ 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" } },
{ node_id = "firm_but_fair", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" } } ]
{ node_id = "firm_but_fair", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" } },
{ node_id = "pavlov", algorithm = { file = "pavlov.py", object = "Pavlov" } } ]
simulation = { object = "StandardSimulation" }
simulation_arguments = { rounds = 200, noise = true, noise_per_mille = 250, round_mutations = true, mutations_per_mille = 100 }
simulation_data_output = "examples/rounds/mutable_noisy_complete_ss.json"
Expand Down
3 changes: 2 additions & 1 deletion examples/config/noisy_complete_generational_mss.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ nodes = [ { node_id = "always_cooperate_", algorithm = { file = "simple.py", obj
{ node_id = "tit_for_tat_", algorithm = { file = "tit_for_tat.py", object = "TitForTat" }, quantity = 10 },
{ node_id = "tit_for_two_tats_", algorithm = { file = "tit_for_tat.py", object = "TitForTwoTats" }, quantity = 10 },
{ node_id = "two_tits_for_tat_", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" }, quantity = 10 },
{ node_id = "firm_but_fair_", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" }, quantity = 10 } ]
{ node_id = "firm_but_fair_", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" }, quantity = 10 },
{ node_id = "pavlov_", algorithm = { file = "pavlov.py", object = "Pavlov" }, quantity = 10 } ]
simulation = { object = "StandardGenerationalSimulation" }
generational_simulation = { object = 'MultiprocessStandardSimulation' }
simulation_arguments = { generations = 10, rounds = 200, noise = true, noise_per_mille = 250, pool_size = 4 }
Expand Down
3 changes: 2 additions & 1 deletion examples/config/noisy_complete_generational_ss.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ nodes = [ { node_id = "always_cooperate_", algorithm = { file = "simple.py", obj
{ node_id = "tit_for_tat_", algorithm = { file = "tit_for_tat.py", object = "TitForTat" }, quantity = 10 },
{ node_id = "tit_for_two_tats_", algorithm = { file = "tit_for_tat.py", object = "TitForTwoTats" }, quantity = 10 },
{ node_id = "two_tits_for_tat_", algorithm = { file = "tit_for_tat.py", object = "TwoTitsForTat" }, quantity = 10 },
{ node_id = "firm_but_fair_", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" }, quantity = 10 } ]
{ node_id = "firm_but_fair_", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" }, quantity = 10 },
{ node_id = "pavlov_", algorithm = { file = "pavlov.py", object = "Pavlov" }, quantity = 10 } ]
simulation = { object = "StandardGenerationalSimulation" }
generational_simulation = { object = 'StandardSimulation' }
simulation_arguments = { generations = 10, rounds = 200, noise = true, noise_per_mille = 250 }
Expand Down
3 changes: 2 additions & 1 deletion examples/config/noisy_complete_mss.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", obje
{ 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" } },
{ node_id = "firm_but_fair", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" } } ]
{ node_id = "firm_but_fair", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" } },
{ node_id = "pavlov", algorithm = { file = "pavlov.py", object = "Pavlov" } } ]
simulation = { object = "MultiprocessStandardSimulation" }
simulation_arguments = { rounds = 200, noise = true, noise_per_mille = 250}
simulation_data_output = "examples/rounds/noisy_complete_mss.json"
Expand Down
3 changes: 2 additions & 1 deletion examples/config/noisy_complete_ss.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ nodes = [ { node_id = "always_cooperate", algorithm = { file = "simple.py", obje
{ 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" } },
{ node_id = "firm_but_fair", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" } } ]
{ node_id = "firm_but_fair", algorithm = { file = "firm_but_fair.py", object = "FirmButFair" } },
{ node_id = "pavlov", algorithm = { file = "pavlov.py", object = "Pavlov" } } ]
simulation = { object = "StandardSimulation" }
simulation_arguments = { rounds = 200, noise = true, noise_per_mille = 250}
simulation_data_output = "examples/rounds/noisy_complete_ss.json"
Expand Down

0 comments on commit 425893e

Please sign in to comment.