code: def propagate_attention(self, g, eids):
      # Compute attention score
      g.apply_edges(src_dot_dst("k", "q", "score"), eids)
      g.apply_edges(scaled_exp("score", np.sqrt(self.d_k)), eids)
      # Send weighted values to target nodes
      g.send_and_recv(
          eids, fn.u_mul_e("v", "score", "v"), fn.sum("v", "wv")
      )
      g.send_and_recv(
          eids, fn.copy_e("score", "score"), fn.sum("score", "z")
      )
  
imports: from .config import *
  from .act import *
  from .attention import *
  from .viz import *
  from .layers import *
  from .functions import *
  from .embedding import *
  import threading
  import dgl.function
  import torch
  import torch.nn.init
label_desc: Use image node_id 2 for calling the Transformer obj's underlying member method code with example usage: obj.propagate_attention(g, eids) without return types