def __init__(
        self,
        circuit: cirq.AbstractCircuit,
        measurement: BitstringsMeasurement,
        params: Sequence[TParamPair] | cirq.ParamResolverOrSimilarType = None,
        spec: ExecutableSpec | None = None,
        problem_topology: cirq.NamedTopology | None = None,
        initial_state: cirq.ProductState | None = None,
    ):
        """Initialize the quantum executable.

        The actual fields in this class are immutable, but we allow more liberal input types
        which will be frozen in this __init__ method.

        Args:
            circuit: The circuit. This will be frozen before being set as an attribute.
            measurement: A description of the measurement properties or process.
            params: A cirq.ParamResolverOrSimilarType which will be frozen into a tuple of
                key value pairs.
            spec: Specification metadata about this executable that is not used by the quantum
                runtime, but is persisted in result objects to associate executables with results.
            problem_topology: Description of the multiqubit gate topology present in the circuit.
                If not specified, the circuit must be compatible with the device topology.
            initial_state: How to initialize the quantum system before running `circuit`. If not
                specified, the device will be initialized into the all-zeros state.
        """

        # We care a lot about mutability in this class. No object is truly immutable in Python,
        # but we can get pretty close by following the example of dataclass(frozen=True), which
        # deletes this class's __setattr__ magic method. To set values ever, we use
        # object.__setattr__ in this __init__ function.
        #
        # We write our own __init__ function to be able to accept a wider range of input formats
        # that can be easily converted to our native, immutable format.
        object.__setattr__(self, 'circuit', circuit.freeze())
        object.__setattr__(self, 'measurement', measurement)

        if isinstance(params, tuple) and all(
            isinstance(param_kv, tuple) and len(param_kv) == 2 for param_kv in params
        ):
            frozen_params = params
        elif isinstance(params, Sequence) and all(
            isinstance(param_kv, Sequence) and len(param_kv) == 2 for param_kv in params
        ):
            frozen_params = tuple((k, v) for k, v in params)
        elif params is None or isinstance(params, (cirq.ParamResolver, dict)):
            param_resolver = cirq.ParamResolver(cast(cirq.ParamResolverOrSimilarType, params))
            frozen_params = tuple(param_resolver.param_dict.items())
        else:
            raise ValueError(f"`params` should be a ParamResolverOrSimilarType, not {params}.")
        object.__setattr__(self, 'params', frozen_params)

        object.__setattr__(self, 'spec', spec)
        object.__setattr__(self, 'problem_topology', problem_topology)
        object.__setattr__(self, 'initial_state', initial_state)

        # Hash may be expensive to compute, especially for large circuits.
        # This should be safe since this class should be immutable. This line will
        # also check for hashibility of members at construction time.
        object.__setattr__(self, '_hash', None)
        _ = hash(self)
Initialize the quantum executable.

        The actual fields in this class are immutable, but we allow more liberal input types
        which will be frozen in this __init__ method.

        Args:
            circuit: The circuit. This will be frozen before being set as an attribute.
            measurement: A description of the measurement properties or process.
            params: A cirq.ParamResolverOrSimilarType which will be frozen into a tuple of
                key value pairs.
            spec: Specification metadata about this executable that is not used by the quantum
                runtime, but is persisted in result objects to associate executables with results.
            problem_topology: Description of the multiqubit gate topology present in the circuit.
                If not specified, the circuit must be compatible with the device topology.
            initial_state: How to initialize the quantum system before running `circuit`. If not
                specified, the device will be initialized into the all-zeros state.
        
cirq-google/cirq_google/workflow/quantum_executable.py