code: def check_double_backward(
      self, h_data, x_data, y_grad, h_grad_grad, x_grad_grad
  ):
      xp = backend.get_array_module(h_data)
      flag_x = xp.random.rand(*x_data.shape)
  
      def f(h, x):
          # As forward computation is executed multiple times in
          # check_double_backward, use a fixed flag.
          xp_str = "numpy" if xp is numpy else "cupy"
          with mock.patch(
              "{}.random.rand".format(xp_str), return_value=flag_x
          ) as mock_rand:
              y = functions.zoneout(h, x, self.ratio)
              mock_rand.assert_called_once_with(*x.shape)
          return y
  
      gradient_check.check_double_backward(
          f,
          (h_data, x_data),
          y_grad,
          (h_grad_grad, x_grad_grad),
          dtype=numpy.float64,
      )
  
imports: import unittest
  import mock
  import numpy
  import chainer
  from chainer import backend
  from chainer.backends import cuda
  from chainer import functions
  from chainer import gradient_check
  from chainer import testing
  from chainer.testing import attr
label_desc: Use image node_id 4 for calling the TestZoneout obj's underlying member method code with example usage: obj.check_double_backward(h_data, x_data, y_grad, h_grad_grad, x_grad_grad) and returns: y