code: def __init__(self, gdict=None, inputs=None, outputs=None, ret=None):
      if gdict is None:
          gdict = {}
      self.graph = gdict
      self.inputs = [] if inputs is None else inputs
      self.outputs = [] if outputs is None else outputs
      self.input_types = []
      self.output_types = []
  
      # ret is a mapping from the output arg names from `signature` to the
      # outputs from `node_def` that should be returned by the function.
      # Only used in TF2 for getting indices when generating get_tuple ops
      # for control flow ops. Because the sub-graph's outputs and control
      # flow node's outputs mapping is defined in `ret` dict. See usages in
      # tf_graph_pass: rewrite_control_flow_functions for details.
      # https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/framework/function.proto
      self.ret = [] if ret is None else ret
  
      check_connections(gdict)
  
      # respect TF inputs/outputs if given, otherwise, infer from the graph
      # in currently implementation: TF1 will always infer from graph. TF2,
      # on the other hand, respect the inputs/outputs provided.
      if len(self.inputs) == 0 or len(self.outputs) == 0:
          self.find_inputs_and_outputs()
      else:
          self.inputs, self.outputs = inputs, outputs
          self.filter_inputs_and_outputs()
  
imports: import copy
  from coremltools import _logger
  from coremltools.converters.mil.mil import types
  from .basic_graph_ops import check_connections, const_determined_nodes
  from .dot_visitor import DotVisitor
  from .naming_utils import escape_fn_name
label_desc: Use image node_id 1 to create a new SSAFunction object  with example: obj = SSAFunction(gdict, inputs, outputs, ret)