def test_tensor_product_nonstandard():
    tensor = observables.TensorProduct(
        [
            observables.Hadamard([1]),
            observables.Identity([5]),
            observables.PauliX([3]),
            observables.PauliZ([7]),
            observables.PauliY([4]),
        ]
    )
    assert tensor.targets == (1, 3, 4)
    assert tensor.measured_qubits == (1, 5, 3, 7, 4)

    eigenvalues = np.array(
        [
            1,
            -1,
            1,
            -1,
            -1,
            1,
            -1,
            1,
            -1,
            1,
            -1,
            1,
            1,
            -1,
            1,
            -1,
            -1,
            1,
            -1,
            1,
            1,
            -1,
            1,
            -1,
            1,
            -1,
            1,
            -1,
            -1,
            1,
            -1,
            1,
        ]
    )
    assert (tensor.eigenvalues == eigenvalues).all()

    # Test cached
    assert (tensor.eigenvalues == eigenvalues).all()

    # Both Identity and Z ignored
    assert (tensor.diagonalizing_matrix == np.kron(np.kron(h_diag, x_diag), y_diag)).all()
def test_observable_known_diagonalization():
    assert np.allclose(
        observables.Hadamard([0]).diagonalizing_matrix, gate_operations.RotY([0], -np.pi / 4).matrix
    )
    assert np.allclose(
        observables.PauliX([0]).diagonalizing_matrix, gate_operations.Hadamard([0]).matrix
    )
    y_diag_expected = np.linalg.multi_dot(
        [
            gate_operations.Hadamard([0]).matrix,
            gate_operations.S([0]).matrix,
            gate_operations.PauliZ([0]).matrix,
        ]
    )
    assert np.allclose(observables.PauliY([0]).diagonalizing_matrix, y_diag_expected)
def test_tensor_product_standard():
    tensor = observables.TensorProduct(
        [
            observables.Hadamard([1]),
            observables.PauliX([3]),
            observables.PauliZ([7]),
            observables.PauliY([4]),
        ]
    )
    assert tensor.targets == (1, 3, 4)
    assert tensor.measured_qubits == (1, 3, 7, 4)
    assert (tensor.eigenvalues == pauli_eigenvalues(4)).all()
    assert not tensor.is_standard

    # Z ignored
    assert (tensor.diagonalizing_matrix == np.kron(np.kron(h_diag, x_diag), y_diag)).all()
def test_tensor_product_one_component():
    observables.TensorProduct([observables.Hadamard([2])])
#
#     http://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file is
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
# ANY KIND, either express or implied. See the License for the specific
# language governing permissions and limitations under the License.

import numpy as np
import pytest

from braket.default_simulator import gate_operations, observables
from braket.default_simulator.operation_helpers import check_unitary, pauli_eigenvalues

testdata = [
    (observables.Hadamard([13]), (13,), (13,), pauli_eigenvalues(1), True),
    (observables.PauliX([11]), (11,), (11,), pauli_eigenvalues(1), True),
    (observables.PauliY([10]), (10,), (10,), pauli_eigenvalues(1), True),
    (observables.PauliZ([9]), (), (9,), pauli_eigenvalues(1), True),
    (observables.Identity([7]), (), (7,), np.array([1, 1]), False),
    (
        observables.Hermitian(np.array([[1, 1 - 1j], [1 + 1j, -1]]), [4]),
        (4,),
        (4,),
        [-np.sqrt(3), np.sqrt(3)],
        False,
    ),
    (
        observables.Hermitian(np.array([[1, 1 - 1j], [1 + 1j, -1]])),
        None,
        None,
コード例 #6
0
    gate_operations.PSwap([0, 1], math.pi),
    gate_operations.XY([0, 1], math.pi),
    gate_operations.XX([0, 1], math.pi),
    gate_operations.YY([0, 1], math.pi),
    gate_operations.ZZ([0, 1], math.pi),
    gate_operations.CCNot([0, 1, 2]),
    gate_operations.CSwap([0, 1, 2]),
    gate_operations.Unitary([0], [[0, 1j], [1j, 0]]),
]

observable_testdata = [
    observables.Identity([0]),
    observables.PauliX([0]),
    observables.PauliY([0]),
    observables.PauliZ([0]),
    observables.Hadamard([0]),
    observables.Hermitian(np.array([[1, 1 - 1j], [1 + 1j, -1]])),
]


def test_correct_eigenvalues_paulis():
    """Test the pauli_eigenvalues function for one qubit"""
    assert np.array_equal(operation_helpers.pauli_eigenvalues(1),
                          np.diag(z_matrix))


def test_correct_eigenvalues_pauli_kronecker_products_two_qubits():
    """Test the pauli_eigenvalues function for two qubits"""
    assert np.array_equal(operation_helpers.pauli_eigenvalues(2),
                          np.diag(np.kron(z_matrix, z_matrix)))
        ],
        3,
        [0, 0, 0, 0, 0, 1, 0, 0],
        [0, 0, 0, 0, 0, 1, 0, 0],
    ),
]

apply_observables_testdata = [
    ([observables.PauliX([0])], [gate_operations.Hadamard([0])], 1),
    ([observables.PauliZ([0])], [], 1),
    ([observables.Identity([0])], [], 1),
    (
        [
            observables.PauliX([0]),
            observables.PauliZ([3]),
            observables.Hadamard([2])
        ],
        [gate_operations.Hadamard([0]),
         gate_operations.RotY([2], -np.pi / 4)],
        5,
    ),
    (
        [
            observables.TensorProduct([
                observables.PauliX([0]),
                observables.PauliZ([3]),
                observables.Hadamard([2]),
                observables.Identity([1]),
            ])
        ],
        [gate_operations.Hadamard([0]),