class_docstr: A visitor that inspects the graph and looks for combine nodes.
  
  This visitor takes the grouped combines and performs the packing of those
  combines.
                 Before packing
             ...               ...
              /                  \
           Combine1             Combine2
             /                     \
  ExtractCombineMergeOutputs1    ExtractCombineMergeOutputs2
  
                 After packing
             ...        ...
              /           \
           AddKey1         AddKey2
              \             /
               \           /
                \         /
                  Flatten
                     |
                 PackedCombineMerge
               /                    \
     ExtractFromDict1              ExtractFromDict2
              /                        \
  ExtractPackedCombineMergeOutputs1    ExtractPackedCombineMergeOutputs2
  
  Since the inputs to the final flatten node before the packed merge come from
  different paths, we add redundant flatten and packed merge nodes each time we
  visit a new input of the final flatten node. At the end of this traversal,
  we would have one final packed merge node with a corresponding flatten node
  having all the needed inputs, and in addition to this we would have a set of
  redundant packed merge and flatten nodes which needs to be removed.
class_docstr_tok: ["A","visitor","that","inspects","the","graph","and","looks","for","combine","nodes",".","This","visitor","takes","the","grouped","combines","and","performs","the","packing","of","those","combines",".","Before","packing","...","...","\/","\\","Combine1","Combine2","\/","\\","ExtractCombineMergeOutputs1","ExtractCombineMergeOutputs2","After","packing","...","...","\/","\\","AddKey1","AddKey2","\\","\/","\\","\/","\\","\/","Flatten","|","PackedCombineMerge","\/","\\","ExtractFromDict1","ExtractFromDict2","\/","\\","ExtractPackedCombineMergeOutputs1","ExtractPackedCombineMergeOutputs2","Since","the","inputs","to","the","final","flatten","node","before","the","packed","merge","come","from","different","paths",",","we","add","redundant","flatten","and","packed","merge","nodes","each","time","we","visit","a","new","input","of","the","final","flatten","node",".","At","the","end","of","this","traversal",",","we","would","have","one","final","packed","merge","node","with","a","corresponding","flatten","node","having","all","the","needed","inputs",",","and","in","addition","to","this","we","would","have","a","set","of","redundant","packed","merge","and","flatten","nodes","which","needs","to","be","removed","."]
code: def _add_flatten_placeholder(self, operation_def, input_values):
      assert isinstance(
          operation_def, analyzer_nodes.ExtractCombineMergeOutputs
      )
      parent = input_values[0].parent_operation
      assert isinstance(
          parent.operation_def, analyzer_nodes.CacheableCombineMerge
      )
      packed_combine = self._get_packed_combine(
          parent.operation_def, parent.inputs
      )
      # For the current combine, create the ExtractFromDict node which
      # extracts the accumulator corresponding to this combine from the
      # packed combine output.
      extract_dict_node = nodes.apply_operation(
          beam_nodes.ExtractFromDict,
          packed_combine,
          keys=parent.operation_def.label,
          label="ExtractFromDict[{}]".format(
              parent.operation_def.label
          ),
      )
      # Create the new ExtractPackedCombineMergeOutputs node.
      return nodes.apply_multi_output_operation(
          analyzer_nodes.ExtractPackedCombineMergeOutputs,
          extract_dict_node,
          output_tensor_info_list=operation_def.output_tensor_infos,
          label="ExtractPackedCombineMergeOutputs[{}]".format(
              parent.operation_def.label
          ),
      )
  
imports: import collections
  import dataclasses
  from typing import Sequence
  from tensorflow_transform import analyzer_nodes
  from tensorflow_transform import nodes
  from tensorflow_transform.beam import beam_nodes
label_desc: Use image node_id 3 for calling the _PackMergeCombineVisitor obj's underlying member method code with example usage: obj._add_flatten_placeholder(operation_def, input_values) and returns: nodes