class_docstr: A batch-mode version of XENetConv.
  
  **Mode**: batch.
  
  **This layer expects a dense adjacency matrix.**
class_docstr_tok: ["A","batch-mode","version","of","XENetConv",".","*","*","Mode","*","*",":","batch",".","*","*","This","layer","expects","a","dense","adjacency","matrix",".","*","*"]
code: def call(self, inputs):
      x, a, e = inputs
  
      assert len(x.shape) == 3
      assert len(e.shape) == 4
  
      N = tf.shape(x)[1]
  
      xi_shape = [-1, N, 1, x.shape[2]]
      xj_shape = [-1, 1, N, x.shape[2]]
  
      xi = tf.reshape(x, xi_shape)  # b n 1 f
      xj = tf.reshape(x, xj_shape)  # b 1 n f
  
      xi = tf.repeat(xi, N, axis=2)
      xj = tf.repeat(xj, N, axis=1)
  
      e_transpose = tf.transpose(e, perm=[0, 2, 1, 3])
  
      stack = tf.concat([xi, xj, e, e_transpose], axis=-1)
  
      for i in range(0, len(self.stack_models)):
          stack = self.stack_models[i](stack)
          stack = self.stack_model_acts[i](stack)
  
      e_mask_shape = [-1, tf.shape(a)[1], tf.shape(a)[2], 1]
      e_mask = tf.reshape(a, e_mask_shape)
  
      # zero-out elements that aren't edges in the adjacency matrix
      stack = Multiply()([stack, e_mask])
  
      if self.attention:
          att1 = self.incoming_att_sigmoid(stack)
          incoming_e = self.incoming_att_multiply([stack, att1])
          incoming_e = tf.keras.backend.sum(
              incoming_e, axis=-2, keepdims=False
          )
          att2 = self.outgoing_att_sigmoid(stack)
          outgoing_e = self.outgoing_att_multiply([stack, att2])
          outgoing_e = tf.keras.backend.sum(
              outgoing_e, axis=-3, keepdims=False
          )
      else:
          incoming_e = tf.keras.backend.sum(
              stack, axis=-2, keepdims=False
          )
          outgoing_e = tf.keras.backend.sum(
              stack, axis=-3, keepdims=False
          )
  
      final_stack = Concatenate(axis=-1)([x, incoming_e, outgoing_e])
  
      x = self.node_model(final_stack)
      e = self.edge_model(stack)
  
      # zero-out elements that aren't edges in the adjacency matrix
      e = Multiply()([e, e_mask])
      return x, e
  
imports: from collections.abc import Iterable
  import tensorflow
  from tensorflow.keras.layers import Concatenate, Dense, Multiply, PReLU, ReLU
  from tensorflow.python.ops import gen_sparse_ops
  from spektral.layers.convolutional.conv import Conv
  from spektral.layers.convolutional.message_passing import MessagePassing
label_desc: Use image node_id 3 for calling the XENetConvBatch obj's underlying member method code with example usage: obj.call(inputs) and returns: x,  e