Source code for mordred.GravitationalIndex
import numpy as np
from ._base import Descriptor
from ._util import atoms_to_numpy
from ._graph_matrix import AdjacencyMatrix, DistanceMatrix3D
__all__ = ("GravitationalIndex",)
[docs]class GravitationalIndex(Descriptor):
    __slots__ = "_heavy", "_pair"
[docs]    def description(self):
        return "{}{}gravitational index".format(
            "heavy atom " if self._heavy else "",
            "pair " if self._pair else "",
        ) 
    @classmethod
    def preset(cls):
        return (
            cls(h, p)
            for p in [False, True]
            for h in [True, False]
        )
    require_3D = True
    @property
    def explicit_hydrogens(self):
        return not self._heavy
    def __str__(self):
        return "GRAV{}{}".format(
            "" if self._heavy else "H",
            "p" if self._pair else "",
        )
    def parameters(self):
        return self._heavy, self._pair
    def __init__(self, heavy=True, pair=False):
        self._heavy = heavy
        self._pair = pair
    def dependencies(self):
        d = {"D": DistanceMatrix3D(self.explicit_hydrogens)}
        if self._pair:
            d["A"] = AdjacencyMatrix(self.explicit_hydrogens)
        return d
    def calculate(self, D, A=1.0):
        w = atoms_to_numpy(lambda a: a.GetMass(), self.mol)
        w = w[:, np.newaxis] * w
        np.fill_diagonal(w, 0)
        D = D.copy()
        np.fill_diagonal(D, 1)
        with self.rethrow_zerodiv():
            return 0.5 * np.sum(w * A / D ** 2)
    rtype = float