def serialize_circuit_op( self, op: cirq.Operation, msg: Optional[v2.program_pb2.CircuitOperation] = None, *, arg_function_language: Optional[str] = '', constants: Optional[List[v2.program_pb2.Constant]] = None, raw_constants: Optional[Dict[Any, int]] = None, ) -> Union[v2.program_pb2.Operation, v2.program_pb2.CircuitOperation]: """Serialize a CircuitOperation to cirq.google.api.v2.CircuitOperation proto. Args: op: The circuit operation to serialize. msg: An optional proto object to populate with the serialization results. arg_function_language: The `arg_function_language` field from `Program.Language`. constants: The list of previously-serialized Constant protos. raw_constants: A map raw objects to their respective indices in `constants`. Returns: The cirq.google.api.v2.CircuitOperation proto. Raises: ValueError: If one of `constants` or `raw_constants` is None, or the circuit operation cannot be serialized. """ circuit = getattr(op.untagged, 'circuit', None) if constants is None or raw_constants is None: raise ValueError( 'CircuitOp serialization requires a constants list and a corresponding ' 'map of pre-serialization values to indices (raw_constants).') if cirq.FrozenCircuit in self.serializers: serializer = self.serializers[cirq.FrozenCircuit][0] if circuit not in raw_constants: subcircuit_msg = v2.program_pb2.Circuit() self._serialize_circuit( circuit, subcircuit_msg, arg_function_language=arg_function_language, constants=constants, raw_constants=raw_constants, ) constants.append( v2.program_pb2.Constant(circuit_value=subcircuit_msg)) raw_constants[circuit] = len(constants) - 1 proto_msg = serializer.to_proto( op, msg, arg_function_language=arg_function_language, constants=constants, raw_constants=raw_constants, ) if proto_msg is not None: return proto_msg raise ValueError(f'Cannot serialize CircuitOperation {op!r}')
def _serialize_circuit_op( self, op: cirq.CircuitOperation, msg: Optional[v2.program_pb2.CircuitOperation] = None, *, arg_function_language: Optional[str] = '', constants: Optional[List[v2.program_pb2.Constant]] = None, raw_constants: Optional[Dict[Any, int]] = None, ) -> v2.program_pb2.CircuitOperation: """Serialize a CircuitOperation to cirq.google.api.v2.CircuitOperation proto. Args: op: The circuit operation to serialize. msg: An optional proto object to populate with the serialization results. arg_function_language: The `arg_function_language` field from `Program.Language`. constants: The list of previously-serialized Constant protos. raw_constants: A map raw objects to their respective indices in `constants`. Returns: The cirq.google.api.v2.CircuitOperation proto. Raises: ValueError: If `constant` or `raw_constants` are not specified. """ circuit = op.circuit if constants is None or raw_constants is None: raise ValueError( 'CircuitOp serialization requires a constants list and a corresponding ' 'map of pre-serialization values to indices (raw_constants).' ) serializer = op_serializer.CircuitOpSerializer() if circuit not in raw_constants: subcircuit_msg = v2.program_pb2.Circuit() self._serialize_circuit( circuit, subcircuit_msg, arg_function_language=arg_function_language, constants=constants, raw_constants=raw_constants, ) constants.append(v2.program_pb2.Constant(circuit_value=subcircuit_msg)) raw_constants[circuit] = len(constants) - 1 return serializer.to_proto( op, msg, arg_function_language=arg_function_language, constants=constants, raw_constants=raw_constants, )
def serialize_gate_op( self, op: cirq.Operation, msg: Optional[v2.program_pb2.Operation] = None, *, arg_function_language: Optional[str] = '', constants: Optional[List[v2.program_pb2.Constant]] = None, raw_constants: Optional[Dict[Any, int]] = None, ) -> v2.program_pb2.Operation: """Serialize an Operation to cirq_google.api.v2.Operation proto. Args: op: The operation to serialize. msg: An optional proto object to populate with the serialization results. arg_function_language: The `arg_function_language` field from `Program.Language`. constants: The list of previously-serialized Constant protos. raw_constants: A map raw objects to their respective indices in `constants`. Returns: The cirq.google.api.v2.Operation proto. Raises: ValueError: If the op cannot be serialized. """ gate_type = type(op.gate) for gate_type_mro in gate_type.mro(): # Check all super classes in method resolution order. if gate_type_mro in self.serializers: # Check each serializer in turn, if serializer proto returns # None, then skip. for serializer in self.serializers[gate_type_mro]: proto_msg = serializer.to_proto( op, msg, arg_function_language=arg_function_language, constants=constants, raw_constants=raw_constants, ) if proto_msg is not None: return proto_msg raise ValueError(f'Cannot serialize op {op!r} of type {gate_type}')