def test_is_special_orthogonal_tolerance(): tol = Tolerance(atol=0.5) # Pays attention to specified tolerance. assert cirq.is_special_orthogonal(np.array([[1, 0], [-0.5, 1]]), tol) assert not cirq.is_special_orthogonal(np.array([[1, 0], [-0.6, 1]]), tol) # Error isn't accumulated across entries, except for determinant factors. assert cirq.is_special_orthogonal( np.array([[1.2, 0, 0], [0, 1.2, 0], [0, 0, 1 / 1.2]]), tol) assert not cirq.is_special_orthogonal( np.array([[1.2, 0, 0], [0, 1.2, 0], [0, 0, 1.2]]), tol) assert not cirq.is_special_orthogonal( np.array([[1.2, 0, 0], [0, 1.3, 0], [0, 0, 1 / 1.2]]), tol)
def test_is_special_orthogonal(): assert cirq.is_special_orthogonal(np.empty((0, 0))) assert not cirq.is_special_orthogonal(np.empty((1, 0))) assert not cirq.is_special_orthogonal(np.empty((0, 1))) assert cirq.is_special_orthogonal(np.array([[1]])) assert not cirq.is_special_orthogonal(np.array([[-1]])) assert not cirq.is_special_orthogonal(np.array([[1j]])) assert not cirq.is_special_orthogonal(np.array([[5]])) assert not cirq.is_special_orthogonal(np.array([[3j]])) assert not cirq.is_special_orthogonal(np.array([[1, 0]])) assert not cirq.is_special_orthogonal(np.array([[1], [0]])) assert not cirq.is_special_orthogonal(np.array([[1, 0], [0, -2]])) assert not cirq.is_special_orthogonal(np.array([[1, 0], [0, -1]])) assert cirq.is_special_orthogonal(np.array([[-1, 0], [0, -1]])) assert not cirq.is_special_orthogonal(np.array([[1j, 0], [0, 1]])) assert not cirq.is_special_orthogonal(np.array([[1, 0], [1, 1]])) assert not cirq.is_special_orthogonal(np.array([[1, 1], [0, 1]])) assert not cirq.is_special_orthogonal(np.array([[1, 1], [1, 1]])) assert not cirq.is_special_orthogonal(np.array([[1, -1], [1, 1]])) assert cirq.is_special_orthogonal( np.array([[1, -1], [1, 1]]) * np.sqrt(0.5)) assert not cirq.is_special_orthogonal( np.array([[1, 1], [1, -1]]) * np.sqrt(0.5)) assert not cirq.is_special_orthogonal( np.array([[1, 1j], [1j, 1]]) * np.sqrt(0.5)) assert not cirq.is_special_orthogonal( np.array([[1, -1j], [1j, 1]]) * np.sqrt(0.5)) assert cirq.is_special_orthogonal(np.array([[1, 1e-11], [0, 1 + 1e-11]]))
def test_bidiagonalize_unitary_with_special_orthogonals(mat): p, d, q = cirq.bidiagonalize_unitary_with_special_orthogonals(mat) assert cirq.is_special_orthogonal(p) assert cirq.is_special_orthogonal(q) assert np.allclose(p.dot(mat).dot(q), np.diag(d)) assert_bidiagonalized_by(mat, p, q)