def __init__(self, matrix: np.ndarray, display_name: str = "Hermitian"): """ Args: matrix (numpy.ndarray): Hermitian matrix that defines the observable. display_name (str): Name to use for an instance of this Hermitian matrix observable for circuit diagrams. Defaults to `Hermitian`. Raises: ValueError: If `matrix` is not a two-dimensional square matrix, or has a dimension length that is not a positive power of 2, or is not Hermitian. Examples: >>> Observable.Hermitian(matrix=np.array([[0, 1],[1, 0]])) """ verify_quantum_operator_matrix_dimensions(matrix) self._matrix = np.array(matrix, dtype=complex) if not is_hermitian(self._matrix): raise ValueError(f"{self._matrix} is not hermitian") qubit_count = int(np.log2(self._matrix.shape[0])) eigendecomposition = Hermitian._get_eigendecomposition(self._matrix) self._eigenvalues = eigendecomposition["eigenvalues"] self._diagonalizing_gates = (Gate.Unitary( matrix=eigendecomposition["eigenvectors"].conj().T), ) super().__init__(qubit_count=qubit_count, ascii_symbols=[display_name] * qubit_count)
def test_is_hermitian_exception(): is_hermitian(invalid_matrix_type_error)
def test_is_hermitian_false(matrix): assert not is_hermitian(matrix)
def test_is_hermitian_true(): assert is_hermitian(valid_unitary_hermitian_matrix)