class_docstr: ExecutionDecision records how executor should perform next execution.
  
  Attributes:
    input_dict: Updated key -> types.Artifact for inputs that will be used by
      actual execution.
    output_dict: Updated key -> types.Artifact for outputs that will be used by
      actual execution.
    exec_properties: Updated dict of other execution properties that will be
      used by actual execution.
    execution_id: Registered execution_id for the upcoming execution.
    use_cached_results: Whether or not to use a cached result.
code: def __init__(
      self,
      input_dict: Dict[str, List[types.Artifact]],
      output_dict: Dict[str, List[types.Artifact]],
      exec_properties: Dict[str, Any],
      execution_id: Optional[int] = None,
      use_cached_results: Optional[bool] = False,
  ):
      self.input_dict = input_dict
      self.output_dict = output_dict
      self.exec_properties = exec_properties
      self.execution_id = execution_id
      self.use_cached_results = use_cached_results
  
imports: from typing import Any, Dict, List, Optional, Type, Union
  from tfx import types
  from tfx.dsl.placeholder import placeholder
  from tfx.utils import json_utils
label_desc: Use image node_id 1 to create a new ExecutionDecision object  with example: obj = ExecutionDecision(input_dict, output_dict, exec_properties, execution_id, use_cached_results)