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 would_like_to_commit(self) -> bool: return self.accepts_commitment
[docs] def proposes_commitment(self) -> bool: return False
[docs] def is_commitment_validated(self, nb_committers: int) -> bool: return False
[docs] def type(self) -> str: return f"EXT{self.extraction}{self.accepts_commitment}"
[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 would_like_to_commit(self) -> bool: return True
[docs] def proposes_commitment(self) -> bool: return False
[docs] def is_commitment_validated(self, nb_committers: int) -> bool: if nb_committers > 0: return True else: return False
[docs] def type(self) -> str: return "FAIR"
[docs] def __str__(self) -> str: return "FairExtraction"
[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] def would_like_to_commit(self) -> bool: return False
[docs] def proposes_commitment(self) -> bool: return False
[docs] def is_commitment_validated(self, nb_committers: int) -> bool: return False
[docs] def type(self) -> str: return "HIGH"
[docs] def __str__(self) -> str: return "HighExtraction"
[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] def would_like_to_commit(self) -> bool: return False
[docs] def proposes_commitment(self) -> bool: return False
[docs] def is_commitment_validated(self, nb_committers: int) -> bool: return False
[docs] def type(self) -> str: return "NASH"
[docs] def __str__(self) -> str: return "NashExtraction"
[docs]class CommitmentStrategy(AbstractCPRStrategy):
[docs] def __init__(self, commitment_threshold): self.commitment_threshold = commitment_threshold
[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 would_like_to_commit(self) -> bool: return True
[docs] def proposes_commitment(self) -> bool: return True
[docs] def is_commitment_validated(self, nb_committers: int) -> bool: return False if nb_committers < self.commitment_threshold else True
[docs] def type(self) -> str: return f"COM{self.commitment_threshold}"
[docs] def __str__(self) -> str: return f"CommitmentStrategy{self.commitment_threshold}"
[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 would_like_to_commit(self) -> bool: return True
[docs] def proposes_commitment(self) -> bool: return False
[docs] def is_commitment_validated(self, nb_committers: int) -> bool: return True if nb_committers > 0 else False
[docs] def type(self) -> str: return "FAKE"
[docs] def __str__(self) -> str: return "FakeStrategy"
[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 would_like_to_commit(self) -> bool: return True
[docs] def proposes_commitment(self) -> bool: return False
[docs] def is_commitment_validated(self, nb_committers: int) -> bool: return True if nb_committers > 0 else False
[docs] def type(self) -> str: return "FREE"
[docs] def __str__(self) -> str: return "FreeStrategy"