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