input: 
  from typing import List, Tuple
  import tensorflow as tf
  
  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.
          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).
          
      >>> decode_libsvm(tf.constant(['1 2:1 3:1']), 3)
      (<tf.Tensor: shape=(1,), dtype=int64, numpy=array([1])>,
       <tf.Tensor: shape=(2, 2), dtype=int64, numpy=array([[0, 1], [0, 2]])>,
       <tf.Tensor: shape=(2,), dtype=float32, numpy=array([1., 1.], dtype=float32)>,
       <tf.Tensor: shape=(2,), dtype=int64, numpy=array([1, 3])>)
      """
      pass
  
  
output:     
      with tf.name_scope(name, "decode_libsvm", [input]) as name:
          def parse_line(line):
              parts = tf.strings.split(line, ' ')
              label = tf.strings.to_number(parts[0], out_type=label_dtype)
              indices = []
              values = []
              for part in parts[1:]:
                  feature_parts = tf.strings.split(part, ':')
                  index = tf.strings.to_number(feature_parts[0], out_type=tf.int64)
                  value = tf.strings.to_number(feature_parts[1], out_type=dtype)
                  indices.append([0, index - 1])
                  values.append(value)
              return label, indices, values
  
          labels, indices, values = tf.map_fn(
              parse_line,
              input,
              dtype=(label_dtype, tf.int64, dtype),
              name="map_parse_line"
          )
  
          labels = tf.stack(labels)
          indices = tf.concat(indices, axis=0)
          values = tf.stack(values)
          shape = tf.constant([-1, num_features], dtype=tf.int64)
  
          return labels, indices, values, shape
  