示例#1
0
def test_with_observable_batched_factory(executor):
    observable = Observable(PauliString(spec="Z"))
    circuit = cirq.Circuit(cirq.H.on(cirq.LineQubit(0))) * 20

    noisy_value = observable.expectation(circuit, sample_bitstrings)
    zne_value = execute_with_zne(
        circuit,
        executor=functools.partial(executor, noise_model=cirq.depolarize),
        observable=observable,
        factory=PolyFactory(scale_factors=[1, 3, 5], order=2),
    )
    true_value = observable.expectation(
        circuit, functools.partial(compute_density_matrix, noise_level=(0, )))

    assert abs(zne_value - true_value) <= abs(noisy_value - true_value)
示例#2
0
def test_with_observable_adaptive_factory(executor):
    observable = Observable(PauliString(spec="Z"))
    circuit = cirq.Circuit(cirq.H.on(cirq.LineQubit(0))) * 20

    noisy_value = observable.expectation(circuit, sample_bitstrings)
    zne_value = execute_with_zne(
        circuit,
        executor=functools.partial(executor, noise_model=cirq.amplitude_damp),
        observable=observable,
        factory=AdaExpFactory(steps=4, asymptote=0.5),
    )
    true_value = observable.expectation(
        circuit, functools.partial(compute_density_matrix, noise_level=(0, )))

    assert abs(zne_value - true_value) <= abs(noisy_value - true_value)
示例#3
0
def test_with_observable_two_qubits(executor):
    observable = Observable(PauliString(spec="XX", coeff=-1.21),
                            PauliString(spec="ZZ", coeff=0.7))
    circuit = cirq.Circuit(cirq.H.on(cirq.LineQubit(0)),
                           cirq.CNOT.on(*cirq.LineQubit.range(2)))
    circuit += [circuit, cirq.inverse(circuit)] * 20

    noisy_value = observable.expectation(circuit, sample_bitstrings)
    zne_value = execute_with_zne(
        circuit,
        executor=functools.partial(executor, noise_model=cirq.depolarize),
        observable=observable,
        factory=PolyFactory(scale_factors=[1, 3, 5], order=2),
    )
    true_value = observable.expectation(
        circuit, functools.partial(compute_density_matrix, noise_level=(0, )))

    assert abs(zne_value - true_value) <= 3 * abs(noisy_value - true_value)
示例#4
0
def test_executor_evaluate_density_matrix(execute):
    obs = Observable(PauliString("Z"))

    q = cirq.LineQubit(0)
    circuits = [cirq.Circuit(cirq.I.on(q)), cirq.Circuit(cirq.X.on(q))]

    executor = Executor(execute)

    results = executor.evaluate(circuits, obs)
    assert np.allclose(results, [1, -1])

    if execute is executor_density_matrix:
        assert executor.calls_to_executor == 2
    else:
        assert executor.calls_to_executor == 1

    assert executor.executed_circuits == circuits
    assert np.allclose(executor.quantum_results[0],
                       executor_density_matrix(circuits[0]))
    assert np.allclose(executor.quantum_results[1],
                       executor_density_matrix(circuits[1]))
    assert len(executor.quantum_results) == len(circuits)
示例#5
0
def test_executor_evaluate_measurements(execute):
    obs = Observable(PauliString("Z"))

    q = cirq.LineQubit(0)
    circuits = [cirq.Circuit(cirq.I.on(q)), cirq.Circuit(cirq.X.on(q))]

    executor = Executor(execute)

    results = executor.evaluate(circuits, obs)
    assert np.allclose(results, [1, -1])

    if execute is executor_measurements:
        assert executor.calls_to_executor == 2
    else:
        assert executor.calls_to_executor == 1

    assert executor.executed_circuits[0] == circuits[0] + cirq.measure(q)
    assert executor.executed_circuits[1] == circuits[1] + cirq.measure(q)
    assert executor.quantum_results[0] == executor_measurements(
        circuits[0] + cirq.measure(q))
    assert executor.quantum_results[1] == executor_measurements(
        circuits[1] + cirq.measure(q))
    assert len(executor.quantum_results) == len(circuits)