Source code for mordred.BaryszMatrix
from __future__ import division
import numpy as np
from networkx import Graph, floyd_warshall_numpy
from ._base import Descriptor
from ._atomic_property import AtomicProperty, get_properties
from ._matrix_attributes import methods, get_method
__all__ = ("BaryszMatrix",)
class BaryszMatrixBase(Descriptor):
explicit_hydrogens = False
__slots__ = ()
class Barysz(BaryszMatrixBase):
__slots__ = ("_prop",)
def parameters(self):
return self._prop,
def __init__(self, prop):
self._prop = prop
def dependencies(self):
return {"P": self._prop}
def calculate(self, P):
C = self._prop.carbon
G = Graph()
G.add_nodes_from(a.GetIdx() for a in self.mol.GetAtoms())
for bond in self.mol.GetBonds():
i = bond.GetBeginAtomIdx()
j = bond.GetEndAtomIdx()
pi = bond.GetBondTypeAsDouble()
with self.rethrow_zerodiv():
w = (C * C) / (P[i] * P[j] * pi)
G.add_edge(i, j, weight=w)
sp = floyd_warshall_numpy(G)
np.fill_diagonal(sp, [1. - C / P[a.GetIdx()] for a in self.mol.GetAtoms()])
return sp
[docs]class BaryszMatrix(BaryszMatrixBase):
r"""barysz matrix descriptor.
:type prop: :py:class:`str` or :py:class:`function`
:param prop: :ref:`atomic_properties`
:type type: str
:param type: :ref:`matrix_aggregating_methods`
:returns: NaN when any properties are NaN
"""
__slots__ = ("_prop", "_type",)
[docs] def description(self):
return "{} from Barysz matrix weighted by {}".format(
self._type.description(), self._prop.get_long())
@classmethod
def preset(cls):
return (cls(p, m) for p in get_properties() for m in methods)
def __str__(self):
return "{}_Dz{}".format(self._type.__name__, self._prop.as_argument)
def parameters(self):
return self._prop, self._type
def __init__(self, prop="Z", type="SpMax"):
self._prop = AtomicProperty(self.explicit_hydrogens, prop)
self._type = get_method(type)
def dependencies(self):
return {
"result": self._type(
Barysz(self._prop),
self.explicit_hydrogens,
self.kekulize,
),
}
def calculate(self, result):
return result
rtype = float