"""Python wrappers around TensorFlow ops. This file is MACHINE GENERATED! Do not edit. """ import collections from tensorflow.python import pywrap_tfe as pywrap_tfe from tensorflow.python.eager import context as _context from tensorflow.python.eager import core as _core from tensorflow.python.eager import execute as _execute from tensorflow.python.framework import dtypes as _dtypes from tensorflow.python.framework import op_def_registry as _op_def_registry from tensorflow.python.framework import ops as _ops from tensorflow.python.framework import op_def_library as _op_def_library from tensorflow.python.util.deprecation import deprecated_endpoints from tensorflow.python.util import dispatch as _dispatch from tensorflow.python.util.tf_export import tf_export from typing import TypeVar _RaggedTensorFromVariantOutput = collections.namedtuple( "RaggedTensorFromVariant", ["output_nested_splits", "output_dense_values"]) def ragged_tensor_from_variant(encoded_ragged, input_ragged_rank, output_ragged_rank, Tvalues, Tsplits=_dtypes.int64, name=None): r"""Decodes a `variant` Tensor into a `RaggedTensor`. Decodes the given `variant` Tensor and returns a `RaggedTensor`. The input could be a scalar, meaning it encodes a single `RaggedTensor` with ragged_rank `output_ragged_rank`. It could also have an arbitrary rank, in which case each element is decoded into a `RaggedTensor` with ragged_rank `input_ragged_rank` and these are then stacked according to the input shape to output a single `RaggedTensor` with ragged_rank `output_ragged_rank`. Each `variant` element in the input Tensor is decoded by retrieving from the element a 1-D `variant` Tensor with `input_ragged_rank + 1` Tensors, corresponding to the splits and values of the decoded `RaggedTensor`. If `input_ragged_rank` is -1, then it is inferred as `output_ragged_rank` - `rank(encoded_ragged)`. See `RaggedTensorToVariant` for the corresponding encoding logic. Args: encoded_ragged: A `Tensor` of type `variant`. A `variant` Tensor containing encoded `RaggedTensor`s. input_ragged_rank: An `int` that is `>= -1`. The ragged rank of each encoded `RaggedTensor` component in the input. If set to -1, this is inferred as `output_ragged_rank` - `rank(encoded_ragged)` output_ragged_rank: An `int` that is `>= 0`. The expected ragged rank of the output `RaggedTensor`. The following must hold: `output_ragged_rank = rank(encoded_ragged) + input_ragged_rank`. Tvalues: A `tf.DType`. Tsplits: An optional `tf.DType` from: `tf.int32, tf.int64`. Defaults to `tf.int64`. name: A name for the operation (optional). Returns: A tuple of `Tensor` objects (output_nested_splits, output_dense_values). output_nested_splits: A list of `output_ragged_rank` `Tensor` objects with type `Tsplits`. output_dense_values: A `Tensor` of type `Tvalues`. """ _ctx = _context._context or _context.context() tld = _ctx._thread_local_data if tld.is_eager: try: _result = pywrap_tfe.TFE_Py_FastPathExecute( _ctx, "RaggedTensorFromVariant", name, encoded_ragged, "input_ragged_rank", input_ragged_rank, "output_ragged_rank", output_ragged_rank, "Tvalues", Tvalues, "Tsplits", Tsplits) _result = _RaggedTensorFromVariantOutput._make(_result) return _result except _core._NotOkStatusException as e: _ops.raise_from_not_ok_status(e, name) except _core._FallbackException: pass try: return ragged_tensor_from_variant_eager_fallback( encoded_ragged, input_ragged_rank=input_ragged_rank, output_ragged_rank=output_ragged_rank, Tvalues=Tvalues, Tsplits=Tsplits, name=name, ctx=_ctx) except _core._SymbolicException: pass # Add nodes to the TensorFlow graph. # Add nodes to the TensorFlow graph. input_ragged_rank = _execute.make_int(input_ragged_rank, "input_ragged_rank") output_ragged_rank = _execute.make_int(output_ragged_rank, "output_ragged_rank") Tvalues = _execute.make_type(Tvalues, "Tvalues") if Tsplits is None: Tsplits = _dtypes.int64 Tsplits = _execute.make_type(Tsplits, "Tsplits") _, _, _op, _outputs = _op_def_library._apply_op_helper( "RaggedTensorFromVariant", encoded_ragged=encoded_ragged, input_ragged_rank=input_ragged_rank, output_ragged_rank=output_ragged_rank, Tvalues=Tvalues, Tsplits=Tsplits, name=name) _result = _outputs[:] if _execute.must_record_gradient(): _attrs = ("input_ragged_rank", _op._get_attr_int("input_ragged_rank"), "output_ragged_rank", _op._get_attr_int("output_ragged_rank"), "Tvalues", _op._get_attr_type("Tvalues"), "Tsplits", _op._get_attr_type("Tsplits")) _inputs_flat = _op.inputs _execute.record_gradient( "RaggedTensorFromVariant", _inputs_flat, _attrs, _result) _result = [_result[:output_ragged_rank]] + _result[output_ragged_rank:] _result = _RaggedTensorFromVariantOutput._make(_result) return _result RaggedTensorFromVariant = tf_export("raw_ops.RaggedTensorFromVariant")(_ops.to_raw_op(ragged_tensor_from_variant)) def ragged_tensor_from_variant_eager_fallback(encoded_ragged, input_ragged_rank, output_ragged_rank, Tvalues, Tsplits, name, ctx): input_ragged_rank = _execute.make_int(input_ragged_rank, "input_ragged_rank") output_ragged_rank = _execute.make_int(output_ragged_rank, "output_ragged_rank") Tvalues = _execute.make_type(Tvalues, "Tvalues") if Tsplits is None: Tsplits = _dtypes.int64 Tsplits = _execute.make_type(Tsplits, "Tsplits") encoded_ragged = _ops.convert_to_tensor(encoded_ragged, _dtypes.variant) _inputs_flat = [encoded_ragged] _attrs = ("input_ragged_rank", input_ragged_rank, "output_ragged_rank", output_ragged_rank, "Tvalues", Tvalues, "Tsplits", Tsplits) _result = _execute.execute(b"RaggedTensorFromVariant", output_ragged_rank + 1, inputs=_inputs_flat, attrs=_attrs, ctx=ctx, name=name) if _execute.must_record_gradient(): _execute.record_gradient( "RaggedTensorFromVariant", _inputs_flat, _attrs, _result) _result = [_result[:output_ragged_rank]] + _result[output_ragged_rank:] _result = _RaggedTensorFromVariantOutput._make(_result) return _result _RaggedTensorToSparseOutput = collections.namedtuple( "RaggedTensorToSparse", ["sparse_indices", "sparse_values", "sparse_dense_shape"]) def ragged_tensor_to_sparse(rt_nested_splits, rt_dense_values, name=None): r"""Converts a `RaggedTensor` into a `SparseTensor` with the same values. input=ragged.from_nested_row_splits(rt_dense_values, rt_nested_splits) output=SparseTensor(indices=sparse_indices, values=sparse_values, dense_shape=sparse_dense_shape) Args: rt_nested_splits: A list of at least 1 `Tensor` objects with the same type in: `int32`, `int64`. The `row_splits` for the `RaggedTensor`. rt_dense_values: A `Tensor`. The `flat_values` for the `RaggedTensor`. name: A name for the operation (optional). Returns: A tuple of `Tensor` objects (sparse_indices, sparse_values, sparse_dense_shape). sparse_indices: A `Tensor` of type `int64`. sparse_values: A `Tensor`. Has the same type as `rt_dense_values`. sparse_dense_shape: A `Tensor` of type `int64`. """ _ctx = _context._context or _context.context() tld = _ctx._thread_local_data if tld.is_eager: try: _result = pywrap_tfe.TFE_Py_FastPathExecute( _ctx, "RaggedTensorToSparse", name, rt_nested_splits, rt_dense_values) _result = _RaggedTensorToSparseOutput._make(_result) return _result except _core._NotOkStatusException as e: _ops.raise_from_not_ok_status(e, name) except _core._FallbackException: pass try: return ragged_tensor_to_sparse_eager_fallback( rt_nested_splits, rt_dense_values, name=name, ctx=_ctx) except _core._SymbolicException: pass # Add nodes to the TensorFlow graph. # Add nodes to the TensorFlow graph. if not isinstance(rt_nested_splits, (list, tuple)): raise TypeError( "Expected list for 'rt_nested_splits' argument to " "'ragged_tensor_to_sparse' Op, not %r." % rt_nested_splits) _attr_RAGGED_RANK = len(rt_nested_splits) _, _, _op, _outputs = _op_def_library._apply_op_helper( "RaggedTensorToSparse", rt_nested_splits=rt_nested_splits, rt_dense_values=rt_dense_values, name=name) _result = _outputs[:] if _execute.must_record_gradient(): _attrs = ("RAGGED_RANK", _op._get_attr_int("RAGGED_RANK"), "T", _op._get_attr_type("T"), "Tsplits", _op._get_attr_type("Tsplits")) _inputs_flat = _op.inputs _execute.record_gradient( "RaggedTensorToSparse", _inputs_flat, _attrs, _result) _result = _RaggedTensorToSparseOutput._make(_result) return _result RaggedTensorToSparse = tf_export("raw_ops.RaggedTensorToSparse")(_ops.to_raw_op(ragged_tensor_to_sparse)) def ragged_tensor_to_sparse_eager_fallback(rt_nested_splits, rt_dense_values, name, ctx): if not isinstance(rt_nested_splits, (list, tuple)): raise TypeError( "Expected list for 'rt_nested_splits' argument to " "'ragged_tensor_to_sparse' Op, not %r." % rt_nested_splits) _attr_RAGGED_RANK = len(rt_nested_splits) _attr_T, (rt_dense_values,) = _execute.args_to_matching_eager([rt_dense_values], ctx, []) _attr_Tsplits, rt_nested_splits = _execute.args_to_matching_eager(list(rt_nested_splits), ctx, [_dtypes.int32, _dtypes.int64, ], _dtypes.int64) _inputs_flat = list(rt_nested_splits) + [rt_dense_values] _attrs = ("RAGGED_RANK", _attr_RAGGED_RANK, "T", _attr_T, "Tsplits", _attr_Tsplits) _result = _execute.execute(b"RaggedTensorToSparse", 3, inputs=_inputs_flat, attrs=_attrs, ctx=ctx, name=name) if _execute.must_record_gradient(): _execute.record_gradient( "RaggedTensorToSparse", _inputs_flat, _attrs, _result) _result = _RaggedTensorToSparseOutput._make(_result) return _result def ragged_tensor_to_tensor(shape, values, default_value, row_partition_tensors, row_partition_types, name=None): r"""Create a dense tensor from a ragged tensor, possibly altering its shape. The `ragged_to_dense` op creates a dense tensor from a list of row partition tensors, a value vector, and default values. If the shape is unspecified, the minimal shape required to contain all the elements in the ragged tensor (the natural shape) will be used. If some dimensions are left unspecified, then the size of the natural shape is used in that dimension. The default_value will be broadcast to the output shape. After that, the values from the ragged tensor overwrite the default values. Note that the default_value must have less dimensions than the value. The row partition tensors are in the order of the dimensions. At present, the types can be: * "ROW_SPLITS": the row_splits tensor from the ragged tensor. * "VALUE_ROWIDS": the value_rowids tensor from the ragged tensor. * "FIRST_DIM_SIZE": if value_rowids is used for the first dimension, then it is preceded by "FIRST_DIM_SIZE". Args: shape: A `Tensor`. Must be one of the following types: `int64`, `int32`. The desired shape of the output tensor. If left unspecified (empty), the minimal shape required to contain all the elements in the ragged tensor (the natural shape) will be used. If some dimensions are left unspecified, then the size of the natural shape is used in that dimension. Note that dense dimensions cannot be modified by the shape argument. Trying to change the size of a dense dimension will cause the op to fail. Examples: natural shape: [4, 5, 6] shape: -1 output shape: [4, 5, 6] natural shape: [4, 5, 6] shape: [3, -1, 2] output shape: [3, 5, 2] natural shape: [4, 5, 6] shape: [3, 7, 2] output shape: [3, 7, 2] values: A `Tensor`. A 1D tensor representing the values of the ragged tensor. default_value: A `Tensor`. Must have the same type as `values`. The default_value when the shape is larger than the ragged tensor. The default_value is broadcast until it is the shape of the output tensor, and then overwritten by values in the ragged tensor. The default value must be compatible with this broadcast operation, and must have fewer dimensions than the value tensor. row_partition_tensors: A list of at least 1 `Tensor` objects with the same type in: `int64`, `int32`. row_partition_types: A list of `strings`. The types of the row partition tensors. At present, these can be: * "ROW_SPLITS": the row_splits tensor from the ragged tensor. * "VALUE_ROWIDS": the value_rowids tensor from the ragged tensor. * "FIRST_DIM_SIZE": if value_rowids is used for the first dimension, then it is preceeded by "FIRST_DIM_SIZE". The tensors are in the order of the dimensions. name: A name for the operation (optional). Returns: A `Tensor`. Has the same type as `values`. """ _ctx = _context._context or _context.context() tld = _ctx._thread_local_data if tld.is_eager: try: _result = pywrap_tfe.TFE_Py_FastPathExecute( _ctx, "RaggedTensorToTensor", name, shape, values, default_value, row_partition_tensors, "row_partition_types", row_partition_types) return _result except _core._NotOkStatusException as e: _ops.raise_from_not_ok_status(e, name) except _core._FallbackException: pass try: return ragged_tensor_to_tensor_eager_fallback( shape, values, default_value, row_partition_tensors, row_partition_types=row_partition_types, name=name, ctx=_ctx) except _core._SymbolicException: pass # Add nodes to the TensorFlow graph. # Add nodes to the TensorFlow graph. if not isinstance(row_partition_tensors, (list, tuple)): raise TypeError( "Expected list for 'row_partition_tensors' argument to " "'ragged_tensor_to_tensor' Op, not %r." % row_partition_tensors) _attr_num_row_partition_tensors = len(row_partition_tensors) if not isinstance(row_partition_types, (list, tuple)): raise TypeError( "Expected list for 'row_partition_types' argument to " "'ragged_tensor_to_tensor' Op, not %r." % row_partition_types) row_partition_types = [_execute.make_str(_s, "row_partition_types") for _s in row_partition_types] _, _, _op, _outputs = _op_def_library._apply_op_helper( "RaggedTensorToTensor", shape=shape, values=values, default_value=default_value, row_partition_tensors=row_partition_tensors, row_partition_types=row_partition_types, name=name) _result = _outputs[:] if _execute.must_record_gradient(): _attrs = ("T", _op._get_attr_type("T"), "Tindex", _op._get_attr_type("Tindex"), "Tshape", _op._get_attr_type("Tshape"), "num_row_partition_tensors", _op._get_attr_int("num_row_partition_tensors"), "row_partition_types", _op.get_attr("row_partition_types")) _inputs_flat = _op.inputs _execute.record_gradient( "RaggedTensorToTensor", _inputs_flat, _attrs, _result) _result, = _result return _result RaggedTensorToTensor = tf_export("raw_ops.RaggedTensorToTensor")(_ops.to_raw_op(ragged_tensor_to_tensor)) def ragged_tensor_to_tensor_eager_fallback(shape, values, default_value, row_partition_tensors, row_partition_types, name, ctx): if not isinstance(row_partition_tensors, (list, tuple)): raise TypeError( "Expected list for 'row_partition_tensors' argument to " "'ragged_tensor_to_tensor' Op, not %r." % row_partition_tensors) _attr_num_row_partition_tensors = len(row_partition_tensors) if not isinstance(row_partition_types, (list, tuple)): raise TypeError( "Expected list for 'row_partition_types' argument to " "'ragged_tensor_to_tensor' Op, not %r." % row_partition_types) row_partition_types = [_execute.make_str(_s, "row_partition_types") for _s in row_partition_types] _attr_T, _inputs_T = _execute.args_to_matching_eager([values, default_value], ctx, []) (values, default_value) = _inputs_T _attr_Tindex, row_partition_tensors = _execute.args_to_matching_eager(list(row_partition_tensors), ctx, [_dtypes.int64, _dtypes.int32, ]) _attr_Tshape, (shape,) = _execute.args_to_matching_eager([shape], ctx, [_dtypes.int64, _dtypes.int32, ]) _inputs_flat = [shape, values, default_value] + list(row_partition_tensors) _attrs = ("T", _attr_T, "Tindex", _attr_Tindex, "Tshape", _attr_Tshape, "num_row_partition_tensors", _attr_num_row_partition_tensors, "row_partition_types", row_partition_types) _result = _execute.execute(b"RaggedTensorToTensor", 1, inputs=_inputs_flat, attrs=_attrs, ctx=ctx, name=name) if _execute.must_record_gradient(): _execute.record_gradient( "RaggedTensorToTensor", _inputs_flat, _attrs, _result) _result, = _result return _result def ragged_tensor_to_variant(rt_nested_splits, rt_dense_values, batched_input, name=None): r"""Encodes a `RaggedTensor` into a `variant` Tensor. Encodes the given `RaggedTensor` and returns a `variant` Tensor. If `batched_input` is True, then input `RaggedTensor` is unbatched along the zero-th dimension, each component `RaggedTensor` is encoded into a scalar `variant` Tensor, and these are stacked to return a 1-D `variant` Tensor. If `batched_input` is False, then the input `RaggedTensor` is encoded as is and a scalar `variant` Tensor is returned. A `RaggedTensor` is encoded by first creating a 1-D `variant` Tensor with `ragged_rank + 1` elements, containing the splits and values Tensors of the `RaggedTensor`. Then the 1-D `variant` Tensor is wrapped in a scalar `variant` Tensor. See `RaggedTensorFromVariant` for the corresponding decoding logic. Args: rt_nested_splits: A list of `Tensor` objects with the same type in: `int32`, `int64`. A list of one or more Tensors representing the splits of the input `RaggedTensor`. rt_dense_values: A `Tensor`. A Tensor representing the values of the input `RaggedTensor`. batched_input: A `bool`. A `bool` denoting whether the input is a batched `RaggedTensor`. name: A name for the operation (optional). Returns: A `Tensor` of type `variant`. """ _ctx = _context._context or _context.context() tld = _ctx._thread_local_data if tld.is_eager: try: _result = pywrap_tfe.TFE_Py_FastPathExecute( _ctx, "RaggedTensorToVariant", name, rt_nested_splits, rt_dense_values, "batched_input", batched_input) return _result except _core._NotOkStatusException as e: _ops.raise_from_not_ok_status(e, name) except _core._FallbackException: pass try: return ragged_tensor_to_variant_eager_fallback( rt_nested_splits, rt_dense_values, batched_input=batched_input, name=name, ctx=_ctx) except _core._SymbolicException: pass # Add nodes to the TensorFlow graph. # Add nodes to the TensorFlow graph. if not isinstance(rt_nested_splits, (list, tuple)): raise TypeError( "Expected list for 'rt_nested_splits' argument to " "'ragged_tensor_to_variant' Op, not %r." % rt_nested_splits) _attr_RAGGED_RANK = len(rt_nested_splits) batched_input = _execute.make_bool(batched_input, "batched_input") _, _, _op, _outputs = _op_def_library._apply_op_helper( "RaggedTensorToVariant", rt_nested_splits=rt_nested_splits, rt_dense_values=rt_dense_values, batched_input=batched_input, name=name) _result = _outputs[:] if _execute.must_record_gradient(): _attrs = ("RAGGED_RANK", _op._get_attr_int("RAGGED_RANK"), "Tvalues", _op._get_attr_type("Tvalues"), "Tsplits", _op._get_attr_type("Tsplits"), "batched_input", _op._get_attr_bool("batched_input")) _inputs_flat = _op.inputs _execute.record_gradient( "RaggedTensorToVariant", _inputs_flat, _attrs, _result) _result, = _result return _result RaggedTensorToVariant = tf_export("raw_ops.RaggedTensorToVariant")(_ops.to_raw_op(ragged_tensor_to_variant)) def ragged_tensor_to_variant_eager_fallback(rt_nested_splits, rt_dense_values, batched_input, name, ctx): if not isinstance(rt_nested_splits, (list, tuple)): raise TypeError( "Expected list for 'rt_nested_splits' argument to " "'ragged_tensor_to_variant' Op, not %r." % rt_nested_splits) _attr_RAGGED_RANK = len(rt_nested_splits) batched_input = _execute.make_bool(batched_input, "batched_input") _attr_Tvalues, (rt_dense_values,) = _execute.args_to_matching_eager([rt_dense_values], ctx, []) _attr_Tsplits, rt_nested_splits = _execute.args_to_matching_eager(list(rt_nested_splits), ctx, [_dtypes.int32, _dtypes.int64, ], _dtypes.int64) _inputs_flat = list(rt_nested_splits) + [rt_dense_values] _attrs = ("RAGGED_RANK", _attr_RAGGED_RANK, "Tvalues", _attr_Tvalues, "Tsplits", _attr_Tsplits, "batched_input", batched_input) _result = _execute.execute(b"RaggedTensorToVariant", 1, inputs=_inputs_flat, attrs=_attrs, ctx=ctx, name=name) if _execute.must_record_gradient(): _execute.record_gradient( "RaggedTensorToVariant", _inputs_flat, _attrs, _result) _result, = _result return _result def ragged_tensor_to_variant_gradient(encoded_ragged_grad, row_splits, dense_values_shape, Tvalues, name=None): r"""Helper used to compute the gradient for `RaggedTensorToVariant`. Computes the gradient for the dense_values input to the RaggedTensorToVariant op, given the variant-encoded ragged gradients of the outputs, along with the outer row-splits and the shape of the dense-values that were provided as inputs to the RaggedTensorToVariant op. Args: encoded_ragged_grad: A `Tensor` of type `variant`. A `variant` Tensor containing encoded `RaggedTensor` gradients. row_splits: A `Tensor`. Must be one of the following types: `int32`, `int64`. Outermost row-splits that were used as input to the RaggedTensorToVariant op. dense_values_shape: A `Tensor` of type `int32`. Shape of the dense_values that was used as an input to the RaggedTensorToVariant op. Tvalues: A `tf.DType`. name: A name for the operation (optional). Returns: A `Tensor` of type `Tvalues`. """ _ctx = _context._context or _context.context() tld = _ctx._thread_local_data if tld.is_eager: try: _result = pywrap_tfe.TFE_Py_FastPathExecute( _ctx, "RaggedTensorToVariantGradient", name, encoded_ragged_grad, row_splits, dense_values_shape, "Tvalues", Tvalues) return _result except _core._NotOkStatusException as e: _ops.raise_from_not_ok_status(e, name) except _core._FallbackException: pass try: return ragged_tensor_to_variant_gradient_eager_fallback( encoded_ragged_grad, row_splits, dense_values_shape, Tvalues=Tvalues, name=name, ctx=_ctx) except _core._SymbolicException: pass # Add nodes to the TensorFlow graph. # Add nodes to the TensorFlow graph. Tvalues = _execute.make_type(Tvalues, "Tvalues") _, _, _op, _outputs = _op_def_library._apply_op_helper( "RaggedTensorToVariantGradient", encoded_ragged_grad=encoded_ragged_grad, row_splits=row_splits, dense_values_shape=dense_values_shape, Tvalues=Tvalues, name=name) _result = _outputs[:] if _execute.must_record_gradient(): _attrs = ("Tvalues", _op._get_attr_type("Tvalues"), "Tsplits", _op._get_attr_type("Tsplits")) _inputs_flat = _op.inputs _execute.record_gradient( "RaggedTensorToVariantGradient", _inputs_flat, _attrs, _result) _result, = _result return _result RaggedTensorToVariantGradient = tf_export("raw_ops.RaggedTensorToVariantGradient")(_ops.to_raw_op(ragged_tensor_to_variant_gradient)) def ragged_tensor_to_variant_gradient_eager_fallback(encoded_ragged_grad, row_splits, dense_values_shape, Tvalues, name, ctx): Tvalues = _execute.make_type(Tvalues, "Tvalues") _attr_Tsplits, (row_splits,) = _execute.args_to_matching_eager([row_splits], ctx, [_dtypes.int32, _dtypes.int64, ], _dtypes.int64) encoded_ragged_grad = _ops.convert_to_tensor(encoded_ragged_grad, _dtypes.variant) dense_values_shape = _ops.convert_to_tensor(dense_values_shape, _dtypes.int32) _inputs_flat = [encoded_ragged_grad, row_splits, dense_values_shape] _attrs = ("Tvalues", Tvalues, "Tsplits", _attr_Tsplits) _result = _execute.execute(b"RaggedTensorToVariantGradient", 1, inputs=_inputs_flat, attrs=_attrs, ctx=ctx, name=name) if _execute.must_record_gradient(): _execute.record_gradient( "RaggedTensorToVariantGradient", _inputs_flat, _attrs, _result) _result, = _result return _result