input: 
  def decode_libsvm(input: tf.Tensor, num_features: int, dtype: tf.DType = tf.float32, label_dtype: tf.DType = tf.int64, name: str = None) -> Tuple[tf.Tensor, tf.Tensor, tf.Tensor, tf.Tensor]:
      """
      Convert LibSVM input to tensors. The output consists of a label and a feature tensor.
  
      Args:
          input: A `Tensor` of type `string`. Each string is a record in the LibSVM format.
          num_features: An `int` that is `>= 1`. The number of features.
          dtype: An optional `tf.DType` from: `tf.float32, tf.float64, tf.int32, tf.int64`. Defaults to `tf.float32`.
          label_dtype: An optional `tf.DType` from: `tf.float32, tf.float64, tf.int32, tf.int64`. Defaults to `tf.int64`.
          name: A name for the operation (optional).
  
      Returns:
          A tuple of `Tensor` objects (label, feature_indices, feature_values, feature_shape).
  
          label: A `Tensor` of type `label_dtype`. A tensor of the same shape as input.
          feature_indices: A `Tensor` of type `int64`. A 2-D int64 tensor of dense_shape [N, ndims].
          feature_values: A `Tensor` of type `dtype`. A 1-D tensor of any type and dense_shape [N].
          feature_shape: A `Tensor` of type `int64`. A 1-D int64 tensor of dense_shape [ndims].
  
      Example:
          >>> decode_libsvm(tf.constant(["1 1:1 2:2", "2 3:3 4:4", "1 1:1 3:3"]), 4)
          (<tf.Tensor: shape=(3,), dtype=int64, numpy=array([1, 2, 1])>, <tf.Tensor: shape=(5, 2), dtype=int64, numpy=array([[0, 1], [0, 2], [1, 3], [1, 4], [2, 1], [2, 3]])>, <tf.Tensor: shape=(5,), dtype=float32, numpy=array([1., 2., 3., 4., 1., 3.])>, <tf.Tensor: shape=(2,), dtype=int64, numpy=array([3, 4])>)
      """
  
output:     
      with tf.name_scope(name, "decode_libsvm", [input]) as scope:
          input = tf.convert_to_tensor(input, name="input")
          
          # Split the input by lines
          lines = tf.strings.split(input, sep='\n')
          
          # Split each line into label and features
          parts = tf.strings.split(lines, sep=' ')
          labels = tf.strings.to_number(parts.values[0::2], out_type=label_dtype)
          
          # Split features into indices and values
          feature_parts = parts.values[1::2]
          feature_indices = tf.strings.to_number(tf.strings.split(feature_parts, sep=':').values[0::2], out_type=tf.int64)
          feature_values = tf.strings.to_number(tf.strings.split(feature_parts, sep=':').values[1::2], out_type=dtype)
          
          # Create a dense shape tensor
          feature_shape = tf.constant([tf.shape(input)[0], num_features], dtype=tf.int64)
          
          # Create a 2D tensor for feature indices
          row_indices = tf.repeat(tf.range(tf.shape(input)[0]), tf.shape(feature_indices)[0] // tf.shape(input)[0])
          feature_indices = tf.stack([row_indices, feature_indices], axis=1)
          
          return labels, feature_indices, feature_values, feature_shape
  