code: def mix(x1,
          x2,
          steps,
          is_training,
          min_prob=0.0,
          max_prob=1.0,
          mode="lin",
          simple=False,
          broadcast_last=False):
    
    with tf.name_scope("mix"):
      if not is_training:
        if max_prob >= 1.0:
          return x1
        alpha_shape = shape_list(x1)
        if broadcast_last:
          alpha_shape = alpha_shape[:-1] + [1]
        alpha = tf.random_uniform(alpha_shape)
        alpha = to_float(tf.less(alpha, max_prob))
        return alpha * x1 + (1.0 - alpha) * x2
  
      def get_res():
        """Create the result.
  
        Separate function to speed it up later (see below).
  
        Returns:
          Tensor of mixed inputs.
        """
        if mode == "lin":
          alpha_p = inverse_lin_decay(steps)
        else:
          alpha_p = inverse_exp_decay(steps)
        alpha_p = alpha_p * (max_prob - min_prob) + min_prob
        if simple:
          return alpha_p * x1 + (1.0 - alpha_p) * x2
        alpha_shape = shape_list(x1)
        if broadcast_last:
          alpha_shape = alpha_shape[:-1] + [1]
        alpha = tf.random_uniform(alpha_shape)
        alpha = to_float(tf.less(alpha, alpha_p))
        return alpha * x1 + (1.0 - alpha) * x2
  
      if max_prob < 1.0:
        return get_res()
  
      # Prevent sampling after steps is passed to speed it up.
      if is_xla_compiled():
        return get_res()
      else:
        cur_step = tf.train.get_global_step()
        if cur_step is None:
          return x1  # Step not available, probably eval mode, don't mix.
        return tf.cond(tf.less(cur_step, steps), get_res, lambda: x1)
docs: Mix starting with x2, mixing mixing, going towards x1.