input: from typing import 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.
      
      >>> decode_libsvm(tf.constant(["1 2:0.3 4:1.5"]), 5)
      (<tf.Tensor: shape=(1,), dtype=int64, numpy=array([1])>, <tf.Tensor: shape=(2, 2), dtype=int64, numpy=array([[0, 2], [0, 4]])>, <tf.Tensor: shape=(2,), dtype=float32, numpy=array([0.3, 1.5], dtype=float32)>, <tf.Tensor: shape=(2,), dtype=int64, numpy=array([5])>)
      
      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].
      """
output:     with tf.name_scope(name or "decode_libsvm"):
          def parse_line(line):
              parts = tf.strings.split([line], ' ')
              label = tf.strings.to_number(parts[0], out_type=label_dtype)
              features = parts[1:]
              indices = tf.strings.to_number(tf.strings.split(features, ':')[0], out_type=tf.int64)
              values = tf.strings.to_number(tf.strings.split(features, ':')[1], out_type=dtype)
              return label, indices, values
  
          labels, indices, values = tf.map_fn(
              parse_line,
              input,
              dtype=(label_dtype, tf.int64, dtype),
              back_prop=False
          )
  
          feature_indices = tf.RaggedTensor.from_row_splits(
              indices,
              tf.range(tf.shape(indices)[0] + 1)
          ).to_tensor()
  
          feature_values = tf.RaggedTensor.from_row_splits(
              values,
              tf.range(tf.shape(values)[0] + 1)
          ).to_tensor()
  
          feature_shape = tf.shape(feature_indices, out_type=tf.int64)
  
          return labels, feature_indices, feature_values, feature_shape