class_docstr: CommNet module.
  
  Implementation for the model originally described in
  https://arxiv.org/abs/1605.07736 (S. Sukhbaatar, A. Szlam, R. Fergus), in the
  version presented in https://arxiv.org/abs/1706.06122 (Y. Hoshen).
  
  This module internally creates edge features based on the features from the
  nodes sending to that edge, and independently learns an embedding for each
  node. It then uses these edges and nodes features to compute updated node
  features.
  
  This module does not use the global nor the edges features of the input, but
  uses its receivers and senders information. The output graph has the same
  value in edge and global fields as the input graph. The edge and global
  features fields may have a `None` value in the input `gn_graphs.GraphsTuple`.
docstr: Connects the CommNet network.
  
  Args:
    graph: A `graphs.GraphsTuple` containing `Tensor`s, with non-`None` nodes,
      receivers and senders.
    edge_model_kwargs: Optional keyword arguments to pass to
      the edge block model.
    node_encoder_model_kwargs: Optional keyword arguments to pass to
      the node block ecoder model.
    node_model_kwargs: Optional keyword arguments to pass to
      the node block model.
  
  Returns:
    An output `graphs.GraphsTuple` with updated nodes.
  
  Raises:
    ValueError: if any of `graph.nodes`, `graph.receivers` or `graph.senders`
    is `None`.
code: def _build(
      self,
      graph,
      edge_model_kwargs=None,
      node_encoder_model_kwargs=None,
      node_model_kwargs=None,
  ):
      """Connects the CommNet network.
  
      Args:
        graph: A `graphs.GraphsTuple` containing `Tensor`s, with non-`None` nodes,
          receivers and senders.
        edge_model_kwargs: Optional keyword arguments to pass to
          the edge block model.
        node_encoder_model_kwargs: Optional keyword arguments to pass to
          the node block ecoder model.
        node_model_kwargs: Optional keyword arguments to pass to
          the node block model.
  
      Returns:
        An output `graphs.GraphsTuple` with updated nodes.
  
      Raises:
        ValueError: if any of `graph.nodes`, `graph.receivers` or `graph.senders`
        is `None`.
      """
      node_input = self._node_encoder_block(
          self._edge_block(graph, edge_model_kwargs),
          node_encoder_model_kwargs,
      )
      return graph.replace(
          nodes=self._node_block(node_input, node_model_kwargs).nodes
      )
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  from graph_nets import _base
  from graph_nets import blocks
  import tensorflow
label_desc: Use image node_id 2 for calling the CommNet obj's underlying member method code with example usage: obj._build(graph, edge_model_kwargs, node_encoder_model_kwargs, node_model_kwargs) and returns: graph