code: def local_abstract_batch_norm_inference(node):
      if not isinstance(node.op, AbstractBatchNormInference):
          return None
  
      (
          x,
          scale,
          bias,
          estimated_mean,
          estimated_variance,
          epsilon,
      ) = node.inputs
  
      if (
          not isinstance(x.type, TensorType)
          or not isinstance(scale.type, TensorType)
          or not isinstance(bias.type, TensorType)
          or not isinstance(estimated_mean.type, TensorType)
          or not isinstance(estimated_variance.type, TensorType)
          or not isinstance(epsilon.type, TensorType)
      ):
          return None
  
      # The epsilon should not upcast the dtype.
      if (
          estimated_variance.dtype == "float32"
          and epsilon.dtype == "float64"
      ):
          epsilon = epsilon.astype("float32")
  
      result = (x - estimated_mean) * (
          scale / T.sqrt(estimated_variance + epsilon)
      ) + bias
      result = T.patternbroadcast(result, node.outputs[0].broadcastable)
  
      for var in theano.gof.graph.variables(node.inputs, [result]):
          if var not in node.inputs:
              copy_stack_trace(node.outputs[0], var)
      return [result]
  
imports: from __future__ import absolute_import, print_function, division
  import numpy
  import theano
  from theano import Apply, Op
  from theano.gof import local_optimizer
  from theano.gof.opt import copy_stack_trace
  from theano.tensor import as_tensor_variable, TensorType
  from theano.tensor import basic
  from theano.tensor.opt import register_specialize_device
  from theano.scalar import Composite, as_common_dtype
  from theano.scalar import add, sub, true_div, mul
label_desc: Use image node_id 7 for calling a global function with example usage: local_abstract_batch_norm_inference(node) and returns: list, None, None