Source code for egttools.behaviors.CPR.cpr_strategies
import numpy as np
from .abstract_cpr_strategy import AbstractCPRStrategy
[docs]def high_extraction(a: float, b: float, group_size: int) -> float:
return a / (b * group_size)
[docs]def fair_extraction(a: float, b: float, group_size: int) -> float:
group_optimal = a / (2 * b)
return group_optimal / group_size
[docs]def nash_extraction(a: float, b: float, group_size: int) -> float:
group_max = (group_size / (group_size + 1)) * (a / b)
return group_max / group_size
[docs]def payoff_no_commitment(a: float, b: float, extraction: float, group_extraction: float) -> float:
return (extraction / group_extraction) * ((a * group_extraction) - (b * np.power(group_extraction, 2)))
[docs]class FixedExtraction(AbstractCPRStrategy):
[docs] def __init__(self, extraction: float, accepts_commitment: bool):
self.extraction = extraction
self.accepts_commitment = accepts_commitment
[docs] def get_extraction(self, a: float, b: float, group_size: int, commitment: bool = False) -> float:
return self.extraction
[docs] @staticmethod
def get_payoff(a: float, b: float, extraction: float, group_extraction: float, fine: float = 0,
cost: float = 0, commitment: bool = False) -> float:
return payoff_no_commitment(a, b, extraction, group_extraction)
[docs] def __str__(self) -> str:
return f"FixedExtraction_e{self.extraction}_c{self.accepts_commitment}"
[docs]class FairExtraction(AbstractCPRStrategy):
[docs] def get_extraction(self, a: float, b: float, group_size: int, commitment: bool = False) -> float:
return fair_extraction(a, b, group_size)
[docs] @staticmethod
def get_payoff(a: float, b: float, extraction: float, group_extraction: float, fine: float = 0,
cost: float = 0, commitment: bool = False) -> float:
return payoff_no_commitment(a, b, extraction, group_extraction)
[docs] def is_commitment_validated(self, nb_committers: int) -> bool:
if nb_committers > 0:
return True
else:
return False
[docs]class HighExtraction(AbstractCPRStrategy):
[docs] def get_extraction(self, a: float, b: float, group_size: int, commitment: bool = False) -> float:
return high_extraction(a, b, group_size)
[docs] @staticmethod
def get_payoff(a: float, b: float, extraction: float, group_extraction: float, fine: float = 0,
cost: float = 0, commitment: bool = False) -> float:
return payoff_no_commitment(a, b, extraction, group_extraction)
[docs]class NashExtraction(AbstractCPRStrategy):
[docs] def get_extraction(self, a: float, b: float, group_size: int, commitment: bool = False) -> float:
return nash_extraction(a, b, group_size)
[docs] @staticmethod
def get_payoff(a: float, b: float, extraction: float, group_extraction: float, fine: float = 0,
cost: float = 0, commitment: bool = False) -> float:
return payoff_no_commitment(a, b, extraction, group_extraction)
[docs]class CommitmentStrategy(AbstractCPRStrategy):
[docs] def get_extraction(self, a: float, b: float, group_size: int, commitment: bool = False) -> float:
if commitment: # extracts Fair
return fair_extraction(a, b, group_size)
else: # extracts High
return high_extraction(a, b, group_size)
[docs] @staticmethod
def get_payoff(a: float, b: float, extraction: float, group_extraction: float, fine: float = 0,
cost: float = 0, commitment: bool = False) -> float:
if commitment:
return payoff_no_commitment(a, b, extraction, group_extraction) - cost
else:
return payoff_no_commitment(a, b, extraction, group_extraction)
[docs] def is_commitment_validated(self, nb_committers: int) -> bool:
return False if nb_committers < self.commitment_threshold else True
[docs]class FakeStrategy(AbstractCPRStrategy):
[docs] def get_extraction(self, a: float, b: float, group_size: int, commitment: bool = False) -> float:
return high_extraction(a, b, group_size)
[docs] @staticmethod
def get_payoff(a: float, b: float, extraction: float, group_extraction: float, fine: float = 0,
cost: float = 0, commitment: bool = False) -> float:
if commitment:
return payoff_no_commitment(a, b, extraction, group_extraction) - fine
else:
return payoff_no_commitment(a, b, extraction, group_extraction)
[docs] def is_commitment_validated(self, nb_committers: int) -> bool:
return True if nb_committers > 0 else False
[docs]class FreeStrategy(AbstractCPRStrategy):
[docs] def get_extraction(self, a: float, b: float, group_size: int, commitment: bool = False) -> float:
if commitment:
return fair_extraction(a, b, group_size)
else:
return high_extraction(a, b, group_size)
[docs] @staticmethod
def get_payoff(a: float, b: float, extraction: float, group_extraction: float, fine: float = 0,
cost: float = 0, commitment: bool = False) -> float:
return payoff_no_commitment(a, b, extraction, group_extraction)
[docs] def is_commitment_validated(self, nb_committers: int) -> bool:
return True if nb_committers > 0 else False