Source code for stk.ea.mutation.mutators.molecule.random_topology_graph

Random Topology Graph


import numpy as np

from ....molecule_records import MoleculeRecord
from ...records import MutationRecord
from .mutator import MoleculeMutator

[docs]class RandomTopologyGraph(MoleculeMutator): """ Changes topology graphs at random. Examples -------- *Constructed Molecule Mutation* .. testcode:: constructed-molecule-mutation import stk # Create a molecule which is to be mutated. bb1 = stk.BuildingBlock('NCCN', [stk.PrimaryAminoFactory()]) bb2 = stk.BuildingBlock( smiles='O=CCC(C=O)CC=O', functional_groups=[stk.AldehydeFactory()], ) cage = stk.MoleculeRecord( topology_graph=stk.cage.FourPlusSix((bb1, bb2)), ) # Create functions which replace the topology graph. replacement_funcs = ( lambda graph: stk.cage.TwoPlusThree(graph.get_building_blocks()), lambda graph: stk.cage.EightPlusTwelve(graph.get_building_blocks()), lambda graph: stk.cage.TwentyPlusThirty(graph.get_building_blocks()), ) # Create the mutator. random_topology = stk.RandomTopologyGraph(replacement_funcs) # Mutate a molecule. mutation_record1 = random_topology.mutate(cage) # Mutate the molecule a second time. mutation_record2 = random_topology.mutate(cage) """
[docs] def __init__( self, replacement_funcs, name="RandomTopologyGraph", random_seed=None, ): """ Initialize a :class:`.RandomTopology` instance. Parameters ---------- replacement_funcs : :class:`tuple` of :class:`callable` Each :class:`callable` takes a single parameter, a :class:`.TopologyGraph`, and returns the :class:`.TopologyGraph` which should replace it. name : :class:`str`, optional A name to help identify the mutator instance. random_seed : :class:`bool`, optional The random seed to use. """ self._replacement_funcs = replacement_funcs self._name = name self._generator = np.random.RandomState(random_seed)
[docs] def mutate(self, record): replacement_func = self._generator.choice( a=self._replacement_funcs, ) replacement = replacement_func(record.get_topology_graph()) return MutationRecord( molecule_record=MoleculeRecord(replacement), mutator_name=self._name, )