def test_parameterized_repeat_side_effects_when_not_using_rep_ids(): q = cirq.LineQubit(0) op = cirq.CircuitOperation( cirq.FrozenCircuit( cirq.X(q).with_classical_controls('c'), cirq.measure(q, key='m')), repetitions=sympy.Symbol('a'), use_repetition_ids=False, ) assert cirq.control_keys(op) == {cirq.MeasurementKey('c')} assert cirq.parameter_names(op.with_params({'a': 1})) == {'a'} assert set(map(str, cirq.measurement_key_objs(op))) == {'m'} assert cirq.measurement_key_names(op) == {'m'} assert cirq.measurement_key_names( cirq.with_measurement_key_mapping(op, {'m': 'm2'})) == {'m2'} with pytest.raises( ValueError, match='Cannot unroll circuit due to nondeterministic repetitions'): op.mapped_circuit() with pytest.raises( ValueError, match='Cannot unroll circuit due to nondeterministic repetitions'): cirq.decompose(op) with pytest.raises(ValueError, match='repetition ids with parameterized repetitions'): op.with_repetition_ids(['x', 'y']) with pytest.raises(ValueError, match='repetition ids with parameterized repetitions'): op.repeat(repetition_ids=['x', 'y'])
def test_measurement_keys(): a = cirq.NamedQubit('a') b = cirq.NamedQubit('b') m = cirq.Moment(cirq.X(a), cirq.X(b)) assert cirq.measurement_key_names(m) == set() assert not cirq.is_measurement(m) m2 = cirq.Moment(cirq.measure(a, b, key='foo')) assert cirq.measurement_key_objs(m2) == {cirq.MeasurementKey('foo')} assert cirq.measurement_key_names(m2) == {'foo'} assert cirq.is_measurement(m2)
def test_measurement_key_enumerable_deprecated(): class Deprecated: def _measurement_key_objs_(self): return [cirq.MeasurementKey('key')] def _measurement_key_names_(self): return ['key'] with cirq.testing.assert_deprecated('frozenset', deadline='v0.16'): assert cirq.measurement_key_objs( Deprecated()) == {cirq.MeasurementKey('key')} with cirq.testing.assert_deprecated('frozenset', deadline='v0.16'): assert cirq.measurement_key_names(Deprecated()) == {'key'}
def test_measurement_key_objs_caching(): q0, q1, q2, q3 = cirq.LineQubit.range(4) m = cirq.Moment(cirq.measure(q0, key='foo')) assert m._measurement_key_objs is None key_objs = cirq.measurement_key_objs(m) assert m._measurement_key_objs == key_objs # Make sure it gets updated when adding an operation. m = m.with_operation(cirq.measure(q1, key='bar')) assert m._measurement_key_objs == { cirq.MeasurementKey(name='bar'), cirq.MeasurementKey(name='foo'), } # Or multiple operations. m = m.with_operations(cirq.measure(q2, key='doh'), cirq.measure(q3, key='baz')) assert m._measurement_key_objs == { cirq.MeasurementKey(name='bar'), cirq.MeasurementKey(name='foo'), cirq.MeasurementKey(name='doh'), cirq.MeasurementKey(name='baz'), }
def test_parameterized_repeat_side_effects(): q = cirq.LineQubit(0) op = cirq.CircuitOperation( cirq.FrozenCircuit( cirq.X(q).with_classical_controls('c'), cirq.measure(q, key='m')), repetitions=sympy.Symbol('a'), ) # Control keys can be calculated because they only "lift" if there's a matching # measurement, in which case they're not returned here. assert cirq.control_keys(op) == {cirq.MeasurementKey('c')} # "local" params do not bind to the repetition param. assert cirq.parameter_names(op.with_params({'a': 1})) == {'a'} # Check errors that require unrolling the circuit. with pytest.raises( ValueError, match='Cannot unroll circuit due to nondeterministic repetitions'): cirq.measurement_key_objs(op) with pytest.raises( ValueError, match='Cannot unroll circuit due to nondeterministic repetitions'): cirq.measurement_key_names(op) with pytest.raises( ValueError, match='Cannot unroll circuit due to nondeterministic repetitions'): op.mapped_circuit() with pytest.raises( ValueError, match='Cannot unroll circuit due to nondeterministic repetitions'): cirq.decompose(op) # Not compatible with repetition ids with pytest.raises(ValueError, match='repetition ids with parameterized repetitions'): op.with_repetition_ids(['x', 'y']) with pytest.raises(ValueError, match='repetition ids with parameterized repetitions'): op.repeat(repetition_ids=['x', 'y']) # TODO(daxfohl): This should work, but likely requires a new protocol that returns *just* the # name of the measurement keys. (measurement_key_names returns the full serialized string). with pytest.raises( ValueError, match='Cannot unroll circuit due to nondeterministic repetitions'): cirq.with_measurement_key_mapping(op, {'m': 'm2'}) # Everything should work once resolved op = cirq.resolve_parameters(op, {'a': 2}) assert set(map(str, cirq.measurement_key_objs(op))) == {'0:m', '1:m'} assert op.mapped_circuit() == cirq.Circuit( cirq.X(q).with_classical_controls('c'), cirq.measure(q, key=cirq.MeasurementKey.parse_serialized('0:m')), cirq.X(q).with_classical_controls('c'), cirq.measure(q, key=cirq.MeasurementKey.parse_serialized('1:m')), ) assert cirq.decompose(op) == cirq.decompose( cirq.Circuit( cirq.X(q).with_classical_controls('c'), cirq.measure(q, key=cirq.MeasurementKey.parse_serialized('0:m')), cirq.X(q).with_classical_controls('c'), cirq.measure(q, key=cirq.MeasurementKey.parse_serialized('1:m')), ))