code: def _prepare_args(
      value_and_gradients_function,
      initial_step_size,
      val_initial,
      val_0,
      approximate_wolfe_threshold,
  ):
      """Prepares the arguments for the line search initialization.
  
      Args:
        value_and_gradients_function: A Python callable that accepts a real scalar
          tensor and returns a namedtuple with the fields 'x', 'f', and 'df' that
          correspond to scalar tensors of real dtype containing the point at which
          the function was evaluated, the value of the function, and its
          derivative at that point. The other namedtuple fields, if present,
          should be tensors or sequences (possibly nested) of tensors.
          In usual optimization application, this function would be generated by
          projecting the multivariate objective function along some specific
          direction. The direction is determined by some other procedure but should
          be a descent direction (i.e. the derivative of the projected univariate
          function must be negative at 0.).
          Alternatively, the function may represent the batching of `n` such line
          functions (e.g. projecting a single multivariate objective function along
          `n` distinct directions at once) accepting n points as input, i.e. a
          tensor of shape [n], and the fields 'x', 'f' and 'df' in the returned
          namedtuple should each be a tensor of shape [n], with the corresponding
          input points, function values, and derivatives at those input points.
        initial_step_size: Scalar positive `Tensor` of real dtype, or a tensor of
          shape [n] in batching mode. The initial value (or values) to try to
          bracket the minimum. Default is `1.` as a float32.
          Note that this point need not necessarily bracket the minimum for the line
          search to work correctly but the supplied value must be greater than 0.
          A good initial value will make the search converge faster.
        val_initial: The full return value of evaluating
          value_and_gradients_function at initial_step_size, i.e. a namedtuple with
          'x', 'f', 'df', if already known by the caller. If not None the value of
          `initial_step_size` will be ignored, otherwise the tuple will be computed
          by evaluating value_and_gradients_function.
        val_0: The full return value of value_and_gradients_function at `0.`, i.e.
          a namedtuple with 'x', 'f', 'df', if already known by the caller. If None
          the tuple will be computed by evaluating value_and_gradients_function.
        approximate_wolfe_threshold: Scalar positive `Tensor` of
          real dtype. Corresponds to the parameter 'epsilon' in
          [Hager and Zhang (2006)][2]. Used to estimate the
          threshold at which the line search switches to approximate Wolfe
          conditions.
  
      Returns:
        left: A namedtuple, as returned by value_and_gradients_function,
          containing the value and derivative of the function at `0.`.
        val_initial: A namedtuple, as returned by value_and_gradients_function,
          containing the value and derivative of the function at
          `initial_step_size`.
        f_lim: Real `Tensor` of shape [n]. The function value threshold for
          the approximate Wolfe conditions to be checked.
        eval_count: Scalar int32 `Tensor`. The number of target function
          evaluations made by this function.
      """
      eval_count = 0
      if val_initial is None:
          if initial_step_size is not None:
              initial_step_size = tf.convert_to_tensor(
                  initial_step_size
              )
          else:
              initial_step_size = np.float32(1.0)
          val_initial = value_and_gradients_function(initial_step_size)
          eval_count += 1
  
      if val_0 is None:
          x_0 = tf.zeros_like(val_initial.x)
          val_0 = value_and_gradients_function(x_0)
          eval_count += 1
  
      f_lim = val_0.f + (
          approximate_wolfe_threshold * tf.math.abs(val_0.f)
      )
      return val_0, val_initial, f_lim, tf.convert_to_tensor(eval_count)
  
file_path: probability/tensorflow_probability/python/optimizer/linesearch/hager_zhang.py
imports: import collections
  import numpy
  import tensorflow.compat.v2
  from tensorflow_probability.python.internal import dtype_util
  from tensorflow_probability.python.internal import prefer_static
  from tensorflow_probability.python.optimizer.linesearch.internal import hager_zhang_lib
label_desc: Use image node_id 6 for calling a global function with example usage: _prepare_args(value_and_gradients_function, initial_step_size, val_initial, val_0, approximate_wolfe_threshold) and returns: val_0,  val_initial,  f_lim,  tf