code: def _secant2_inner_update(
      value_and_gradients_function,
      initial_args,
      val_0,
      val_c,
      f_lim,
      sufficient_decrease_param,
      curvature_param,
  ):
      """Helper function for secant-square step."""
      # Fail if `val_c` is no longer finite.
      new_failed = initial_args.active & ~is_finite(val_c)
      active = initial_args.active & ~new_failed
      failed = initial_args.failed | new_failed
  
      # We converge when we find a point satisfying the Wolfe conditions, in those
      # cases we set `val_left = val_right = val_c`.
      found_wolfe = active & _satisfies_wolfe(
          val_0,
          val_c,
          f_lim,
          sufficient_decrease_param,
          curvature_param,
      )
      val_left = val_where(found_wolfe, val_c, initial_args.left)
      val_right = val_where(found_wolfe, val_c, initial_args.right)
      converged = initial_args.converged | found_wolfe
      active = active & ~found_wolfe
  
      # If any active batch members remain, we apply the `update` function to
      # squeeze further their corresponding left/right bracketing interval.
      def _apply_update():
          update_result = update(
              value_and_gradients_function,
              val_left,
              val_right,
              val_c,
              f_lim,
              active=active,
          )
          return _Secant2Result(
              active=tf.zeros_like(
                  active
              ),  # End of secant2, no actives anymore.
              converged=converged,
              failed=failed | update_result.failed,
              num_evals=initial_args.num_evals
              + update_result.num_evals,
              left=update_result.left,
              right=update_result.right,
          )
  
      # Otherwise just return the current results.
      def _default():
          return _Secant2Result(
              active=active,
              converged=converged,
              failed=failed,
              num_evals=initial_args.num_evals,
              left=val_left,
              right=val_right,
          )
  
      return prefer_static.cond(
          tf.reduce_any(active), _apply_update, _default
      )
  
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 4 for calling a global function with example usage: _secant2_inner_update(value_and_gradients_function, initial_args, val_0, val_c, f_lim, sufficient_decrease_param, curvature_param) and returns: prefer_static, _Secant2Result, _Secant2Result