示例#1
0
def test_qiskit_mitigate_executor_with_shot_list():
    true_zne_value = 1.0

    scale_factors = [1.0, 3.0]
    shot_list = [10_000, 30_000]

    fac = inference.ExpFactory(
        scale_factors=scale_factors, shot_list=shot_list, asymptote=0.5,
    )
    mitigated_executor = mitigate_executor(qiskit_executor, factory=fac)

    circuit = qiskit_measure(
        *generate_rb_circuits(
            n_qubits=1,
            num_cliffords=TEST_DEPTH,
            trials=1,
            return_type="qiskit",
        ),
        0,
    )
    base = qiskit_executor(circuit)
    zne_value = mitigated_executor(circuit)

    assert abs(true_zne_value - zne_value) < abs(true_zne_value - base)

    for i in range(len(fac._instack)):
        assert fac._instack[i] == {
            "scale_factor": scale_factors[i],
            "shots": shot_list[i],
        }
def test_mitigate_executor():
    qp = generate_rb_circuits(
        n_qubits=1, num_cliffords=TEST_DEPTH, trials=1, return_type="pyquil",
    )

    new_executor = mitigate_executor(noiseless_executor)
    result = new_executor(*qp)
    assert np.isclose(result, 1.0, atol=1e-5)
示例#3
0
def test_mitigate_executor():
    rand_circ = random_identity_circuit(depth=TEST_DEPTH)
    qp = measure(rand_circ, qid=0)
    new_executor = mitigate_executor(basic_executor, None, scale_noise)
    # bad_result is computed with native noise (scale = 1)
    bad_result = basic_executor(scale_noise(qp, 1))
    good_result = new_executor(qp)
    assert not np.isclose(bad_result, 1.0, atol=1.0e-1)
    assert np.isclose(good_result, 1.0, atol=1.0e-1)
示例#4
0
def test_mitigate_executor():
    true_zne_value = 1.0

    circuit = measure(
        random_one_qubit_identity_circuit(num_cliffords=TEST_DEPTH), 0)
    base = qiskit_executor(circuit)

    mitigated_executor = zne.mitigate_executor(qiskit_executor)
    zne_value = mitigated_executor(circuit)
    assert abs(true_zne_value - zne_value) < abs(true_zne_value - base)
示例#5
0
def test_mitigate_executor():
    """Tests a random identity circuit executor."""
    rand_circ = random_one_qubit_identity_circuit(num_cliffords=TEST_DEPTH)
    qp = measure(rand_circ, qid=0)
    new_executor = mitigate_executor(basic_executor, scale_noise=scale_noise)
    # bad_result is computed with native noise (scale = 1)
    bad_result = basic_executor(scale_noise(qp, 1))
    good_result = new_executor(qp)
    assert not np.isclose(bad_result, 1.0, atol=1.0e-1)
    assert np.isclose(good_result, 1.0, atol=1.0e-1)
示例#6
0
def test_doc_is_preserved():
    """Tests that the doc of the original executor is preserved."""
    def first_executor(circuit):
        """Doc of the original executor."""
        return 0

    mit_executor = mitigate_executor(first_executor)
    assert mit_executor.__doc__ == first_executor.__doc__

    @zne_decorator()
    def second_executor(circuit):
        """Doc of the original executor."""
        return 0

    assert second_executor.__doc__ == first_executor.__doc__
示例#7
0
def test_qiskit_mitigate_executor():
    true_zne_value = 1.0

    circuit = qiskit_measure(
        *generate_rb_circuits(
            n_qubits=1,
            num_cliffords=TEST_DEPTH,
            trials=1,
            return_type="qiskit",
        ),
        0,
    )
    base = qiskit_executor(circuit)

    mitigated_executor = mitigate_executor(qiskit_executor)
    zne_value = mitigated_executor(circuit)
    assert abs(true_zne_value - zne_value) < abs(true_zne_value - base)
示例#8
0
def test_mitigate_executor_with_shot_list():
    """Tests the mitigation of an executor using different shots
    for each noise scale factor.
    """
    rand_circ = random_one_qubit_identity_circuit(num_cliffords=TEST_DEPTH)
    qp = measure(rand_circ, qid=0)

    fac = RichardsonFactory(
        [1.0, 2.0, 3.0], shot_list=[10 ** 4, 10 ** 5, 10 ** 6]
    )
    new_executor = mitigate_executor(
        basic_executor, scale_noise=scale_noise, factory=fac
    )
    # bad_result is computed with native noise (scale = 1)
    bad_result = basic_executor(scale_noise(qp, 1))
    good_result = new_executor(qp)
    assert not np.isclose(bad_result, 1.0, atol=1.0e-1)
    assert np.isclose(good_result, 1.0, atol=1.0e-1)
    assert fac._instack[0] == {"scale_factor": 1.0, "shots": 10 ** 4}
    assert fac._instack[1] == {"scale_factor": 2.0, "shots": 10 ** 5}
    assert fac._instack[2] == {"scale_factor": 3.0, "shots": 10 ** 6}
示例#9
0
def test_random_benchmarks(scale_noise, fac):
    trials = 3
    circuits = generate_rb_circuits(n_qubits=2, num_cliffords=4, trials=trials)
    noise = 0.01
    obs = np.diag([1, 0, 0, 0])

    def executor(qc):
        return noisy_simulation(qc, noise=noise, obs=obs)

    mit_executor = mitigate_executor(executor, fac, scale_noise)

    unmitigated = []
    mitigated = []
    for qc in circuits:
        unmitigated.append(executor(qc))
        mitigated.append(mit_executor(qc))

    unmit_err = np.abs(1.0 - np.asarray(unmitigated))
    mit_err = np.abs(1.0 - np.asarray(mitigated))

    assert np.average(unmit_err) >= np.average(mit_err)
示例#10
0
def test_mitigate_executor_with_shot_list():
    true_zne_value = 1.0

    scale_factors = [1.0, 2.0, 3.0]
    shot_list = [1_000, 2_000, 3_000]

    fac = zne.inference.ExpFactory(scale_factors=scale_factors,
                                   shot_list=shot_list)
    mitigated_executor = zne.mitigate_executor(qiskit_executor, fac)

    circuit = measure(
        random_one_qubit_identity_circuit(num_cliffords=TEST_DEPTH), 0)
    base = qiskit_executor(circuit)
    zne_value = mitigated_executor(circuit)

    assert abs(true_zne_value - zne_value) < abs(true_zne_value - base)

    for i in range(len(fac._instack)):
        assert fac._instack[i] == {
            "scale_factor": scale_factors[i],
            "shots": shot_list[i],
        }
示例#11
0
def test_mitigate_executor():
    qp = random_one_qubit_identity_circuit(num_cliffords=TEST_DEPTH)

    new_executor = mitigate_executor(noiseless_executor)
    result = new_executor(qp)
    assert np.isclose(result, 1.0, atol=1e-5)