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)
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)
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
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
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]]))
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)
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)