Assemble the underlying Markov chain

Use the generate_transition_matrix function:

>>> import ludics
>>> import ludics.fitness_functions

>>> r = 1.5
>>> alpha = 5
>>> selection_intensity = 0.2
>>> state_space = ludics.get_state_space(N=2, k=2)
>>> ludics.generate_transition_matrix(
...     state_space=state_space,
...     fitness_function=ludics.fitness_functions.homogeneous_pgg_fitness_function,
...     compute_transition_probability=ludics.compute_moran_transition_probability,
...     selection_intensity=selection_intensity,
...     alpha=alpha,
...     r=r,
... )
array([[1.  , 0.  , 0.  , 0.  ],
       [0.35, 0.5 , 0.  , 0.15],
       [0.35, 0.  , 0.5 , 0.15],
       [0.  , 0.  , 0.  , 1.  ]])

Most fitness functions and population dynamics in ludics will require **kwargs, which must be passed into the generate_transition_matrix function.

Apply mutation

Pass the individual_to_action_mutation_probability argument:

>>> import ludics
>>> import ludics.fitness_functions
>>> import numpy as np

>>> r = 1.5
>>> alpha = 5
>>> selection_intensity = 0.2
>>> state_space = ludics.get_state_space(N=3, k=2)
>>> mutation_probabilities = np.array([
...     [0.1, 0.2],
...     [0.2, 0.15],
...     [0.15, 0.1],
... ])

>>> ludics.generate_transition_matrix(
...     state_space=state_space,
...     fitness_function=ludics.fitness_functions.homogeneous_pgg_fitness_function,
...     compute_transition_probability=ludics.compute_moran_transition_probability,
...     selection_intensity=selection_intensity,
...     alpha=alpha,
...     r=r,
...     individual_to_action_mutation_probability=mutation_probabilities,
... )
array([[0.85      , 0.03333333, 0.05      , 0.        , 0.06666667,
        0.        , 0.        , 0.        ],
       [0.26428571, 0.5547619 , 0.        , 0.08095238, 0.        ,
        0.1       , 0.        , 0.        ],
       [0.25238095, 0.        , 0.57857143, 0.06904762, 0.        ,
        0.        , 0.1       , 0.        ],
       [0.        , 0.175     , 0.175     , 0.46666667, 0.        ,
        0.        , 0.        , 0.18333333],
       [0.23333333, 0.        , 0.        , 0.        , 0.61666667,
        0.06904762, 0.08095238, 0.        ],
       [0.        , 0.15      , 0.        , 0.        , 0.175     ,
        0.51666667, 0.        , 0.15833333],
       [0.        , 0.        , 0.15      , 0.        , 0.175     ,
        0.        , 0.51666667, 0.15833333],
       [0.        , 0.        , 0.        , 0.03333333, 0.        ,
        0.06666667, 0.05      , 0.85      ]])