Source code for bbprep._internal.modifiers.random_functional_groups

import numpy as np
import stk

from .modifier import Modifier


[docs] class RandomFGs(Modifier): """Modify a building block."""
[docs] def modify( # type: ignore[override] self, building_block: stk.BuildingBlock, desired_functional_groups: int, seed: int = 1000, ) -> stk.BuildingBlock: selected_fgs: list[stk.FunctionalGroup] if ( building_block.get_num_functional_groups() == desired_functional_groups ): return building_block.clone() if ( building_block.get_num_functional_groups() < desired_functional_groups ): msg = ( f"{building_block} has less functional groups than" f" asked for ({desired_functional_groups})." ) raise RuntimeError(msg) generator = np.random.default_rng(seed) existing_fgs = list(building_block.get_functional_groups()) selected_fgs = list( generator.choice( np.array(existing_fgs), size=desired_functional_groups, replace=False, ) ) return building_block.with_functional_groups(selected_fgs)