code: def jvp_fd(fun, args, tangents):
      EPS = 1e-3
  
      def eval_eps(eps):
          return fun(
              *[
                  x if t is None else x + eps * t
                  for x, t in zip(args, tangents)
              ]
          )
  
      ys_neg = eval_eps(-EPS)
      ys_pos = eval_eps(EPS)
      ys = eval_eps(0.0)
      deriv = [
          (y_pos - y_neg) / (2 * EPS)
          for y_neg, y_pos in zip(ys_neg, ys_pos)
      ]
      return ys, deriv
  
imports: from collections import namedtuple
  from functools import partial
  import numpy.random
  from absl.testing import absltest
  from absl.testing import parameterized
  import itertools
  import jax.numpy
  from jax import jit, jvp, vjp
  import jax._src.test_util
  from jax import config
  from jax._src.util import unzip2, safe_zip, safe_map
label_desc: Use image node_id 21 for calling a global function with example usage: jvp_fd(fun, args, tangents) and returns: ys,  deriv, fun