def test_measure_density_matrix_not_square(): with pytest.raises(ValueError, match='not square'): cirq.measure_density_matrix(np.array([1, 0, 0]), [1]) with pytest.raises(ValueError, match='not square'): cirq.measure_density_matrix(np.array([1, 0, 0, 0]).reshape((2, 1, 2)), [1], qid_shape=(2, 1))
def test_measure_density_matrix_seed(): n = 5 matrix = np.eye(2**n) / 2**n bits, out_matrix1 = cirq.measure_density_matrix(matrix, range(n), seed=1234) assert bits == [False, False, True, True, False] bits, out_matrix2 = cirq.measure_density_matrix( matrix, range(n), seed=np.random.RandomState(1234)) assert bits == [False, False, True, True, False] np.testing.assert_allclose(out_matrix1, out_matrix2)
def test_measure_density_matrix_partial_indices_all_orders(): for perm in itertools.permutations([0, 1, 2]): for x in range(8): matrix = cirq.to_valid_density_matrix(x, 3) bits, out_matrix = cirq.measure_density_matrix(matrix, perm) np.testing.assert_almost_equal(matrix, out_matrix) assert bits == [bool(1 & (x >> (2 - p))) for p in perm]
def test_measure_density_matrix_partial_indices(): for index in range(3): for x in range(8): matrix = cirq.to_valid_density_matrix(x, 3) bits, out_matrix = cirq.measure_density_matrix(matrix, [index]) np.testing.assert_almost_equal(out_matrix, matrix) assert bits == [bool(1 & (x >> (2 - index)))]
def test_measure_state_no_indices_out_is_not_matrix(): matrix = cirq.to_valid_density_matrix(0, 3) out = np.zeros_like(matrix) bits, out_matrix = cirq.measure_density_matrix(matrix, [], out=out) assert [] == bits np.testing.assert_almost_equal(out_matrix, matrix) assert out is out_matrix assert out is not matrix
def test_measure_density_matrix_out_is_matrix(): matrix = matrix_000_plus_010() bits, out_matrix = cirq.measure_density_matrix(matrix, [2, 1, 0], out=matrix) expected_state = np.zeros(8, dtype=np.complex64) expected_state[2 if bits[1] else 0] = 1.0 expected_matrix = np.outer(np.conj(expected_state), expected_state) np.testing.assert_array_almost_equal(out_matrix, expected_matrix) assert out_matrix is matrix
def test_measure_density_matrix_computational_basis_reshaped(): results = [] for x in range(8): matrix = np.reshape(cirq.to_valid_density_matrix(x, 3), (2,) * 6) bits, out_matrix = cirq.measure_density_matrix(matrix, [2, 1, 0]) results.append(bits) np.testing.assert_almost_equal(out_matrix, matrix) expected = [list(reversed(x)) for x in list(itertools.product([False, True], repeat=3))] assert results == expected
def test_measure_density_matrix_collapse(): matrix = matrix_000_plus_010() for _ in range(10): bits, out_matrix = cirq.measure_density_matrix(matrix, [2, 1, 0]) assert bits in [[False, False, False], [False, True, False]] expected = np.zeros(8, dtype=np.complex64) if bits[1]: expected[2] = 1j else: expected[0] = 1 expected_matrix = np.outer(np.conj(expected), expected) np.testing.assert_almost_equal(out_matrix, expected_matrix) assert out_matrix is not matrix # Partial sample is correct. for _ in range(10): bits, out_matrix = cirq.measure_density_matrix(matrix, [2]) np.testing.assert_almost_equal(out_matrix, matrix) assert bits == [False] bits, out_matrix = cirq.measure_density_matrix(matrix, [0]) np.testing.assert_almost_equal(out_matrix, matrix) assert bits == [False]
def test_measure_state_empty_density_matrix(): matrix = np.zeros(shape=()) bits, out_matrix = cirq.measure_density_matrix(matrix, []) assert [] == bits np.testing.assert_almost_equal(matrix, out_matrix)
def test_measure_state_no_indices_out_is_matrix(): matrix = cirq.to_valid_density_matrix(0, 3) bits, out_matrix = cirq.measure_density_matrix(matrix, [], out=matrix) assert [] == bits np.testing.assert_almost_equal(out_matrix, matrix) assert out_matrix is matrix
def test_measure_density_matrix_out_of_range(): matrix = cirq.to_valid_density_matrix(0, 3) with pytest.raises(IndexError, match='-2'): cirq.measure_density_matrix(matrix, [-2]) with pytest.raises(IndexError, match='3'): cirq.measure_density_matrix(matrix, [3])
def test_measure_density_matrix_tensor_different_left_right_shape(): with pytest.raises(ValueError, match='not equal'): cirq.measure_density_matrix(np.array([1, 0, 0, 0]).reshape( (2, 2, 1, 1)), [1], qid_shape=(2, 1))
def test_measure_density_matrix_higher_powers_of_two(): with pytest.raises(ValueError, match='powers of two'): cirq.measure_density_matrix(np.ones((2, 4, 2, 4)) / 8, [1])
def test_measure_density_matrix_not_power_of_two(): with pytest.raises(ValueError, match='power of two'): cirq.measure_density_matrix(np.ones((3, 3)) / 3, [1]) with pytest.raises(ValueError, match='power of two'): cirq.measure_density_matrix(np.ones((2, 3, 2, 3)) / 6, [1])
def test_measure_state_out_is_not_matrix(): matrix = matrix_000_plus_010() out = np.zeros_like(matrix) _, out_matrix = cirq.measure_density_matrix(matrix, [2, 1, 0], out=out) assert out is not matrix assert out is out_matrix
def test_measure_density_matrix_not_square(): with pytest.raises(ValueError, match='not square'): cirq.measure_density_matrix(np.array([1, 0, 0]), [1])