예제 #1
0
    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)
예제 #2
0
def test_is_hermitian_exception():
    is_hermitian(invalid_matrix_type_error)
예제 #3
0
def test_is_hermitian_false(matrix):
    assert not is_hermitian(matrix)
예제 #4
0
def test_is_hermitian_true():
    assert is_hermitian(valid_unitary_hermitian_matrix)