Commit 3a5d413c authored by VIGNESHinZONE's avatar VIGNESHinZONE
Browse files

Merge Conflict

parents d6a38486 c9f0da15
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ from deepchem.feat.complex_featurizers import ComplexNeighborListFragmentAtomicC
from deepchem.feat.material_featurizers import ElementPropertyFingerprint
from deepchem.feat.material_featurizers import SineCoulombMatrix
from deepchem.feat.material_featurizers import CGCNNFeaturizer
from deepchem.feat.material_featurizers import ElemNetFeaturizer
from deepchem.feat.material_featurizers import LCNNFeaturizer

try:
+5 −3
Original line number Diff line number Diff line
@@ -146,9 +146,6 @@ class GraphData:

    src = self.edge_index[0]
    dst = self.edge_index[1]
    if self_loop:
      src = np.concatenate([src, np.arange(self.num_nodes)])
      dst = np.concatenate([dst, np.arange(self.num_nodes)])

    g = dgl.graph(
        (torch.from_numpy(src).long(), torch.from_numpy(dst).long()),
@@ -161,6 +158,11 @@ class GraphData:
    if self.edge_features is not None:
      g.edata['edge_attr'] = torch.from_numpy(self.edge_features).float()

    if self_loop:
      # This assumes that the edge features for self loops are full-zero tensors
      # In the future we may want to support featurization for self loops
      g.add_edges(np.arange(self.num_nodes), np.arange(self.num_nodes))

    return g


+1 −0
Original line number Diff line number Diff line
@@ -5,4 +5,5 @@ Featurizers for inorganic crystals.
from deepchem.feat.material_featurizers.element_property_fingerprint import ElementPropertyFingerprint
from deepchem.feat.material_featurizers.sine_coulomb_matrix import SineCoulombMatrix
from deepchem.feat.material_featurizers.cgcnn_featurizer import CGCNNFeaturizer
from deepchem.feat.material_featurizers.elemnet_featurizer import ElemNetFeaturizer
from deepchem.feat.material_featurizers.lcnn_featurizer import LCNNFeaturizer
+83 −0
Original line number Diff line number Diff line
import numpy as np
from typing import DefaultDict, Union

from deepchem.utils.typing import PymatgenComposition
from deepchem.feat import MaterialCompositionFeaturizer

elements_tl = [
    'H', 'Li', 'Be', 'B', 'C', 'N', 'O', 'F', 'Na', 'Mg', 'Al', 'Si', 'P', 'S',
    'Cl', 'K', 'Ca', 'Sc', 'Ti', 'V', 'Cr', 'Mn', 'Fe', 'Co', 'Ni', 'Cu', 'Zn',
    'Ga', 'Ge', 'As', 'Se', 'Br', 'Kr', 'Rb', 'Sr', 'Y', 'Zr', 'Nb', 'Mo', 'Tc',
    'Ru', 'Rh', 'Pd', 'Ag', 'Cd', 'In', 'Sn', 'Sb', 'Te', 'I', 'Xe', 'Cs', 'Ba',
    'La', 'Ce', 'Pr', 'Nd', 'Pm', 'Sm', 'Eu', 'Gd', 'Tb', 'Dy', 'Ho', 'Er',
    'Tm', 'Yb', 'Lu', 'Hf', 'Ta', 'W', 'Re', 'Os', 'Ir', 'Pt', 'Au', 'Hg', 'Tl',
    'Pb', 'Bi', 'Ac', 'Th', 'Pa', 'U', 'Np', 'Pu'
]


class ElemNetFeaturizer(MaterialCompositionFeaturizer):
  """
  Fixed size vector of length 86 containing raw fractional elemental
  compositions in the compound. The 86 chosen elements are based on the
  original implementation at https://github.com/NU-CUCIS/ElemNet.

  Returns a vector containing fractional compositions of each element
  in the compound.

  References
  ----------
  .. [1] Jha, D., Ward, L., Paul, A. et al. Sci Rep 8, 17593 (2018).
     https://doi.org/10.1038/s41598-018-35934-y

  Examples
  --------
  >>> import pymatgen as mg
  >>> comp = "Fe2O3"
  >>> featurizer = ElemNetFeaturizer()
  >>> features = featurizer.featurize([comp])

  Notes
  -----
  This class requires Pymatgen to be installed.
  """

  def get_vector(self, comp: DefaultDict) -> Union[np.ndarray, None]:
    """
    Converts a dictionary containing element names and corresponding
    compositional fractions into a vector of fractions.

    Parameters
    ----------
    comp: collections.defaultdict object
      Dictionary mapping element names to fractional compositions.

    Returns
    -------
    fractions: np.ndarray
      Vector of fractional compositions of each element.
    """
    if all(e in elements_tl for e in comp):
      fractions = np.array([comp[e] if e in comp else 0 for e in elements_tl],
                           np.float32)
    else:
      fractions = None
    return fractions

  def _featurize(self, composition: PymatgenComposition) -> np.ndarray:
    """
    Calculate 86 dimensional vector containing fractional compositions of
    each element in the compound.

    Parameters
    ----------
    composition: pymatgen.Composition object
      Composition object.

    Returns
    -------
    feats: np.ndarray
      86 dimensional vector containing fractional compositions of elements.
    """
    fractions = composition.fractional_composition.get_el_amt_dict()
    feat = self.get_vector(fractions)
    return feat
+14 −1
Original line number Diff line number Diff line
@@ -4,7 +4,7 @@ Test featurizers for inorganic crystals.
import unittest
import numpy as np

from deepchem.feat import ElementPropertyFingerprint, SineCoulombMatrix, CGCNNFeaturizer
from deepchem.feat import ElementPropertyFingerprint, SineCoulombMatrix, CGCNNFeaturizer, ElemNetFeaturizer


class TestMaterialFeaturizers(unittest.TestCase):
@@ -83,3 +83,16 @@ class TestMaterialFeaturizers(unittest.TestCase):
    assert graph_features[0].node_features.shape == (1, 92)
    assert graph_features[0].edge_index.shape == (2, 6)
    assert graph_features[0].edge_features.shape == (6, 11)

  def test_elemnet_featurizer(self):
    """
    Test ElemNetFeaturizer.
    """

    featurizer = ElemNetFeaturizer()
    features = featurizer.featurize([self.formula])

    assert features.shape[1] == 86
    assert np.isclose(features[0][13], 0.6666667, atol=0.01)
    assert np.isclose(features[0][38], 0.33333334, atol=0.01)
    assert np.isclose(features.sum(), 1.0, atol=0.01)
Loading