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)
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)
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)
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)
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)