t = Symbol.t(integer=True) dt = Symbol.d_t(integer=True) d0 = initial_offset(r, w, 0) d1 = initial_offset(r, w, 1) d2 = initial_offset(r, w, 2) i0 = i - d0 j0 = j - d1 t0 = t - d2 return Lamda[t:n2, j:n1, i:n0](Sum[sum_limit(r, w, n2, dt, t0, 2), sum_limit(r, w, n1, dj, j0, 1), sum_limit(r, w, n0, di, i0, 0)]( x[i0 + di * r[0], j0 + dj * r[1], t0 + dt * r[2]] @ w[di, dj, dt])) if batch_size: batch_size = batch_size[0] k = Symbol.k(integer=True) return Lamda[k:batch_size](conv3d(x[k], w)) else: return conv3d(x, w) conv3d = Function.conv3d(real=True, nargs=(2, ), eval=conv3d, shape=property(shape))