Пример #1
0
def test_fidelity_product_states():
    a, b = cirq.LineQubit.range(2)

    np.testing.assert_allclose(
        cirq.fidelity(cirq.KET_ZERO(a) * cirq.KET_ZERO(b), cirq.KET_ZERO(a) * cirq.KET_ZERO(b)), 1.0
    )
    np.testing.assert_allclose(
        cirq.fidelity(cirq.KET_ZERO(a) * cirq.KET_ZERO(b), cirq.KET_ZERO(a) * cirq.KET_ONE(b)),
        0.0,
        atol=1e-7,
    )
    np.testing.assert_allclose(
        cirq.fidelity(cirq.KET_ZERO(a) * cirq.KET_ZERO(b), cirq.KET_ZERO(a) * cirq.KET_PLUS(b)), 0.5
    )
    np.testing.assert_allclose(
        cirq.fidelity(cirq.KET_ONE(a) * cirq.KET_ONE(b), cirq.KET_MINUS(a) * cirq.KET_PLUS(b)), 0.25
    )
    np.testing.assert_allclose(
        cirq.fidelity(cirq.KET_MINUS(a) * cirq.KET_PLUS(b), cirq.KET_MINUS(a) * cirq.KET_PLUS(b)),
        1.0,
    )
    np.testing.assert_allclose(
        cirq.fidelity(cirq.KET_MINUS(a) * cirq.KET_PLUS(b), cirq.KET_PLUS(a) * cirq.KET_MINUS(b)),
        0.0,
        atol=1e-7,
    )

    with pytest.raises(ValueError, match='Mismatched'):
        _ = cirq.fidelity(cirq.KET_MINUS(a), cirq.KET_PLUS(a) * cirq.KET_MINUS(b))
    with pytest.raises(ValueError, match='qid shape'):
        _ = cirq.fidelity(
            cirq.KET_MINUS(a) * cirq.KET_PLUS(b),
            cirq.KET_PLUS(a) * cirq.KET_MINUS(b),
            qid_shape=(4,),
        )
Пример #2
0
def test_tp_projector():
    q0, q1 = cirq.LineQubit.range(2)
    p00 = (cirq.KET_ZERO(q0) * cirq.KET_ZERO(q1)).projector()
    rho = cirq.final_density_matrix(cirq.Circuit(cirq.I.on_each(q0, q1)))
    np.testing.assert_allclose(rho, p00)

    p01 = (cirq.KET_ZERO(q0) * cirq.KET_ONE(q1)).projector()
    rho = cirq.final_density_matrix(cirq.Circuit([cirq.I.on_each(q0, q1), cirq.X(q1)]))
    np.testing.assert_allclose(rho, p01)

    ppp = (cirq.KET_PLUS(q0) * cirq.KET_PLUS(q1)).projector()
    rho = cirq.final_density_matrix(
        cirq.Circuit(
            [
                cirq.H.on_each(q0, q1),
            ]
        )
    )
    np.testing.assert_allclose(rho, ppp, atol=1e-7)

    ppm = (cirq.KET_PLUS(q0) * cirq.KET_MINUS(q1)).projector()
    rho = cirq.final_density_matrix(cirq.Circuit([cirq.H.on_each(q0, q1), cirq.Z(q1)]))
    np.testing.assert_allclose(rho, ppm, atol=1e-7)

    pii = (cirq.KET_IMAG(q0) * cirq.KET_IMAG(q1)).projector()
    rho = cirq.final_density_matrix(cirq.Circuit(cirq.rx(-np.pi / 2).on_each(q0, q1)))
    np.testing.assert_allclose(rho, pii, atol=1e-7)

    pij = (cirq.KET_IMAG(q0) * cirq.KET_MINUS_IMAG(q1)).projector()
    rho = cirq.final_density_matrix(cirq.Circuit(cirq.rx(-np.pi / 2)(q0), cirq.rx(np.pi / 2)(q1)))
    np.testing.assert_allclose(rho, pij, atol=1e-7)
def example_bsa() -> 'cw.BitstringAccumulator':
    """Test fixture to create an (empty) example BitstringAccumulator"""
    q0, q1 = cirq.LineQubit.range(2)
    setting = cw.InitObsSetting(init_state=cirq.KET_ZERO(q0) *
                                cirq.KET_ZERO(q1),
                                observable=cirq.X(q0) * cirq.Y(q1))
    meas_spec = _MeasurementSpec(
        max_setting=setting,
        circuit_params={
            'beta': 0.123,
            'gamma': 0.456,
        },
    )
    bsa = cw.BitstringAccumulator(
        meas_spec=meas_spec,
        simul_settings=[
            setting,
            cw.InitObsSetting(init_state=setting.init_state,
                              observable=cirq.X(q0)),
            cw.InitObsSetting(init_state=setting.init_state,
                              observable=cirq.Y(q1)),
        ],
        qubit_to_index={
            q0: 0,
            q1: 1
        },
    )
    return bsa
Пример #4
0
def test_get_params_for_setting():
    qubits = cirq.LineQubit.range(3)
    a, b, c = qubits

    init_state = cirq.KET_PLUS(a) * cirq.KET_ZERO(b)
    observable = cirq.X(a) * cirq.Y(b)
    setting = cw.InitObsSetting(init_state=init_state, observable=observable)
    padded_setting = _pad_setting(setting, qubits=qubits)
    assert padded_setting.init_state == cirq.KET_PLUS(a) * cirq.KET_ZERO(
        b) * cirq.KET_ZERO(c)
    assert padded_setting.observable == cirq.X(a) * cirq.Y(b) * cirq.Z(c)
    assert init_state == cirq.KET_PLUS(a) * cirq.KET_ZERO(b)
    assert observable == cirq.X(a) * cirq.Y(b)

    needs_init_layer = True
    with pytest.raises(ValueError):
        _get_params_for_setting(
            padded_setting,
            flips=[0, 0],
            qubits=qubits,
            needs_init_layer=needs_init_layer,
        )
    params = _get_params_for_setting(
        padded_setting,
        flips=[0, 0, 1],
        qubits=qubits,
        needs_init_layer=needs_init_layer,
    )
    assert all(x in params for x in [
        '0-Xf',
        '0-Yf',
        '1-Xf',
        '1-Yf',
        '2-Xf',
        '2-Yf',
        '0-Xi',
        '0-Yi',
        '1-Xi',
        '1-Yi',
        '2-Xi',
        '2-Yi',
    ])

    circuit = cirq.Circuit(cirq.I.on_each(*qubits))
    circuit = _with_parameterized_layers(
        circuit,
        qubits=qubits,
        needs_init_layer=needs_init_layer,
    )
    circuit = circuit[:-1]  # remove measurement so we can compute <Z>
    psi = cirq.Simulator().simulate(circuit, param_resolver=params)
    ma = cirq.Z(a).expectation_from_state_vector(psi.final_state_vector,
                                                 qubit_map=psi.qubit_map)
    mb = cirq.Z(b).expectation_from_state_vector(psi.final_state_vector,
                                                 qubit_map=psi.qubit_map)
    mc = cirq.Z(c).expectation_from_state_vector(psi.final_state_vector,
                                                 qubit_map=psi.qubit_map)

    np.testing.assert_allclose([ma, mb, mc], [1, 0, -1])
Пример #5
0
def test_measurement_spec_no_symbols():
    q0, q1 = cirq.LineQubit.range(2)
    setting = InitObsSetting(init_state=cirq.KET_ZERO(q0) * cirq.KET_ZERO(q1),
                             observable=cirq.X(q0) * cirq.Y(q1))
    meas_spec = _MeasurementSpec(max_setting=setting,
                                 circuit_params={'beta': sympy.Symbol('t')})
    with pytest.raises(ValueError, match='Cannot convert'):
        _ = hash(meas_spec)
Пример #6
0
def test_tp_state_vector():
    q0, q1 = cirq.LineQubit.range(2)
    s00 = cirq.KET_ZERO(q0) * cirq.KET_ZERO(q1)
    np.testing.assert_equal(s00.state_vector(), [1, 0, 0, 0])
    np.testing.assert_equal(s00.state_vector(qubit_order=(q1, q0)), [1, 0, 0, 0])

    s01 = cirq.KET_ZERO(q0) * cirq.KET_ONE(q1)
    np.testing.assert_equal(s01.state_vector(), [0, 1, 0, 0])
    np.testing.assert_equal(s01.state_vector(qubit_order=(q1, q0)), [0, 0, 1, 0])
Пример #7
0
def test_init_obs_setting():
    q0, q1 = cirq.LineQubit.range(2)
    setting = InitObsSetting(init_state=cirq.KET_ZERO(q0) * cirq.KET_ZERO(q1),
                             observable=cirq.X(q0) * cirq.Y(q1))
    assert str(setting) == '+Z(q(0)) * +Z(q(1)) → X(q(0))*Y(q(1))'
    assert eval(repr(setting)) == setting

    with pytest.raises(ValueError):
        setting = InitObsSetting(init_state=cirq.KET_ZERO(q0),
                                 observable=cirq.X(q0) * cirq.Y(q1))
Пример #8
0
def test_group_settings_greedy_init_state_compat():
    q0, q1 = cirq.LineQubit.range(2)
    settings = [
        cirq.work.InitObsSetting(init_state=cirq.KET_PLUS(q0) *
                                 cirq.KET_ZERO(q1),
                                 observable=cirq.X(q0)),
        cirq.work.InitObsSetting(init_state=cirq.KET_PLUS(q0) *
                                 cirq.KET_ZERO(q1),
                                 observable=cirq.Z(q1)),
    ]
    grouped_settings = cirq.work.group_settings_greedy(settings)
    assert len(grouped_settings) == 1
Пример #9
0
def test_observable_to_setting():
    q0, q1, q2 = cirq.LineQubit.range(3)
    observables = [cirq.X(q0) * cirq.Y(q1), cirq.Z(q2) * 1]

    zero_state = cirq.KET_ZERO(q0) * cirq.KET_ZERO(q1) * cirq.KET_ZERO(q2)
    settings_should_be = [
        InitObsSetting(zero_state, observables[0]),
        InitObsSetting(zero_state, observables[1]),
    ]
    assert list(observables_to_settings(observables,
                                        qubits=[q0, q1,
                                                q2])) == settings_should_be
Пример #10
0
def test_ps_initial_state_dmat():
    q0, q1 = cirq.LineQubit.range(2)
    s00 = cirq.KET_ZERO(q0) * cirq.KET_ZERO(q1)
    sp0 = cirq.KET_PLUS(q0) * cirq.KET_ZERO(q1)

    np.testing.assert_allclose(
        cirq.final_density_matrix(cirq.Circuit(cirq.I.on_each(q0, q1))),
        cirq.final_density_matrix(cirq.Circuit(cirq.I.on_each(q0, q1)),
                                  initial_state=s00))

    np.testing.assert_allclose(
        cirq.final_density_matrix(cirq.Circuit(cirq.H(q0), cirq.I(q1))),
        cirq.final_density_matrix(cirq.Circuit(cirq.I.on_each(q0, q1)),
                                  initial_state=sp0))
Пример #11
0
def _set_up_meas_specs_for_testing():
    q0, q1 = cirq.LineQubit.range(2)
    setting = cw.InitObsSetting(init_state=cirq.KET_ZERO(q0) *
                                cirq.KET_ZERO(q1),
                                observable=cirq.X(q0) * cirq.Y(q1))
    meas_spec = _MeasurementSpec(max_setting=setting,
                                 circuit_params={
                                     'beta': 0.123,
                                     'gamma': 0.456
                                 })
    bsa = cw.BitstringAccumulator(
        meas_spec, [], {q: i
                        for i, q in enumerate(cirq.LineQubit.range(3))})
    return bsa, meas_spec
Пример #12
0
def test_group_settings_greedy_init_state_compat_sparse():
    q0, q1 = cirq.LineQubit.range(2)
    settings = [
        cirq.work.InitObsSetting(init_state=cirq.KET_PLUS(q0),
                                 observable=cirq.X(q0)),
        cirq.work.InitObsSetting(init_state=cirq.KET_ZERO(q1),
                                 observable=cirq.Z(q1)),
    ]
    grouped_settings = cirq.work.group_settings_greedy(settings)
    # pylint: disable=line-too-long
    grouped_settings_should_be = {
        cirq.work.InitObsSetting(init_state=cirq.KET_PLUS(q0) * cirq.KET_ZERO(q1),
                                 observable=cirq.X(q0) * cirq.Z(q1)):
        settings
    }
    assert grouped_settings == grouped_settings_should_be
Пример #13
0
def test_product_iter():
    q0, q1, q2 = cirq.LineQubit.range(3)
    ps = cirq.KET_PLUS(q0) * cirq.KET_PLUS(q1) * cirq.KET_ZERO(q2)

    should_be = [(q0, cirq.KET_PLUS), (q1, cirq.KET_PLUS), (q2, cirq.KET_ZERO)]
    assert list(ps) == should_be
    assert len(ps) == 3
Пример #14
0
def test_measure_grouped_settings_read_checkpoint(tmpdir):
    qubits = cirq.LineQubit.range(1)
    (q,) = qubits

    setting = cw.InitObsSetting(
        init_state=cirq.KET_ZERO(q),
        observable=cirq.Z(q),
    )
    grouped_settings = {setting: [setting]}
    circuit = cirq.Circuit(cirq.I.on_each(*qubits))
    with pytest.raises(ValueError, match=r'same filename.*'):
        _ = cw.measure_grouped_settings(
            circuit=circuit,
            grouped_settings=grouped_settings,
            sampler=cirq.Simulator(),
            stopping_criteria=cw.RepetitionsStoppingCriteria(1_000, repetitions_per_chunk=500),
            checkpoint=True,
            checkpoint_fn=f'{tmpdir}/obs.json',
            checkpoint_other_fn=f'{tmpdir}/obs.json',  # Same filename
        )
    _ = cw.measure_grouped_settings(
        circuit=circuit,
        grouped_settings=grouped_settings,
        sampler=cirq.Simulator(),
        stopping_criteria=cw.RepetitionsStoppingCriteria(1_000, repetitions_per_chunk=500),
        checkpoint=True,
        checkpoint_fn=f'{tmpdir}/obs.json',
        checkpoint_other_fn=f'{tmpdir}/obs.prev.json',
    )
    results = cirq.read_json(f'{tmpdir}/obs.json')
    (result,) = results  # one group
    assert result.n_repetitions == 1_000
    assert result.means() == [1.0]
Пример #15
0
def test_measurement_spec():
    q0, q1 = cirq.LineQubit.range(2)
    setting = InitObsSetting(init_state=cirq.KET_ZERO(q0) * cirq.KET_ZERO(q1),
                             observable=cirq.X(q0) * cirq.Y(q1))
    meas_spec = _MeasurementSpec(max_setting=setting,
                                 circuit_params={
                                     'beta': 0.123,
                                     'gamma': 0.456
                                 })
    meas_spec2 = _MeasurementSpec(max_setting=setting,
                                  circuit_params={
                                      'beta': 0.123,
                                      'gamma': 0.456
                                  })
    assert hash(meas_spec) == hash(meas_spec2)
    cirq.testing.assert_equivalent_repr(meas_spec)
Пример #16
0
def test_tp_initial_state():
    q0, q1 = cirq.LineQubit.range(2)
    psi1 = cirq.final_state_vector(cirq.Circuit([cirq.I.on_each(q0, q1), cirq.X(q1)]))

    s01 = cirq.KET_ZERO(q0) * cirq.KET_ONE(q1)
    psi2 = cirq.final_state_vector(cirq.Circuit([cirq.I.on_each(q0, q1)]), initial_state=s01)

    np.testing.assert_allclose(psi1, psi2)
Пример #17
0
def test_simulate_tps_initial_state():
    q0, q1 = cirq.LineQubit.range(2)
    simulator = cirq.DensityMatrixSimulator()
    for b0 in [0, 1]:
        for b1 in [0, 1]:
            circuit = cirq.Circuit((cirq.X ** b0)(q0), (cirq.X ** b1)(q1))
            result = simulator.simulate(circuit, initial_state=cirq.KET_ZERO(q0) * cirq.KET_ONE(q1))
            expected_density_matrix = np.zeros(shape=(4, 4))
            expected_density_matrix[b0 * 2 + 1 - b1, b0 * 2 + 1 - b1] = 1.0
            np.testing.assert_equal(result.final_density_matrix, expected_density_matrix)
Пример #18
0
def test_meas_specs_still_todo():
    q0, q1 = cirq.LineQubit.range(2)
    setting = cw.InitObsSetting(init_state=cirq.KET_ZERO(q0) *
                                cirq.KET_ZERO(q1),
                                observable=cirq.X(q0) * cirq.Y(q1))
    meas_spec = _MeasurementSpec(
        max_setting=setting,
        circuit_params={
            'beta': 0.123,
            'gamma': 0.456,
        },
    )
    bsa = cw.BitstringAccumulator(
        meas_spec, [], {q: i
                        for i, q in enumerate(cirq.LineQubit.range(3))})

    # 1. before taking any data
    still_todo, reps = _check_meas_specs_still_todo(
        meas_specs=[meas_spec],
        accumulators={meas_spec: bsa},
        desired_repetitions=1_000)
    assert still_todo == [meas_spec]
    assert reps == 1_000

    # 2. After taking a mocked-out 997 shots.
    bsa.consume_results(np.zeros((997, 3), dtype=np.uint8))
    still_todo, reps = _check_meas_specs_still_todo(
        meas_specs=[meas_spec],
        accumulators={meas_spec: bsa},
        desired_repetitions=1_000)
    assert still_todo == [meas_spec]
    assert reps == 3

    # 3. After taking the final 3 shots
    bsa.consume_results(np.zeros((reps, 3), dtype=np.uint8))
    still_todo, reps = _check_meas_specs_still_todo(
        meas_specs=[meas_spec],
        accumulators={meas_spec: bsa},
        desired_repetitions=1_000)
    assert still_todo == []
    assert reps == 0
Пример #19
0
def test_subdivide_meas_specs():

    qubits = cirq.LineQubit.range(2)
    q0, q1 = qubits
    setting = cw.InitObsSetting(init_state=cirq.KET_ZERO(q0) *
                                cirq.KET_ZERO(q1),
                                observable=cirq.X(q0) * cirq.Y(q1))
    meas_spec = cw._MeasurementSpec(
        max_setting=setting,
        circuit_params={
            'beta': 0.123,
            'gamma': 0.456,
        },
    )

    flippy_mspecs, repetitions = _subdivide_meas_specs(
        meas_specs=[meas_spec],
        repetitions=100_000,
        qubits=qubits,
        readout_symmetrization=True)
    fmspec1, fmspec2 = flippy_mspecs
    assert repetitions == 50_000
    assert fmspec1.meas_spec == meas_spec
    assert fmspec2.meas_spec == meas_spec
    assert np.all(fmspec2.flips)
    assert not np.any(fmspec1.flips)

    assert list(fmspec1.param_tuples()) == [
        ('0-Xf', 0),
        ('0-Yf', -0.5),
        ('0-Xi', 0),
        ('0-Yi', 0),
        ('1-Xf', 0.5),
        ('1-Yf', 0),
        ('1-Xi', 0),
        ('1-Yi', 0),
        ('beta', 0.123),
        ('gamma', 0.456),
    ]
Пример #20
0
def test_product_qubits():
    q0, q1, q2 = cirq.LineQubit.range(3)
    ps = cirq.KET_PLUS(q0) * cirq.KET_PLUS(q1) * cirq.KET_ZERO(q2)
    assert ps.qubits == [q0, q1, q2]
    assert ps[q0] == cirq.KET_PLUS