Esempio n. 1
0
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)
Esempio n. 2
0
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'))
Esempio n. 3
0
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))
Esempio n. 4
0
File: hhl.py Progetto: jshede/Cirq
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
Esempio n. 5
0
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
Esempio n. 6
0
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'
Esempio n. 7
0
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)
Esempio n. 8
0
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