Sum

class Sum(filter=<function Sum.<lambda>>)[source]

Bases: stk.ea.fitness_normalizers.fitness_normalizer.FitnessNormalizer

Combines fitness value components into a single fitness value.

Examples

Combining Fitness Value Components Into a Single Value

Sometimes, your FitnessCalculator will return a fitness value which is a tuple of multiple numbers. Each number represents a different property of the molecule, which contributes to the final fitness value. This fitness normalizer combines these fitness value components into a single number, by taking their sum.

import stk

building_block = stk.BuildingBlock(
    smiles='BrCCBr',
    functional_groups=[stk.BromoFactory()],
)

population = (
    stk.MoleculeRecord(
        topology_graph=stk.polymer.Linear(
            building_blocks=(building_block, ),
            repeating_unit='A',
            num_repeating_units=2,
        ),
    ).with_fitness_value(
        fitness_value=(1, -2, 3),
        normalized=False,
    ),
)

# Create the normalizer.
sum_normalizer = stk.Sum()

normalized_population = tuple(sum_normalizer.normalize(
    population=population,
))
normalized_record, = normalized_population

assert normalized_record.get_fitness_value() == 2

Selectively Normalizing Fitness Values

Sometimes, you only want to normalize some members of a population, for example if some do not have an assigned fitness value, because the fitness calculation failed for whatever reason. You can use the filter parameter to exclude records from the normalization

import stk

building_block = stk.BuildingBlock(
    smiles='BrCCBr',
    functional_groups=[stk.BromoFactory()],
)

population = (
    stk.MoleculeRecord(
        topology_graph=stk.polymer.Linear(
            building_blocks=(building_block, ),
            repeating_unit='A',
            num_repeating_units=2,
        ),
    ).with_fitness_value(
        fitness_value=(1, -2, 3),
        normalized=False,
    ),
    # This will have a fitness value of None.
    stk.MoleculeRecord(
        topology_graph=stk.polymer.Linear(
            building_blocks=(building_block, ),
            repeating_unit='A',
            num_repeating_units=2,
        ),
    ),
)

normalizer = stk.Sum(
    # Only normalize values which are not None.
    filter=lambda population, record:
        record.get_fitness_value() is not None,
)
normalized_population = tuple(normalizer.normalize(population))
normalized_record1, normalized_record2 = normalized_population
assert normalized_record1.get_fitness_value() == 2
assert normalized_record2.get_fitness_value() is None

Methods

normalize(population)

Normalize the fitness values in population.

__init__(filter=<function Sum.<lambda>>)[source]

Initialize a Sum instance.

Parameters

filter (callable, optional) – Takes two parameters, first is a tuple of MoleculeRecord instances, and the second is a MoleculeRecord. The callable returns True or False. Only molecules which return True will have fitness values normalized. By default, all molecules will have fitness values normalized. The instance passed to the population argument of normalize() is passed as the first argument, while the second argument will be passed every MoleculeRecord in it, one at a time.

normalize(population)[source]

Normalize the fitness values in population.

Parameters

population (tuple of MoleculeRecord) – The molecules which need to have their fitness values normalized.

Yields

MoleculeRecord – A record with a normalized fitness value.