code: def add_position_timing_signal(x, step, hparams):
      """Add n-dimensional embedding as the position (horizontal) timing signal.
  
      Args:
        x: a tensor with shape [batch, length, depth]
        step: step
        hparams: model hyper parameters
  
      Returns:
        a Tensor with the same shape as x.
  
      """
  
      if not hparams.position_start_index:
          index = 0
  
      elif hparams.position_start_index == "random":
          # Shift all positions randomly
          # TODO(dehghani): What would be reasonable for max number of shift?
          index = tf.random_uniform(
              [], maxval=common_layers.shape_list(x)[1], dtype=tf.int32
          )
  
      elif hparams.position_start_index == "step":
          # Shift positions based on the step
          if hparams.recurrence_type == "act":
              num_steps = hparams.act_max_steps
          else:
              num_steps = hparams.num_rec_steps
          index = tf.cast(
              common_layers.shape_list(x)[1] * step / num_steps,
              dtype=tf.int32,
          )
  
      # No need for the timing signal in the encoder/decoder input preparation
      assert hparams.pos is None
  
      length = common_layers.shape_list(x)[1]
      channels = common_layers.shape_list(x)[2]
      signal = common_attention.get_timing_signal_1d(
          length, channels, start_index=index
      )
  
      if hparams.add_or_concat_timing_signal == "add":
          x_with_timing = x + common_layers.cast_like(signal, x)
  
      elif hparams.add_or_concat_timing_signal == "concat":
          batch_size = common_layers.shape_list(x)[0]
          signal_tiled = tf.tile(signal, [batch_size, 1, 1])
          x_with_timing = tf.concat((x, signal_tiled), axis=-1)
  
      return x_with_timing
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import copy
  import functools
  from six.moves import range
  from tensor2tensor.layers import common_attention
  from tensor2tensor.layers import common_layers
  from tensor2tensor.models import transformer
  from tensor2tensor.utils import contrib
  from tensor2tensor.utils import expert_utils
  import tensorflow.compat.v1
label_desc: Use image node_id 20 for calling a global function with example usage: add_position_timing_signal(x, step, hparams) and returns: x_with_timing