def test_center_slice_error_model_generate_seeded():
    code = FiveQubitCode()
    lim = (0, 0, 1)
    pos = 0.5
    error_model = CenterSliceErrorModel(lim, pos)
    probability = 0.1
    error1 = error_model.generate(code, probability, np.random.default_rng(5))
    error2 = error_model.generate(code, probability, np.random.default_rng(5))
    assert np.array_equal(
        error1, error2), 'Identically seeded errors are not the same.'
def test_center_slice_error_model_generate():
    code = FiveQubitCode()
    lim = (0, 0, 1)
    pos = 0.5
    error_model = CenterSliceErrorModel(lim, pos)
    probability = 0.1
    error = error_model.generate(code, probability)
    assert len(error) == code.n_k_d[
        0] * 2, 'Error length is not twice number of physical qubits.'
    assert issubclass(error.dtype.type,
                      np.integer), 'Error is not integer array.'
    assert set(np.unique(error)).issubset({0, 1}), 'Error is not binary.'
def test_center_slice_error_model_properties():
    lim = (0, 0, 1)
    pos = 0.5
    error_model = CenterSliceErrorModel(lim, pos)
    assert isinstance(error_model.label, str)
    assert isinstance(repr(error_model), str)
    assert error_model.lim == lim
    assert error_model.pos == pos
    assert error_model.neg_lim == (0.5, 0.5, 0)
    assert error_model.ratio == (1 / 6, 1 / 6, 2 / 3)
def test_center_slice_error_model_probability_distribution(lim):
    # floating point tolerances (better than default)
    rtol, atol = 0.0, 1e-15
    # probability 10%
    p = 0.1
    for pos in (1, 0.5, 0, -0.5, -1):
        error_model = CenterSliceErrorModel(lim, pos)
        prob_dist = error_model.probability_distribution(p)
        print('Lim={!r}: (Pr(I), Pr(X), Pr(Y), Pr(Z))={}'.format(
            lim, prob_dist))
        p_i, p_x, p_y, p_z = prob_dist
        # check Pr(I) = 1 - p
        print('Lim={!r}: Pr(I) = {!r} ~= {!r} = 1 - p'.format(lim, p_i, 1 - p))
        assert np.isclose(p_i, 1 - p, rtol=rtol, atol=atol), 'Pr(I) != 1 - p.'
        # check Pr(X) + Pr(Y) + Pr(Z) = p
        print('Lim={!r}: Pr(X) + Pr(Y) + Pr(Z) = {!r} ~= {!r} = p'.format(
            lim, p_x + p_y + p_z, p))
        assert np.isclose(p_x + p_y + p_z, p, rtol=rtol,
                          atol=atol), 'Pr(X) + Pr(Y) + Pr(Z) != p'
        # check Pr(i) + Pr(X) + Pr(Y) + Pr(Z) = 1
        print('Lim={!r}: Pr(I) + Pr(X) + Pr(Y) + Pr(Z) = {!r} ~= 1'.format(
            lim, sum(prob_dist)))
        assert np.isclose(np.sum(prob_dist), 1, rtol=rtol,
                          atol=atol), 'sum(prob_dist) != 1'
    # check center-slice specific properties
    csem_lim_zero = CenterSliceErrorModel(lim, 0)
    csem_lim_plus1 = CenterSliceErrorModel(lim, 1)
    csem_lim_minus1 = CenterSliceErrorModel(lim, -1)
    csem_neg_lim_zero = CenterSliceErrorModel(csem_lim_zero.neg_lim, 0)
    csem_neg_lim_plus1 = CenterSliceErrorModel(csem_lim_zero.neg_lim, 1)
    csem_neg_lim_minus1 = CenterSliceErrorModel(csem_lim_zero.neg_lim, -1)
    # check lim
    assert np.all(
        np.isclose(csem_lim_zero.lim, csem_neg_lim_zero.neg_lim, rtol, atol))
    assert np.all(
        np.isclose(csem_lim_zero.neg_lim, csem_neg_lim_zero.lim, rtol, atol))
    # check ratio
    assert csem_lim_zero.ratio == csem_neg_lim_zero.ratio == (1 / 3, 1 / 3,
                                                              1 / 3)
    assert np.all(
        np.isclose(csem_lim_plus1.ratio, csem_neg_lim_minus1.ratio, rtol,
                   atol))
    assert np.all(
        np.isclose(csem_lim_minus1.ratio, csem_neg_lim_plus1.ratio, rtol,
                   atol))
    # check probability distribution
    assert np.all(
        np.isclose(csem_lim_zero.probability_distribution(p),
                   csem_neg_lim_zero.probability_distribution(p)))
    assert np.all(
        np.isclose(csem_lim_plus1.probability_distribution(p),
                   csem_neg_lim_minus1.probability_distribution(p)))
    assert np.all(
        np.isclose(csem_lim_minus1.probability_distribution(p),
                   csem_neg_lim_plus1.probability_distribution(p)))
def test_center_slice_error_model_invalid_parameters(lim, pos):
    with pytest.raises((ValueError, TypeError),
                       match=r"^CenterSliceErrorModel") as exc_info:
        CenterSliceErrorModel(lim, pos)
    print(exc_info)
def test_center_slice_error_model_valid_parameters(lim, pos):
    CenterSliceErrorModel(lim, pos)  # no error raised
        np.isclose(csem_lim_minus1.ratio, csem_neg_lim_plus1.ratio, rtol,
                   atol))
    # check probability distribution
    assert np.all(
        np.isclose(csem_lim_zero.probability_distribution(p),
                   csem_neg_lim_zero.probability_distribution(p)))
    assert np.all(
        np.isclose(csem_lim_plus1.probability_distribution(p),
                   csem_neg_lim_minus1.probability_distribution(p)))
    assert np.all(
        np.isclose(csem_lim_minus1.probability_distribution(p),
                   csem_neg_lim_plus1.probability_distribution(p)))


@pytest.mark.parametrize('csem, sem', [
    (CenterSliceErrorModel((1, 0, 0), 0), DepolarizingErrorModel()),
    (CenterSliceErrorModel((0, 1, 0), 0), DepolarizingErrorModel()),
    (CenterSliceErrorModel((0, 0, 1), 0), DepolarizingErrorModel()),
    (CenterSliceErrorModel((1, 0, 0), 1), BitFlipErrorModel()),
    (CenterSliceErrorModel((0, 1, 0), 1), BitPhaseFlipErrorModel()),
    (CenterSliceErrorModel((0, 0, 1), 1), PhaseFlipErrorModel()),
])
def test_center_slice_standard_error_models(csem, sem):
    p = 0.1
    assert csem.probability_distribution(p) == sem.probability_distribution(p)


def test_center_slice_error_model_generate():
    code = FiveQubitCode()
    lim = (0, 0, 1)
    pos = 0.5
Beispiel #8
0
    (PlanarCode(5, 5), DepolarizingErrorModel(), PlanarMPSDecoder(chi=6)),
    (PlanarCode(5, 5), DepolarizingErrorModel(), PlanarMWPMDecoder()),
    (PlanarCode(5, 5), DepolarizingErrorModel(), PlanarRMPSDecoder(chi=6)),
    (PlanarCode(4, 5), BitPhaseFlipErrorModel(), PlanarYDecoder()),
    (RotatedPlanarCode(7, 7), DepolarizingErrorModel(), RotatedPlanarMPSDecoder(chi=8)),
    (RotatedPlanarCode(7, 7), DepolarizingErrorModel(), RotatedPlanarRMPSDecoder(chi=8)),
    (RotatedPlanarCode(7, 7), BiasedDepolarizingErrorModel(100), RotatedPlanarSMWPMDecoder()),
    (RotatedToricCode(6, 6), BiasedDepolarizingErrorModel(100), RotatedToricSMWPMDecoder()),
    (SteaneCode(), DepolarizingErrorModel(), NaiveDecoder()),
    (ToricCode(5, 5), DepolarizingErrorModel(), ToricMWPMDecoder()),
    # each generic noise model
    (PlanarCode(5, 5), BiasedDepolarizingErrorModel(10), PlanarMPSDecoder(chi=6)),
    (PlanarCode(5, 5), BiasedYXErrorModel(10), PlanarMPSDecoder(chi=6)),
    (PlanarCode(5, 5), BitFlipErrorModel(), PlanarMPSDecoder(chi=6)),
    (PlanarCode(5, 5), BitPhaseFlipErrorModel(), PlanarMPSDecoder(chi=6)),
    (PlanarCode(5, 5), CenterSliceErrorModel((0.2, 0.8, 0), 0.5), PlanarMPSDecoder(chi=6)),
    (PlanarCode(5, 5), DepolarizingErrorModel(), PlanarMPSDecoder(chi=6)),
    (PlanarCode(5, 5), PhaseFlipErrorModel(), PlanarMPSDecoder(chi=6)),
])
def test_run_once(code, error_model, decoder):
    error_probability = 0.15
    data = app.run_once(code, error_model, decoder, error_probability)  # no error raised
    expected_key_cls = {'error_weight': int, 'success': bool, 'logical_commutations': np.ndarray,
                        'custom_values': np.ndarray}
    assert data.keys() == expected_key_cls.keys(), 'data={} has missing/extra keys'
    for key, cls in expected_key_cls.items():
        assert data[key] is None or type(data[key]) == cls, 'data[{}]={} is not of type={}'.format(key, data[key], cls)


def test_run_once_seeded():
    code = PlanarCode(5, 5)