code: def _secant2_inner(
      value_and_gradients_function,
      initial_args,
      val_0,
      val_c,
      f_lim,
      sufficient_decrease_param,
      curvature_param,
  ):
      """Helper function for secant square."""
      # Apply the `update` function on active branch members to squeeze their
      # bracketing interval.
      update_result = update(
          value_and_gradients_function,
          initial_args.left,
          initial_args.right,
          val_c,
          f_lim,
          active=initial_args.active,
      )
  
      # Update active and failed flags, update left/right on non-failed entries.
      active = initial_args.active & ~update_result.failed
      failed = initial_args.failed | update_result.failed
      val_left = val_where(
          active, update_result.left, initial_args.left
      )
      val_right = val_where(
          active, update_result.right, initial_args.right
      )
  
      # Check if new `c` points should be generated.
      updated_left = active & tf.equal(val_left.x, val_c.x)
      updated_right = active & tf.equal(val_right.x, val_c.x)
      is_new = updated_left | updated_right
  
      next_c = tf.where(
          updated_left, _secant(initial_args.left, val_left), val_c.x
      )
      next_c = tf.where(
          updated_right, _secant(initial_args.right, val_right), next_c
      )
      in_range = (val_left.x <= next_c) & (next_c <= val_right.x)
  
      # Figure out if an extra function evaluation is needed for new `c` points.
      needs_extra_eval = tf.reduce_any(in_range & is_new)
      num_evals = initial_args.num_evals + update_result.num_evals
      num_evals = num_evals + tf.cast(needs_extra_eval, num_evals.dtype)
  
      next_args = _Secant2Result(
          active=active
          & in_range,  # No longer active if `c` is out of range.
          converged=initial_args.converged,
          failed=failed,
          num_evals=num_evals,
          left=val_left,
          right=val_right,
      )
  
      def _apply_inner_update():
          next_val_c = prefer_static.cond(
              needs_extra_eval,
              (lambda: value_and_gradients_function(next_c)),
              (lambda: val_c),
          )
          return _secant2_inner_update(
              value_and_gradients_function,
              next_args,
              val_0,
              next_val_c,
              f_lim,
              sufficient_decrease_param,
              curvature_param,
          )
  
      return prefer_static.cond(
          tf.reduce_any(next_args.active),
          _apply_inner_update,
          lambda: next_args,
      )
  
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 3 for calling a global function with example usage: _secant2_inner(value_and_gradients_function, initial_args, val_0, val_c, f_lim, sufficient_decrease_param, curvature_param) and returns: prefer_static, _secant2_inner_update