code: def forward(self, x, emb, idx_kj, idx_ji):
      rbf0, sbf, t = emb
  
      x1, x2 = x
  
      x_ji = self.act(self.lin_ji(x1))
      x_kj = self.act(self.lin_kj(x1))
  
      rbf = self.lin_rbf1(rbf0)
      rbf = self.lin_rbf2(rbf)
      x_kj = x_kj * rbf
      x_kj = self.act(self.lin_down(x_kj))
  
      sbf = self.lin_sbf1(sbf)
      sbf = self.lin_sbf2(sbf)
      x_kj = x_kj[idx_kj] * sbf
      t = self.lin_t1(t)
      t = self.lin_t2(t)
      x_kj = x_kj * t
      x_kj = scatter(x_kj, idx_ji, dim=0, dim_size=x1.size(0))
      x_kj = self.act(self.lin_up(x_kj))
      e1 = x_ji + x_kj
      for layer in self.layers_before_skip:
          e1 = layer(e1)
      e1 = self.act(self.lin(e1)) + x1
      for layer in self.layers_after_skip:
          e1 = layer(e1)
      e2 = self.lin_rbf(rbf0) * e1
  
      non_iso_idx = torch.cat((idx_ji, idx_kj))
      e1 = x1 + scatter(
          e1[non_iso_idx] - x1[non_iso_idx],
          non_iso_idx,
          dim=0,
          dim_size=x1.size(0),
          reduce="mean",
      )
      e2 = x2 + scatter(
          e2[non_iso_idx] - x2[non_iso_idx],
          non_iso_idx,
          dim=0,
          dim_size=x2.size(0),
          reduce="mean",
      )
  
      return e1, e2
  
imports: import torch
  from torch import nn
  from torch.nn import Linear, Embedding
  from torch_geometric.nn.inits import glorot_orthogonal
  from torch_geometric.nn import radius_graph
  from torch_scatter import scatter
  import torch.nn.functional
  from math import sqrt
  from .geometric_computing import xyztodat
  from .features import dist_emb, angle_emb, torsion_emb
label_desc: Use image node_id 3 for calling the update_e obj's underlying member method code with example usage: obj.forward(x, emb, idx_kj, idx_ji) and returns: e1,  e2