def test_repeat_until_error(): q = cirq.LineQubit(0) with pytest.raises(ValueError, match='Cannot use repetitions with repeat_until'): cirq.CircuitOperation( cirq.FrozenCircuit(), use_repetition_ids=True, repeat_until=cirq.KeyCondition(cirq.MeasurementKey('a')), ) with pytest.raises(ValueError, match='Infinite loop'): cirq.CircuitOperation( cirq.FrozenCircuit(cirq.measure(q, key='m')), use_repetition_ids=False, repeat_until=cirq.KeyCondition(cirq.MeasurementKey('a')), )
def test_repeated_measurement_unset(sim): q0, q1 = cirq.LineQubit.range(2) circuit = cirq.Circuit( cirq.measure(q0, key='a'), cirq.X(q0), cirq.measure(q0, key='a'), cirq.X(q1).with_classical_controls( cirq.KeyCondition(cirq.MeasurementKey('a'), index=-2)), cirq.measure(q1, key='b'), cirq.X(q1).with_classical_controls( cirq.KeyCondition(cirq.MeasurementKey('a'), index=-1)), cirq.measure(q1, key='c'), ) result = sim.run(circuit) assert result.records['a'][0][0][0] == 0 assert result.records['a'][0][1][0] == 1 assert result.records['b'][0][0][0] == 0 assert result.records['c'][0][0][0] == 1
def test_post_selection(sim): q = cirq.LineQubit(0) key = cirq.MeasurementKey('m') c = cirq.Circuit( cirq.CircuitOperation( cirq.FrozenCircuit(cirq.X(q)**0.2, cirq.measure(q, key=key)), use_repetition_ids=False, repeat_until=cirq.KeyCondition(key), )) result = sim.run(c) assert result.records['m'][0][-1] == (1, ) for i in range(len(result.records['m'][0]) - 1): assert result.records['m'][0][i] == (0, )
def test_inhomogeneous_measurement_count_padding(): q = cirq.LineQubit(0) key = cirq.MeasurementKey('m') sim = cirq.Simulator() c = cirq.Circuit( cirq.CircuitOperation( cirq.FrozenCircuit(cirq.X(q)**0.2, cirq.measure(q, key=key)), use_repetition_ids=False, repeat_until=cirq.KeyCondition(key), )) results = sim.run(c, repetitions=10) for i in range(10): assert np.sum(results.records['m'][i, :, :]) == 1
def test_repeat_until(sim): q = cirq.LineQubit(0) key = cirq.MeasurementKey('m') c = cirq.Circuit( cirq.X(q), cirq.CircuitOperation( cirq.FrozenCircuit(cirq.X(q), cirq.measure(q, key=key)), use_repetition_ids=False, repeat_until=cirq.KeyCondition(key), ), ) measurements = sim.run(c).records['m'][0] assert len(measurements) == 2 assert measurements[0] == (0, ) assert measurements[1] == (1, )
def test_repeat_until_diagram(): q = cirq.LineQubit(0) key = cirq.MeasurementKey('m') c = cirq.Circuit( cirq.CircuitOperation( cirq.FrozenCircuit(cirq.X(q)**0.2, cirq.measure(q, key=key)), use_repetition_ids=False, repeat_until=cirq.KeyCondition(key), )) cirq.testing.assert_has_diagram( c, """ 0: ───[ 0: ───X^0.2───M('m')─── ](no_rep_ids, until=m)─── """, use_unicode_characters=True, )
def test_string_format(): x, y, z = cirq.LineQubit.range(3) fc0 = cirq.FrozenCircuit() op0 = cirq.CircuitOperation(fc0) assert str(op0) == f"[ ]" fc0_global_phase_inner = cirq.FrozenCircuit( cirq.global_phase_operation(1j), cirq.global_phase_operation(1j)) op0_global_phase_inner = cirq.CircuitOperation(fc0_global_phase_inner) fc0_global_phase_outer = cirq.FrozenCircuit( op0_global_phase_inner, cirq.global_phase_operation(1j)) op0_global_phase_outer = cirq.CircuitOperation(fc0_global_phase_outer) assert (str(op0_global_phase_outer) == f"""\ [ ] [ ] [ global phase: -0.5π ]""") fc1 = cirq.FrozenCircuit(cirq.X(x), cirq.H(y), cirq.CX(y, z), cirq.measure(x, y, z, key='m')) op1 = cirq.CircuitOperation(fc1) assert (str(op1) == f"""\ [ 0: ───X───────M('m')─── ] [ │ ] [ 1: ───H───@───M──────── ] [ │ │ ] [ 2: ───────X───M──────── ]""") assert (repr(op1) == """\ cirq.CircuitOperation( circuit=cirq.FrozenCircuit([ cirq.Moment( cirq.X(cirq.LineQubit(0)), cirq.H(cirq.LineQubit(1)), ), cirq.Moment( cirq.CNOT(cirq.LineQubit(1), cirq.LineQubit(2)), ), cirq.Moment( cirq.measure(cirq.LineQubit(0), cirq.LineQubit(1), cirq.LineQubit(2), key=cirq.MeasurementKey(name='m')), ), ]), )""") fc2 = cirq.FrozenCircuit(cirq.X(x), cirq.H(y), cirq.CX(y, x)) op2 = cirq.CircuitOperation( circuit=fc2, qubit_map=({ y: z }), repetitions=3, parent_path=('outer', 'inner'), repetition_ids=['a', 'b', 'c'], ) assert (str(op2) == f"""\ [ 0: ───X───X─── ] [ │ ] [ 1: ───H───@─── ](qubit_map={{1: 2}}, parent_path=('outer', 'inner'),\ repetition_ids=['a', 'b', 'c'])""") assert (repr(op2) == """\ cirq.CircuitOperation( circuit=cirq.FrozenCircuit([ cirq.Moment( cirq.X(cirq.LineQubit(0)), cirq.H(cirq.LineQubit(1)), ), cirq.Moment( cirq.CNOT(cirq.LineQubit(1), cirq.LineQubit(0)), ), ]), repetitions=3, qubit_map={cirq.LineQubit(1): cirq.LineQubit(2)}, parent_path=('outer', 'inner'), repetition_ids=['a', 'b', 'c'], )""") fc3 = cirq.FrozenCircuit( cirq.X(x)**sympy.Symbol('b'), cirq.measure(x, key='m'), ) op3 = cirq.CircuitOperation( circuit=fc3, qubit_map={x: y}, measurement_key_map={'m': 'p'}, param_resolver={sympy.Symbol('b'): 2}, ) indented_fc3_repr = repr(fc3).replace('\n', '\n ') assert (str(op3) == f"""\ [ 0: ───X^b───M('m')─── ](qubit_map={{0: 1}}, \ key_map={{m: p}}, params={{b: 2}})""") assert (repr(op3) == f"""\ cirq.CircuitOperation( circuit={indented_fc3_repr}, qubit_map={{cirq.LineQubit(0): cirq.LineQubit(1)}}, measurement_key_map={{'m': 'p'}}, param_resolver=cirq.ParamResolver({{sympy.Symbol('b'): 2}}), )""") fc4 = cirq.FrozenCircuit(cirq.X(y)) op4 = cirq.CircuitOperation(fc4) fc5 = cirq.FrozenCircuit(cirq.X(x), op4) op5 = cirq.CircuitOperation(fc5) assert (repr(op5) == """\ cirq.CircuitOperation( circuit=cirq.FrozenCircuit([ cirq.Moment( cirq.X(cirq.LineQubit(0)), cirq.CircuitOperation( circuit=cirq.FrozenCircuit([ cirq.Moment( cirq.X(cirq.LineQubit(1)), ), ]), ), ), ]), )""") op6 = cirq.CircuitOperation(fc5, use_repetition_ids=False) assert (repr(op6) == """\ cirq.CircuitOperation( circuit=cirq.FrozenCircuit([ cirq.Moment( cirq.X(cirq.LineQubit(0)), cirq.CircuitOperation( circuit=cirq.FrozenCircuit([ cirq.Moment( cirq.X(cirq.LineQubit(1)), ), ]), ), ), ]), use_repetition_ids=False, )""") op7 = cirq.CircuitOperation( cirq.FrozenCircuit(cirq.measure(x, key='a')), use_repetition_ids=False, repeat_until=cirq.KeyCondition(cirq.MeasurementKey('a')), ) assert (repr(op7) == """\ cirq.CircuitOperation( circuit=cirq.FrozenCircuit([ cirq.Moment( cirq.measure(cirq.LineQubit(0), key=cirq.MeasurementKey(name='a')), ), ]), use_repetition_ids=False, repeat_until=cirq.KeyCondition(cirq.MeasurementKey(name='a')), )""")
def test_key_condition_qasm(): assert cirq.KeyCondition(cirq.MeasurementKey('a')).qasm == 'm_a!=0'
def test_key_condition_repr(): cirq.testing.assert_equivalent_repr(init_key_condition) cirq.testing.assert_equivalent_repr(cirq.KeyCondition(key_a, index=-2))
def test_key_condition_str(): assert str(init_key_condition) == '0:a' assert str(cirq.KeyCondition(key_a, index=-2)) == '0:a[-2]'
# distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import re import pytest import sympy import cirq key_a = cirq.MeasurementKey.parse_serialized('0:a') key_b = cirq.MeasurementKey.parse_serialized('0:b') key_c = cirq.MeasurementKey.parse_serialized('0:c') init_key_condition = cirq.KeyCondition(key_a) init_sympy_condition = cirq.SympyCondition(sympy.Symbol('0:a') >= 1) def test_key_condition_with_keys(): c = init_key_condition.replace_key(key_a, key_b) assert c.key is key_b c = init_key_condition.replace_key(key_b, key_c) assert c.key is key_a def test_key_condition_str(): assert str(init_key_condition) == '0:a' assert str(cirq.KeyCondition(key_a, index=-2)) == '0:a[-2]'
def test_key_condition_qasm(): with pytest.raises(ValueError, match='QASM is defined only for SympyConditions'): _ = cirq.KeyCondition(cirq.MeasurementKey('a')).qasm