class_docstr: Aggregates via pooling over two MLP functions.
      
class_docstr_tok: ["Aggregates","via","pooling","over","two","MLP","functions","."]
code: def _call(self, inputs):
      self_vecs, neigh_vecs = inputs
      neigh_h = neigh_vecs
  
      dims = tf.shape(neigh_h)
      batch_size = dims[0]
      num_neighbors = dims[1]
      # [nodes * sampled neighbors] x [hidden_dim]
      h_reshaped = tf.reshape(
          neigh_h, (batch_size * num_neighbors, self.neigh_input_dim)
      )
  
      for l in self.mlp_layers:
          h_reshaped = l(h_reshaped)
      neigh_h = tf.reshape(
          h_reshaped, (batch_size, num_neighbors, self.hidden_dim_2)
      )
      neigh_h = tf.reduce_max(neigh_h, axis=1)
  
      from_neighs = tf.matmul(neigh_h, self.vars["neigh_weights"])
      from_self = tf.matmul(self_vecs, self.vars["self_weights"])
  
      if not self.concat:
          output = tf.add_n([from_self, from_neighs])
      else:
          output = tf.concat([from_self, from_neighs], axis=1)
  
      # bias
      if self.bias:
          output += self.vars["bias"]
  
      return self.act(output)
  
imports: import tensorflow
  from .layers import Layer, Dense
  from .inits import glorot, zeros
label_desc: Use image node_id 2 for calling the TwoMaxLayerPoolingAggregator obj's underlying member method code with example usage: obj._call(inputs) and returns: self