Source code for egttools.numerical.structure.factories

from typing import Dict, List, Optional
from egttools.numerical.structure import (
    NetworkMCEstimatorPC, NetworkMCEstimatorBD, NetworkMCEstimatorDB,
    NetworkMCEstimatorTDPC, NetworkMCEstimatorLP,
    NetworkCoEvolutionaryPC, NetworkCoEvolutionaryPCHomophilic,
)
from egttools.games import AbstractSpatialGame


_UPDATE_RULE_ESTIMATORS = {
    "PC": NetworkMCEstimatorPC,
    "PairwiseComparison": NetworkMCEstimatorPC,
    "BD": NetworkMCEstimatorBD,
    "BirthDeath": NetworkMCEstimatorBD,
    "DB": NetworkMCEstimatorDB,
    "DeathBirth": NetworkMCEstimatorDB,
    "TDPC": NetworkMCEstimatorTDPC,
    "TimeDependentPC": NetworkMCEstimatorTDPC,
    "LP": NetworkMCEstimatorLP,
    "LinearProportional": NetworkMCEstimatorLP,
}


[docs] def network_mc_estimator_factory( game: AbstractSpatialGame, topology: Dict[int, List[int]], nb_strategies: int, beta: float, mu: float, update_rule: str = "PC", cache_size: int = 100000, ): """ Create a NetworkMCEstimator for the requested update rule. Parameters ---------- game : egttools.games.AbstractSpatialGame topology : dict[int, list[int]] Network adjacency dictionary (e.g. from ``{n: list(nbrs) for n, nbrs in G.adjacency()}``). nb_strategies : int beta : float Selection intensity. For ``"LP"`` / ``"LinearProportional"`` pass ``beta = max(T, 1.0) - min(S, 0.0)`` (payoff-normalisation constant D_>). mu : float Mutation probability. update_rule : str One of ``"PC"`` / ``"PairwiseComparison"``, ``"BD"`` / ``"BirthDeath"``, ``"DB"`` / ``"DeathBirth"``, ``"TDPC"`` / ``"TimeDependentPC"``, ``"LP"`` / ``"LinearProportional"``. cache_size : int, optional Returns ------- NetworkMCEstimatorPC | NetworkMCEstimatorBD | NetworkMCEstimatorDB | NetworkMCEstimatorTDPC | NetworkMCEstimatorLP """ cls = _UPDATE_RULE_ESTIMATORS.get(update_rule) if cls is None: raise ValueError( f"Unknown update_rule '{update_rule}'. " f"Choose from: {list(_UPDATE_RULE_ESTIMATORS.keys())}" ) return cls(game, topology, nb_strategies, beta, mu, cache_size)
[docs] def network_coevo_factory( game: AbstractSpatialGame, topology: Dict[int, List[int]], nb_strategies: int, beta: float, mu: float, rewiring_probability: float, rewiring_rule: str = "random", cache_size: int = 100000, ): """ Create a NetworkCoEvolutionary estimator for the requested rewiring rule. Parameters ---------- game : egttools.games.AbstractSpatialGame topology : dict[int, list[int]] nb_strategies : int beta : float mu : float rewiring_probability : float Probability per time step that a rewiring event occurs. rewiring_rule : str ``"random"`` (Santos 2006) or ``"homophilic"`` (Borges 2023). cache_size : int, optional Returns ------- NetworkCoEvolutionaryPC | NetworkCoEvolutionaryPCHomophilic """ rewiring_map = { "random": NetworkCoEvolutionaryPC, "homophilic": NetworkCoEvolutionaryPCHomophilic, } cls = rewiring_map.get(rewiring_rule.lower()) if cls is None: raise ValueError( f"Unknown rewiring_rule '{rewiring_rule}'. " f"Choose from: {list(rewiring_map.keys())}" ) return cls(game, topology, nb_strategies, beta, mu, rewiring_probability, cache_size)