input: 
  def decode_libsvm(input, num_features, dtype=_dtypes.float32, label_dtype=_dtypes.int64, name=None):
      """ 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 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].
  
      >>> decode_libsvm(tf.constant(["1 2:1 3:1"]), 3)
      (<tf.Tensor: shape=(1,), dtype=int64, numpy=array([1], dtype=int64)>, 
       <tf.Tensor: shape=(2, 1), dtype=int64, numpy=array([[2], [3]], dtype=int64)>, 
       <tf.Tensor: shape=(2,), dtype=float32, numpy=array([1., 1.], dtype=float32)>, 
       <tf.Tensor: shape=(1,), dtype=int64, numpy=array([2], dtype=int64)>)
      """
  
output:     with ops.name_scope(name, "decode_libsvm", [input]) as name:
          input = ops.convert_to_tensor(input, name="input")
          num_features = ops.convert_to_tensor(num_features, dtype=_dtypes.int32, name="num_features")
  
          def _parse_line(line):
              splits = tf.strings.split(line, ' ')
              label = tf.strings.to_number(splits[0], out_type=label_dtype)
              feature_pairs = splits[1:]
              indices = tf.strings.to_number(tf.strings.split(feature_pairs, ':', result_type='RaggedTensor')[0], out_type=_dtypes.int64)
              values = tf.strings.to_number(tf.strings.split(feature_pairs, ':', result_type='RaggedTensor')[1], out_type=dtype)
              return label, indices, values
  
          labels, indices, values = tf.map_fn(
              _parse_line,
              input,
              dtype=(label_dtype, _dtypes.int64, dtype),
              name="map_fn"
          )
  
          feature_shape = tf.shape(indices, out_type=_dtypes.int64)
          feature_shape = tf.concat([feature_shape, [num_features]], axis=0)
  
          return labels, indices, values, feature_shape