code: def forward(
      self,
      node_emb: Tensor,
      edge_emb: Tensor,
      i: Tensor,
      j: Tensor,
      idx_i: Tensor,
      idx_j: Tensor,
      idx_k: Tensor,
      idx_ji: Tensor,
      idx_kj: Tensor,
  ) -> Tensor:
      c2 = node_emb[i] * node_emb[j]
      c2 = self.bn_c2(self.lin_c2(c2))
      c2_filter, c2_core = c2.chunk(2, dim=1)
      c2_filter = c2_filter.sigmoid()
      c2_core = c2_core.tanh()
      c2_emb = self.bn_c2_2(c2_filter * c2_core)
  
      c3 = torch.cat(
          [
              node_emb[idx_i],
              node_emb[idx_j],
              node_emb[idx_k],
              edge_emb[idx_ji],
              edge_emb[idx_kj],
          ],
          dim=1,
      )
      c3 = self.bn_c3(self.lin_c3(c3))
      c3_filter, c3_core = c3.chunk(2, dim=1)
      c3_filter = c3_filter.sigmoid()
      c3_core = c3_core.tanh()
      c3_emb = scatter(
          c3_filter * c3_core,
          idx_ji,
          dim=0,
          dim_size=edge_emb.size(0),
          reduce="sum",
      )
      c3_emb = self.bn_c3_2(c3_emb)
  
      return (edge_emb + c2_emb + c3_emb).tanh()
  
imports: import torch
  from torch import Tensor
  from torch.nn import BatchNorm1d, Embedding, Linear, ModuleList, Sequential
  from torch_geometric.nn import radius_graph
  from torch_geometric.nn.inits import reset
  from torch_geometric.nn.models.dimenet import triplets
  from torch_geometric.nn.models.schnet import ShiftedSoftplus
  from torch_geometric.typing import OptTensor
  from torch_geometric.utils import scatter
label_desc: Use image node_id 3 for calling the EdgeBlock obj's underlying member method code with example usage: obj.forward(node_emb, edge_emb, i, j, idx_i, idx_j, idx_k, idx_ji, idx_kj) and returns: unknown