Package rdkit :: Package VLib :: Module Transform

[hide private]
[frames] | no frames]

# Source Code for Module rdkit.VLib.Transform

     1  #  $Id$
     2  #
     3  #  Copyright (C) 2003 Rational Discovery LLC
     4  #     All Rights Reserved
     5  #
     6  import sys
     7  from rdkit import six
     8
     9  from rdkit.VLib.Node import VLibNode
    10
    11 -class TransformNode(VLibNode):
    12    """ base class for nodes which filter their input
    13
    14    Assumptions:
    15
    16      - transform function takes a number of arguments equal to the
    17        number of inputs we have.  We return whatever it returns
    18
    19      - inputs (parents) can be stepped through in lockstep
    20
    21    Usage Example:
    22      >>> from rdkit.VLib.Supply import SupplyNode
    23      >>> def func(a,b):
    24      ...   return a+b
    25      >>> tform = TransformNode(func)
    26      >>> suppl1 = SupplyNode(contents=[1,2,3,3])
    27      >>> suppl2 = SupplyNode(contents=[1,2,3,1])
    28      >>> tform.AddParent(suppl1)
    29      >>> tform.AddParent(suppl2)
    30      >>> v = [x for x in tform]
    31      >>> v
    32      [2, 4, 6, 4]
    33      >>> tform.reset()
    34      >>> v = [x for x in tform]
    35      >>> v
    36      [2, 4, 6, 4]
    37
    38      If we don't provide a function, just return the inputs:
    39      >>> tform = TransformNode()
    40      >>> suppl1 = SupplyNode(contents=[1,2,3,3])
    41      >>> suppl2 = SupplyNode(contents=[1,2,3,1])
    42      >>> tform.AddParent(suppl1)
    43      >>> tform.AddParent(suppl2)
    44      >>> v = [x for x in tform]
    45      >>> v
    46      [(1, 1), (2, 2), (3, 3), (3, 1)]
    47
    48    """
    49 -  def __init__(self,func=None,**kwargs):
    50      VLibNode.__init__(self,**kwargs)
    51      self._func = func
    52
    53 -  def next(self):
    54      done = 0
    55      parent = self.GetParents()[0]
    56      args = []
    57      try:
    58        for parent in self.GetParents():
    59          args.append(parent.next())
    60      except StopIteration:
    61        raise StopIteration
    62      args = tuple(args)
    63      if self._func is not None:
    64        res = self._func(*args)
    65      else:
    66        res = args
    67      return res
    68
    69  if six.PY3:
    70      TransformNode.__next__ = TransformNode.next
    71
    72
    73  #------------------------------------
    74  #
    75  #  doctest boilerplate
    76  #
    77 -def _test():
    78    import doctest,sys
    79    return doctest.testmod(sys.modules["__main__"])
    80
    81  if __name__ == '__main__':
    82    import sys
    83    failed,tried = _test()
    84    sys.exit(failed)
    85