Source code for mordred.TopologicalIndex
from __future__ import division
from ._base import Descriptor
from ._graph_matrix import Radius as CRadius
from ._graph_matrix import Diameter as CDiameter
__all__ = ("Diameter", "Radius", "TopologicalShapeIndex", "PetitjeanIndex")
class TopologicalIndexBase(Descriptor):
__slots__ = ()
explicit_hydrogens = False
@classmethod
def preset(cls, version):
yield cls()
def parameters(self):
return ()
rtype = int
[docs]
class Radius(TopologicalIndexBase):
r"""radius descriptor."""
since = "1.0.0"
__slots__ = ()
[docs]
def description(self):
return "topological radius"
def __str__(self):
return "Radius"
def dependencies(self):
return {"R": CRadius(self.explicit_hydrogens)}
def calculate(self, R):
return int(R)
[docs]
class Diameter(TopologicalIndexBase):
r"""diameter descriptor."""
since = "1.0.0"
__slots__ = ()
[docs]
def description(self):
return "topological diameter"
def __str__(self):
return "Diameter"
def dependencies(self):
return {"D": CDiameter(self.explicit_hydrogens)}
def calculate(self, D):
return int(D)
[docs]
class TopologicalShapeIndex(TopologicalIndexBase):
r"""topological shape index descriptor.
.. math::
I_{\rm topo} = \frac{D - R}{R}
where
:math:`R` is graph radius,
:math:`D` is graph diameter.
:returns: NaN when :math:`R = 0`
"""
since = "1.0.0"
__slots__ = ()
[docs]
def description(self):
return "topological shape index"
def __str__(self):
return "TopoShapeIndex"
def dependencies(self):
return {
"D": CDiameter(self.explicit_hydrogens),
"R": CRadius(self.explicit_hydrogens),
}
def calculate(self, R, D):
with self.rethrow_zerodiv():
return (D - R) / R
rtype = float
[docs]
class PetitjeanIndex(TopologicalShapeIndex):
r"""Petitjean index descriptor.
.. math::
I_{\rm Petitjean} = \frac{D - R}{D}
where
:math:`R` is graph radius,
:math:`D` is graph diameter.
:returns: NaN when :math:`D = 0`
"""
since = "1.0.0"
__slots__ = ()
[docs]
def description(self):
return "Petitjean index"
def __str__(self):
return "PetitjeanIndex"
def calculate(self, R, D):
with self.rethrow_zerodiv():
return (D - R) / D