def test_axis_angle(): assert cirq.approx_eq( cirq.axis_angle(cirq.unitary(cirq.ry(1e-10))), cirq.AxisAngleDecomposition(angle=0, axis=(1, 0, 0), global_phase=1), atol=1e-8, ) assert cirq.approx_eq( cirq.axis_angle(cirq.unitary(cirq.rx(np.pi))), cirq.AxisAngleDecomposition(angle=np.pi, axis=(1, 0, 0), global_phase=1), atol=1e-8, ) assert cirq.approx_eq( cirq.axis_angle(cirq.unitary(cirq.X)), cirq.AxisAngleDecomposition(angle=np.pi, axis=(1, 0, 0), global_phase=1j), atol=1e-8, ) assert cirq.approx_eq( cirq.axis_angle(cirq.unitary(cirq.X ** 0.5)), cirq.AxisAngleDecomposition( angle=np.pi / 2, axis=(1, 0, 0), global_phase=np.exp(1j * np.pi / 4) ), atol=1e-8, ) assert cirq.approx_eq( cirq.axis_angle(cirq.unitary(cirq.X ** -0.5)), cirq.AxisAngleDecomposition( angle=-np.pi / 2, axis=(1, 0, 0), global_phase=np.exp(-1j * np.pi / 4) ), ) assert cirq.approx_eq( cirq.axis_angle(cirq.unitary(cirq.Y)), cirq.AxisAngleDecomposition(angle=np.pi, axis=(0, 1, 0), global_phase=1j), atol=1e-8, ) assert cirq.approx_eq( cirq.axis_angle(cirq.unitary(cirq.Z)), cirq.AxisAngleDecomposition(angle=np.pi, axis=(0, 0, 1), global_phase=1j), atol=1e-8, ) assert cirq.approx_eq( cirq.axis_angle(cirq.unitary(cirq.H)), cirq.AxisAngleDecomposition( angle=np.pi, axis=(np.sqrt(0.5), 0, np.sqrt(0.5)), global_phase=1j ), atol=1e-8, ) assert cirq.approx_eq( cirq.axis_angle(cirq.unitary(cirq.H ** 0.5)), cirq.AxisAngleDecomposition( angle=np.pi / 2, axis=(np.sqrt(0.5), 0, np.sqrt(0.5)), global_phase=np.exp(1j * np.pi / 4), ), atol=1e-8, )
def test_axis_angle_decomposition_str(): assert str(cirq.axis_angle(cirq.unitary(cirq.X))) == '1*π around X' assert str(cirq.axis_angle(cirq.unitary(cirq.Y))) == '1*π around Y' assert str(cirq.axis_angle(cirq.unitary(cirq.Z))) == '1*π around Z' assert str(cirq.axis_angle(cirq.unitary( cirq.H))) == '1*π around 0.707*X+0.707*Z' assert str(cirq.axis_angle(cirq.unitary( cirq.H**0.5))) == '0.5*π around 0.707*X+0.707*Z' assert str( cirq.axis_angle( cirq.unitary(cirq.X**0.25) @ cirq.unitary(cirq.Y**0.25) @ cirq.unitary(cirq.Z** 0.25))) == '0.477*π around 0.679*X+0.281*Y+0.679*Z'
def test_axis_angle_decomposition_unitary(): u = cirq.testing.random_unitary(2) u = cirq.unitary(cirq.T) a = cirq.axis_angle(u) np.testing.assert_allclose(u, cirq.unitary(a), atol=1e-8)