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