Exemplo n.º 1
0
 def from_increments(cls, increments, rep, deltas=None):
     if deltas is None:
         deltas = cls.get_default_deltas(rep)
     if sanity_checking_enabled:
         if isinstance(increments, np.ndarray) and len(increments.shape) != 1:
             raise ValueError("'increments' should be 1-dimensional")
         if isinstance(deltas, np.ndarray) and len(deltas.shape) != 1:
             raise ValueError("'deltas' should be 1-dimensional")
     if type_checking_enabled:
         if not isinstance(increments, (np.ndarray, list, tuple)):
             raise TypeError
         if not isinstance(deltas, (np.ndarray, list, tuple)):
             raise TypeError
     if sanity_checking_enabled:
         if len(increments) != len(rep):
             raise ValueError("length of increments must match length of representation, but {0} != {1}".format(len(increments), len(rep)))
         if len(increments) != len(deltas):
             raise ValueError("length of increments must match deltas, but {0} != {1}".format(len(increments), len(deltas)))
     disps = []
     for inc, delta, coord in zip(increments, deltas, rep):
         if hasunits(delta):
             disps.append(inc * delta.in_units(coord.units))
         else:
             # Assume the default units for the genre
             disps.append(inc * (delta * coord.units.genre.default).in_units(coord.units))
     return Displacement(rep, disps, increments=increments, deltas=deltas)
Exemplo n.º 2
0
 def __array_wrap__(self, out_arr, context=None):
     """
     See http://docs.scipy.org/doc/numpy/user/basics.subclassing.html#array-wrap for explanation
     """
     if context is not None:
         if context[0] is np.multiply:
             if len(context[1]) == 2:
                 op1, op2 = context[1]
             else:
                 _, op1, op2 = context[1]
             if op1 is self:
                 tens = op1
                 other = op2
             elif op2 is self:
                 tens = op2
                 other = op1
             else:
                 raise Exception("something very enigmatic happened...")
             #----------------------------------------#
             if hasunits(other):
                 out_arr.units = self.__mul_units__(tens.units, other.units)
             else:
                 out_arr.units = self.units
     #--------------------------------------------------------------------------------#
     return np.ndarray.__array_wrap__(self, out_arr, context)
Exemplo n.º 3
0
 def __array_wrap__(self, out_arr, context=None):
     """
     See http://docs.scipy.org/doc/numpy/user/basics.subclassing.html#array-wrap for explanation
     """
     if context is not None:
         if context[0] is np.multiply:
             if len(context[1]) == 2:
                 op1, op2 = context[1]
             else:
                 _, op1, op2 = context[1]
             if op1 is self:
                 tens = op1
                 other = op2
             elif op2 is self:
                 tens = op2
                 other = op1
             else:
                 raise Exception("something very enigmatic happened...")
             #----------------------------------------#
             if hasunits(other):
                 out_arr.units = self.__mul_units__(tens.units, other.units)
             else:
                 out_arr.units = self.units
     #--------------------------------------------------------------------------------#
     return np.ndarray.__array_wrap__(self, out_arr, context)
Exemplo n.º 4
0
 def __init__(self, base_molecule_or_representation, differentiable, deltas=None, details=None):
     if type_checking_enabled:
         if not isinstance(base_molecule_or_representation, (Molecule, Representation)):
             raise TypeError
         if not isinstance(differentiable, type) and issubclass(differentiable, Differentiable):
             raise TypeError
     if sanity_checking_enabled:
         if not issubclass(differentiable, MolecularProperty):
             # TODO write this error
             raise ValueError
     self._differentiable = differentiable
     if isinstance(base_molecule_or_representation, Molecule):
         # Assume the first InternalRepresentation is the one we want
         self._representation = base_molecule_or_representation.internal_representation
     else:
         self._representation = base_molecule_or_representation
     self.displacements = {}
     self.deltas = deltas
     self.details = details
     if deltas is not None:
         if type_checking_enabled and not isinstance(deltas, Iterable):
             raise TypeError
         if sanity_checking_enabled and len(deltas) != len(self.representation):
             raise ValueError("dimension mismatch.  'deltas' list (length {}) must be the same " \
                               "as the number of coordinates ({})".format(len(deltas), len(self.representation)))
         self.deltas = []
         for delta, coord in zip(deltas, self.representation):
             if hasunits(delta):
                 if sanity_checking_enabled and not compatible_units(delta.units, coord.units):
                     raise IncompatibleUnitsError("{} is not in valid units for a displacement of a {}".format(
                         delta, coord.__class__.__name__
                     ))
             else:
                 delta = delta * coord.units
             self.deltas.append(delta)
     else:
         self.deltas = Displacement.get_default_deltas(self.representation)