input: Write a function to use the `decode_libsvm` function from TensorFlow to decode LibSVM input into tensors. The function should accept the following parameters: `input` (a `Tensor` of type `string`), `num_features` (an `int` that is `>= 1`), `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`), and `name` (a name for the operation, optional). The function should return a tuple of `Tensor` objects `(label, feature_indices, feature_values, feature_shape)`.
  
  
  assert decode_libsvm(["1 1:1", "2 2:1"], 2) == (tf.constant([1, 2]), tf.constant([[0, 1], [1, 2]]), tf.constant([1.0, 1.0]), tf.constant([2]))
  assert decode_libsvm(["1 3:1", "2 4:1"], 4) == (tf.constant([1, 2]), tf.constant([[0, 3], [1, 4]]), tf.constant([1.0, 1.0]), tf.constant([2]))
  assert decode_libsvm(["1 2:2", "2 3:3"], 3, dtype=tf.int32, label_dtype=tf.int32) == (tf.constant([1, 2], dtype=tf.int32), tf.constant([[0, 2], [1, 3]]), tf.constant([2, 3], dtype=tf.int32), tf.constant([2]))
  
output: def decode_libsvm(input, num_features, dtype=tf.float32, label_dtype=tf.int64, name=None):
      with tf.name_scope(name, "decode_libsvm", [input, num_features, dtype, label_dtype]):
          label, indices, values = tf.decode_libsvm(input, num_features, dtype, label_dtype)
          shape = tf.shape(input)[0]
          feature_shape = tf.stack([shape, num_features])
          return label, indices, values, feature_shape