code: def forward(self, x, feature0, feature1, pos_emb, edge_index, batch):
      x_lin_1 = self.act(self.lin_1(x))
      x_lin_2 = self.act(self.lin_2(x))
  
      feature0 = self.lin_feature0(feature0)
      h0 = self.conv0(x_lin_1, edge_index, feature0)
      h0 = self.lin0(h0)
      h0 = self.act(h0)
      h0 = self.dropout(h0)
  
      feature1 = self.lin_feature1(feature1)
      h1 = self.conv1(x_lin_1, edge_index, feature1)
      h1 = self.lin1(h1)
      h1 = self.act(h1)
      h1 = self.dropout(h1)
  
      feature2 = self.lin_feature2(pos_emb)
      h2 = self.conv2(x_lin_1, edge_index, feature2)
      h2 = self.lin2(h2)
      h2 = self.act(h2)
      h2 = self.dropout(h2)
  
      h = torch.cat((h0, h1, h2), 1)
      for lin in self.lins_cat:
          h = self.act(lin(h))
  
      h = h + x_lin_2
  
      for lin in self.lins:
          h = self.act(lin(h))
      h = self.final(h)
      return h
  
imports: from torch_geometric.nn import inits, MessagePassing
  from torch_geometric.nn import radius_graph
  from .features import d_angle_emb, d_theta_phi_emb
  from torch_scatter import scatter
  from torch_sparse import matmul
  import torch
  from torch import nn
  from torch.nn import Embedding
  import torch.nn.functional
  import numpy
label_desc: Use image node_id 3 for calling the InteractionBlock obj's underlying member method code with example usage: obj.forward(x, feature0, feature1, pos_emb, edge_index, batch) and returns: h