def test_matrix_from_basis_coefficients(expansion): m = cirq.matrix_from_basis_coefficients(expansion, PAULI_BASIS) for name, coefficient in expansion.items(): element = PAULI_BASIS[name] expected_coefficient = cirq.hilbert_schmidt_inner_product( m, element) / cirq.hilbert_schmidt_inner_product(element, element) assert np.isclose(coefficient, expected_coefficient)
def test_hilbert_schmidt_inner_product_is_conjugate_symmetric(m1, m2, expect_real): v1 = cirq.hilbert_schmidt_inner_product(m1, m2) v2 = cirq.hilbert_schmidt_inner_product(m2, m1) assert v1 == v2.conjugate() assert np.isreal(v1) == expect_real if not expect_real: assert v1 != v2
def test_kron_bases_repeat_sanity_checks(basis, repeat): product_basis = cirq.kron_bases(basis, repeat=repeat) assert len(product_basis) == 4**repeat for name1, matrix1 in product_basis.items(): for name2, matrix2 in product_basis.items(): p = cirq.hilbert_schmidt_inner_product(matrix1, matrix2) if name1 != name2: assert p == 0 else: assert abs(p) >= 1
def test_hilbert_schmidt_inner_product_values(m1, m2, expected_value): v = cirq.hilbert_schmidt_inner_product(m1, m2) assert np.isclose(v, expected_value)
def test_hilbert_schmidt_inner_product_is_positive_definite(m): v = cirq.hilbert_schmidt_inner_product(m, m) assert np.isreal(v) assert v.real > 0
def test_hilbert_schmidt_inner_product_is_linear(a, m1, b, m2): v1 = cirq.hilbert_schmidt_inner_product(H, (a * m1 + b * m2)) v2 = (a * cirq.hilbert_schmidt_inner_product(H, m1) + b * cirq.hilbert_schmidt_inner_product(H, m2)) assert v1 == v2
def test_hilbert_schmidt_inner_product_is_positive_definite(m): v = cirq.hilbert_schmidt_inner_product(m, m) # Cannot check using np.is_real due to bug in aarch64. # See https://github.com/quantumlib/Cirq/issues/4379 assert np.isclose(np.imag(v), 1e-16) assert v.real > 0