class_docstr: Neural Clustering Process (NCP) base model implementing one NCP iteration.
  
  The model and notations are based on Algorithm 1 from the NCP paper
  https://arxiv.org/abs/1901.00409. In amortized probabilistic clustering, the
  goal is to learn a parameterized function $ q_{\theta}(c|x) $ to approximate
  the clustering posterior $ p(c|x) $ , where `x` represents the observations
  and `c` represents the cluster labels. NCP does this using a sequential
  point-wise expansion of $ p(c|x) $:
  $$
    p(c|x) = p(c_1|x_{1:N})p(c_2|c_1, x_{1:N})...p(c_N|c_{1:N-1}, x_{1:N})
  $$
  NCP handles a variable number of clusters by dynamically growing neural
  network representations and a variable-input softmax function.
  Permutation invariant representations are used to preserve the permutation
  symmetries within and between clusters.
  
  This class implements the forward pass for one iteration of the NCP model,
  $ q_{\theta}(c_i|c_{1:i-1}, x_{1:N}) $, which assigns a cluster label to
  the `i`-th point given the context of all points and the labels already
  assigned in previous iterations. Within this iteration, it is possible
  for the `i`-th point to join one of the `K` existing clusters, or create a new
  cluster (i.e. joining an empty cluster). Making this decision requires
  evaluating the `K+1` hypotheses, which has been parallelized as much as
  possible. Computing the cluster labels for `N` points requires `N` iterations.
  
  See `NCPWrapper` as an example of how to use the methods in this class.
  
  Attributes:
    assigned_point_layer: A `tf.keras.Model` or `tf.keras.layers.Layer` for the
      `h` function of NCP, which transforms each assigned point `x_i` to `h_i`,
      in order to build representations of existing clusters (`H_k`) from
      assigned points.
    unassigned_point_layer: A `tf.keras.Model` or `tf.keras.layers.Layer` for
      the `u` function of NCP, which transforms each unassigned point `x_i` to
      `u_i`, in order to build the global representation of unassigned points
      (`U`).
    cluster_layer: A `tf.keras.Model` or `tf.keras.layers.Layer` for the `g`
      function of NCP, which transforms the embedding of each cluster `H_k` to
      `g_k`, in order to build the global representation of already clustered
      points (`G`).
    logits_layer: A `tf.keras.Model` or `tf.keras.layers.Layer` for the `f`
      function of NCP (output dim must be 1), which computes the logits of
      possible cluster assignments.
docstr: Precomputes the assigned and unassigned representation for each point.
  
  Arguments:
    inputs: A `Tensor` of shape `[batch_size, num_points, x_dim]`. The input
      data containing all points to be clustered.
  
  Returns:
    h_x: A `Tensor` of shape `[batch_size, num_points, h_dim]`. The output of
      `assigned_point_layer(inputs)`, which will be used to build
      representations of existing clusters (`H_k`) from assigned points.
    u_x: A `Tensor` of shape `[batch_size, num_points, u_dim]`. The output of
      `unassigned_point_layer(inputs)`, which will be used to build the global
      representation of all unassigned points (`U`).
code: def preprocess_inputs(self, inputs):
      """Precomputes the assigned and unassigned representation for each point.
  
      Arguments:
        inputs: A `Tensor` of shape `[batch_size, num_points, x_dim]`. The input
          data containing all points to be clustered.
  
      Returns:
        h_x: A `Tensor` of shape `[batch_size, num_points, h_dim]`. The output of
          `assigned_point_layer(inputs)`, which will be used to build
          representations of existing clusters (`H_k`) from assigned points.
        u_x: A `Tensor` of shape `[batch_size, num_points, u_dim]`. The output of
          `unassigned_point_layer(inputs)`, which will be used to build the global
          representation of all unassigned points (`U`).
      """
  
      h_x = self.assigned_point_layer(inputs)
      u_x = self.unassigned_point_layer(inputs)
  
      preprocessed_inputs = [h_x, u_x]
      return preprocessed_inputs
  
file_path: neural-structured-learning/research/neural_clustering/models/ncp_base.py
imports: import numpy
  import tensorflow
label_desc: Use image node_id 2 for calling the NCPBase obj's underlying member method code with example usage: obj.preprocess_inputs(inputs) and returns: preprocessed_inputs