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)
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)
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)