Skip to content

misc

diversity(population)

Calculates diversity of lineups

Parameters:

Name Type Description Default
population ndarray

the population

required

Returns:

Type Description
ndarray

np.ndarray: is square, shape len(population) x len(population)

Source code in pangadfs/misc.py
def diversity(population: np.ndarray) -> np.ndarray:
    """Calculates diversity of lineups

    Args:
        population (np.ndarray): the population

    Returns:
        np.ndarray: is square, shape len(population) x len(population)

    """
    uniques = np.unique(population)
    a = (population[..., None] == uniques).sum(1)
    return np.einsum('ij,kj->ik', a, a)

exposure(population=None)

Returns dict of index: count of individuals

Parameters:

Name Type Description Default
population ndarray

the population

None

Returns:

Type Description
Dict[int, int]

Dict[int, int]: key is index, value is count of lineup

Examples:

>>> fittest_population = population[np.where(fitness > np.percentile(fitness, 97))]
>>> exposure = population_exposure(fittest_population)
>>> top_exposure = np.argpartition(np.array(list(exposure.values())), -10)[-10:]
>>> print([round(i, 3) for i in sorted(top_exposure / len(fittest_population), reverse=True)])            
Source code in pangadfs/misc.py
def exposure(population: np.ndarray = None) -> Dict[int, int]:
    """Returns dict of index: count of individuals

    Args:
        population (np.ndarray): the population

    Returns:
        Dict[int, int]: key is index, value is count of lineup

    Examples:
        >>> fittest_population = population[np.where(fitness > np.percentile(fitness, 97))]
        >>> exposure = population_exposure(fittest_population)
        >>> top_exposure = np.argpartition(np.array(list(exposure.values())), -10)[-10:]
        >>> print([round(i, 3) for i in sorted(top_exposure / len(fittest_population), reverse=True)])            

    """
    flat = population.flatten
    return dict(zip(flat, np.bincount(flat)[flat]))

multidimensional_shifting(elements, num_samples, sample_size, probs)

Based on https://medium.com/ibm-watson/incredibly-fast-random-sampling-in-python-baf154bd836a

Parameters:

Name Type Description Default
elements Iterable

iterable to sample from, typically a dataframe index

required
num_samples int

the number of rows (e.g. initial population size)

required
sample_size int

the number of columns (e.g. team size)

required
probs Iterable

is same size as elements

required

Returns:

Type Description
ndarray

ndarray: of shape (num_samples, sample_size)

Source code in pangadfs/misc.py
def multidimensional_shifting(elements: Iterable, 
                              num_samples: int, 
                              sample_size: int, 
                              probs: Iterable) -> np.ndarray:
    """Based on https://medium.com/ibm-watson/incredibly-fast-random-sampling-in-python-baf154bd836a

    Args:
        elements (iterable): iterable to sample from, typically a dataframe index
        num_samples (int): the number of rows (e.g. initial population size)
        sample_size (int): the number of columns (e.g. team size)
        probs (iterable): is same size as elements

    Returns:
        ndarray: of shape (num_samples, sample_size)

    """
    replicated_probabilities = np.tile(probs, (num_samples, 1))
    random_shifts = np.random.random(replicated_probabilities.shape)
    random_shifts /= random_shifts.sum(axis=1)[:, np.newaxis]
    shifted_probabilities = random_shifts - replicated_probabilities
    samples = np.argpartition(shifted_probabilities, sample_size, axis=1)[:, :sample_size]
    return elements.to_numpy()[samples]

parents(population)

Evenly splits population

Parameters:

Name Type Description Default
population ndarray

the population to crossover. Shape is n_individuals x n_chromosomes.

required

Returns:

Type Description
Tuple[numpy.ndarray, numpy.ndarray]

Tuple[np.ndarray, np.ndarray]: population split into two equal-size arrays

Source code in pangadfs/misc.py
def parents(population: np.ndarray) -> Tuple[np.ndarray, np.ndarray]:
    """Evenly splits population

    Args:
        population (np.ndarray): the population to crossover. Shape is n_individuals x n_chromosomes.

    Returns:
        Tuple[np.ndarray, np.ndarray]: population split into two equal-size arrays

    """
    fathers, mothers = np.array_split(population, 2)
    size = min(len(fathers), len(mothers))
    return fathers[:size], mothers[:size]