code: def add_self_loops(a, fill=1.0):
      """
      Adds self-loops to the given adjacency matrix. Self-loops are added only for
      those node that don't have a self-loop already, and are assigned a weight
      of `fill`.
      :param a: a square SparseTensor.
      :param fill: the fill value for the new self-loops. It will be cast to the
      dtype of `a`.
      :return: a SparseTensor with the same shape as the input.
      """
      indices = a.indices
      values = a.values
      N = tf.shape(a, out_type=indices.dtype)[0]
  
      mask_od = indices[:, 0] != indices[:, 1]
      mask_sl = ~mask_od
      mask_od.set_shape([None])  # For compatibility with TF 2.2
      mask_sl.set_shape([None])
  
      indices_od = indices[mask_od]
      indices_sl = indices[mask_sl]
  
      values_sl = tf.fill((N,), tf.cast(fill, values.dtype))
      values_sl = tf.tensor_scatter_nd_update(
          values_sl, indices_sl[:, 0:1], values[mask_sl]
      )
  
      indices_sl = tf.range(N, dtype=indices.dtype)[:, None]
      indices_sl = tf.repeat(indices_sl, 2, -1)
      indices = tf.concat((indices_od, indices_sl), 0)
  
      values_od = values[mask_od]
      values = tf.concat((values_od, values_sl), 0)
  
      out = tf.SparseTensor(indices, values, (N, N))
  
      return tf.sparse.reorder(out)
  
file_path: spektral/spektral/layers/ops/sparse.py
imports: import tensorflow
  from tensorflow.python.ops import gen_sparse_ops
  from .None import ops
label_desc: Use image node_id 1 for calling a global function with example usage: add_self_loops(a, fill) and returns: tf