Source code for besmarts.sample

"""
besmarts.sample

Sample molecules based on internal coordinate SMARTS
"""

from besmarts.core import mapper
from besmarts.core import graphs
import random


[docs] def sample_ic(cfg, icgl, n=1): """ """ d = {} for gi, g in enumerate(icgl): print(f"{gi:5d}/{len(icgl)}", end="\r") mapper.mapper_smarts_extend(cfg, g) for ic in g: d.setdefault(ic, []).append(gi) print() ret = set() for ic, gids in d.items(): N = len(gids) if N == n: ret.update(gids) elif len(gids) <= n: # warning print(f"Warning, sample pool size is {N} but sample size is {n}") # print(graphs.structure_print(ic)) ret.update(gids) else: ret.update(random.sample(gids, k=n)) return ret
[docs] def sample_bonds(cfg, gl, n=1): icgl = [graphs.graph_to_structure_bonds(g) for g in gl] ret = set() ret.update(sample_ic(cfg, icgl, n=n)) return ret
[docs] def sample_angles(cfg, gl, n=1): icgl = [graphs.graph_to_structure_angles(g) for g in gl] ret = set() ret.update(sample_ic(cfg, icgl, n=n)) return ret
[docs] def sample_torsions(cfg, gl, n=1): icgl = [graphs.graph_to_structure_torsions(g) for g in gl] ret = set() ret.update(sample_ic(cfg, icgl, n=n)) return ret
[docs] def sample_outofplanes(cfg, gl, n=1): icgl = [graphs.graph_to_structure_outofplanes(g) for g in gl] ret = set() ret.update(sample_ic(cfg, icgl, n=n)) return ret
[docs] def sample_valence(cfg, gl, n=1): ret = set() fn_list = sample_bonds, sample_angles, sample_torsions, sample_outofplanes for fn in fn_list: x = fn(cfg, gl, n=n) ret.update(x) print(fn, len(x), len(gl), "Returning", len(ret)) return ret