def test_serialize_deserialize_circuit_with_tokens(): q0 = cirq.GridQubit(1, 1) q1 = cirq.GridQubit(1, 2) tag1 = cg.CalibrationTag('abc123') tag2 = cg.CalibrationTag('def456') circuit = cirq.Circuit(cirq.X(q0).with_tags(tag1), cirq.X(q1).with_tags(tag2), cirq.X(q0)) op1 = v2.program_pb2.Operation() op1.gate.id = 'x_pow' op1.args['half_turns'].arg_value.float_value = 1.0 op1.qubits.add().id = '1_1' op1.token_constant_index = 0 op2 = v2.program_pb2.Operation() op2.gate.id = 'x_pow' op2.args['half_turns'].arg_value.float_value = 1.0 op2.qubits.add().id = '1_2' op2.token_constant_index = 1 proto = v2.program_pb2.Program( language=v2.program_pb2.Language(arg_function_language='', gate_set='my_gate_set'), circuit=v2.program_pb2.Circuit( scheduling_strategy=v2.program_pb2.Circuit.MOMENT_BY_MOMENT, moments=[ v2.program_pb2.Moment(operations=[op1, op2]), v2.program_pb2.Moment(operations=[X_SERIALIZER.to_proto(cirq.X(q0))]), ], ), constants=[ v2.program_pb2.Constant(string_value='abc123'), v2.program_pb2.Constant(string_value='def456'), ], ) assert proto == MY_GATE_SET.serialize(circuit) assert MY_GATE_SET.deserialize(proto) == circuit
def test_hash(): s = set() s.add(cirq_google.CalibrationTag('foo')) assert len(s) == 1 s.add(cirq_google.CalibrationTag('foo')) assert len(s) == 1 s.add(cirq_google.CalibrationTag('bar')) assert len(s) == 2
def test_serialize_deserialize_circuit_with_tokens(): serializer = cg.CircuitSerializer('my_gate_set') tag1 = cg.CalibrationTag('abc123') tag2 = cg.CalibrationTag('def456') circuit = cirq.Circuit( cirq.X(Q0).with_tags(tag1), cirq.X(Q1).with_tags(tag2), cirq.X(Q0).with_tags(tag2), cirq.X(Q0), ) op_q0_tag1 = v2.program_pb2.Operation() op_q0_tag1.xpowgate.exponent.float_value = 1.0 op_q0_tag1.qubit_constant_index.append(0) op_q0_tag1.token_constant_index = 1 op_q1_tag2 = v2.program_pb2.Operation() op_q1_tag2.xpowgate.exponent.float_value = 1.0 op_q1_tag2.qubit_constant_index.append(2) op_q1_tag2.token_constant_index = 3 # Test repeated tag uses existing constant entey op_q0_tag2 = v2.program_pb2.Operation() op_q0_tag2.xpowgate.exponent.float_value = 1.0 op_q0_tag2.qubit_constant_index.append(0) op_q0_tag2.token_constant_index = 3 proto = v2.program_pb2.Program( language=v2.program_pb2.Language(arg_function_language='exp', gate_set='my_gate_set'), circuit=v2.program_pb2.Circuit( scheduling_strategy=v2.program_pb2.Circuit.MOMENT_BY_MOMENT, moments=[ v2.program_pb2.Moment( operations=[op_q0_tag1, op_q1_tag2], ), v2.program_pb2.Moment( operations=[op_q0_tag2], ), v2.program_pb2.Moment( operations=[X_PROTO], ), ], ), constants=[ v2.program_pb2.Constant(qubit=v2.program_pb2.Qubit(id='2_4')), v2.program_pb2.Constant(string_value='abc123'), v2.program_pb2.Constant(qubit=v2.program_pb2.Qubit(id='2_5')), v2.program_pb2.Constant(string_value='def456'), ], ) assert proto == serializer.serialize(circuit) assert serializer.deserialize(proto) == circuit
def test_token_with_references(): deserializer = base_deserializer() serialized = op_proto({ 'gate': { 'id': 'my_gate' }, 'args': { 'my_val': { 'arg_value': { 'float_value': 1.25 } } }, 'qubits': [{ 'id': '1_2' }], 'token_constant_index': 1, }) op = GateWithAttribute(1.25)(cirq.GridQubit(1, 2)) op = op.with_tags(cg.CalibrationTag('abc123')) constants = [] constant = v2.program_pb2.Constant() constant.string_value = 'my_token' constants.append(constant) constant = v2.program_pb2.Constant() constant.string_value = 'abc123' constants.append(constant) assert deserializer.from_proto(serialized, constants=constants) == op with pytest.raises(ValueError, match='Proto has references to constants table'): deserializer.from_proto(serialized)
def test_serialize_deserialize_circuit_with_subcircuit(): q0 = cirq.GridQubit(1, 1) q1 = cirq.GridQubit(1, 2) tag1 = cg.CalibrationTag('abc123') fcircuit = cirq.FrozenCircuit(cirq.X(q0)) circuit = cirq.Circuit( cirq.X(q1).with_tags(tag1), cirq.CircuitOperation(fcircuit).repeat(repetition_ids=['a', 'b']), cirq.CircuitOperation(fcircuit).with_qubit_mapping({q0: q1}), cirq.X(q0), ) op1 = v2.program_pb2.Operation() op1.gate.id = 'x_pow' op1.args['half_turns'].arg_value.float_value = 1.0 op1.qubits.add().id = '1_2' op1.token_constant_index = 0 c_op1 = v2.program_pb2.CircuitOperation() c_op1.circuit_constant_index = 1 rep_spec = c_op1.repetition_specification rep_spec.repetition_count = 2 rep_spec.repetition_ids.ids.extend(['a', 'b']) c_op2 = v2.program_pb2.CircuitOperation() c_op2.circuit_constant_index = 1 c_op2.repetition_specification.repetition_count = 1 qmap = c_op2.qubit_map.entries.add() qmap.key.id = '1_1' qmap.value.id = '1_2' proto = v2.program_pb2.Program( language=v2.program_pb2.Language(arg_function_language='', gate_set='my_gate_set'), circuit=v2.program_pb2.Circuit( scheduling_strategy=v2.program_pb2.Circuit.MOMENT_BY_MOMENT, moments=[ v2.program_pb2.Moment( operations=[op1], circuit_operations=[c_op1], ), v2.program_pb2.Moment( operations=[X_SERIALIZER.to_proto(cirq.X(q0))], circuit_operations=[c_op2], ), ], ), constants=[ v2.program_pb2.Constant(string_value='abc123'), v2.program_pb2.Constant(circuit_value=v2.program_pb2.Circuit( scheduling_strategy=v2.program_pb2.Circuit.MOMENT_BY_MOMENT, moments=[ v2.program_pb2.Moment( operations=[X_SERIALIZER.to_proto(cirq.X(q0))], ) ], )), ], ) assert proto == MY_GATE_SET.serialize(circuit) assert MY_GATE_SET.deserialize(proto) == circuit
def test_deserialize_circuit_with_token_strings(): """Supporting token strings for backwards compatibility.""" serializer = cg.CircuitSerializer('my_gate_set') proto = v2.program_pb2.Program( language=v2.program_pb2.Language(arg_function_language='exp', gate_set='my_gate_set'), circuit=v2.program_pb2.Circuit( scheduling_strategy=v2.program_pb2.Circuit.MOMENT_BY_MOMENT, moments=[ v2.program_pb2.Moment(operations=[ v2.program_pb2.Operation( xpowgate=v2.program_pb2.XPowGate( exponent=v2.program_pb2.FloatArg(float_value=1.0)), token_value='abc123', qubit_constant_index=[0], ), ], ), ], ), constants=[ v2.program_pb2.Constant(qubit=v2.program_pb2.Qubit(id='2_4')), ], ) tag = cg.CalibrationTag('abc123') circuit = cirq.Circuit(cirq.X(Q0).with_tags(tag)) assert serializer.deserialize(proto) == circuit
def test_token_serialization_with_constant_reference(constants, expected_index, expected_constants): serializer = cg.GateOpSerializer( gate_type=GateWithAttribute, serialized_gate_id='my_gate', args=[ cg.SerializingArg(serialized_name='my_val', serialized_type=float, op_getter='val') ], ) # Make a local copy since we are modifying the array in-place. constants = copy.copy(constants) q = cirq.GridQubit(1, 2) tag = cg.CalibrationTag('my_token') expected = op_proto({ 'gate': { 'id': 'my_gate' }, 'args': { 'my_val': { 'arg_value': { 'float_value': 0.125 } } }, 'qubits': [{ 'id': '1_2' }], 'token_constant_index': expected_index, }) assert expected == serializer.to_proto( GateWithAttribute(0.125)(q).with_tags(tag), constants=constants) assert constants == expected_constants
def test_token_serialization(): serializer = cg.GateOpSerializer( gate_type=GateWithAttribute, serialized_gate_id='my_gate', args=[ cg.SerializingArg(serialized_name='my_val', serialized_type=float, op_getter='val') ], ) q = cirq.GridQubit(1, 2) tag = cg.CalibrationTag('my_token') expected = op_proto({ 'gate': { 'id': 'my_gate' }, 'args': { 'my_val': { 'arg_value': { 'float_value': 0.125 } } }, 'qubits': [{ 'id': '1_2' }], 'token_value': 'my_token', }) assert expected == serializer.to_proto( GateWithAttribute(0.125)(q).with_tags(tag))
def test_find_measurements_with_tags(): circuit = cirq.Circuit() circuit.append( cirq.measure(q(0, 0), q(0, 1), q(0, 2), key='k', invert_mask=[False, True, True]).with_tags( cirq_google.CalibrationTag('special') ) ) measurements = v2.find_measurements(circuit) assert len(measurements) == 1 m = measurements[0] _check_measurement( m, 'k', [q(0, 0), q(0, 1), q(0, 2)], 0, [False, True, True], [cirq_google.CalibrationTag('special')], )
def test_serialize_deserialize_op_with_token(): q0 = cirq.GridQubit(1, 1) proto = op_proto( { 'gate': {'id': 'x_pow'}, 'args': {'half_turns': {'arg_value': {'float_value': 0.125}}}, 'qubits': [{'id': '1_1'}], 'token_value': 'abc123', } ) op = cirq.XPowGate(exponent=0.125)(q0).with_tags(cg.CalibrationTag('abc123')) assert proto == MY_GATE_SET.serialize_op(op) assert MY_GATE_SET.deserialize_op(proto) == op
def test_serialize_deserialize_op_with_constants(): q0 = cirq.GridQubit(1, 1) proto = op_proto( { 'gate': {'id': 'x_pow'}, 'args': {'half_turns': {'arg_value': {'float_value': 0.125}}}, 'qubits': [{'id': '1_1'}], 'token_constant_index': 0, } ) op = cirq.XPowGate(exponent=0.125)(q0).with_tags(cg.CalibrationTag('abc123')) assert proto == MY_GATE_SET.serialize_op(op, constants=[]) constant = v2.program_pb2.Constant() constant.string_value = 'abc123' assert MY_GATE_SET.deserialize_op(proto, constants=[constant]) == op
def test_token(): deserializer = cg.GateOpDeserializer( serialized_gate_id='my_gate', gate_constructor=GateWithAttribute, args=[ cg.DeserializingArg(serialized_name='my_val', constructor_arg_name='val'), ], ) serialized = op_proto( { 'gate': {'id': 'my_gate'}, 'args': {'my_val': {'arg_value': {'float_value': 1.25}}}, 'qubits': [{'id': '1_2'}], 'token_value': 'abc123', } ) op = GateWithAttribute(1.25)(cirq.GridQubit(1, 2)) op = op.with_tags(cg.CalibrationTag('abc123')) assert deserializer.from_proto(serialized) == op
def test_token(): deserializer = base_deserializer() serialized = op_proto({ 'gate': { 'id': 'my_gate' }, 'args': { 'my_val': { 'arg_value': { 'float_value': 1.25 } } }, 'qubits': [{ 'id': '1_2' }], 'token_value': 'abc123', }) op = GateWithAttribute(1.25)(cirq.GridQubit(1, 2)) op = op.with_tags(cg.CalibrationTag('abc123')) assert deserializer.from_proto(serialized) == op
def test_serialize_deserialize_circuit_with_subcircuit(): serializer = cg.CircuitSerializer('my_gate_set') tag1 = cg.CalibrationTag('abc123') fcircuit = cirq.FrozenCircuit( cirq.XPowGate(exponent=2 * sympy.Symbol('t'))(Q0)) circuit = cirq.Circuit( cirq.X(Q1).with_tags(tag1), cirq.CircuitOperation(fcircuit).repeat(repetition_ids=['a', 'b']), cirq.CircuitOperation(fcircuit).with_qubit_mapping({Q0: Q1}), cirq.X(Q0), ) op_x = v2.program_pb2.Operation() op_x.xpowgate.exponent.float_value = 1.0 op_x.qubit_constant_index.append(2) op_tag = v2.program_pb2.Operation() op_tag.xpowgate.exponent.float_value = 1.0 op_tag.qubit_constant_index.append(0) op_tag.token_constant_index = 1 op_symbol = v2.program_pb2.Operation() op_symbol.xpowgate.exponent.func.type = 'mul' op_symbol.xpowgate.exponent.func.args.add().arg_value.float_value = 2.0 op_symbol.xpowgate.exponent.func.args.add().symbol = 't' op_symbol.qubit_constant_index.append(2) c_op1 = v2.program_pb2.CircuitOperation() c_op1.circuit_constant_index = 3 rep_spec = c_op1.repetition_specification rep_spec.repetition_count = 2 rep_spec.repetition_ids.ids.extend(['a', 'b']) c_op2 = v2.program_pb2.CircuitOperation() c_op2.circuit_constant_index = 3 c_op2.repetition_specification.repetition_count = 1 qmap = c_op2.qubit_map.entries.add() qmap.key.id = '2_4' qmap.value.id = '2_5' proto = v2.program_pb2.Program( language=v2.program_pb2.Language(arg_function_language='exp', gate_set='my_gate_set'), circuit=v2.program_pb2.Circuit( scheduling_strategy=v2.program_pb2.Circuit.MOMENT_BY_MOMENT, moments=[ v2.program_pb2.Moment( operations=[op_tag], circuit_operations=[c_op1], ), v2.program_pb2.Moment( operations=[op_x], circuit_operations=[c_op2], ), ], ), constants=[ v2.program_pb2.Constant(qubit=v2.program_pb2.Qubit(id='2_5')), v2.program_pb2.Constant(string_value='abc123'), v2.program_pb2.Constant(qubit=v2.program_pb2.Qubit(id='2_4')), v2.program_pb2.Constant(circuit_value=v2.program_pb2.Circuit( scheduling_strategy=v2.program_pb2.Circuit.MOMENT_BY_MOMENT, moments=[v2.program_pb2.Moment(operations=[op_symbol], )], )), ], ) assert proto == serializer.serialize(circuit) assert serializer.deserialize(proto) == circuit
def test_str_repr(): example_tag = cirq_google.CalibrationTag('foo') assert str(example_tag) == 'CalibrationTag(\'foo\')' assert repr(example_tag) == 'cirq_google.CalibrationTag(\'foo\')' cirq.testing.assert_equivalent_repr(example_tag, setup_code=('import cirq\nimport cirq_google'))
def test_equality(): eq = cirq.testing.EqualsTester() eq.add_equality_group(cirq_google.CalibrationTag('blah'), cirq_google.CalibrationTag('blah')) eq.add_equality_group(cirq_google.CalibrationTag('blah2'))