Exemplo n.º 1
0
async def estimate_characteristic_function(circuit: cirq.Circuit,
                                           pauli_string: cirq.PauliString,
                                           qubits: List[cirq.Qid],
                                           sampler: cirq.Sampler,
                                           samples_per_term: int):
    """
    Estimates the characteristic function using a (noisy) circuit simulator by
    sampling the results.

    Args:
        circuit: The circuit to run the simulation on.
        pauli_string: The Pauli string.
        qubits: The list of qubits.
        sampler: Either a noisy simulator or an engine.
        samples_per_term: An integer greater than 0, the number of samples.

    Returns:
        The estimated characteristic function.
    """
    p = cirq.PauliSumCollector(circuit=circuit,
                               observable=pauli_string,
                               samples_per_term=samples_per_term)

    await p.collect_async(sampler=sampler)

    sigma_i = p.estimated_energy()
    assert np.isclose(sigma_i.imag, 0.0, atol=1e-6)
    sigma_i = sigma_i.real

    return sigma_i
Exemplo n.º 2
0
async def estimate_characteristic_function(
        circuit: cirq.Circuit, P_i: Tuple[cirq.Gate, ...],
        qubits: List[cirq.Qid], simulator: cirq.DensityMatrixSimulator,
        samples_per_term: int):
    """
    Estimates the characteristic function using a (noisy) circuit simulator by
    sampling the results.

    Args:
        circuit: The circuit to run the simulation on.
        P_i: The Pauli matrix.
        qubits: The list of qubits.
        simulator: The (noisy) simulator.
        samples_per_term: An integer greater than 0, the number of samples.

    Returns:
        The estimated characteristic function.
    """
    pauli_string = cirq.PauliString(dict(zip(qubits, P_i)))

    p = cirq.PauliSumCollector(circuit=circuit,
                               observable=pauli_string,
                               samples_per_term=samples_per_term)

    await p.collect_async(sampler=simulator)

    sigma_i = p.estimated_energy()
    assert np.isclose(sigma_i.imag, 0.0, atol=1e-6)
    sigma_i = sigma_i.real

    return sigma_i
Exemplo n.º 3
0
def test_pauli_string_sample_collector_extra_qubit_x():
    a, b = cirq.LineQubit.range(2)
    p = cirq.PauliSumCollector(circuit=cirq.Circuit(cirq.H(a)),
                               observable=3 * cirq.X(b),
                               samples_per_term=10000)
    p.collect(sampler=cirq.Simulator())
    assert abs(p.estimated_energy()) < 0.5
Exemplo n.º 4
0
def test_pauli_string_sample_single():
    a, b = cirq.LineQubit.range(2)
    p = cirq.PauliSumCollector(circuit=cirq.Circuit(cirq.H(a), cirq.CNOT(a, b),
                                                    cirq.X(a), cirq.Z(b)),
                               observable=cirq.X(a) * cirq.X(b),
                               samples_per_term=100)
    completion = p.collect_async(sampler=cirq.Simulator())
    cirq.testing.assert_asyncio_will_have_result(completion, None)
    assert p.estimated_energy() == -1
Exemplo n.º 5
0
async def test_pauli_string_sample_single():
    a, b = cirq.LineQubit.range(2)
    p = cirq.PauliSumCollector(
        circuit=cirq.Circuit(cirq.H(a), cirq.CNOT(a, b), cirq.X(a), cirq.Z(b)),
        observable=cirq.X(a) * cirq.X(b),
        samples_per_term=100,
    )
    result = await p.collect_async(sampler=cirq.Simulator())
    assert result is None
    assert p.estimated_energy() == -1
Exemplo n.º 6
0
async def test_pauli_string_sample_collector():
    a, b = cirq.LineQubit.range(2)
    p = cirq.PauliSumCollector(circuit=cirq.Circuit(cirq.H(a), cirq.CNOT(a, b),
                                                    cirq.X(a), cirq.Z(b)),
                               observable=cirq.X(a) * cirq.X(b) -
                               16 * cirq.Y(a) * cirq.Y(b) +
                               4 * cirq.Z(a) * cirq.Z(b),
                               samples_per_term=100)
    completion = p.collect_async(sampler=cirq.Simulator())
    assert await completion is None
    assert p.estimated_energy() == 11
Exemplo n.º 7
0
async def test_pauli_string_sample_collector():
    a, b = cirq.LineQubit.range(2)
    p = cirq.PauliSumCollector(
        circuit=cirq.Circuit(cirq.H(a), cirq.CNOT(a, b), cirq.X(a), cirq.Z(b)),
        observable=(1 + 0j) * cirq.X(a) * cirq.X(b) -
        16 * cirq.Y(a) * cirq.Y(b) + 4 * cirq.Z(a) * cirq.Z(b) + (1 - 0j),
        samples_per_term=100,
    )
    result = await p.collect_async(sampler=cirq.Simulator())
    assert result is None
    energy = p.estimated_energy()
    assert isinstance(energy, float) and energy == 12
Exemplo n.º 8
0
def execute_with_shots(circ: cirq.Circuit, obs: cirq.PauliString,
                       shots: int) -> float:
    """Simulates noiseless wavefunction evolution and returns the
        expectation value of a PauliString observable.

        Args:
            circ: The input Cirq circuit.
            obs: The observable to measure as a cirq.PauliString.
            shots: The number of measurements.

        Returns:
            The expectation value of obs as a float.
        """

    # Do the sampling
    psum = cirq.PauliSumCollector(circ, obs, samples_per_term=shots)
    psum.collect(sampler=cirq.Simulator())

    # Return the expectation value
    return psum.estimated_energy()
Exemplo n.º 9
0
def execute_with_shots_and_depolarizing_noise(
        circuit: cirq.Circuit, obs: PauliSumLike, noise: float,
        shots: int) -> Union[float, complex]:
    """Simulates a circuit with depolarizing noise at level noise.

    Args:
        circuit: The input Cirq circuit.
        obs: The observable to measure as a NumPy array.
        noise: The depolarizing noise strength as a float (0.001 is 0.1%)
        shots: The number of measurements.

    Returns:
        The expectation value of obs as a float.
    """
    # Add noise
    noisy = circuit.with_noise(cirq.depolarize(p=noise))  # type: ignore

    # Do the sampling
    psum = cirq.PauliSumCollector(noisy, obs, samples_per_term=shots)
    psum.collect(sampler=cirq.DensityMatrixSimulator())

    # Return the expectation value
    return psum.estimated_energy()
Exemplo n.º 10
0
def test_pauli_string_sample_collector_identity():
    p = cirq.PauliSumCollector(circuit=cirq.Circuit(),
                               observable=cirq.PauliSum() + 2j,
                               samples_per_term=100)
    p.collect(sampler=cirq.Simulator())
    assert p.estimated_energy() == 2j