message: Register DeserializeSparse in TensorFlow MLIR ODS.
diff: @@ -2913,6 +2913,67 @@ Converts the given variant tensor to an iterator and stores it in the given reso
  let results = (outs);
  }
  +def TF_DeserializeSparseOp : TF_Op<"DeserializeSparse", [NoSideEffect]> {
  + let summary = "Deserialize `SparseTensor` objects.";
  +
  + let description = [{
  +The input `serialized_sparse` must have the shape `[?, ?, ..., ?, 3]` where
  +the last dimension stores serialized `SparseTensor` objects and the other N
  +dimensions (N >= 0) correspond to a batch. The ranks of the original
  +`SparseTensor` objects must all match. When the final `SparseTensor` is
  +created, its rank is the rank of the incoming `SparseTensor` objects plus N;
  +the sparse tensors have been concatenated along new dimensions, one for each
  +batch.
  +
  +The output `SparseTensor` object's shape values for the original dimensions
  +are the max across the input `SparseTensor` objects' shape values for the
  +corresponding dimensions. The new dimensions match the size of the batch.
  +
  +The input `SparseTensor` objects' indices are assumed ordered in
  +standard lexicographic order. If this is not the case, after this
  +step run `SparseReorder` to restore index ordering.
  +
  +For example, if the serialized input is a `[2 x 3]` matrix representing two
  +original `SparseTensor` objects:
  +
  + index = [ 0]
  + [10]
  + [20]
  + values = [1, 2, 3]
  + shape = [50]
  +
  +and
  +
  + index = [ 2]
  + [10]
  + values = [4, 5]
  + shape = [30]
  +
  +then the final deserialized `SparseTensor` will be:
  +
  + index = [0 0]
  + [0 10]
  + [0 20]
  + [1 2]
  + [1 10]
  + values = [1, 2, 3, 4, 5]
  + shape = [2 50]
  + }];
  +
  + let arguments = (ins
  + TensorOf<[TF_Str, TF_Variant]>:$serialized_sparse
  + );
  +
  + let results = (outs
  + TF_Int64Tensor:$sparse_indices,
  + TF_Tensor:$sparse_values,
  + TF_Int64Tensor:$sparse_shape
  + );
  +
  + TF_DerivedOperandTypeAttr Tserialized = TF_DerivedOperandTypeAttr<0>;
  + TF_DerivedResultTypeAttr dtype = TF_DerivedResultTypeAttr<1>;
  +}
  +
  def TF_DestroyResourceOp : TF_Op<"DestroyResourceOp", []> {
  let summary = "Deletes the resource specified by the handle.";
  