code: def apply_edge(self, x_i, x_j, edge_index_i, size_i):
      alpha = self.att_i(x_i) + self.att_j(x_j)
      alpha = tf.nn.leaky_relu(alpha)
      alpha = mp_ops.scatter_softmax(alpha, edge_index_i, size_i)
  
      x_j = x_j * tf.reshape(alpha, [-1, 1])
      return tf.reshape(x_j, [-1, self.dim])
  
file_path: euler/tf_euler/python/convolution/gat_conv.py
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import tensorflow
  import tf_euler
  from tf_euler.python.convolution import conv
  from tf_euler.python.euler_ops import mp_ops
label_desc: Use image node_id 3 for calling the GATConv obj's underlying member method code with example usage: obj.apply_edge(x_i, x_j, edge_index_i, size_i) and returns: tf