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