code: def _zoneoutlstm(func, c, h, x, c_creator, h_creator):
      device = backend.get_device_from_array(x)
      with chainer.using_device(device):
          xp = device.xp
          lstm_in = x.dot(func.upward.W.data.T)
          lstm_in += h.dot(func.lateral.W.data.T)
          lstm_in = xp.reshape(
              lstm_in, (len(lstm_in), lstm_in.shape[1] // 4, 4)
          )
          a, i, f, o = xp.split(lstm_in, 4, 2)
          a = xp.reshape(a, (len(a), a.shape[1]))
          i = xp.reshape(i, (len(i), i.shape[1]))
          f = xp.reshape(f, (len(f), f.shape[1]))
          o = xp.reshape(o, (len(o), o.shape[1]))
  
          c_tmp = xp.tanh(a) * _sigmoid(i) + _sigmoid(f) * c
          c_next = c * c_creator.flag_h + c_tmp * c_creator.flag_x
          h_next = (
              h * h_creator.flag_h
              + (_sigmoid(o) * xp.tanh(c_tmp)) * h_creator.flag_x
          )
      return c_next, h_next
  
imports: import unittest
  import numpy
  import chainer
  from chainer import backend
  from chainer.backends import cuda
  from chainer import gradient_check
  from chainer import links
  from chainer import testing
  from chainer.testing import attr
label_desc: Use image node_id 2 for calling a global function with example usage: _zoneoutlstm(func, c, h, x, c_creator, h_creator) and returns: c_next,  h_next