code: def test_nondifferentiable_body2(capfd):
      def cond_fun(carry):
          return True
  
      # This function is set up so that (x, y, z) require multiple passes through to
      # propagate which values are perturbed.
      # This function is set up so that w has a cotangent that should be dropped.
      def body_fun(carry):
          x, y, z, w = carry
          w = eqxi.nondifferentiable(w)
          return x + 1, x + y, y + z, w * 2
  
      @jax.jit
      @jax.grad
      def run(x, y, z, w):
          x, y, z, w = eqxi.while_loop(
              cond_fun,
              body_fun,
              (x, y, z, w),
              max_steps=3,
              kind="checkpointed",
          )
          return y + w
  
      capfd.readouterr()
      run(1.0, 1.0, 1.0, 1.0)
      text, _ = capfd.readouterr()
      assert (
          "perturb_val (False, False, False, (True, True, True, False))"
          in text
      )
      assert (
          "symbolic_zero_gradient (True, True, True, (False, False, True, True))"
          in text
      )
  
imports: import functools
  import timeit
  from typing import Optional
  import equinox
  import equinox.internal
  import jax
  import jax.lax
  import jax.lib
  import jax.numpy
  import jax.random
  import jax.tree_util
  import pytest
  from .helpers import tree_allclose
label_desc: Use image node_id 20 for calling a global function with example usage: test_nondifferentiable_body2(capfd) and returns: True, unknown,  unknown,  unknown,  unknown, unknown