docstr: inputs: list of features with shape [batch_size, feature_dim]
docstr_tok: ["inputs",":","list","of","features","with","shape","[","batch_size",",","feature_dim","]"]
code: def call(self, inputs):
      """
      inputs: list of features with shape [batch_size, feature_dim]
      """
  
      batch_size = tf.shape(inputs[0])[0]
  
      concat_features = tf.stack(inputs, axis=1)
      dot_products = tf.linalg.LinearOperatorLowerTriangular(
          tf.matmul(concat_features, concat_features, transpose_b=True)
      ).to_dense()
  
      ones = tf.ones_like(dot_products)
      mask = tf.linalg.band_part(ones, 0, -1)
  
      if not self._self_interaction:
          mask = mask - tf.linalg.band_part(ones, 0, 0)
          out_dim = int(len(inputs) * (len(inputs) - 1) / 2)
      else:
          out_dim = int(len(inputs) * (len(inputs) + 1) / 2)
  
      flat_interactions = tf.reshape(
          tf.boolean_mask(dot_products, mask), (batch_size, out_dim)
      )
  
      return flat_interactions
  
imports: from tensorflow.keras.layers import Layer
  import tensorflow
label_desc: Use image node_id 2 for calling the SecondOrderFeatureInteraction obj's underlying member method code with example usage: obj.call(inputs) and returns: flat_interactions