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
Return the fitness value of a molecule.