def recompose_so4(a: np.ndarray, b: np.ndarray) -> np.ndarray: assert a.shape == (2, 2) assert b.shape == (2, 2) assert cirq.is_special_unitary(a) assert cirq.is_special_unitary(b) magic = np.array([[1, 0, 0, 1j], [0, 1j, 1, 0], [0, 1j, -1, 0], [1, 0, 0, -1j]]) * np.sqrt(0.5) result = np.real(cirq.dot(np.conj(magic.T), cirq.kron(a, b), magic)) assert cirq.is_orthogonal(result) return result
def recompose_so4(a: np.ndarray, b: np.ndarray) -> np.ndarray: assert a.shape == (2, 2) assert b.shape == (2, 2) assert cirq.is_special_unitary(a) assert cirq.is_special_unitary(b) magic = np.array([[1, 0, 0, 1j], [0, 1j, 1, 0], [0, 1j, -1, 0], [1, 0, 0, -1j]]) * np.sqrt(0.5) result = np.real(cirq.dot(np.conj(magic.T), cirq.kron(a, b), magic)) assert cirq.is_orthogonal(result) return result
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_is_orthogonal(): assert cirq.is_orthogonal(np.empty((0, 0))) assert not cirq.is_orthogonal(np.empty((1, 0))) assert not cirq.is_orthogonal(np.empty((0, 1))) assert cirq.is_orthogonal(np.array([[1]])) assert cirq.is_orthogonal(np.array([[-1]])) assert not cirq.is_orthogonal(np.array([[1j]])) assert not cirq.is_orthogonal(np.array([[5]])) assert not cirq.is_orthogonal(np.array([[3j]])) assert not cirq.is_orthogonal(np.array([[1, 0]])) assert not cirq.is_orthogonal(np.array([[1], [0]])) assert not cirq.is_orthogonal(np.array([[1, 0], [0, -2]])) assert cirq.is_orthogonal(np.array([[1, 0], [0, -1]])) assert not cirq.is_orthogonal(np.array([[1j, 0], [0, 1]])) assert not cirq.is_orthogonal(np.array([[1, 0], [1, 1]])) assert not cirq.is_orthogonal(np.array([[1, 1], [0, 1]])) assert not cirq.is_orthogonal(np.array([[1, 1], [1, 1]])) assert not cirq.is_orthogonal(np.array([[1, -1], [1, 1]])) assert cirq.is_orthogonal(np.array([[1, -1], [1, 1]]) * np.sqrt(0.5)) assert not cirq.is_orthogonal(np.array([[1, 1j], [1j, 1]]) * np.sqrt(0.5)) assert not cirq.is_orthogonal(np.array([[1, -1j], [1j, 1]]) * np.sqrt(0.5)) assert cirq.is_orthogonal(np.array([[1, 1e-11], [0, 1 + 1e-11]]))
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)