1681 lines
64 KiB
C++
1681 lines
64 KiB
C++
// This file is MACHINE GENERATED! Do not edit.
|
|
|
|
#ifndef TENSORFLOW_CC_OPS_SPARSE_OPS_H_
|
|
#define TENSORFLOW_CC_OPS_SPARSE_OPS_H_
|
|
|
|
// This file is MACHINE GENERATED! Do not edit.
|
|
|
|
#include "tensorflow/cc/framework/ops.h"
|
|
#include "tensorflow/cc/framework/scope.h"
|
|
#include "tensorflow/core/framework/tensor.h"
|
|
#include "tensorflow/core/framework/tensor_shape.h"
|
|
#include "tensorflow/core/framework/types.h"
|
|
#include "tensorflow/core/lib/gtl/array_slice.h"
|
|
|
|
namespace tensorflow {
|
|
namespace ops {
|
|
|
|
/// @defgroup sparse_ops Sparse Ops
|
|
/// @{
|
|
|
|
/// Add an `N`-minibatch `SparseTensor` to a `SparseTensorsMap`, return `N` handles.
|
|
///
|
|
/// A `SparseTensor` of rank `R` is represented by three tensors: `sparse_indices`,
|
|
/// `sparse_values`, and `sparse_shape`, where
|
|
///
|
|
/// ```sparse_indices.shape[1] == sparse_shape.shape[0] == R```
|
|
///
|
|
/// An `N`-minibatch of `SparseTensor` objects is represented as a `SparseTensor`
|
|
/// having a first `sparse_indices` column taking values between `[0, N)`, where
|
|
/// the minibatch size `N == sparse_shape[0]`.
|
|
///
|
|
/// The input `SparseTensor` must have rank `R` greater than 1, and the first
|
|
/// dimension is treated as the minibatch dimension. Elements of the `SparseTensor`
|
|
/// must be sorted in increasing order of this first dimension. The stored
|
|
/// `SparseTensor` objects pointed to by each row of the output `sparse_handles`
|
|
/// will have rank `R-1`.
|
|
///
|
|
/// The `SparseTensor` values can then be read out as part of a minibatch by passing
|
|
/// the given keys as vector elements to `TakeManySparseFromTensorsMap`. To ensure
|
|
/// the correct `SparseTensorsMap` is accessed, ensure that the same
|
|
/// `container` and `shared_name` are passed to that Op. If no `shared_name`
|
|
/// is provided here, instead use the *name* of the Operation created by calling
|
|
/// `AddManySparseToTensorsMap` as the `shared_name` passed to
|
|
/// `TakeManySparseFromTensorsMap`. Ensure the Operations are colocated.
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * sparse_indices: 2-D. The `indices` of the minibatch `SparseTensor`.
|
|
/// `sparse_indices[:, 0]` must be ordered values in `[0, N)`.
|
|
/// * sparse_values: 1-D. The `values` of the minibatch `SparseTensor`.
|
|
/// * sparse_shape: 1-D. The `shape` of the minibatch `SparseTensor`.
|
|
/// The minibatch size `N == sparse_shape[0]`.
|
|
///
|
|
/// Optional attributes (see `Attrs`):
|
|
/// * container: The container name for the `SparseTensorsMap` created by this op.
|
|
/// * shared_name: The shared name for the `SparseTensorsMap` created by this op.
|
|
/// If blank, the new Operation's unique name is used.
|
|
///
|
|
/// Returns:
|
|
/// * `Output`: 1-D. The handles of the `SparseTensor` now stored in the
|
|
/// `SparseTensorsMap`. Shape: `[N]`.
|
|
class AddManySparseToTensorsMap {
|
|
public:
|
|
/// Optional attribute setters for AddManySparseToTensorsMap
|
|
struct Attrs {
|
|
/// The container name for the `SparseTensorsMap` created by this op.
|
|
///
|
|
/// Defaults to ""
|
|
TF_MUST_USE_RESULT Attrs Container(StringPiece x) {
|
|
Attrs ret = *this;
|
|
ret.container_ = x;
|
|
return ret;
|
|
}
|
|
|
|
/// The shared name for the `SparseTensorsMap` created by this op.
|
|
/// If blank, the new Operation's unique name is used.
|
|
///
|
|
/// Defaults to ""
|
|
TF_MUST_USE_RESULT Attrs SharedName(StringPiece x) {
|
|
Attrs ret = *this;
|
|
ret.shared_name_ = x;
|
|
return ret;
|
|
}
|
|
|
|
StringPiece container_ = "";
|
|
StringPiece shared_name_ = "";
|
|
};
|
|
AddManySparseToTensorsMap(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
sparse_indices, ::tensorflow::Input sparse_values,
|
|
::tensorflow::Input sparse_shape);
|
|
AddManySparseToTensorsMap(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
sparse_indices, ::tensorflow::Input sparse_values,
|
|
::tensorflow::Input sparse_shape, const
|
|
AddManySparseToTensorsMap::Attrs& attrs);
|
|
operator ::tensorflow::Output() const { return sparse_handles; }
|
|
operator ::tensorflow::Input() const { return sparse_handles; }
|
|
::tensorflow::Node* node() const { return sparse_handles.node(); }
|
|
|
|
static Attrs Container(StringPiece x) {
|
|
return Attrs().Container(x);
|
|
}
|
|
static Attrs SharedName(StringPiece x) {
|
|
return Attrs().SharedName(x);
|
|
}
|
|
|
|
Operation operation;
|
|
::tensorflow::Output sparse_handles;
|
|
};
|
|
|
|
/// Add a `SparseTensor` to a `SparseTensorsMap` return its handle.
|
|
///
|
|
/// A `SparseTensor` is represented by three tensors: `sparse_indices`,
|
|
/// `sparse_values`, and `sparse_shape`.
|
|
///
|
|
/// This operator takes the given `SparseTensor` and adds it to a container
|
|
/// object (a `SparseTensorsMap`). A unique key within this container is generated
|
|
/// in the form of an `int64`, and this is the value that is returned.
|
|
///
|
|
/// The `SparseTensor` can then be read out as part of a minibatch by passing
|
|
/// the key as a vector element to `TakeManySparseFromTensorsMap`. To ensure
|
|
/// the correct `SparseTensorsMap` is accessed, ensure that the same
|
|
/// `container` and `shared_name` are passed to that Op. If no `shared_name`
|
|
/// is provided here, instead use the *name* of the Operation created by calling
|
|
/// `AddSparseToTensorsMap` as the `shared_name` passed to
|
|
/// `TakeManySparseFromTensorsMap`. Ensure the Operations are colocated.
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * sparse_indices: 2-D. The `indices` of the `SparseTensor`.
|
|
/// * sparse_values: 1-D. The `values` of the `SparseTensor`.
|
|
/// * sparse_shape: 1-D. The `shape` of the `SparseTensor`.
|
|
///
|
|
/// Optional attributes (see `Attrs`):
|
|
/// * container: The container name for the `SparseTensorsMap` created by this op.
|
|
/// * shared_name: The shared name for the `SparseTensorsMap` created by this op.
|
|
/// If blank, the new Operation's unique name is used.
|
|
///
|
|
/// Returns:
|
|
/// * `Output`: 0-D. The handle of the `SparseTensor` now stored in the
|
|
/// `SparseTensorsMap`.
|
|
class AddSparseToTensorsMap {
|
|
public:
|
|
/// Optional attribute setters for AddSparseToTensorsMap
|
|
struct Attrs {
|
|
/// The container name for the `SparseTensorsMap` created by this op.
|
|
///
|
|
/// Defaults to ""
|
|
TF_MUST_USE_RESULT Attrs Container(StringPiece x) {
|
|
Attrs ret = *this;
|
|
ret.container_ = x;
|
|
return ret;
|
|
}
|
|
|
|
/// The shared name for the `SparseTensorsMap` created by this op.
|
|
/// If blank, the new Operation's unique name is used.
|
|
///
|
|
/// Defaults to ""
|
|
TF_MUST_USE_RESULT Attrs SharedName(StringPiece x) {
|
|
Attrs ret = *this;
|
|
ret.shared_name_ = x;
|
|
return ret;
|
|
}
|
|
|
|
StringPiece container_ = "";
|
|
StringPiece shared_name_ = "";
|
|
};
|
|
AddSparseToTensorsMap(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
sparse_indices, ::tensorflow::Input sparse_values,
|
|
::tensorflow::Input sparse_shape);
|
|
AddSparseToTensorsMap(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
sparse_indices, ::tensorflow::Input sparse_values,
|
|
::tensorflow::Input sparse_shape, const
|
|
AddSparseToTensorsMap::Attrs& attrs);
|
|
operator ::tensorflow::Output() const { return sparse_handle; }
|
|
operator ::tensorflow::Input() const { return sparse_handle; }
|
|
::tensorflow::Node* node() const { return sparse_handle.node(); }
|
|
|
|
static Attrs Container(StringPiece x) {
|
|
return Attrs().Container(x);
|
|
}
|
|
static Attrs SharedName(StringPiece x) {
|
|
return Attrs().SharedName(x);
|
|
}
|
|
|
|
Operation operation;
|
|
::tensorflow::Output sparse_handle;
|
|
};
|
|
|
|
/// Deserialize and concatenate `SparseTensors` from a serialized minibatch.
|
|
///
|
|
/// The input `serialized_sparse` must be a string matrix of shape `[N x 3]` where
|
|
/// `N` is the minibatch size and the rows correspond to packed outputs of
|
|
/// `SerializeSparse`. The ranks of the original `SparseTensor` objects
|
|
/// must all match. When the final `SparseTensor` is created, it has rank one
|
|
/// higher than the ranks of the incoming `SparseTensor` objects
|
|
/// (they have been concatenated along a new row dimension).
|
|
///
|
|
/// The output `SparseTensor` object's shape values for all dimensions but the
|
|
/// first are the max across the input `SparseTensor` objects' shape values
|
|
/// for the corresponding dimensions. Its first shape value is `N`, the minibatch
|
|
/// size.
|
|
///
|
|
/// 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]
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * serialized_sparse: 2-D, The `N` serialized `SparseTensor` objects.
|
|
/// Must have 3 columns.
|
|
/// * dtype: The `dtype` of the serialized `SparseTensor` objects.
|
|
///
|
|
/// Returns:
|
|
/// * `Output` sparse_indices
|
|
/// * `Output` sparse_values
|
|
/// * `Output` sparse_shape
|
|
class DeserializeManySparse {
|
|
public:
|
|
DeserializeManySparse(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
serialized_sparse, DataType dtype);
|
|
|
|
Operation operation;
|
|
::tensorflow::Output sparse_indices;
|
|
::tensorflow::Output sparse_values;
|
|
::tensorflow::Output sparse_shape;
|
|
};
|
|
|
|
/// Deserialize `SparseTensor` objects.
|
|
///
|
|
/// 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]
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * serialized_sparse: The serialized `SparseTensor` objects. The last dimension
|
|
/// must have 3 columns.
|
|
/// * dtype: The `dtype` of the serialized `SparseTensor` objects.
|
|
///
|
|
/// Returns:
|
|
/// * `Output` sparse_indices
|
|
/// * `Output` sparse_values
|
|
/// * `Output` sparse_shape
|
|
class DeserializeSparse {
|
|
public:
|
|
DeserializeSparse(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
serialized_sparse, DataType dtype);
|
|
|
|
Operation operation;
|
|
::tensorflow::Output sparse_indices;
|
|
::tensorflow::Output sparse_values;
|
|
::tensorflow::Output sparse_shape;
|
|
};
|
|
|
|
/// Serialize an `N`-minibatch `SparseTensor` into an `[N, 3]` `Tensor` object.
|
|
///
|
|
/// The `SparseTensor` must have rank `R` greater than 1, and the first dimension
|
|
/// is treated as the minibatch dimension. Elements of the `SparseTensor`
|
|
/// must be sorted in increasing order of this first dimension. The serialized
|
|
/// `SparseTensor` objects going into each row of `serialized_sparse` will have
|
|
/// rank `R-1`.
|
|
///
|
|
/// The minibatch size `N` is extracted from `sparse_shape[0]`.
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * sparse_indices: 2-D. The `indices` of the minibatch `SparseTensor`.
|
|
/// * sparse_values: 1-D. The `values` of the minibatch `SparseTensor`.
|
|
/// * sparse_shape: 1-D. The `shape` of the minibatch `SparseTensor`.
|
|
///
|
|
/// Optional attributes (see `Attrs`):
|
|
/// * out_type: The `dtype` to use for serialization; the supported types are `string`
|
|
/// (default) and `variant`.
|
|
///
|
|
/// Returns:
|
|
/// * `Output`: The serialized_sparse tensor.
|
|
class SerializeManySparse {
|
|
public:
|
|
/// Optional attribute setters for SerializeManySparse
|
|
struct Attrs {
|
|
/// The `dtype` to use for serialization; the supported types are `string`
|
|
/// (default) and `variant`.
|
|
///
|
|
/// Defaults to DT_STRING
|
|
TF_MUST_USE_RESULT Attrs OutType(DataType x) {
|
|
Attrs ret = *this;
|
|
ret.out_type_ = x;
|
|
return ret;
|
|
}
|
|
|
|
DataType out_type_ = DT_STRING;
|
|
};
|
|
SerializeManySparse(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
sparse_indices, ::tensorflow::Input sparse_values,
|
|
::tensorflow::Input sparse_shape);
|
|
SerializeManySparse(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
sparse_indices, ::tensorflow::Input sparse_values,
|
|
::tensorflow::Input sparse_shape, const
|
|
SerializeManySparse::Attrs& attrs);
|
|
operator ::tensorflow::Output() const { return serialized_sparse; }
|
|
operator ::tensorflow::Input() const { return serialized_sparse; }
|
|
::tensorflow::Node* node() const { return serialized_sparse.node(); }
|
|
|
|
static Attrs OutType(DataType x) {
|
|
return Attrs().OutType(x);
|
|
}
|
|
|
|
Operation operation;
|
|
::tensorflow::Output serialized_sparse;
|
|
};
|
|
|
|
/// Serialize a `SparseTensor` into a `[3]` `Tensor` object.
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * sparse_indices: 2-D. The `indices` of the `SparseTensor`.
|
|
/// * sparse_values: 1-D. The `values` of the `SparseTensor`.
|
|
/// * sparse_shape: 1-D. The `shape` of the `SparseTensor`.
|
|
///
|
|
/// Optional attributes (see `Attrs`):
|
|
/// * out_type: The `dtype` to use for serialization; the supported types are `string`
|
|
/// (default) and `variant`.
|
|
///
|
|
/// Returns:
|
|
/// * `Output`: The serialized_sparse tensor.
|
|
class SerializeSparse {
|
|
public:
|
|
/// Optional attribute setters for SerializeSparse
|
|
struct Attrs {
|
|
/// The `dtype` to use for serialization; the supported types are `string`
|
|
/// (default) and `variant`.
|
|
///
|
|
/// Defaults to DT_STRING
|
|
TF_MUST_USE_RESULT Attrs OutType(DataType x) {
|
|
Attrs ret = *this;
|
|
ret.out_type_ = x;
|
|
return ret;
|
|
}
|
|
|
|
DataType out_type_ = DT_STRING;
|
|
};
|
|
SerializeSparse(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
sparse_indices, ::tensorflow::Input sparse_values,
|
|
::tensorflow::Input sparse_shape);
|
|
SerializeSparse(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
sparse_indices, ::tensorflow::Input sparse_values,
|
|
::tensorflow::Input sparse_shape, const SerializeSparse::Attrs&
|
|
attrs);
|
|
operator ::tensorflow::Output() const { return serialized_sparse; }
|
|
operator ::tensorflow::Input() const { return serialized_sparse; }
|
|
::tensorflow::Node* node() const { return serialized_sparse.node(); }
|
|
|
|
static Attrs OutType(DataType x) {
|
|
return Attrs().OutType(x);
|
|
}
|
|
|
|
Operation operation;
|
|
::tensorflow::Output serialized_sparse;
|
|
};
|
|
|
|
/// Adds two `SparseTensor` objects to produce another `SparseTensor`.
|
|
///
|
|
/// The input `SparseTensor` objects' indices are assumed ordered in standard
|
|
/// lexicographic order. If this is not the case, before this step run
|
|
/// `SparseReorder` to restore index ordering.
|
|
///
|
|
/// By default, if two values sum to zero at some index, the output `SparseTensor`
|
|
/// would still include that particular location in its index, storing a zero in the
|
|
/// corresponding value slot. To override this, callers can specify `thresh`,
|
|
/// indicating that if the sum has a magnitude strictly smaller than `thresh`, its
|
|
/// corresponding value and index would then not be included. In particular,
|
|
/// `thresh == 0` (default) means everything is kept and actual thresholding happens
|
|
/// only for a positive value.
|
|
///
|
|
/// In the following shapes, `nnz` is the count after taking `thresh` into account.
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * a_indices: 2-D. The `indices` of the first `SparseTensor`, size `[nnz, ndims]` Matrix.
|
|
/// * a_values: 1-D. The `values` of the first `SparseTensor`, size `[nnz]` Vector.
|
|
/// * a_shape: 1-D. The `shape` of the first `SparseTensor`, size `[ndims]` Vector.
|
|
/// * b_indices: 2-D. The `indices` of the second `SparseTensor`, size `[nnz, ndims]` Matrix.
|
|
/// * b_values: 1-D. The `values` of the second `SparseTensor`, size `[nnz]` Vector.
|
|
/// * b_shape: 1-D. The `shape` of the second `SparseTensor`, size `[ndims]` Vector.
|
|
/// * thresh: 0-D. The magnitude threshold that determines if an output value/index
|
|
/// pair takes space.
|
|
///
|
|
/// Returns:
|
|
/// * `Output` sum_indices
|
|
/// * `Output` sum_values
|
|
/// * `Output` sum_shape
|
|
class SparseAdd {
|
|
public:
|
|
SparseAdd(const ::tensorflow::Scope& scope, ::tensorflow::Input a_indices,
|
|
::tensorflow::Input a_values, ::tensorflow::Input a_shape,
|
|
::tensorflow::Input b_indices, ::tensorflow::Input b_values,
|
|
::tensorflow::Input b_shape, ::tensorflow::Input thresh);
|
|
|
|
Operation operation;
|
|
::tensorflow::Output sum_indices;
|
|
::tensorflow::Output sum_values;
|
|
::tensorflow::Output sum_shape;
|
|
};
|
|
|
|
/// The gradient operator for the SparseAdd op.
|
|
///
|
|
/// The SparseAdd op calculates A + B, where A, B, and the sum are all represented
|
|
/// as `SparseTensor` objects. This op takes in the upstream gradient w.r.t.
|
|
/// non-empty values of the sum, and outputs the gradients w.r.t. the non-empty
|
|
/// values of A and B.
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * backprop_val_grad: 1-D with shape `[nnz(sum)]`. The gradient with respect to
|
|
/// the non-empty values of the sum.
|
|
/// * a_indices: 2-D. The `indices` of the `SparseTensor` A, size `[nnz(A), ndims]`.
|
|
/// * b_indices: 2-D. The `indices` of the `SparseTensor` B, size `[nnz(B), ndims]`.
|
|
/// * sum_indices: 2-D. The `indices` of the sum `SparseTensor`, size
|
|
/// `[nnz(sum), ndims]`.
|
|
///
|
|
/// Returns:
|
|
/// * `Output` a_val_grad: 1-D with shape `[nnz(A)]`. The gradient with respect to the
|
|
/// non-empty values of A.
|
|
/// * `Output` b_val_grad: 1-D with shape `[nnz(B)]`. The gradient with respect to the
|
|
/// non-empty values of B.
|
|
class SparseAddGrad {
|
|
public:
|
|
SparseAddGrad(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
backprop_val_grad, ::tensorflow::Input a_indices,
|
|
::tensorflow::Input b_indices, ::tensorflow::Input sum_indices);
|
|
|
|
Operation operation;
|
|
::tensorflow::Output a_val_grad;
|
|
::tensorflow::Output b_val_grad;
|
|
};
|
|
|
|
/// Concatenates a list of `SparseTensor` along the specified dimension.
|
|
///
|
|
/// Concatenation is with respect to the dense versions of these sparse tensors.
|
|
/// It is assumed that each input is a `SparseTensor` whose elements are ordered
|
|
/// along increasing dimension number.
|
|
///
|
|
/// All inputs' shapes must match, except for the concat dimension. The
|
|
/// `indices`, `values`, and `shapes` lists must have the same length.
|
|
///
|
|
/// The output shape is identical to the inputs', except along the concat
|
|
/// dimension, where it is the sum of the inputs' sizes along that dimension.
|
|
///
|
|
/// The output elements will be resorted to preserve the sort order along
|
|
/// increasing dimension number.
|
|
///
|
|
/// This op runs in `O(M log M)` time, where `M` is the total number of non-empty
|
|
/// values across all inputs. This is due to the need for an internal sort in
|
|
/// order to concatenate efficiently across an arbitrary dimension.
|
|
///
|
|
/// For example, if `concat_dim = 1` and the inputs are
|
|
///
|
|
/// sp_inputs[0]: shape = [2, 3]
|
|
/// [0, 2]: "a"
|
|
/// [1, 0]: "b"
|
|
/// [1, 1]: "c"
|
|
///
|
|
/// sp_inputs[1]: shape = [2, 4]
|
|
/// [0, 1]: "d"
|
|
/// [0, 2]: "e"
|
|
///
|
|
/// then the output will be
|
|
///
|
|
/// shape = [2, 7]
|
|
/// [0, 2]: "a"
|
|
/// [0, 4]: "d"
|
|
/// [0, 5]: "e"
|
|
/// [1, 0]: "b"
|
|
/// [1, 1]: "c"
|
|
///
|
|
/// Graphically this is equivalent to doing
|
|
///
|
|
/// [ a] concat [ d e ] = [ a d e ]
|
|
/// [b c ] [ ] [b c ]
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * indices: 2-D. Indices of each input `SparseTensor`.
|
|
/// * values: 1-D. Non-empty values of each `SparseTensor`.
|
|
/// * shapes: 1-D. Shapes of each `SparseTensor`.
|
|
/// * concat_dim: Dimension to concatenate along. Must be in range [-rank, rank),
|
|
/// where rank is the number of dimensions in each input `SparseTensor`.
|
|
///
|
|
/// Returns:
|
|
/// * `Output` output_indices: 2-D. Indices of the concatenated `SparseTensor`.
|
|
/// * `Output` output_values: 1-D. Non-empty values of the concatenated `SparseTensor`.
|
|
/// * `Output` output_shape: 1-D. Shape of the concatenated `SparseTensor`.
|
|
class SparseConcat {
|
|
public:
|
|
SparseConcat(const ::tensorflow::Scope& scope, ::tensorflow::InputList indices,
|
|
::tensorflow::InputList values, ::tensorflow::InputList shapes,
|
|
int64 concat_dim);
|
|
|
|
Operation operation;
|
|
::tensorflow::Output output_indices;
|
|
::tensorflow::Output output_values;
|
|
::tensorflow::Output output_shape;
|
|
};
|
|
|
|
/// Generates sparse cross from a list of sparse and dense tensors.
|
|
///
|
|
/// The op takes two lists, one of 2D `SparseTensor` and one of 2D `Tensor`, each
|
|
/// representing features of one feature column. It outputs a 2D `SparseTensor` with
|
|
/// the batchwise crosses of these features.
|
|
///
|
|
/// For example, if the inputs are
|
|
///
|
|
/// inputs[0]: SparseTensor with shape = [2, 2]
|
|
/// [0, 0]: "a"
|
|
/// [1, 0]: "b"
|
|
/// [1, 1]: "c"
|
|
///
|
|
/// inputs[1]: SparseTensor with shape = [2, 1]
|
|
/// [0, 0]: "d"
|
|
/// [1, 0]: "e"
|
|
///
|
|
/// inputs[2]: Tensor [["f"], ["g"]]
|
|
///
|
|
/// then the output will be
|
|
///
|
|
/// shape = [2, 2]
|
|
/// [0, 0]: "a_X_d_X_f"
|
|
/// [1, 0]: "b_X_e_X_g"
|
|
/// [1, 1]: "c_X_e_X_g"
|
|
///
|
|
/// if hashed_output=true then the output will be
|
|
///
|
|
/// shape = [2, 2]
|
|
/// [0, 0]: FingerprintCat64(
|
|
/// Fingerprint64("f"), FingerprintCat64(
|
|
/// Fingerprint64("d"), Fingerprint64("a")))
|
|
/// [1, 0]: FingerprintCat64(
|
|
/// Fingerprint64("g"), FingerprintCat64(
|
|
/// Fingerprint64("e"), Fingerprint64("b")))
|
|
/// [1, 1]: FingerprintCat64(
|
|
/// Fingerprint64("g"), FingerprintCat64(
|
|
/// Fingerprint64("e"), Fingerprint64("c")))
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * indices: 2-D. Indices of each input `SparseTensor`.
|
|
/// * values: 1-D. values of each `SparseTensor`.
|
|
/// * shapes: 1-D. Shapes of each `SparseTensor`.
|
|
/// * dense_inputs: 2-D. Columns represented by dense `Tensor`.
|
|
/// * hashed_output: If true, returns the hash of the cross instead of the string.
|
|
/// This will allow us avoiding string manipulations.
|
|
/// * num_buckets: It is used if hashed_output is true.
|
|
/// output = hashed_value%num_buckets if num_buckets > 0 else hashed_value.
|
|
/// * hash_key: Specify the hash_key that will be used by the `FingerprintCat64`
|
|
/// function to combine the crosses fingerprints.
|
|
///
|
|
/// Returns:
|
|
/// * `Output` output_indices: 2-D. Indices of the concatenated `SparseTensor`.
|
|
/// * `Output` output_values: 1-D. Non-empty values of the concatenated or hashed
|
|
/// `SparseTensor`.
|
|
/// * `Output` output_shape: 1-D. Shape of the concatenated `SparseTensor`.
|
|
class SparseCross {
|
|
public:
|
|
SparseCross(const ::tensorflow::Scope& scope, ::tensorflow::InputList indices,
|
|
::tensorflow::InputList values, ::tensorflow::InputList shapes,
|
|
::tensorflow::InputList dense_inputs, bool hashed_output, int64
|
|
num_buckets, int64 hash_key, DataType out_type, DataType
|
|
internal_type);
|
|
|
|
Operation operation;
|
|
::tensorflow::Output output_indices;
|
|
::tensorflow::Output output_values;
|
|
::tensorflow::Output output_shape;
|
|
};
|
|
|
|
/// Adds up a SparseTensor and a dense Tensor, using these special rules:
|
|
///
|
|
/// (1) Broadcasts the dense side to have the same shape as the sparse side, if
|
|
/// eligible;
|
|
/// (2) Then, only the dense values pointed to by the indices of the SparseTensor
|
|
/// participate in the cwise addition.
|
|
///
|
|
/// By these rules, the result is a logical SparseTensor with exactly the same
|
|
/// indices and shape, but possibly with different non-zero values. The output of
|
|
/// this Op is the resultant non-zero values.
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * sp_indices: 2-D. `N x R` matrix with the indices of non-empty values in a
|
|
/// SparseTensor, possibly not in canonical ordering.
|
|
/// * sp_values: 1-D. `N` non-empty values corresponding to `sp_indices`.
|
|
/// * sp_shape: 1-D. Shape of the input SparseTensor.
|
|
/// * dense: `R`-D. The dense Tensor operand.
|
|
///
|
|
/// Returns:
|
|
/// * `Output`: 1-D. The `N` values that are operated on.
|
|
class SparseDenseCwiseAdd {
|
|
public:
|
|
SparseDenseCwiseAdd(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
sp_indices, ::tensorflow::Input sp_values,
|
|
::tensorflow::Input sp_shape, ::tensorflow::Input dense);
|
|
operator ::tensorflow::Output() const { return output; }
|
|
operator ::tensorflow::Input() const { return output; }
|
|
::tensorflow::Node* node() const { return output.node(); }
|
|
|
|
Operation operation;
|
|
::tensorflow::Output output;
|
|
};
|
|
|
|
/// Component-wise divides a SparseTensor by a dense Tensor.
|
|
///
|
|
/// *Limitation*: this Op only broadcasts the dense side to the sparse side, but not
|
|
/// the other direction.
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * sp_indices: 2-D. `N x R` matrix with the indices of non-empty values in a
|
|
/// SparseTensor, possibly not in canonical ordering.
|
|
/// * sp_values: 1-D. `N` non-empty values corresponding to `sp_indices`.
|
|
/// * sp_shape: 1-D. Shape of the input SparseTensor.
|
|
/// * dense: `R`-D. The dense Tensor operand.
|
|
///
|
|
/// Returns:
|
|
/// * `Output`: 1-D. The `N` values that are operated on.
|
|
class SparseDenseCwiseDiv {
|
|
public:
|
|
SparseDenseCwiseDiv(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
sp_indices, ::tensorflow::Input sp_values,
|
|
::tensorflow::Input sp_shape, ::tensorflow::Input dense);
|
|
operator ::tensorflow::Output() const { return output; }
|
|
operator ::tensorflow::Input() const { return output; }
|
|
::tensorflow::Node* node() const { return output.node(); }
|
|
|
|
Operation operation;
|
|
::tensorflow::Output output;
|
|
};
|
|
|
|
/// Component-wise multiplies a SparseTensor by a dense Tensor.
|
|
///
|
|
/// The output locations corresponding to the implicitly zero elements in the sparse
|
|
/// tensor will be zero (i.e., will not take up storage space), regardless of the
|
|
/// contents of the dense tensor (even if it's +/-INF and that INF*0 == NaN).
|
|
///
|
|
/// *Limitation*: this Op only broadcasts the dense side to the sparse side, but not
|
|
/// the other direction.
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * sp_indices: 2-D. `N x R` matrix with the indices of non-empty values in a
|
|
/// SparseTensor, possibly not in canonical ordering.
|
|
/// * sp_values: 1-D. `N` non-empty values corresponding to `sp_indices`.
|
|
/// * sp_shape: 1-D. Shape of the input SparseTensor.
|
|
/// * dense: `R`-D. The dense Tensor operand.
|
|
///
|
|
/// Returns:
|
|
/// * `Output`: 1-D. The `N` values that are operated on.
|
|
class SparseDenseCwiseMul {
|
|
public:
|
|
SparseDenseCwiseMul(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
sp_indices, ::tensorflow::Input sp_values,
|
|
::tensorflow::Input sp_shape, ::tensorflow::Input dense);
|
|
operator ::tensorflow::Output() const { return output; }
|
|
operator ::tensorflow::Input() const { return output; }
|
|
::tensorflow::Node* node() const { return output.node(); }
|
|
|
|
Operation operation;
|
|
::tensorflow::Output output;
|
|
};
|
|
|
|
/// Fills empty rows in the input 2-D `SparseTensor` with a default value.
|
|
///
|
|
/// The input `SparseTensor` is represented via the tuple of inputs
|
|
/// (`indices`, `values`, `dense_shape`). The output `SparseTensor` has the
|
|
/// same `dense_shape` but with indices `output_indices` and values
|
|
/// `output_values`.
|
|
///
|
|
/// This op inserts a single entry for every row that doesn't have any values.
|
|
/// The index is created as `[row, 0, ..., 0]` and the inserted value
|
|
/// is `default_value`.
|
|
///
|
|
/// For example, suppose `sp_input` has shape `[5, 6]` and non-empty values:
|
|
///
|
|
/// [0, 1]: a
|
|
/// [0, 3]: b
|
|
/// [2, 0]: c
|
|
/// [3, 1]: d
|
|
///
|
|
/// Rows 1 and 4 are empty, so the output will be of shape `[5, 6]` with values:
|
|
///
|
|
/// [0, 1]: a
|
|
/// [0, 3]: b
|
|
/// [1, 0]: default_value
|
|
/// [2, 0]: c
|
|
/// [3, 1]: d
|
|
/// [4, 0]: default_value
|
|
///
|
|
/// The output `SparseTensor` will be in row-major order and will have the
|
|
/// same shape as the input.
|
|
///
|
|
/// This op also returns an indicator vector shaped `[dense_shape[0]]` such that
|
|
///
|
|
/// empty_row_indicator[i] = True iff row i was an empty row.
|
|
///
|
|
/// And a reverse index map vector shaped `[indices.shape[0]]` that is used during
|
|
/// backpropagation,
|
|
///
|
|
/// reverse_index_map[j] = out_j s.t. indices[j, :] == output_indices[out_j, :]
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * indices: 2-D. the indices of the sparse tensor.
|
|
/// * values: 1-D. the values of the sparse tensor.
|
|
/// * dense_shape: 1-D. the shape of the sparse tensor.
|
|
/// * default_value: 0-D. default value to insert into location `[row, 0, ..., 0]`
|
|
/// for rows missing from the input sparse tensor.
|
|
/// output indices: 2-D. the indices of the filled sparse tensor.
|
|
///
|
|
/// Returns:
|
|
/// * `Output` output_indices
|
|
/// * `Output` output_values: 1-D. the values of the filled sparse tensor.
|
|
/// * `Output` empty_row_indicator: 1-D. whether the dense row was missing in the
|
|
/// input sparse tensor.
|
|
/// * `Output` reverse_index_map: 1-D. a map from the input indices to the output indices.
|
|
class SparseFillEmptyRows {
|
|
public:
|
|
SparseFillEmptyRows(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
indices, ::tensorflow::Input values, ::tensorflow::Input
|
|
dense_shape, ::tensorflow::Input default_value);
|
|
|
|
Operation operation;
|
|
::tensorflow::Output output_indices;
|
|
::tensorflow::Output output_values;
|
|
::tensorflow::Output empty_row_indicator;
|
|
::tensorflow::Output reverse_index_map;
|
|
};
|
|
|
|
/// The gradient of SparseFillEmptyRows.
|
|
///
|
|
/// Takes vectors reverse_index_map, shaped `[N]`, and grad_values,
|
|
/// shaped `[N_full]`, where `N_full >= N` and copies data into either
|
|
/// `d_values` or `d_default_value`. Here `d_values` is shaped `[N]` and
|
|
/// `d_default_value` is a scalar.
|
|
///
|
|
/// d_values[j] = grad_values[reverse_index_map[j]]
|
|
/// d_default_value = sum_{k : 0 .. N_full - 1} (
|
|
/// grad_values[k] * 1{k not in reverse_index_map})
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * reverse_index_map: 1-D. The reverse index map from SparseFillEmptyRows.
|
|
/// * grad_values: 1-D. The gradients from backprop.
|
|
///
|
|
/// Returns:
|
|
/// * `Output` d_values: 1-D. The backprop into values.
|
|
/// * `Output` d_default_value: 0-D. The backprop into default_value.
|
|
class SparseFillEmptyRowsGrad {
|
|
public:
|
|
SparseFillEmptyRowsGrad(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
reverse_index_map, ::tensorflow::Input grad_values);
|
|
|
|
Operation operation;
|
|
::tensorflow::Output d_values;
|
|
::tensorflow::Output d_default_value;
|
|
};
|
|
|
|
/// Computes the max of elements across dimensions of a SparseTensor.
|
|
///
|
|
/// This Op takes a SparseTensor and is the sparse counterpart to
|
|
/// `tf.reduce_max()`. In particular, this Op also returns a dense `Tensor`
|
|
/// instead of a sparse one.
|
|
///
|
|
/// Reduces `sp_input` along the dimensions given in `reduction_axes`. Unless
|
|
/// `keep_dims` is true, the rank of the tensor is reduced by 1 for each entry in
|
|
/// `reduction_axes`. If `keep_dims` is true, the reduced dimensions are retained
|
|
/// with length 1.
|
|
///
|
|
/// If `reduction_axes` has no entries, all dimensions are reduced, and a tensor
|
|
/// with a single element is returned. Additionally, the axes can be negative,
|
|
/// which are interpreted according to the indexing rules in Python.
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * input_indices: 2-D. `N x R` matrix with the indices of non-empty values in a
|
|
/// SparseTensor, possibly not in canonical ordering.
|
|
/// * input_values: 1-D. `N` non-empty values corresponding to `input_indices`.
|
|
/// * input_shape: 1-D. Shape of the input SparseTensor.
|
|
/// * reduction_axes: 1-D. Length-`K` vector containing the reduction axes.
|
|
///
|
|
/// Optional attributes (see `Attrs`):
|
|
/// * keep_dims: If true, retain reduced dimensions with length 1.
|
|
///
|
|
/// Returns:
|
|
/// * `Output`: `R-K`-D. The reduced Tensor.
|
|
class SparseReduceMax {
|
|
public:
|
|
/// Optional attribute setters for SparseReduceMax
|
|
struct Attrs {
|
|
/// If true, retain reduced dimensions with length 1.
|
|
///
|
|
/// Defaults to false
|
|
TF_MUST_USE_RESULT Attrs KeepDims(bool x) {
|
|
Attrs ret = *this;
|
|
ret.keep_dims_ = x;
|
|
return ret;
|
|
}
|
|
|
|
bool keep_dims_ = false;
|
|
};
|
|
SparseReduceMax(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
input_indices, ::tensorflow::Input input_values,
|
|
::tensorflow::Input input_shape, ::tensorflow::Input
|
|
reduction_axes);
|
|
SparseReduceMax(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
input_indices, ::tensorflow::Input input_values,
|
|
::tensorflow::Input input_shape, ::tensorflow::Input
|
|
reduction_axes, const SparseReduceMax::Attrs& attrs);
|
|
operator ::tensorflow::Output() const { return output; }
|
|
operator ::tensorflow::Input() const { return output; }
|
|
::tensorflow::Node* node() const { return output.node(); }
|
|
|
|
static Attrs KeepDims(bool x) {
|
|
return Attrs().KeepDims(x);
|
|
}
|
|
|
|
Operation operation;
|
|
::tensorflow::Output output;
|
|
};
|
|
|
|
/// Computes the max of elements across dimensions of a SparseTensor.
|
|
///
|
|
/// This Op takes a SparseTensor and is the sparse counterpart to
|
|
/// `tf.reduce_max()`. In contrast to SparseReduceMax, this Op returns a
|
|
/// SparseTensor.
|
|
///
|
|
/// Reduces `sp_input` along the dimensions given in `reduction_axes`. Unless
|
|
/// `keep_dims` is true, the rank of the tensor is reduced by 1 for each entry in
|
|
/// `reduction_axes`. If `keep_dims` is true, the reduced dimensions are retained
|
|
/// with length 1.
|
|
///
|
|
/// If `reduction_axes` has no entries, all dimensions are reduced, and a tensor
|
|
/// with a single element is returned. Additionally, the axes can be negative,
|
|
/// which are interpreted according to the indexing rules in Python.
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * input_indices: 2-D. `N x R` matrix with the indices of non-empty values in a
|
|
/// SparseTensor, possibly not in canonical ordering.
|
|
/// * input_values: 1-D. `N` non-empty values corresponding to `input_indices`.
|
|
/// * input_shape: 1-D. Shape of the input SparseTensor.
|
|
/// * reduction_axes: 1-D. Length-`K` vector containing the reduction axes.
|
|
///
|
|
/// Optional attributes (see `Attrs`):
|
|
/// * keep_dims: If true, retain reduced dimensions with length 1.
|
|
///
|
|
/// Returns:
|
|
/// * `Output` output_indices
|
|
/// * `Output` output_values
|
|
/// * `Output` output_shape
|
|
class SparseReduceMaxSparse {
|
|
public:
|
|
/// Optional attribute setters for SparseReduceMaxSparse
|
|
struct Attrs {
|
|
/// If true, retain reduced dimensions with length 1.
|
|
///
|
|
/// Defaults to false
|
|
TF_MUST_USE_RESULT Attrs KeepDims(bool x) {
|
|
Attrs ret = *this;
|
|
ret.keep_dims_ = x;
|
|
return ret;
|
|
}
|
|
|
|
bool keep_dims_ = false;
|
|
};
|
|
SparseReduceMaxSparse(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
input_indices, ::tensorflow::Input input_values,
|
|
::tensorflow::Input input_shape, ::tensorflow::Input
|
|
reduction_axes);
|
|
SparseReduceMaxSparse(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
input_indices, ::tensorflow::Input input_values,
|
|
::tensorflow::Input input_shape, ::tensorflow::Input
|
|
reduction_axes, const SparseReduceMaxSparse::Attrs&
|
|
attrs);
|
|
|
|
static Attrs KeepDims(bool x) {
|
|
return Attrs().KeepDims(x);
|
|
}
|
|
|
|
Operation operation;
|
|
::tensorflow::Output output_indices;
|
|
::tensorflow::Output output_values;
|
|
::tensorflow::Output output_shape;
|
|
};
|
|
|
|
/// Computes the sum of elements across dimensions of a SparseTensor.
|
|
///
|
|
/// This Op takes a SparseTensor and is the sparse counterpart to
|
|
/// `tf.reduce_sum()`. In particular, this Op also returns a dense `Tensor`
|
|
/// instead of a sparse one.
|
|
///
|
|
/// Reduces `sp_input` along the dimensions given in `reduction_axes`. Unless
|
|
/// `keep_dims` is true, the rank of the tensor is reduced by 1 for each entry in
|
|
/// `reduction_axes`. If `keep_dims` is true, the reduced dimensions are retained
|
|
/// with length 1.
|
|
///
|
|
/// If `reduction_axes` has no entries, all dimensions are reduced, and a tensor
|
|
/// with a single element is returned. Additionally, the axes can be negative,
|
|
/// which are interpreted according to the indexing rules in Python.
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * input_indices: 2-D. `N x R` matrix with the indices of non-empty values in a
|
|
/// SparseTensor, possibly not in canonical ordering.
|
|
/// * input_values: 1-D. `N` non-empty values corresponding to `input_indices`.
|
|
/// * input_shape: 1-D. Shape of the input SparseTensor.
|
|
/// * reduction_axes: 1-D. Length-`K` vector containing the reduction axes.
|
|
///
|
|
/// Optional attributes (see `Attrs`):
|
|
/// * keep_dims: If true, retain reduced dimensions with length 1.
|
|
///
|
|
/// Returns:
|
|
/// * `Output`: `R-K`-D. The reduced Tensor.
|
|
class SparseReduceSum {
|
|
public:
|
|
/// Optional attribute setters for SparseReduceSum
|
|
struct Attrs {
|
|
/// If true, retain reduced dimensions with length 1.
|
|
///
|
|
/// Defaults to false
|
|
TF_MUST_USE_RESULT Attrs KeepDims(bool x) {
|
|
Attrs ret = *this;
|
|
ret.keep_dims_ = x;
|
|
return ret;
|
|
}
|
|
|
|
bool keep_dims_ = false;
|
|
};
|
|
SparseReduceSum(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
input_indices, ::tensorflow::Input input_values,
|
|
::tensorflow::Input input_shape, ::tensorflow::Input
|
|
reduction_axes);
|
|
SparseReduceSum(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
input_indices, ::tensorflow::Input input_values,
|
|
::tensorflow::Input input_shape, ::tensorflow::Input
|
|
reduction_axes, const SparseReduceSum::Attrs& attrs);
|
|
operator ::tensorflow::Output() const { return output; }
|
|
operator ::tensorflow::Input() const { return output; }
|
|
::tensorflow::Node* node() const { return output.node(); }
|
|
|
|
static Attrs KeepDims(bool x) {
|
|
return Attrs().KeepDims(x);
|
|
}
|
|
|
|
Operation operation;
|
|
::tensorflow::Output output;
|
|
};
|
|
|
|
/// Computes the sum of elements across dimensions of a SparseTensor.
|
|
///
|
|
/// This Op takes a SparseTensor and is the sparse counterpart to
|
|
/// `tf.reduce_sum()`. In contrast to SparseReduceSum, this Op returns a
|
|
/// SparseTensor.
|
|
///
|
|
/// Reduces `sp_input` along the dimensions given in `reduction_axes`. Unless
|
|
/// `keep_dims` is true, the rank of the tensor is reduced by 1 for each entry in
|
|
/// `reduction_axes`. If `keep_dims` is true, the reduced dimensions are retained
|
|
/// with length 1.
|
|
///
|
|
/// If `reduction_axes` has no entries, all dimensions are reduced, and a tensor
|
|
/// with a single element is returned. Additionally, the axes can be negative,
|
|
/// which are interpreted according to the indexing rules in Python.
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * input_indices: 2-D. `N x R` matrix with the indices of non-empty values in a
|
|
/// SparseTensor, possibly not in canonical ordering.
|
|
/// * input_values: 1-D. `N` non-empty values corresponding to `input_indices`.
|
|
/// * input_shape: 1-D. Shape of the input SparseTensor.
|
|
/// * reduction_axes: 1-D. Length-`K` vector containing the reduction axes.
|
|
///
|
|
/// Optional attributes (see `Attrs`):
|
|
/// * keep_dims: If true, retain reduced dimensions with length 1.
|
|
///
|
|
/// Returns:
|
|
/// * `Output` output_indices
|
|
/// * `Output` output_values
|
|
/// * `Output` output_shape
|
|
class SparseReduceSumSparse {
|
|
public:
|
|
/// Optional attribute setters for SparseReduceSumSparse
|
|
struct Attrs {
|
|
/// If true, retain reduced dimensions with length 1.
|
|
///
|
|
/// Defaults to false
|
|
TF_MUST_USE_RESULT Attrs KeepDims(bool x) {
|
|
Attrs ret = *this;
|
|
ret.keep_dims_ = x;
|
|
return ret;
|
|
}
|
|
|
|
bool keep_dims_ = false;
|
|
};
|
|
SparseReduceSumSparse(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
input_indices, ::tensorflow::Input input_values,
|
|
::tensorflow::Input input_shape, ::tensorflow::Input
|
|
reduction_axes);
|
|
SparseReduceSumSparse(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
input_indices, ::tensorflow::Input input_values,
|
|
::tensorflow::Input input_shape, ::tensorflow::Input
|
|
reduction_axes, const SparseReduceSumSparse::Attrs&
|
|
attrs);
|
|
|
|
static Attrs KeepDims(bool x) {
|
|
return Attrs().KeepDims(x);
|
|
}
|
|
|
|
Operation operation;
|
|
::tensorflow::Output output_indices;
|
|
::tensorflow::Output output_values;
|
|
::tensorflow::Output output_shape;
|
|
};
|
|
|
|
/// Reorders a SparseTensor into the canonical, row-major ordering.
|
|
///
|
|
/// Note that by convention, all sparse ops preserve the canonical ordering along
|
|
/// increasing dimension number. The only time ordering can be violated is during
|
|
/// manual manipulation of the indices and values vectors to add entries.
|
|
///
|
|
/// Reordering does not affect the shape of the SparseTensor.
|
|
///
|
|
/// If the tensor has rank `R` and `N` non-empty values, `input_indices` has
|
|
/// shape `[N, R]`, input_values has length `N`, and input_shape has length `R`.
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * input_indices: 2-D. `N x R` matrix with the indices of non-empty values in a
|
|
/// SparseTensor, possibly not in canonical ordering.
|
|
/// * input_values: 1-D. `N` non-empty values corresponding to `input_indices`.
|
|
/// * input_shape: 1-D. Shape of the input SparseTensor.
|
|
///
|
|
/// Returns:
|
|
/// * `Output` output_indices: 2-D. `N x R` matrix with the same indices as input_indices, but
|
|
/// in canonical row-major ordering.
|
|
/// * `Output` output_values: 1-D. `N` non-empty values corresponding to `output_indices`.
|
|
class SparseReorder {
|
|
public:
|
|
SparseReorder(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
input_indices, ::tensorflow::Input input_values,
|
|
::tensorflow::Input input_shape);
|
|
|
|
Operation operation;
|
|
::tensorflow::Output output_indices;
|
|
::tensorflow::Output output_values;
|
|
};
|
|
|
|
/// Reshapes a SparseTensor to represent values in a new dense shape.
|
|
///
|
|
/// This operation has the same semantics as reshape on the represented dense
|
|
/// tensor. The `input_indices` are recomputed based on the requested `new_shape`.
|
|
///
|
|
/// If one component of `new_shape` is the special value -1, the size of that
|
|
/// dimension is computed so that the total dense size remains constant. At
|
|
/// most one component of `new_shape` can be -1. The number of dense elements
|
|
/// implied by `new_shape` must be the same as the number of dense elements
|
|
/// originally implied by `input_shape`.
|
|
///
|
|
/// Reshaping does not affect the order of values in the SparseTensor.
|
|
///
|
|
/// If the input tensor has rank `R_in` and `N` non-empty values, and `new_shape`
|
|
/// has length `R_out`, then `input_indices` has shape `[N, R_in]`,
|
|
/// `input_shape` has length `R_in`, `output_indices` has shape `[N, R_out]`, and
|
|
/// `output_shape` has length `R_out`.
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * input_indices: 2-D. `N x R_in` matrix with the indices of non-empty values in a
|
|
/// SparseTensor.
|
|
/// * input_shape: 1-D. `R_in` vector with the input SparseTensor's dense shape.
|
|
/// * new_shape: 1-D. `R_out` vector with the requested new dense shape.
|
|
///
|
|
/// Returns:
|
|
/// * `Output` output_indices: 2-D. `N x R_out` matrix with the updated indices of non-empty
|
|
/// values in the output SparseTensor.
|
|
/// * `Output` output_shape: 1-D. `R_out` vector with the full dense shape of the output
|
|
/// SparseTensor. This is the same as `new_shape` but with any -1 dimensions
|
|
/// filled in.
|
|
class SparseReshape {
|
|
public:
|
|
SparseReshape(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
input_indices, ::tensorflow::Input input_shape,
|
|
::tensorflow::Input new_shape);
|
|
|
|
Operation operation;
|
|
::tensorflow::Output output_indices;
|
|
::tensorflow::Output output_shape;
|
|
};
|
|
|
|
/// Slice a `SparseTensor` based on the `start` and `size`.
|
|
///
|
|
/// For example, if the input is
|
|
///
|
|
/// input_tensor = shape = [2, 7]
|
|
/// [ a d e ]
|
|
/// [b c ]
|
|
///
|
|
/// Graphically the output tensors are:
|
|
///
|
|
/// sparse_slice([0, 0], [2, 4]) = shape = [2, 4]
|
|
/// [ a ]
|
|
/// [b c ]
|
|
///
|
|
/// sparse_slice([0, 4], [2, 3]) = shape = [2, 3]
|
|
/// [ d e ]
|
|
/// [ ]
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * indices: 2-D tensor represents the indices of the sparse tensor.
|
|
/// * values: 1-D tensor represents the values of the sparse tensor.
|
|
/// * shape: 1-D. tensor represents the shape of the sparse tensor.
|
|
/// * start: 1-D. tensor represents the start of the slice.
|
|
/// * size: 1-D. tensor represents the size of the slice.
|
|
/// output indices: A list of 1-D tensors represents the indices of the output
|
|
/// sparse tensors.
|
|
///
|
|
/// Returns:
|
|
/// * `Output` output_indices
|
|
/// * `Output` output_values: A list of 1-D tensors represents the values of the output sparse
|
|
/// tensors.
|
|
/// * `Output` output_shape: A list of 1-D tensors represents the shape of the output sparse
|
|
/// tensors.
|
|
class SparseSlice {
|
|
public:
|
|
SparseSlice(const ::tensorflow::Scope& scope, ::tensorflow::Input indices,
|
|
::tensorflow::Input values, ::tensorflow::Input shape,
|
|
::tensorflow::Input start, ::tensorflow::Input size);
|
|
|
|
Operation operation;
|
|
::tensorflow::Output output_indices;
|
|
::tensorflow::Output output_values;
|
|
::tensorflow::Output output_shape;
|
|
};
|
|
|
|
/// The gradient operator for the SparseSlice op.
|
|
///
|
|
/// This op takes in the upstream gradient w.r.t. non-empty values of
|
|
/// the sliced `SparseTensor`, and outputs the gradients w.r.t.
|
|
/// the non-empty values of input `SparseTensor`.
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * backprop_val_grad: 1-D. The gradient with respect to
|
|
/// the non-empty values of the sliced `SparseTensor`.
|
|
/// * input_indices: 2-D. The `indices` of the input `SparseTensor`.
|
|
/// * input_start: 1-D. tensor represents the start of the slice.
|
|
/// * output_indices: 2-D. The `indices` of the sliced `SparseTensor`.
|
|
///
|
|
/// Returns:
|
|
/// * `Output`: 1-D. The gradient with respect to the non-empty values of input `SparseTensor`.
|
|
class SparseSliceGrad {
|
|
public:
|
|
SparseSliceGrad(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
backprop_val_grad, ::tensorflow::Input input_indices,
|
|
::tensorflow::Input input_start, ::tensorflow::Input
|
|
output_indices);
|
|
operator ::tensorflow::Output() const { return val_grad; }
|
|
operator ::tensorflow::Input() const { return val_grad; }
|
|
::tensorflow::Node* node() const { return val_grad.node(); }
|
|
|
|
Operation operation;
|
|
::tensorflow::Output val_grad;
|
|
};
|
|
|
|
/// Applies softmax to a batched N-D `SparseTensor`.
|
|
///
|
|
/// The inputs represent an N-D SparseTensor with logical shape `[..., B, C]`
|
|
/// (where `N >= 2`), and with indices sorted in the canonical lexicographic order.
|
|
///
|
|
/// This op is equivalent to applying the normal `tf.nn.softmax()` to each innermost
|
|
/// logical submatrix with shape `[B, C]`, but with the catch that *the implicitly
|
|
/// zero elements do not participate*. Specifically, the algorithm is equivalent
|
|
/// to the following:
|
|
///
|
|
/// (1) Applies `tf.nn.softmax()` to a densified view of each innermost submatrix
|
|
/// with shape `[B, C]`, along the size-C dimension;
|
|
/// (2) Masks out the original implicitly-zero locations;
|
|
/// (3) Renormalizes the remaining elements.
|
|
///
|
|
/// Hence, the `SparseTensor` result has exactly the same non-zero indices and
|
|
/// shape.
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * sp_indices: 2-D. `NNZ x R` matrix with the indices of non-empty values in a
|
|
/// SparseTensor, in canonical ordering.
|
|
/// * sp_values: 1-D. `NNZ` non-empty values corresponding to `sp_indices`.
|
|
/// * sp_shape: 1-D. Shape of the input SparseTensor.
|
|
///
|
|
/// Returns:
|
|
/// * `Output`: 1-D. The `NNZ` values for the result `SparseTensor`.
|
|
class SparseSoftmax {
|
|
public:
|
|
SparseSoftmax(const ::tensorflow::Scope& scope, ::tensorflow::Input sp_indices,
|
|
::tensorflow::Input sp_values, ::tensorflow::Input sp_shape);
|
|
operator ::tensorflow::Output() const { return output; }
|
|
operator ::tensorflow::Input() const { return output; }
|
|
::tensorflow::Node* node() const { return output.node(); }
|
|
|
|
Operation operation;
|
|
::tensorflow::Output output;
|
|
};
|
|
|
|
/// Returns the element-wise max of two SparseTensors.
|
|
///
|
|
/// Assumes the two SparseTensors have the same shape, i.e., no broadcasting.
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * a_indices: 2-D. `N x R` matrix with the indices of non-empty values in a
|
|
/// SparseTensor, in the canonical lexicographic ordering.
|
|
/// * a_values: 1-D. `N` non-empty values corresponding to `a_indices`.
|
|
/// * a_shape: 1-D. Shape of the input SparseTensor.
|
|
/// * b_indices: counterpart to `a_indices` for the other operand.
|
|
/// * b_values: counterpart to `a_values` for the other operand; must be of the same dtype.
|
|
/// * b_shape: counterpart to `a_shape` for the other operand; the two shapes must be equal.
|
|
///
|
|
/// Returns:
|
|
/// * `Output` output_indices: 2-D. The indices of the output SparseTensor.
|
|
/// * `Output` output_values: 1-D. The values of the output SparseTensor.
|
|
class SparseSparseMaximum {
|
|
public:
|
|
SparseSparseMaximum(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
a_indices, ::tensorflow::Input a_values,
|
|
::tensorflow::Input a_shape, ::tensorflow::Input b_indices,
|
|
::tensorflow::Input b_values, ::tensorflow::Input b_shape);
|
|
|
|
Operation operation;
|
|
::tensorflow::Output output_indices;
|
|
::tensorflow::Output output_values;
|
|
};
|
|
|
|
/// Returns the element-wise min of two SparseTensors.
|
|
///
|
|
/// Assumes the two SparseTensors have the same shape, i.e., no broadcasting.
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * a_indices: 2-D. `N x R` matrix with the indices of non-empty values in a
|
|
/// SparseTensor, in the canonical lexicographic ordering.
|
|
/// * a_values: 1-D. `N` non-empty values corresponding to `a_indices`.
|
|
/// * a_shape: 1-D. Shape of the input SparseTensor.
|
|
/// * b_indices: counterpart to `a_indices` for the other operand.
|
|
/// * b_values: counterpart to `a_values` for the other operand; must be of the same dtype.
|
|
/// * b_shape: counterpart to `a_shape` for the other operand; the two shapes must be equal.
|
|
///
|
|
/// Returns:
|
|
/// * `Output` output_indices: 2-D. The indices of the output SparseTensor.
|
|
/// * `Output` output_values: 1-D. The values of the output SparseTensor.
|
|
class SparseSparseMinimum {
|
|
public:
|
|
SparseSparseMinimum(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
a_indices, ::tensorflow::Input a_values,
|
|
::tensorflow::Input a_shape, ::tensorflow::Input b_indices,
|
|
::tensorflow::Input b_values, ::tensorflow::Input b_shape);
|
|
|
|
Operation operation;
|
|
::tensorflow::Output output_indices;
|
|
::tensorflow::Output output_values;
|
|
};
|
|
|
|
/// Split a `SparseTensor` into `num_split` tensors along one dimension.
|
|
///
|
|
/// If the `shape[split_dim]` is not an integer multiple of `num_split`. Slices
|
|
/// `[0 : shape[split_dim] % num_split]` gets one extra dimension.
|
|
/// For example, if `split_dim = 1` and `num_split = 2` and the input is
|
|
///
|
|
/// input_tensor = shape = [2, 7]
|
|
/// [ a d e ]
|
|
/// [b c ]
|
|
///
|
|
/// Graphically the output tensors are:
|
|
///
|
|
/// output_tensor[0] = shape = [2, 4]
|
|
/// [ a ]
|
|
/// [b c ]
|
|
///
|
|
/// output_tensor[1] = shape = [2, 3]
|
|
/// [ d e ]
|
|
/// [ ]
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * split_dim: 0-D. The dimension along which to split. Must be in the range
|
|
/// `[0, rank(shape))`.
|
|
/// * indices: 2-D tensor represents the indices of the sparse tensor.
|
|
/// * values: 1-D tensor represents the values of the sparse tensor.
|
|
/// * shape: 1-D. tensor represents the shape of the sparse tensor.
|
|
/// output indices: A list of 1-D tensors represents the indices of the output
|
|
/// sparse tensors.
|
|
/// * num_split: The number of ways to split.
|
|
///
|
|
/// Returns:
|
|
/// * `OutputList` output_indices
|
|
/// * `OutputList` output_values: A list of 1-D tensors represents the values of the output sparse
|
|
/// tensors.
|
|
/// * `OutputList` output_shape: A list of 1-D tensors represents the shape of the output sparse
|
|
/// tensors.
|
|
class SparseSplit {
|
|
public:
|
|
SparseSplit(const ::tensorflow::Scope& scope, ::tensorflow::Input split_dim,
|
|
::tensorflow::Input indices, ::tensorflow::Input values,
|
|
::tensorflow::Input shape, int64 num_split);
|
|
|
|
Operation operation;
|
|
::tensorflow::OutputList output_indices;
|
|
::tensorflow::OutputList output_values;
|
|
::tensorflow::OutputList output_shape;
|
|
};
|
|
|
|
/// Adds up a `SparseTensor` and a dense `Tensor`, producing a dense `Tensor`.
|
|
///
|
|
/// This Op does not require `a_indices` be sorted in standard lexicographic order.
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * a_indices: 2-D. The `indices` of the `SparseTensor`, with shape `[nnz, ndims]`.
|
|
/// * a_values: 1-D. The `values` of the `SparseTensor`, with shape `[nnz]`.
|
|
/// * a_shape: 1-D. The `shape` of the `SparseTensor`, with shape `[ndims]`.
|
|
/// * b: `ndims`-D Tensor. With shape `a_shape`.
|
|
///
|
|
/// Returns:
|
|
/// * `Output`: The output tensor.
|
|
class SparseTensorDenseAdd {
|
|
public:
|
|
SparseTensorDenseAdd(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
a_indices, ::tensorflow::Input a_values,
|
|
::tensorflow::Input a_shape, ::tensorflow::Input b);
|
|
operator ::tensorflow::Output() const { return output; }
|
|
operator ::tensorflow::Input() const { return output; }
|
|
::tensorflow::Node* node() const { return output.node(); }
|
|
|
|
Operation operation;
|
|
::tensorflow::Output output;
|
|
};
|
|
|
|
/// Multiply SparseTensor (of rank 2) "A" by dense matrix "B".
|
|
///
|
|
/// No validity checking is performed on the indices of A. However, the following
|
|
/// input format is recommended for optimal behavior:
|
|
///
|
|
/// if adjoint_a == false:
|
|
/// A should be sorted in lexicographically increasing order. Use SparseReorder
|
|
/// if you're not sure.
|
|
/// if adjoint_a == true:
|
|
/// A should be sorted in order of increasing dimension 1 (i.e., "column major"
|
|
/// order instead of "row major" order).
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * a_indices: 2-D. The `indices` of the `SparseTensor`, size `[nnz, 2]` Matrix.
|
|
/// * a_values: 1-D. The `values` of the `SparseTensor`, size `[nnz]` Vector.
|
|
/// * a_shape: 1-D. The `shape` of the `SparseTensor`, size `[2]` Vector.
|
|
/// * b: 2-D. A dense Matrix.
|
|
///
|
|
/// Optional attributes (see `Attrs`):
|
|
/// * adjoint_a: Use the adjoint of A in the matrix multiply. If A is complex, this
|
|
/// is transpose(conj(A)). Otherwise it's transpose(A).
|
|
/// * adjoint_b: Use the adjoint of B in the matrix multiply. If B is complex, this
|
|
/// is transpose(conj(B)). Otherwise it's transpose(B).
|
|
///
|
|
/// Returns:
|
|
/// * `Output`: The product tensor.
|
|
class SparseTensorDenseMatMul {
|
|
public:
|
|
/// Optional attribute setters for SparseTensorDenseMatMul
|
|
struct Attrs {
|
|
/// Use the adjoint of A in the matrix multiply. If A is complex, this
|
|
/// is transpose(conj(A)). Otherwise it's transpose(A).
|
|
///
|
|
/// Defaults to false
|
|
TF_MUST_USE_RESULT Attrs AdjointA(bool x) {
|
|
Attrs ret = *this;
|
|
ret.adjoint_a_ = x;
|
|
return ret;
|
|
}
|
|
|
|
/// Use the adjoint of B in the matrix multiply. If B is complex, this
|
|
/// is transpose(conj(B)). Otherwise it's transpose(B).
|
|
///
|
|
/// Defaults to false
|
|
TF_MUST_USE_RESULT Attrs AdjointB(bool x) {
|
|
Attrs ret = *this;
|
|
ret.adjoint_b_ = x;
|
|
return ret;
|
|
}
|
|
|
|
bool adjoint_a_ = false;
|
|
bool adjoint_b_ = false;
|
|
};
|
|
SparseTensorDenseMatMul(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
a_indices, ::tensorflow::Input a_values,
|
|
::tensorflow::Input a_shape, ::tensorflow::Input b);
|
|
SparseTensorDenseMatMul(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
a_indices, ::tensorflow::Input a_values,
|
|
::tensorflow::Input a_shape, ::tensorflow::Input b,
|
|
const SparseTensorDenseMatMul::Attrs& attrs);
|
|
operator ::tensorflow::Output() const { return product; }
|
|
operator ::tensorflow::Input() const { return product; }
|
|
::tensorflow::Node* node() const { return product.node(); }
|
|
|
|
static Attrs AdjointA(bool x) {
|
|
return Attrs().AdjointA(x);
|
|
}
|
|
static Attrs AdjointB(bool x) {
|
|
return Attrs().AdjointB(x);
|
|
}
|
|
|
|
Operation operation;
|
|
::tensorflow::Output product;
|
|
};
|
|
|
|
/// Converts a sparse representation into a dense tensor.
|
|
///
|
|
/// Builds an array `dense` with shape `output_shape` such that
|
|
///
|
|
/// ```
|
|
/// # If sparse_indices is scalar
|
|
/// dense[i] = (i == sparse_indices ? sparse_values : default_value)
|
|
///
|
|
/// # If sparse_indices is a vector, then for each i
|
|
/// dense[sparse_indices[i]] = sparse_values[i]
|
|
///
|
|
/// # If sparse_indices is an n by d matrix, then for each i in [0, n)
|
|
/// dense[sparse_indices[i][0], ..., sparse_indices[i][d-1]] = sparse_values[i]
|
|
/// ```
|
|
///
|
|
/// All other values in `dense` are set to `default_value`. If `sparse_values` is a
|
|
/// scalar, all sparse indices are set to this single value.
|
|
///
|
|
/// Indices should be sorted in lexicographic order, and indices must not
|
|
/// contain any repeats. If `validate_indices` is true, these properties
|
|
/// are checked during execution.
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * sparse_indices: 0-D, 1-D, or 2-D. `sparse_indices[i]` contains the complete
|
|
/// index where `sparse_values[i]` will be placed.
|
|
/// * output_shape: 1-D. Shape of the dense output tensor.
|
|
/// * sparse_values: 1-D. Values corresponding to each row of `sparse_indices`,
|
|
/// or a scalar value to be used for all sparse indices.
|
|
/// * default_value: Scalar value to set for indices not specified in
|
|
/// `sparse_indices`.
|
|
///
|
|
/// Optional attributes (see `Attrs`):
|
|
/// * validate_indices: If true, indices are checked to make sure they are sorted in
|
|
/// lexicographic order and that there are no repeats.
|
|
///
|
|
/// Returns:
|
|
/// * `Output`: Dense output tensor of shape `output_shape`.
|
|
class SparseToDense {
|
|
public:
|
|
/// Optional attribute setters for SparseToDense
|
|
struct Attrs {
|
|
/// If true, indices are checked to make sure they are sorted in
|
|
/// lexicographic order and that there are no repeats.
|
|
///
|
|
/// Defaults to true
|
|
TF_MUST_USE_RESULT Attrs ValidateIndices(bool x) {
|
|
Attrs ret = *this;
|
|
ret.validate_indices_ = x;
|
|
return ret;
|
|
}
|
|
|
|
bool validate_indices_ = true;
|
|
};
|
|
SparseToDense(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
sparse_indices, ::tensorflow::Input output_shape,
|
|
::tensorflow::Input sparse_values, ::tensorflow::Input
|
|
default_value);
|
|
SparseToDense(const ::tensorflow::Scope& scope, ::tensorflow::Input
|
|
sparse_indices, ::tensorflow::Input output_shape,
|
|
::tensorflow::Input sparse_values, ::tensorflow::Input
|
|
default_value, const SparseToDense::Attrs& attrs);
|
|
operator ::tensorflow::Output() const { return dense; }
|
|
operator ::tensorflow::Input() const { return dense; }
|
|
::tensorflow::Node* node() const { return dense.node(); }
|
|
|
|
static Attrs ValidateIndices(bool x) {
|
|
return Attrs().ValidateIndices(x);
|
|
}
|
|
|
|
Operation operation;
|
|
::tensorflow::Output dense;
|
|
};
|
|
|
|
/// Read `SparseTensors` from a `SparseTensorsMap` and concatenate them.
|
|
///
|
|
/// The input `sparse_handles` must be an `int64` matrix of shape `[N, 1]` where
|
|
/// `N` is the minibatch size and the rows correspond to the output handles of
|
|
/// `AddSparseToTensorsMap` or `AddManySparseToTensorsMap`. The ranks of the
|
|
/// original `SparseTensor` objects that went into the given input ops must all
|
|
/// match. When the final `SparseTensor` is created, it has rank one
|
|
/// higher than the ranks of the incoming `SparseTensor` objects
|
|
/// (they have been concatenated along a new row dimension on the left).
|
|
///
|
|
/// The output `SparseTensor` object's shape values for all dimensions but the
|
|
/// first are the max across the input `SparseTensor` objects' shape values
|
|
/// for the corresponding dimensions. Its first shape value is `N`, the minibatch
|
|
/// size.
|
|
///
|
|
/// 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 handles represent an input, which is a `[2, 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 `SparseTensor` will be:
|
|
///
|
|
/// ```
|
|
/// index = [0 0]
|
|
/// [0 10]
|
|
/// [0 20]
|
|
/// [1 2]
|
|
/// [1 10]
|
|
/// values = [1, 2, 3, 4, 5]
|
|
/// shape = [2 50]
|
|
/// ```
|
|
///
|
|
/// Arguments:
|
|
/// * scope: A Scope object
|
|
/// * sparse_handles: 1-D, The `N` serialized `SparseTensor` objects.
|
|
/// Shape: `[N]`.
|
|
/// * dtype: The `dtype` of the `SparseTensor` objects stored in the
|
|
/// `SparseTensorsMap`.
|
|
///
|
|
/// Optional attributes (see `Attrs`):
|
|
/// * container: The container name for the `SparseTensorsMap` read by this op.
|
|
/// * shared_name: The shared name for the `SparseTensorsMap` read by this op.
|
|
/// It should not be blank; rather the `shared_name` or unique Operation name
|
|
/// of the Op that created the original `SparseTensorsMap` should be used.
|
|
///
|
|
/// Returns:
|
|
/// * `Output` sparse_indices: 2-D. The `indices` of the minibatch `SparseTensor`.
|
|
/// * `Output` sparse_values: 1-D. The `values` of the minibatch `SparseTensor`.
|
|
/// * `Output` sparse_shape: 1-D. The `shape` of the minibatch `SparseTensor`.
|
|
class TakeManySparseFromTensorsMap {
|
|
public:
|
|
/// Optional attribute setters for TakeManySparseFromTensorsMap
|
|
struct Attrs {
|
|
/// The container name for the `SparseTensorsMap` read by this op.
|
|
///
|
|
/// Defaults to ""
|
|
TF_MUST_USE_RESULT Attrs Container(StringPiece x) {
|
|
Attrs ret = *this;
|
|
ret.container_ = x;
|
|
return ret;
|
|
}
|
|
|
|
/// The shared name for the `SparseTensorsMap` read by this op.
|
|
/// It should not be blank; rather the `shared_name` or unique Operation name
|
|
/// of the Op that created the original `SparseTensorsMap` should be used.
|
|
///
|
|
/// Defaults to ""
|
|
TF_MUST_USE_RESULT Attrs SharedName(StringPiece x) {
|
|
Attrs ret = *this;
|
|
ret.shared_name_ = x;
|
|
return ret;
|
|
}
|
|
|
|
StringPiece container_ = "";
|
|
StringPiece shared_name_ = "";
|
|
};
|
|
TakeManySparseFromTensorsMap(const ::tensorflow::Scope& scope,
|
|
::tensorflow::Input sparse_handles, DataType
|
|
dtype);
|
|
TakeManySparseFromTensorsMap(const ::tensorflow::Scope& scope,
|
|
::tensorflow::Input sparse_handles, DataType
|
|
dtype, const TakeManySparseFromTensorsMap::Attrs&
|
|
attrs);
|
|
|
|
static Attrs Container(StringPiece x) {
|
|
return Attrs().Container(x);
|
|
}
|
|
static Attrs SharedName(StringPiece x) {
|
|
return Attrs().SharedName(x);
|
|
}
|
|
|
|
Operation operation;
|
|
::tensorflow::Output sparse_indices;
|
|
::tensorflow::Output sparse_values;
|
|
::tensorflow::Output sparse_shape;
|
|
};
|
|
|
|
/// @}
|
|
|
|
} // namespace ops
|
|
} // namespace tensorflow
|
|
|
|
#endif // TENSORFLOW_CC_OPS_SPARSE_OPS_H_
|