class_docstr: To deal with ValueChoice used as a parameter of a basic unit.
  
  Should be used together with :class:`ParameterChoiceLeafMutator`.
  :class:`ParameterChoiceMutator` is an empty-shell mutator.
  It calculates all the parameter values based on previous mutations of :class:`ParameterChoiceLeafMutator`.
code: def mutate(self, model: GraphModelSpace) -> None:
      # Retrieve the mutation records from history.
      # looks like {"label1": "cat", "label2": 123}
      value_choice_decisions = {}
      for mutation in model.history:
          if isinstance(mutation.mutator, ParameterChoiceLeafMutator):
              value_choice_decisions[
                  mutation.mutator.label
              ] = mutation.samples[0]
  
      for node, argname in self.nodes:
          # argname is the location of the argument
          # e.g., Conv2d(out_channels=nn.ValueChoice([1, 2, 3])) => argname = "out_channels"
          value_choice: MutableExpression = node.operation.parameters[
              argname
          ]
  
          if self._within_dry_run:
              # Dry-run mode. Fake the value based on the frozen context.
              context = frozen_context.current()
              assert context is not None
              context_before_keys = set(context.keys())
              result_value = value_choice.robust_default(context)
              frozen_context.update(
                  {
                      key: value
                      for key, value in context.items()
                      if key not in context_before_keys
                  }
              )
          else:
              # calculate all the values on the leaf node of ValueChoiceX computation graph
              result_value = value_choice.freeze(value_choice_decisions)
  
          # update model with graph mutation primitives
          target = cast(Node, model.get_node_by_name(node.name))
          target.update_operation(
              target.operation.type,
              {**target.operation.parameters, argname: result_value},
          )
  
imports: from __future__ import annotations
  from typing import Any, List, Tuple, Dict, Iterable, cast
  from nni.mutable import MutableExpression, Categorical, frozen_context, label_scope
  from nni.nas.space import Graph, GraphModelSpace, Node, StationaryMutator, Mutator
  from nni.nas.space.graph_op import Cell
label_desc: Use image node_id 3 for calling the ParameterChoiceMutator obj's underlying member method code with example usage: obj.mutate(model) without return types