input: Write a function to decode LibSVM input to tensors using the `decode_libsvm` function from TensorFlow. The function should take the following arguments: `input_text` (a string in LibSVM format), `num_features` (an integer that is `>= 1`), `dtype` (an optional `tf.DType` from: `tf.float32, tf.float64, tf.int32, tf.int64`. Defaults to `tf.float32`), and `label_dtype` (an optional `tf.DType` from: `tf.float32, tf.float64, tf.int32, tf.int64`. Defaults to `tf.int64`). The function should return a tuple of `Tensor` objects `(label, feature_indices, feature_values, feature_shape)`, where `label` is a `Tensor` of type `label_dtype`, `feature_indices` is a `Tensor` of type `int64`, `feature_values` is a `Tensor` of type `dtype`, and `feature_shape` is a `Tensor` of type `int64`.
  
  
  import tensorflow as tf
  
  def decode_libsvm_input(input_text, num_features, dtype=tf.float32, label_dtype=tf.int64):
      input_tensor = tf.constant([input_text], dtype=tf.string)
      return tf.decode_libsvm(input_tensor, num_features, dtype=dtype, label_dtype=label_dtype)
  
  # Test cases
  assert decode_libsvm_input("1 1:1 2:2 3:3", 3)[0].numpy()[0] == 1
  assert decode_libsvm_input("2 1:1 2:2 3:3", 3)[0].numpy()[0] == 2
  assert decode_libsvm_input("1 1:1 2:2 3:3", 3)[3].numpy()[0] == 3
  assert decode_libsvm_input("1 1:1 2:2 3:3", 3, dtype=tf.int32)[0].dtype == tf.int64
  assert decode_libsvm_input("1 1:1 2:2 3:3", 3, label_dtype=tf.float32)[0].dtype == tf.float32
  
output: def decode_libsvm_input(input_text, num_features, dtype=tf.float32, label_dtype=tf.int64):
      input_tensor = tf.constant([input_text], dtype=tf.string)
      return tf.decode_libsvm(input_tensor, num_features, dtype=dtype, label_dtype=label_dtype)