def test_compute_samples_displays(dtype): a, b, c = cirq.LineQubit.range(3) circuit = cirq.Circuit( cirq.X(a), cirq.H(b), cirq.X(c), cirq.H(c), cirq.approx_pauli_string_expectation(cirq.PauliString({c: cirq.X}), num_samples=10, key='approx_x3'), cirq.approx_pauli_string_expectation(cirq.PauliString({ a: cirq.Z, b: cirq.X }), num_samples=10, key='approx_z1x2'), cirq.approx_pauli_string_expectation(cirq.PauliString({ a: cirq.Z, c: cirq.X }), num_samples=10, key='approx_z1x3'), ) simulator = cirq.Simulator(dtype=dtype) result = simulator.compute_samples_displays(circuit) np.testing.assert_allclose(result.display_values['approx_x3'], -1, atol=1e-7) np.testing.assert_allclose(result.display_values['approx_z1x2'], -1, atol=1e-7) np.testing.assert_allclose(result.display_values['approx_z1x3'], 1, atol=1e-7)
def test_approx_pauli_string_expectation_helper(): qubits = cirq.LineQubit.range(9) qubit_pauli_map = {q: cirq.Pauli.by_index(q.x) for q in qubits} pauli_string = cirq.PauliString(qubit_pauli_map, -1) assert (cirq.approx_pauli_string_expectation( pauli_string, num_samples=5, key='a') == cirq.approx_pauli_string_expectation(pauli_string, num_samples=5, key='a'))
def test_with_qubits(): old_qubits = cirq.LineQubit.range(9) new_qubits = cirq.LineQubit.range(9, 18) qubit_pauli_map = {q: cirq.Pauli.by_index(q.x) for q in old_qubits} pauli_string = cirq.PauliString(qubit_pauli_map, -1) assert (cirq.approx_pauli_string_expectation( pauli_string, num_samples=1).with_qubits( *new_qubits) == cirq.approx_pauli_string_expectation( pauli_string.with_qubits(*new_qubits), num_samples=1))
def hhl_circuit(A, C, t, register_size, *input_prep_gates): """ Constructs the HHL circuit. A is the input Hermitian matrix. C and t are tunable parameters for the algorithm. register_size is the size of the eigenvalue register. input_prep_gates is a list of gates to be applied to |0> to generate the desired input state |b>. """ ancilla = cirq.GridQubit(0, 0) # to store eigenvalues of the matrix register = [cirq.GridQubit(i + 1, 0) for i in range(register_size)] # to store input and output vectors memory = cirq.GridQubit(register_size + 1, 0) c = cirq.Circuit() hs = HamiltonianSimulation(A, t) pe = PhaseEstimation(register_size + 1, hs) c.append([gate(memory) for gate in input_prep_gates]) c.append([ pe(*(register + [memory])), EigenRotation(register_size + 1, C, t)(*(register + [ancilla])), pe(*(register + [memory]))**-1, cirq.measure(ancilla) ]) # Pauli observable display c.append([ cirq.approx_pauli_string_expectation(cirq.PauliString( {ancilla: cirq.Z}), num_samples=5000, key='a'), cirq.approx_pauli_string_expectation(cirq.PauliString({memory: cirq.X}), num_samples=5000, key='x'), cirq.approx_pauli_string_expectation(cirq.PauliString({memory: cirq.Y}), num_samples=5000, key='y'), cirq.approx_pauli_string_expectation(cirq.PauliString({memory: cirq.Z}), num_samples=5000, key='z'), ]) return c
def test_approx_pauli_string_expectation_value_with_coef( measurements, value, coefficient): display = cirq.approx_pauli_string_expectation(cirq.PauliString( {}, coefficient=coefficient), num_samples=1) assert display.value_derived_from_samples( measurements) == value * coefficient
def test_properties(): qubits = cirq.LineQubit.range(9) qubit_pauli_map = {q: cirq.Pauli.by_index(q.x) for q in qubits} pauli_string = cirq.PauliString(qubit_pauli_map, -1) approx_pauli_string_expectation = cirq.approx_pauli_string_expectation( pauli_string, num_samples=5, key='a') assert approx_pauli_string_expectation.qubits == tuple(qubits) assert approx_pauli_string_expectation.num_samples == 5 assert approx_pauli_string_expectation.key == 'a'
def test_approx_pauli_string_expectation_measurement_basis_change(paulis): qubits = cirq.LineQubit.range(2) qubit_map = {qubits[0]: paulis[0], qubits[1]: paulis[1]} display = cirq.approx_pauli_string_expectation(cirq.PauliString(qubit_map), num_samples=1) matrix = np.kron(cirq.unitary(paulis[0]), cirq.unitary(paulis[1])) circuit = cirq.Circuit.from_ops(display.measurement_basis_change()) unitary = circuit.unitary(qubit_order=qubits) ZZ = np.diag([1, -1, -1, 1]) np.testing.assert_allclose( np.dot(unitary, np.dot(matrix, unitary.T.conj())), ZZ)
def test_approx_pauli_string_expectation_value(measurements, value): display = cirq.approx_pauli_string_expectation(cirq.PauliString({}), num_samples=1) assert display.value_derived_from_samples(measurements) == value