Commit fc2c81d7 authored by Bharath Ramsundar's avatar Bharath Ramsundar
Browse files

Changes

parent cd076a8a
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
import deepchem as dc
import numpy as np


def test_IRV_transformer():
  n_features = 128
  n_samples = 20
  test_samples = 5
  n_tasks = 2
  X = np.random.randint(2, size=(n_samples, n_features))
  y = np.zeros((n_samples, n_tasks))
  w = np.ones((n_samples, n_tasks))
  dataset = dc.data.NumpyDataset(X, y, w, ids=None)
  X_test = np.random.randint(2, size=(test_samples, n_features))
  y_test = np.zeros((test_samples, n_tasks))
  w_test = np.ones((test_samples, n_tasks))
  test_dataset = dc.data.NumpyDataset(X_test, y_test, w_test, ids=None)
  sims = np.sum(
      X_test[0, :] * X, axis=1, dtype=float) / np.sum(
          np.sign(X_test[0, :] + X), axis=1, dtype=float)
  sims = sorted(sims, reverse=True)
  IRV_transformer = dc.trans.IRVTransformer(10, n_tasks, dataset)
  test_dataset_trans = IRV_transformer.transform(test_dataset)
  dataset_trans = IRV_transformer.transform(dataset)
  assert test_dataset_trans.X.shape == (test_samples, 20 * n_tasks)
  assert np.allclose(test_dataset_trans.X[0, :10], sims[:10])
  assert np.allclose(test_dataset_trans.X[0, 10:20], [0] * 10)
  assert not np.isclose(dataset_trans.X[0, 0], 1.)
+6 −57
Original line number Diff line number Diff line
@@ -9,32 +9,20 @@ import unittest
import numpy as np
import deepchem as dc
import scipy.ndimage
from deepchem.trans.transformers import DataTransforms


def load_solubility_data():
  """Loads solubility dataset"""
  current_dir = os.path.dirname(os.path.abspath(__file__))
  featurizer = dc.feat.CircularFingerprint(size=1024)
  tasks = ["log-solubility"]
  task_type = "regression"
  input_file = os.path.join(current_dir, "../../models/tests/example.csv")
  loader = dc.data.CSVLoader(
      tasks=tasks, smiles_field="smiles", featurizer=featurizer)

  return loader.create_dataset(input_file)


class TestTransformers(unittest.TestCase):
class TestDataTransforms(unittest.TestCase):
  """
  Test top-level API for transformer objects.
  Test DataTransforms for images 
  """

  def setUp(self):
    """
     init to load the MNIST data for DataTransforms Tests
    """
    super(TestTransformers, self).setUp()
    self.current_dir = os.path.dirname(os.path.abspath(__file__))
    '''
       init to load the MNIST data for DataTransforms Tests
      '''
    (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
    train = dc.data.NumpyDataset(x_train, y_train)
    # extract only the images (no need of the labels)
@@ -43,45 +31,6 @@ class TestTransformers(unittest.TestCase):
    data = np.reshape(data, (28, 28))
    self.d = data

  def test_coulomb_fit_transformer(self):
    """Test coulomb fit transformer on singletask dataset."""
    n_samples = 10
    n_features = 3
    n_tasks = 1
    ids = np.arange(n_samples)
    X = np.random.rand(n_samples, n_features, n_features)
    y = np.zeros((n_samples, n_tasks))
    w = np.ones((n_samples, n_tasks))
    dataset = dc.data.NumpyDataset(X, y, w, ids)
    fit_transformer = dc.trans.CoulombFitTransformer(dataset)
    X_t = fit_transformer.X_transform(dataset.X)
    assert len(X_t.shape) == 2

  def test_IRV_transformer(self):
    n_features = 128
    n_samples = 20
    test_samples = 5
    n_tasks = 2
    X = np.random.randint(2, size=(n_samples, n_features))
    y = np.zeros((n_samples, n_tasks))
    w = np.ones((n_samples, n_tasks))
    dataset = dc.data.NumpyDataset(X, y, w, ids=None)
    X_test = np.random.randint(2, size=(test_samples, n_features))
    y_test = np.zeros((test_samples, n_tasks))
    w_test = np.ones((test_samples, n_tasks))
    test_dataset = dc.data.NumpyDataset(X_test, y_test, w_test, ids=None)
    sims = np.sum(
        X_test[0, :] * X, axis=1, dtype=float) / np.sum(
            np.sign(X_test[0, :] + X), axis=1, dtype=float)
    sims = sorted(sims, reverse=True)
    IRV_transformer = dc.trans.IRVTransformer(10, n_tasks, dataset)
    test_dataset_trans = IRV_transformer.transform(test_dataset)
    dataset_trans = IRV_transformer.transform(dataset)
    assert test_dataset_trans.X.shape == (test_samples, 20 * n_tasks)
    assert np.allclose(test_dataset_trans.X[0, :10], sims[:10])
    assert np.allclose(test_dataset_trans.X[0, 10:20], [0] * 10)
    assert not np.isclose(dataset_trans.X[0, 0], 1.)

  def test_blurring(self):
    # Check Blurring
    dt = DataTransforms(self.d)
+84 −30
Original line number Diff line number Diff line
@@ -889,6 +889,8 @@ class BalancingTransformer(Transformer):
  See Also
  --------
  deepchem.trans.DuplicateBalancingTransformer: Balance by duplicating samples.


  Note
  ----
  This transformer is only meaningful for classification datasets where `y`
@@ -1385,19 +1387,51 @@ class CoulombFitTransformer(Transformer):


class IRVTransformer(Transformer):
  """Performs transform from ECFP to IRV features(K nearest neighbors)."""
  """Performs transform from ECFP to IRV features(K nearest neighbors).

  This transformer is required by `MultitaskIRVClassifier` as a preprocessing
  step before training.

  Examples
  --------
  Let's start by defining the parameters of the dataset we're about to
  transform.

  >>> n_feat = 128
  >>> N = 20
  >>> n_tasks = 2

  Let's now make our dataset object

  >>> import numpy as np
  >>> import deepchem as dc
  >>> X = np.random.randint(2, size=(N, n_feat))
  >>> y = np.zeros((N, n_tasks))
  >>> w = np.ones((N, n_tasks))
  >>> dataset = dc.data.NumpyDataset(X, y, w)

  And let's apply our transformer with 10 nearest neighbors.

  >>> K = 10
  >>> trans = dc.trans.IRVTransformer(K, n_tasks, dataset)
  >>> dataset = trans.transform(dataset)

  Note
  ----
  This class requires TensorFlow to be installed.
  """

  def __init__(self, K, n_tasks, dataset, transform_y=False, transform_x=False):
  def __init__(self, K, n_tasks, dataset):
    """Initializes IRVTransformer.

    Parameters
    ----------
    dataset: dc.data.Dataset object
      train_dataset
    K: int
      number of nearest neighbours being count
    n_tasks: int
      number of tasks
    dataset: dc.data.Dataset object
      train_dataset
    """
    self.X = dataset.X
    self.n_tasks = n_tasks
@@ -1424,7 +1458,6 @@ class IRVTransformer(Transformer):
    features: list
      n_samples * np.array of size (2*K,)
      each array includes K similarity values and corresponding labels

    """
    features = []
    similarity_xs = similarity * np.sign(w)
@@ -1478,13 +1511,13 @@ class IRVTransformer(Transformer):
    """
    X_target2 = []
    n_features = X_target.shape[1]
    print('start similarity calculation')
    logger.info('start similarity calculation')
    time1 = time.time()
    similarity = IRVTransformer.matrix_mul(X_target, np.transpose(
        self.X)) / (n_features - IRVTransformer.matrix_mul(
            1 - X_target, np.transpose(1 - self.X)))
    time2 = time.time()
    print('similarity calculation takes %i s' % (time2 - time1))
    logger.info('similarity calculation takes %i s' % (time2 - time1))
    for i in range(self.n_tasks):
      X_target2.append(self.realize(similarity, self.y[:, i], self.w[:, i]))
    return np.concatenate([z for z in np.array(X_target2)], axis=1)
@@ -1526,6 +1559,21 @@ class IRVTransformer(Transformer):
    return all_result

  def transform(self, dataset, parallel=False, out_dir=None, **kwargs):
    """Transforms a given dataset

    Parameters
    ----------
    dataset: Dataset
      Dataset to transform
    parallel: bool, optional, (default False)
      Whether to parallelize this transformation. Currently ignored.
    out_dir: str, optional (default None)
      Directory to write resulting dataset.

    Returns
    -------
    `Dataset` object that is transformed.
    """
    X_length = dataset.X.shape[0]
    X_trans = []
    for count in range(X_length // 5000 + 1):
@@ -1733,6 +1781,10 @@ class ImageTransformer(Transformer):

class ANITransformer(Transformer):
  """Performs transform from 3D coordinates to ANI symmetry functions

  Note
  ----
  This class requires TensorFlow to be installed.
  """

  def __init__(self,
@@ -1777,7 +1829,7 @@ class ANITransformer(Transformer):
            [self.outputs], feed_dict={self.inputs: X_batch})[0]
        X_out.append(output)
        num_transformed = num_transformed + X_batch.shape[0]
        print('%i samples transformed' % num_transformed)
        logger.info('%i samples transformed' % num_transformed)
        start += 1
        if end >= len(X):
          break
@@ -1794,7 +1846,8 @@ class ANITransformer(Transformer):
    """ tensorflow computation graph for transform """
    graph = tf.Graph()
    with graph.as_default():
      self.inputs = tf.placeholder(tf.float32, shape=(None, self.max_atoms, 4))
      self.inputs = tf.keras.Input(
          dtype=tf.float32, shape=(None, self.max_atoms, 4))
      atom_numbers = tf.cast(self.inputs[:, :, 0], tf.int32)
      flags = tf.sign(atom_numbers)
      flags = tf.cast(
@@ -1833,7 +1886,8 @@ class ANITransformer(Transformer):
    # Cutoff with threshold Rc
    d_flag = flags * tf.sign(cutoff - d)
    d_flag = tf.nn.relu(d_flag)
    d_flag = d_flag * tf.expand_dims((1 - tf.eye(self.max_atoms)), 0)
    d_flag = d_flag * tf.expand_dims(
        tf.expand_dims((1 - tf.eye(self.max_atoms)), 0), -1)
    d = 0.5 * (tf.cos(np.pi * d / cutoff) + 1)
    return d * d_flag

@@ -1936,7 +1990,7 @@ class FeaturizationTransformer(Transformer):
  >>> X = np.array(smiles)
  >>> y = np.array([1, 0])
  >>> dataset = dc.data.NumpyDataset(X, y)
  >>> trans = FeaturizerTransformer(dataset, dc.feat.CircularFingerprint())
  >>> trans = dc.trans.FeaturizationTransformer(dataset, dc.feat.CircularFingerprint())
  >>> dataset = trans.transform(dataset)
  """