docs: def backward_tensor(self, y):
          """
          Transforms a series of triangular matrices y to the packed representation x (tf.tensors)
          
          :param y: unpacked tensor with shape self.num_matrices, self.N, self.N
          :return: packed tensor with shape self.num_matrices, (self.N**2 + self.N) / 2
          """
          if self.squeeze:
              y = tf.expand_dims(y, axis=0)
          indices = np.vstack(np.tril_indices(self.N)).T
          indices = itertools.product(np.arange(self.num_matrices), indices)
          indices = np.array([np.hstack(x) for x in indices])
          triangular = tf.gather_nd(y, indices)
          return tf.reshape(triangular, [self.num_matrices, (self.N**2 + self.N) // 2])