def __init__(self, nqubits, matrix): if not (isinstance(matrix, K.tensor_types) or K.issparse(matrix)): raise_error( TypeError, "Matrix of invalid type {} given during " "Hamiltonian initialization" "".format(type(matrix))) self.K = K matrix = self.K.cast(matrix) super().__init__(nqubits, matrix)
def __mul__(self, o): if isinstance(o, K.tensor_types): o = complex(o) elif not isinstance(o, K.numeric_types): raise_error( NotImplementedError, "Hamiltonian multiplication to {} " "not implemented.".format(type(o))) new_matrix = self.matrix * o r = self.__class__(self.nqubits, new_matrix) if self._eigenvalues is not None: if K.qnp.cast(o).real >= 0: r._eigenvalues = o * self._eigenvalues elif not K.issparse(self.matrix): r._eigenvalues = o * self._eigenvalues[::-1] if self._eigenvectors is not None: if K.qnp.cast(o).real > 0: r._eigenvectors = self._eigenvectors elif o == 0: r._eigenvectors = self.eye(int(self._eigenvectors.shape[0])) return r