code: def double_backward(
      g_dx0,
      g_db0,
      g_dg0,
      g_dz0,
      dy,
      x0,
      b0,
      g0,
      rm,
      rv,
      y0,
      z0,
      axes,
      decay_rate,
      eps,
      nonlinearity,
      batch_stat,
  ):
      # Factorized forward graph looks like
      # [x0, b0, g0, rm, rv] -> BN -> [u(, z0)] -> Add -> [v] -> ReLU -> [y]
      # Factorized backward graph looks like
      # [dy] -> d(ReLU) -> [dv] -> d(Add) -> [du(, dz0)] -> d(BN) -> [dx0, db0, dg0, drm, drv]
  
      # 1ST-ORDER
      # d(Avtivation)
      if nonlinearity == "relu":
          m0 = F.greater_scalar(y0, 0)
          m0 = no_grad(m0)
          dv = dy * m0
      elif nonlinearity == "":
          dv = dy
      # d(Add)
      du = dv
  
      # 2ND-ORDER
      # dd(BN)
      bn_double_backward = (
          bn_double_backward_for_batch
          if batch_stat
          else bn_double_backward_for_global
      )
      g_du, g_x0, g_b0, g_g0 = bn_double_backward(
          g_dx0,
          g_db0,
          g_dg0,
          du,
          x0,
          b0,
          g0,
          rm,
          rv,
          axes,
          decay_rate,
          eps,
      )
      # dd(Add)
      g_dv = g_du
      if g_dz0:
          g_dv += g_dz0
      # dd(Activation)
      if nonlinearity == "relu":
          g_dy = g_dv * m0
      elif nonlinearity == "":
          g_dy = g_dv
  
      return g_dy, g_x0, g_b0, g_g0
  
imports: import nnabla
  import nnabla.function
  import nnabla.functions
  from nnabla.function import PythonFunction
  from .batch_normalization import double_backward_for_batch
  from .batch_normalization import double_backward_for_global
  from .utils import no_grad
label_desc: Use image node_id 1 for calling a global function with example usage: double_backward(g_dx0, g_db0, g_dg0, g_dz0, dy, x0, b0, g0, rm, rv, y0, z0, axes, decay_rate, eps, nonlinearity, batch_stat) and returns: g_dy,  g_x0,  g_b0,  g_g0