code: def _satisfies_wolfe(
      val_0, val_c, f_lim, sufficient_decrease_param, curvature_param
  ):
      """Checks whether the Wolfe or approx Wolfe conditions are satisfied.
  
      The Wolfe conditions are a set of stopping criteria for an inexact line search
      algorithm. Let f(a) be the function value along the search direction and
      df(a) the derivative along the search direction evaluated a distance 'a'.
      Here 'a' is the distance along the search direction. The Wolfe conditions are:
  
        ```None
          f(a) <= f(0) + delta * a * df(0)   (Armijo/Sufficient decrease condition)
          df(a) >= sigma * df(0)             (Weak curvature condition)
        ```
      `delta` and `sigma` are two user supplied parameters satisfying:
       `0 < delta < sigma <= 1.`. In the following, delta is called
       `sufficient_decrease_param` and sigma is called `curvature_param`.
  
      On a finite precision machine, the Wolfe conditions are difficult to satisfy
      when one is close to the minimum. Hence, Hager-Zhang propose replacing
      the sufficient decrease condition with the following condition on the
      derivative in the vicinity of a minimum.
  
        ```None
          df(a) <= (2 * delta - 1) * df(0)  (Approx Wolfe sufficient decrease)
        ```
      This condition is only used if one is near the minimum. This is tested using
  
        ```None
          f(a) <= f(0) + epsilon * |f(0)|
        ```
      The following function checks both the Wolfe and approx Wolfe conditions.
      Here, `epsilon` is a small positive constant. In the following, the argument
      `f_lim` corresponds to the product: epsilon * |f(0)|.
  
      Args:
        val_0: A namedtuple, as returned by value_and_gradients_function
          evaluated at 0.
        val_c: A namedtuple, as returned by value_and_gradients_function
          evaluated at the point to be tested.
        f_lim: Scalar `Tensor` of real dtype. The function value threshold for
          the approximate Wolfe conditions to be checked.
        sufficient_decrease_param: Positive scalar `Tensor` of real dtype.
          Bounded above by the curvature param. Corresponds to 'delta' in the
          terminology of [Hager and Zhang (2006)][2].
        curvature_param: Positive scalar `Tensor` of real dtype. Bounded above
          by `1.`. Corresponds to 'sigma' in the terminology of
          [Hager Zhang (2005)][1].
  
      Returns:
        is_satisfied: A scalar boolean `Tensor` which is True if either the
          Wolfe or approximate Wolfe conditions are satisfied.
      """
      exact_wolfe_suff_dec = (
          sufficient_decrease_param * val_0.df
          >= tf.math.divide_no_nan(val_c.f - val_0.f, val_c.x)
      )
      wolfe_curvature = val_c.df >= curvature_param * val_0.df
      exact_wolfe = exact_wolfe_suff_dec & wolfe_curvature
      approx_wolfe_applies = val_c.f <= f_lim
      approx_wolfe_suff_dec = (
          2 * sufficient_decrease_param - 1
      ) * val_0.df >= val_c.df
      approx_wolfe = (
          approx_wolfe_applies & approx_wolfe_suff_dec & wolfe_curvature
      )
      is_satisfied = exact_wolfe | approx_wolfe
      return is_satisfied
  
file_path: probability/tensorflow_probability/python/optimizer/linesearch/internal/hager_zhang_lib.py
imports: import collections
  import tensorflow.compat.v2
  from tensorflow_probability.python.internal import broadcast_util
  from tensorflow_probability.python.internal import prefer_static
label_desc: Use image node_id 14 for calling a global function with example usage: _satisfies_wolfe(val_0, val_c, f_lim, sufficient_decrease_param, curvature_param) and returns: is_satisfied