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. The shape of 
      the label tensor is the same as input and the shape of the feature 
      tensor is `[input_shape, num_features]`.
      
      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).
          
          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].
      
      >>> decode_libsvm(tf.constant(["1:-1 2:1", "1:2 3:0"]), 3, tf.float32, tf.int32)
      (<tf.Tensor: shape=(2,), dtype=int32, numpy=array([-1,  2], dtype=int32)>,
       <tf.Tensor: shape=(4, 2), dtype=int64, numpy=
       array([[0, 1],
              [0, 2],
              [1, 1],
              [1, 3]], dtype=int64)>,
       <tf.Tensor: shape=(4,), dtype=float32, numpy=array([-1.,  1.,  2.,  0.], dtype=float32)>,
       <tf.Tensor: shape=(2,), dtype=int64, numpy=array([2, 3], dtype=int64)>)
      
      >>> decode_libsvm(tf.constant(["1:0", "2:0"]), 2)
      (<tf.Tensor: shape=(2,), dtype=int64, numpy=array([0, 0], dtype=int64)>,
       <tf.Tensor: shape=(2, 2), dtype=int64, numpy=
       array([[0, 1],
              [1, 2]], dtype=int64)>,
       <tf.Tensor: shape=(2,), dtype=float32, numpy=array([0., 0.], dtype=float32)>,
       <tf.Tensor: shape=(2,), dtype=int64, numpy=array([1, 1], dtype=int64)>)
      """
  
output:     
      with tf.name_scope(name, "decode_libsvm", [input]) as scope:
          input = tf.convert_to_tensor(input, dtype=tf.string, name="input")
          
          # Split the input strings into labels and feature strings
          split_input = tf.strings.split(input, " ")
          labels = tf.strings.to_number(tf.strings.split(split_input.values, ":")[0], out_type=label_dtype)
          
          # Extract feature indices and values
          feature_strings = tf.strings.split(split_input.values, ":")[1]
          feature_indices = tf.strings.to_number(tf.strings.split(feature_strings, ":")[0], out_type=tf.int64)
          feature_values = tf.strings.to_number(tf.strings.split(feature_strings, ":")[1], out_type=dtype)
          
          # Create a dense tensor for feature indices
          dense_shape = tf.stack([tf.shape(input, out_type=tf.int64)[0], tf.constant(num_features, dtype=tf.int64)])
          feature_indices = tf.stack([tf.range(tf.shape(feature_indices, out_type=tf.int64)[0]), feature_indices], axis=1)
          
          # Create a dense tensor for feature values
          feature_values = tf.reshape(feature_values, [-1])
          
          # Create a dense tensor for feature shape
          feature_shape = tf.constant([num_features], dtype=tf.int64)
          
          return labels, feature_indices, feature_values, feature_shape
  