Exemplo n.º 1
0
def measure(p, ro, idx, qc, qbits, correction_matrix):
    # Circuit to measure the expectation value of any Pauli string

    if idx == 0:
        return 1
    elif idx == 1:
        qc = get_qc(qc)
        p += H(qbits[0])
        p += MEASURE(qbits[0], ro[0])
        exe = qc.compile(p)
        res = qc.run(exe)
        probs = estimate_bitstring_probs(res)
        probs = correct_bitstring_probs(probs, [correction_matrix])
        return probs[0] - probs[1]
    elif idx == 2:
        qc = get_qc(qc)
        p += RX(np.pi / 2, qbits[0])
        p += MEASURE(qbits[0], ro[0])
        exe = qc.compile(p)
        res = qc.run(exe)
        probs = estimate_bitstring_probs(res)
        probs = correct_bitstring_probs(probs, [correction_matrix])
        return probs[0] - probs[1]
    elif idx == 3:
        qc = get_qc(qc)
        p += MEASURE(qbits[0], ro[0])
        exe = qc.compile(p)
        res = qc.run(exe)
        probs = estimate_bitstring_probs(res)
        probs = correct_bitstring_probs(probs, [correction_matrix])
        return probs[0] - probs[1]
Exemplo n.º 2
0
def test_readout_compensation():
    np.random.seed(1234124)
    p = np.random.rand(2, 2, 2, 2, 2, 2)
    p /= p.sum()

    aps = [np.eye(2) + .2 * (np.random.rand(2, 2) - 1) for _ in range(p.ndim)]
    for ap in aps:
        ap.flat[ap.flat < 0] = 0.
        ap /= ap.sum()
        assert np.alltrue(ap >= 0)

    assert np.alltrue(p >= 0)

    p_corrupted = corrupt_bitstring_probs(p, aps)
    p_restored = correct_bitstring_probs(p_corrupted, aps)
    assert np.allclose(p, p_restored)

    results = [[0, 0, 0]] * 100 + [[0, 1, 1]] * 200
    p1 = estimate_bitstring_probs(results)
    assert np.isclose(p1[0, 0, 0], 1. / 3.)
    assert np.isclose(p1[0, 1, 1], 2. / 3.)
    assert np.isclose(p1.sum(), 1.)

    zm = bitstring_probs_to_z_moments(p1)
    assert np.isclose(zm[0, 0, 0], 1)
    assert np.isclose(zm[1, 0, 0], 1)
    assert np.isclose(zm[0, 1, 0], -1. / 3)
    assert np.isclose(zm[0, 0, 1], -1. / 3)
    assert np.isclose(zm[0, 1, 1], 1.)
    assert np.isclose(zm[1, 1, 0], -1. / 3)
    assert np.isclose(zm[1, 0, 1], -1. / 3)
    assert np.isclose(zm[1, 1, 1], 1.)