def compute_morgan_fingerprints(graph: nx.Graph, fingerprint_length: int, fingerprint_radius: int): """Get Morgan Fingerprint of a specific SMILES string. Adapted from: <https://github.com/google-research/google-research/blob/ dfac4178ccf521e8d6eae45f7b0a33a6a5b691ee/mol_dqn/chemgraph/dqn/deep_q_networks.py#L750> Args: graph (nx.Graph): The molecule as a networkx graph fingerprint_length (int): Bit-length of fingerprint fingerprint_radius (int): Radius used to compute fingerprint Returns: np.array. shape = [hparams.fingerprint_length]. The Morgan fingerprint. """ if graph is None: # No smiles string return np.zeros((fingerprint_length,)) molecule = convert_nx_to_rdkit(graph) if molecule is None: # Invalid smiles string return np.zeros((fingerprint_length,)) # Compute the fingerprint fingerprint = AllChem.GetMorganFingerprintAsBitVect( molecule, fingerprint_radius, fingerprint_length) arr = np.zeros((1,)) # ConvertToNumpyArray takes ~ 0.19 ms, while # np.asarray takes ~ 4.69 ms DataStructs.ConvertToNumpyArray(fingerprint, arr) return arr
def _call(self, graph: nx.Graph) -> float: # Compute all the rewards mol = convert_nx_to_rdkit(graph) mw = Descriptors.MolWt(mol) pic50 = self.pic50_reward(graph) sim = self.similarity_reward(graph) # Normalize them mw_score = 1.0 / ((1 + np.exp( (self.mw_range[0] - mw) / self.mw_tol)) * (1 + np.exp( (mw - self.mw_range[1]) / self.mw_tol))) pic50_score = 1.0 / (1 + np.exp((8 - pic50) / self.pic50_tol)) # Sim is already between [0, 1] # Combine them return sim + mw_score + pic50_score
def _call(self, graph: nx.Graph) -> float: mol = convert_nx_to_rdkit(graph) return QED.qed(mol)
def _call(self, graph: nx.Graph) -> float: mol = convert_nx_to_rdkit(graph) return calculateScore(mol)
def _call(self, graph: nx.Graph) -> float: mol = convert_nx_to_rdkit(graph) return Crippen.MolLogP(mol)