stk.PropertyVector

class stk.PropertyVector(property_functions, input_database=None, output_database=None)[source]

Bases: FitnessCalculator[T]

Uses multiple molecular properties as a fitness value.

Examples

Calculating Fitness Values

import stk

# First, create the functions which calculate the properties
# of molecules.
def get_num_atoms(record):
    return record.get_molecule().get_num_atoms()

def get_num_bonds(record):
    return record.get_molecule().get_num_bonds()

def get_diameter(record):
    return record.get_molecule().get_maximum_diameter()

# Next, create the fitness calculator.
fitness_calculator = stk.PropertyVector(
    property_functions=(
        get_num_atoms,
        get_num_bonds,
        get_diameter,
    ),
)

# Calculate the fitness value of a molecule.
# "value" is a tuple, holding the number of atoms, number of
# bonds and the diameter of the molecule.
record = stk.MoleculeRecord(
    topology_graph=stk.polymer.Linear(
        building_blocks=(stk.BuildingBlock('BrCCBr'), ),
        repeating_unit='A',
        num_repeating_units=1,
    ),
)
value = fitness_calculator.get_fitness_value(record)

Storing Fitness Values in a Database

Sometimes you want to store fitness values in a database, you can do this by providing the output_database parameter.

import stk
import pymongo

# Create a database which stores the fitness value of each
# molecule.
fitness_db = stk.ValueMongoDb(
    # This connects to a local database - so make sure you have
    # local MongoDB server running. You can also connect to
    # a remote MongoDB with MongoClient(), read to pymongo
    # docs to see how to do that.
    mongo_client=pymongo.MongoClient(),
    collection='fitness_values',
)

# Define the functions which calculate molecular properties.
def get_num_atoms(record):
    return record.get_molecule().get_num_atoms()

def get_num_bonds(record):
    return record.get_molecule().get_num_bonds()

def get_diameter(record):
    return record.get_molecule().get_maximum_diameter()

# Create the fitness calculator.
fitness_calculator = stk.PropertyVector(
    property_functions=(
        get_num_atoms,
        get_num_bonds,
        get_diameter,
    ),
    output_database=fitness_db,
)

# Calculate fitness values.
record = stk.MoleculeRecord(
    topology_graph=stk.polymer.Linear(
        building_blocks=(stk.BuildingBlock('BrCCBr'), ),
        repeating_unit='A',
        num_repeating_units=1,
    ),
)
value1 = fitness_calculator.get_fitness_value(record)

# You can retrieve the fitness values from the database.
value2 = fitness_db.get(record.get_molecule())

Caching Fitness Values

Usually, if you calculate the fitness value of a molecule, you do not want to re-calculate it, because this may be expensive, and the fitness value is going to be the same anyway. By using the input_database parameter, together with the output_database parameter, you can make sure you store and retrieve calculated fitness values instead of repeating the same calculation multiple times.

The input_database is checked before a calculation happens, to see if the value already exists, while the output_database has the calculated fitness value deposited into it.

import stk
import pymongo

# You can use the same database for both the input_database
# and output_database parameters.
fitness_db = stk.ValueMongoDb(
    # This connects to a local database - so make sure you have
    # local MongoDB server running. You can also connect to
    # a remote MongoDB with MongoClient(), read to pymongo
    # docs to see how to do that.
    mongo_client=pymongo.MongoClient(),
    collection='fitness_values',
)

# Define the functions which calculate molecular properties.
def get_num_atoms(record):
    return record.get_molecule().get_num_atoms()

def get_num_bonds(record):
    return record.get_molecule().get_num_bonds()

def get_diameter(record):
    return record.get_molecule().get_maximum_diameter()

# Create the fitness calculator.
fitness_calculator = stk.PropertyVector(
    property_functions=(
        get_num_atoms,
        get_num_bonds,
        get_diameter,
    ),
    input_database=fitness_db,
    output_database=fitness_db,
)

# Assuming that a fitness value for this molecule was not
# deposited into the database in a previous session, this
# will calculate the fitness value.
record = stk.MoleculeRecord(
    topology_graph=stk.polymer.Linear(
        building_blocks=(stk.BuildingBlock('BrCCBr'), ),
        repeating_unit='A',
        num_repeating_units=1,
    ),
)
value1 = fitness_calculator.get_fitness_value(record)
# This will not re-calculate the fitness value, instead,
# value1 will be retrieved from the database.
value2 = fitness_calculator.get_fitness_value(record)
Parameters:
  • property_functions (list[Callable[[T], Any]]) – A group of functions, each of which is used to calculate a single property of the molecule.

  • input_database (ValueDatabase | None) – A database to check before calling fitness_function. If a fitness value exists for a molecule in the database, the stored value is returned, instead of calling fitness_function.

  • output_database (ValueDatabase | None) – A database into which the calculate fitness value is placed.

Methods

get_fitness_value

Return the fitness value of a molecule.

get_fitness_value(record)[source]

Return the fitness value of a molecule.

Parameters:

record (T) – The molecule whose fitness value should be calculated.

Returns:

The fitness value.

Return type:

Any