예제 #1
0
def test_is_diagonal_tolerance():
    atol = 0.5

    # Pays attention to specified tolerance.
    assert cirq.is_diagonal(np.array([[1, 0], [-0.5, 1]]), atol=atol)
    assert not cirq.is_diagonal(np.array([[1, 0], [-0.6, 1]]), atol=atol)

    # Error isn't accumulated across entries.
    assert cirq.is_diagonal(np.array([[1, 0.5], [-0.5, 1]]), atol=atol)
    assert not cirq.is_diagonal(np.array([[1, 0.5], [-0.6, 1]]), atol=atol)
예제 #2
0
def test_decompose_to_diagonal_and_circuit(v):
    b, c = cirq.LineQubit.range(2)
    diagonal, ops = two_qubit_matrix_to_diagonal_and_cz_operations(b, c, v)
    assert cirq.is_diagonal(diagonal)
    combined_circuit = cirq.Circuit(cirq.MatrixGate(diagonal)(b, c), ops)
    circuit_unitary = combined_circuit.unitary(qubits_that_should_be_present=[b, c])
    cirq.testing.assert_allclose_up_to_global_phase(circuit_unitary, v, atol=1e-14)
예제 #3
0
def assert_diagonalized_by(m, p, atol: float = 1e-8):
    d = p.T.dot(m).dot(p)

    try:
        assert cirq.is_orthogonal(p)
        assert cirq.is_diagonal(d, atol=atol)
    except AssertionError:
        # coverage: ignore

        print("m.round(3)")
        print(np.round(m, 3))

        print("p.round(3)")
        print(np.round(p, 3))

        print("np.log10(np.abs(p.T @ m @ p)).round(2)")
        print(np.log10(np.abs(d)).round(2))

        raise
예제 #4
0
def test_extract_right_diag(U):
    assert cirq.num_cnots_required(U) == 3
    diag = cirq.linalg.extract_right_diag(U)
    assert cirq.is_diagonal(diag)
    assert cirq.num_cnots_required(U @ diag) == 2
예제 #5
0
def test_is_diagonal():
    assert cirq.is_diagonal(np.empty((0, 0)))
    assert cirq.is_diagonal(np.empty((1, 0)))
    assert cirq.is_diagonal(np.empty((0, 1)))

    assert cirq.is_diagonal(np.array([[1]]))
    assert cirq.is_diagonal(np.array([[-1]]))
    assert cirq.is_diagonal(np.array([[5]]))
    assert cirq.is_diagonal(np.array([[3j]]))

    assert cirq.is_diagonal(np.array([[1, 0]]))
    assert cirq.is_diagonal(np.array([[1], [0]]))
    assert not cirq.is_diagonal(np.array([[1, 1]]))
    assert not cirq.is_diagonal(np.array([[1], [1]]))

    assert cirq.is_diagonal(np.array([[5j, 0], [0, 2]]))
    assert cirq.is_diagonal(np.array([[1, 0], [0, 1]]))
    assert not cirq.is_diagonal(np.array([[1, 0], [1, 1]]))
    assert not cirq.is_diagonal(np.array([[1, 1], [0, 1]]))
    assert not cirq.is_diagonal(np.array([[1, 1], [1, 1]]))
    assert not cirq.is_diagonal(np.array([[1, 0.1], [0.1, 1]]))

    assert cirq.is_diagonal(np.array([[1, 1e-11], [1e-10, 1]]))
예제 #6
0
def assert_bidiagonalized_by(m, p, q, rtol: float = 1e-5, atol: float = 1e-8):
    d = p.dot(m).dot(q)

    assert (cirq.is_orthogonal(p) and cirq.is_orthogonal(q)
            and cirq.is_diagonal(
                d, atol=atol)), _get_assert_bidiagonalized_by_str(m, p, q, d)
예제 #7
0
def assert_diagonalized_by(m, p, atol: float = 1e-8):
    d = p.T.dot(m).dot(p)

    assert cirq.is_orthogonal(p) and cirq.is_diagonal(
        d, atol=atol), _get_assert_diagonalized_by_str(m, p, d)