def _get_neighbor_coeffs(self, mol: Molecule) -> Counter: """ Get a counter containing the coefficients for the gamma (bond_corr_neighbor) variables. Args: mol: RMG-Py molecule. Returns: Counter containing gamma coefficients. """ if hasattr(mol, 'id') and mol.id is not None: if mol.id in self._gamma_coeffs: return self._gamma_coeffs[mol.id] coeffs = Counter() for bond in mol.get_all_edges(): atom1 = bond.atom1 atom2 = bond.atom2 # Atoms adjacent to atom1 counts1 = Counter(a.element.symbol for a, b in atom1.bonds.items() if b is not bond) counts1[atom1.element.symbol] += max(0, len(atom1.bonds) - 1) # Atoms adjacent to atom2 counts2 = Counter(a.element.symbol for a, b in atom2.bonds.items() if b is not bond) counts2[atom2.element.symbol] += max(0, len(atom2.bonds) - 1) coeffs += counts1 + counts2 if hasattr(mol, 'id'): self._gamma_coeffs[mol.id] = coeffs return coeffs
def _get_length_coeffs(self, mol: Molecule) -> defaultdict: """ Get a dictionary containing the coefficients for the beta (bond_corr_length) variables. There is one coefficient per atom type and an additional coefficient for each combination of atom types. Example: If the atoms are H, C, and O, there are (at most) coefficients for H, C, O, (C, H), (H, O), and (C, O). Args: mol: RMG-Py molecule. Returns: Defaultdict containing beta coefficients. """ if hasattr(mol, 'id') and mol.id is not None: if mol.id in self._beta_coeffs: return self._beta_coeffs[mol.id] coeffs = defaultdict(float) for bond in mol.get_all_edges(): atom1 = bond.atom1 atom2 = bond.atom2 symbol1 = atom1.element.symbol symbol2 = atom2.element.symbol c = np.exp(-self.exp_coeff * np.linalg.norm(atom1.coords - atom2.coords)) k = symbol1 if symbol1 == symbol2 else tuple(sorted([symbol1, symbol2])) coeffs[k] += c if hasattr(mol, 'id'): self._beta_coeffs[mol.id] = coeffs return coeffs