Example #1
0
def test_run_ftp_seeded():
    code = RotatedToricCode(4, 4)
    time_steps = 4
    error_model = BitPhaseFlipErrorModel()
    decoder = RotatedToricSMWPMDecoder()
    error_probability = 0.15
    max_runs = 5
    random_seed = 5
    data1 = app.run_ftp(code, time_steps, error_model, decoder, error_probability, max_runs=max_runs,
                        random_seed=random_seed)
    data2 = app.run_ftp(code, time_steps, error_model, decoder, error_probability, max_runs=max_runs,
                        random_seed=random_seed)
    # remove wall_time from data
    for data in (data1, data2):
        del data['wall_time']
    assert data1 == data2, 'Identically seeded runs are not the same. '
Example #2
0
def test_run_ftp_measurement_error_probability_defaults(time_steps, error_probability, measurement_error_probability,
                                                        expected):
    code = RotatedToricCode(4, 4)
    error_model = BitPhaseFlipErrorModel()
    decoder = RotatedToricSMWPMDecoder()
    max_runs = 2
    data = app.run_ftp(code, time_steps, error_model, decoder, error_probability, measurement_error_probability,
                       max_runs=max_runs)
    assert data['measurement_error_probability'] == expected
Example #3
0
def test_run_ftp_physical_error_rate(code, time_steps, error_model, decoder, error_probability):
    max_runs = 100  # Need to repeat many times to ensure physical_error_rate is close to error_probability
    data = app.run_ftp(code, time_steps, error_model, decoder, error_probability, max_runs=max_runs)
    for key in ('error_probability', 'physical_error_rate', 'error_weight_pvar'):
        assert key in data, 'data={} does not contain key={}'.format(data, key)
    e_prob = data['error_probability']
    p_rate = data['physical_error_rate']
    p_var = data['error_weight_pvar'] / (data['n_k_d'][0] ** 2)  # physical_error_rate_pvar (power of 2 is correct)
    p_std = math.sqrt(p_var)  # physical_error_rate_std
    assert p_rate - p_std < e_prob < p_rate + p_std, (
        'physical_error_rate={} is not within 1 std={} of error_probability={}'.format(p_rate, p_std, e_prob))
Example #4
0
def run_ftp(code, time_steps, error_model, decoder, error_probabilities, max_failures, max_runs,
            measurement_error_probability, output, random_seed):
    """
    Simulate fault-tolerant (time-periodic) quantum error correction.

    Arguments:

    \b
     CODE                  Stabilizer code in format name(<args>)
    #CODE_PARAMETERS#

    \b
     TIME_STEPS            Number of time steps as INT >= 1

    \b
     ERROR_MODEL           Error model in format name(<args>)
    #ERROR_MODEL_PARAMETERS#

    \b
     DECODER               Decoder in format name(<args>)
    #DECODER_PARAMETERS#

    \b
     ERROR_PROBABILITY...  One or more probabilities as FLOAT in [0.0, 1.0]

    Examples:

     qecsim run-ftp -r5 "rotated_planar(13,13)" 13 "generic.bit_phase_flip" "rotated_planar.smwpm" 0.1 0.2

     qecsim run-ftp -r5 -m0.05 "rotated_toric(6,6)" 4 "generic.bit_phase_flip" "rotated_toric.smwpm" 0.1

     qecsim run-ftp -r5 -o"data.json" "rotated_planar(7,7)" 7 "generic.depolarizing" "rotated_planar.smwpm" 0.1
    """
    # INPUT
    code.validate()

    logger.info('RUN STARTING: code={}, time_steps={}, error_model={}, decoder={}, error_probabilities={}, '
                'max_failures={}, max_runs={}, measurement_error_probability={}, random_seed={}.'
                .format(code, time_steps, error_model, decoder, error_probabilities, max_failures, max_runs,
                        measurement_error_probability, random_seed))

    # RUN
    data = []
    for error_probability in error_probabilities:
        runs_data = app.run_ftp(code, time_steps, error_model, decoder, error_probability,
                                measurement_error_probability=measurement_error_probability,
                                max_runs=max_runs, max_failures=max_failures, random_seed=random_seed)
        data.append(runs_data)

    logger.info('RUN COMPLETE: data={}'.format(data))

    # OUTPUT
    _write_data(output, data)
Example #5
0
def test_run_ftp_count(max_runs, max_failures):
    code = RotatedToricCode(6, 6)
    time_steps = 6
    error_model = BitPhaseFlipErrorModel()
    decoder = RotatedToricSMWPMDecoder()
    error_probability = 0.05
    data = app.run_ftp(code, time_steps, error_model, decoder, error_probability,
                       max_runs=max_runs, max_failures=max_failures)  # no error raised
    assert {'n_run', 'n_fail'} <= data.keys(), 'data={} missing count keys'
    if max_runs is None and max_failures is None:
        assert data['n_run'] == 1, 'n_run does not equal 1 when max_runs and max_failures unspecified'
    if max_runs is not None:
        assert data['n_run'] <= max_runs, ('n_run is not <= requested max_runs (data={}).'.format(data))
    if max_failures is not None:
        assert data['n_fail'] <= max_failures, ('n_fail is not <= requested max_failures (data={}).'.format(data))
Example #6
0
def test_run_ftp(code, time_steps, error_model, decoder):
    error_probability = 0.15
    max_runs = 2
    data = app.run_ftp(code, time_steps, error_model, decoder, error_probability, max_runs=max_runs)
    expected_keys = {'code', 'n_k_d', 'error_model', 'decoder', 'error_probability', 'time_steps',
                     'measurement_error_probability', 'n_run', 'n_success', 'n_fail', 'n_logical_commutations',
                     'custom_totals', 'error_weight_total', 'error_weight_pvar', 'logical_failure_rate',
                     'physical_error_rate', 'wall_time'}
    assert data.keys() == expected_keys, 'data={} has missing/extra keys'
    assert data['n_run'] == max_runs, ('n_run does not equal requested max_runs (data={}).'.format(data))
    assert data['n_success'] + data['n_fail'] == max_runs, (
        'n_success + n_fail does not equal requested max_runs (data={}).'.format(data))
    assert data['n_success'] >= 0, 'n_success is negative (data={}).'.format(data)
    assert data['n_fail'] >= 0, 'n_fail is negative (data={}).'.format(data)
    assert data['logical_failure_rate'] == data['n_fail'] / data['n_run']
Example #7
0
def test_run_ftp_invalid_parameters(time_steps, error_probability, measurement_error_probability):
    with pytest.raises(ValueError) as exc_info:
        app.run_ftp(RotatedToricCode(6, 6), time_steps, BitPhaseFlipErrorModel(), RotatedToricSMWPMDecoder(),
                    error_probability, measurement_error_probability, max_runs=2)
    print(exc_info)