Source code for mordred.WalkCount
import numpy as np
from ._base import Descriptor
from ._graph_matrix import AdjacencyMatrix
__all__ = ("WalkCount",)
[docs]class WalkCount(Descriptor):
r"""walk count descriptor.
:type order: int
:param order: walk length
:type total: bool
:param total: sum of walk count over 1 to order
:type self_returning: bool
:param self_returning: use self returning walk only
"""
__slots__ = ("_order", "_total", "_self_returning",)
explicit_hydrogens = False
[docs] def description(self):
return "{}walk count (leg-{}{})".format(
"total " if self._total else "",
self._order,
", only self returning walk" if self._self_returning else "",
)
@classmethod
def preset(cls):
for start, sr in [(1, False), (2, True)]:
for l in range(start, 11):
yield cls(l, False, sr)
yield cls(10, True, sr)
def __str__(self):
T = "{}SRW{:02d}" if self._self_returning else "{}MWC{:02d}"
return T.format("T" if self._total else "", self._order)
def parameters(self):
return self._order, self._total, self._self_returning
def __init__(self, order=1, total=False, self_returning=False):
self._order = order
self._total = total
self._self_returning = self_returning
def dependencies(self):
if self._total:
d = {}
d["W"] = self.__class__(
self._order,
False,
self._self_returning,
)
if self._order > 1:
d["T"] = self.__class__(
self._order - 1,
True,
self._self_returning,
)
return d
return {
"An": AdjacencyMatrix(
self.explicit_hydrogens,
order=self._order,
),
}
def calculate(self, An=None, T=None, W=None):
if self._total:
if self._order == 1:
return self.mol.GetNumAtoms() + W
return T + W
if self._self_returning:
return np.log(An.trace() + 1)
else:
if self._order == 1:
return 0.5 * An.sum()
return np.log(An.sum() + 1)
rtype = float