class_docstr: Visitor optimizes the operation graph (see nodes.py).
  
  This operates on the translated graph which is emitted by the
  `_TranslateVisitor`, and performs optimizations.
  
  Namely, when enabled, this enables reading and writing from/to analyzer
  accumulator cache to avoid recomputing them over already seen datasets.
  This type of optimization requires also creating a partitioned view of the
  input data, according to the `is_partitionable` annotation.
docstr: Applies a shardable operation on a fine grained view.
  
  This also updates `cache_output_nodes` when necessary.
  
  Args:
    operation_def: A shardable `OperationDef`.
    fine_grained_views: A tuple of `_OptimizationView.fine_grained_view`s.
    next_hashed_path: The hashed path for the currently processed
      operation_def.
  
  Returns:
    The resulting list of `_OptimizationView.fine_grained_view`s.
docstr_tok: ["Applies","a","shardable","operation","on","a","fine","grained","view",".","This","also","updates","`","cache_output_nodes","`","when","necessary",".","Args",":","operation_def",":","A","shardable","`","OperationDef","`",".","fine_grained_views",":","A","tuple","of","`","_OptimizationView.fine_grained_view","`","s",".","next_hashed_path",":","The","hashed","path","for","the","currently","processed","operation_def",".","Returns",":","The","resulting","list","of","`","_OptimizationView.fine_grained_view","`","s","."]
code: def _apply_operation_on_fine_grained_view(
      self, operation_def, fine_grained_views, next_hashed_path
  ):
      """Applies a shardable operation on a fine grained view.
  
      This also updates `cache_output_nodes` when necessary.
  
      Args:
        operation_def: A shardable `OperationDef`.
        fine_grained_views: A tuple of `_OptimizationView.fine_grained_view`s.
        next_hashed_path: The hashed path for the currently processed
          operation_def.
  
      Returns:
        The resulting list of `_OptimizationView.fine_grained_view`s.
      """
      result_fine_grained_view = collections.OrderedDict()
  
      cache_entry_key = analyzer_cache.make_cache_entry_key(
          tf.compat.as_bytes(operation_def.label)
          + b"-"
          + next_hashed_path
      )
  
      for dataset_idx, dataset_key in enumerate(
          self._sorted_dataset_keys
      ):
          # We use an index for the label in order to make beam labels more stable.
          infix = f"AnalysisIndex{dataset_idx}"
          if (
              operation_def.cache_coder
              and self._cache_dict
              and self._cache_dict.get(dataset_key, {}).get(
                  cache_entry_key
              )
              is not None
          ):
              self._dataset_has_cache_misses[dataset_key] |= False
              decode_cache = analyzer_nodes.DecodeCache(
                  dataset_key,
                  cache_entry_key,
                  coder=operation_def.cache_coder,
                  label=f"DecodeCache[{operation_def.label}][{infix}]",
              )
              (op_output,) = nodes.OperationNode(
                  decode_cache, tuple()
              ).outputs
              self._num_decode_cache_nodes += 1
          else:
              value_nodes = tuple(
                  v[dataset_key] for v in fine_grained_views
              )
              (op_output,) = nodes.OperationNode(
                  operation_def._replace(
                      label=f"{operation_def.label}[{infix}]"
                  ),
                  value_nodes,
              ).outputs
              if operation_def.cache_coder and dataset_key.is_cached:
                  self._dataset_has_cache_misses[dataset_key] = True
                  encode_cache = nodes.apply_operation(
                      analyzer_nodes.EncodeCache,
                      op_output,
                      coder=operation_def.cache_coder,
                      label=f"EncodeCache[{operation_def.label}][{infix}]",
                  )
                  self.cache_output_nodes[
                      (dataset_key, cache_entry_key)
                  ] = encode_cache
                  self._num_encode_cache_nodes += 1
          result_fine_grained_view[dataset_key] = op_output
  
      return result_fine_grained_view
  
imports: import collections
  import dataclasses
  import hashlib
  from typing import Collection, Dict, Mapping, Optional, Tuple
  from typing import OrderedDict
  import tensorflow
  from tensorflow_transform import analyzer_nodes
  from tensorflow_transform import common_types
  from tensorflow_transform import graph_tools
  from tensorflow_transform import impl_helper
  from tensorflow_transform import nodes
  from tensorflow_transform import tf2_utils
  from tensorflow_transform import tf_utils
  from tensorflow_transform.beam import analyzer_cache
  from tensorflow_transform.beam import beam_nodes
  from tensorflow_transform.beam import combiner_packing_util
label_desc: Use image node_id 7 for calling the _OptimizeVisitor obj's underlying member method code with example usage: obj._apply_operation_on_fine_grained_view(operation_def, fine_grained_views, next_hashed_path) and returns: result_fine_grained_view