/usr/local/lib64/python3.6/site-packages/torch/include/caffe2/operators
NameSizeModeActions
abs_op.h7050644editdlrm
accumulate_op.h10730644editdlrm
accuracy_op.h6520644editdlrm
acos_op.h7110644editdlrm
activation_ops_cudnn.h41220644editdlrm
affine_channel_op.h34500644editdlrm
alias_with_name.h12340644editdlrm
apmeter_op.h10270644editdlrm
arg_ops.h23190644editdlrm
asin_op.h7110644editdlrm
assert_op.h13350644editdlrm
async_net_barrier_op.h9040644editdlrm
atan_op.h7110644editdlrm
batch_box_cox_op.h22870644editdlrm
batch_bucketize_op.h7200644editdlrm
batch_gather_ops.h52640644editdlrm
batch_matmul_op.h96020644editdlrm
batch_moments_op.h33640644editdlrm
batch_permutation_op.h9540644editdlrm
batch_sparse_to_dense_op.h61470644editdlrm
bbox_transform_op.h26680644editdlrm
bisect_percentile_op.h49210644editdlrm
boolean_mask_ops.h26650644editdlrm
boolean_unmask_ops.h3780644editdlrm
box_with_nms_limit_op.h49600644editdlrm
bucketize_op.h13610644editdlrm
byte_weight_dequant_op.h17220644editdlrm
cast_op.h13930644editdlrm
cbrt_op.h7230644editdlrm
cc_bmm_bg_op.h38940644editdlrm
ceil_op.h7820644editdlrm
channel_backprop_stats_op.h7370644editdlrm
channel_shuffle_op.h19020644editdlrm
channel_stats_op.h18070644editdlrm
clip_op.h16390644editdlrm
collect_and_distribute_fpn_rpn_proposals_op.h68750644editdlrm
concat_split_op.h118500644editdlrm
conditional_op.h4870644editdlrm
conv_op.h31250644editdlrm
conv_op_cache_cudnn.h19350644editdlrm
conv_op_impl.h287290644editdlrm
conv_op_shared.h6720644editdlrm
conv_pool_op_base.h321090644editdlrm
conv_transpose_op.h17270644editdlrm
conv_transpose_op_impl.h182640644editdlrm
conv_transpose_op_mobile.h14700644editdlrm
conv_transpose_op_mobile_impl.h195870644editdlrm
conv_transpose_unpool_op_base.h103030644editdlrm
copy_op.h12960644editdlrm
copy_rows_to_tensor_op.h25990644editdlrm
cosh_op.h7110644editdlrm
cosine_embedding_criterion_op.h11270644editdlrm
cos_op.h7050644editdlrm
counter_ops.h45960644editdlrm
create_scope_op.h52320644editdlrm
cross_entropy_op.h44200644editdlrm
ctc_beam_search_decoder_op.h11020644editdlrm
ctc_greedy_decoder_op.h8170644editdlrm
cube_op.h7230644editdlrm
dataset_ops.h55010644editdlrm
data_couple.h4640644editdlrm
deform_conv_op.h35430644editdlrm
deform_conv_op_impl.h131710644editdlrm
dense_vector_to_id_list_op.h17970644editdlrm
distance_op.h84190644editdlrm
do_op.h69810644editdlrm
dropout_op.h15160644editdlrm
elementwise_add_op.h20240644editdlrm
elementwise_div_op.h12240644editdlrm
elementwise_linear_op.h11700644editdlrm
elementwise_logical_ops.h50830644editdlrm
elementwise_mul_op.h12240644editdlrm
elementwise_ops.h191150644editdlrm
elementwise_ops_utils.h10080644editdlrm
elementwise_op_test.h92370644editdlrm
elementwise_sub_op.h20250644editdlrm
elu_op.h8750644editdlrm
enforce_finite_op.h23030644editdlrm
ensure_clipped_op.h16080644editdlrm
ensure_cpu_output_op.h14650644editdlrm
erf_op.h7510644editdlrm
expand_op.h38770644editdlrm
expand_squeeze_dims_op.h34510644editdlrm
exp_op.h4250644editdlrm
fc_inference.h7750644editdlrm
feature_maps_ops.h324370644editdlrm
feed_blob_op.h8020644editdlrm
filler_op.h184310644editdlrm
find_duplicate_elements_op.h15630644editdlrm
find_op.h20550644editdlrm
flatten_op.h15250644editdlrm
flexible_top_k.h9360644editdlrm
floor_op.h7880644editdlrm
free_op.h7770644editdlrm
fully_connected_op.h93510644editdlrm
fused_rowwise_8bit_conversion_ops.h66010644editdlrm
fused_rowwise_nbitfake_conversion_ops.h43750644editdlrm
fused_rowwise_nbit_conversion_ops.h87230644editdlrm
fused_rowwise_random_quantization_ops.h26070644editdlrm
gather_fused_8bit_rowwise_op.h21790644editdlrm
gather_op.h75050644editdlrm
gather_ranges_to_dense_op.h81880644editdlrm
gelu_op.h14520644editdlrm
generate_proposals_op.h62560644editdlrm
generate_proposals_op_util_boxes.h143090644editdlrm
generate_proposals_op_util_nms.h262140644editdlrm
generate_proposals_op_util_nms_gpu.h21280644editdlrm
given_tensor_byte_string_to_uint8_fill_op.h21500644editdlrm
given_tensor_fill_op.h30020644editdlrm
glu_op.h14580644editdlrm
group_norm_op.h89670644editdlrm
gru_unit_op.h66260644editdlrm
half_float_ops.h27320644editdlrm
hard_sigmoid_op.h9940644editdlrm
heatmap_max_keypoint_op.h9390644editdlrm
histogram_op.h24210644editdlrm
h_softmax_op.h49540644editdlrm
if_op.h17640644editdlrm
im2col_op.h89430644editdlrm
index_hash_ops.h22320644editdlrm
index_ops.h31550644editdlrm
inference_lstm_op.h98810644editdlrm
instance_norm_op.h74410644editdlrm
integral_image_op.h9230644editdlrm
is_empty_op.h5580644editdlrm
jsd_op.h7210644editdlrm
key_split_ops.h14000644editdlrm
layer_norm_op.h80980644editdlrm
leaky_relu_op.h11110644editdlrm
lengths_pad_op.h25740644editdlrm
lengths_reducer_fused_8bit_rowwise_ops.h55320644editdlrm
lengths_reducer_fused_nbit_rowwise_ops.h234650644editdlrm
lengths_reducer_ops.h233150644editdlrm
lengths_reducer_rowwise_8bit_ops.h61800644editdlrm
lengths_tile_op.h5820644editdlrm
lengths_top_k_op.h13580644editdlrm
length_split_op.h22590644editdlrm
listwise_l2r_op.h16770644editdlrm
load_save_op.h140910644editdlrm
load_save_op_util.h16420644editdlrm
locally_connected_op.h38720644editdlrm
locally_connected_op_impl.h264950644editdlrm
locally_connected_op_util.h13320644editdlrm
local_response_normalization_op.h28040644editdlrm
log1p_op.h7170644editdlrm
logit_op.h11290644editdlrm
log_op.h4310644editdlrm
loss_op.h10580644editdlrm
lpnorm_op.h12790644editdlrm
lstm_unit_op.h67330644editdlrm
lstm_utils.h94240644editdlrm
map_ops.h80110644editdlrm
margin_ranking_criterion_op.h11130644editdlrm
matmul_op.h28430644editdlrm
max_pool_with_index_gpu.h11550644editdlrm
mean_op.h32520644editdlrm
merge_id_lists_op.h25700644editdlrm
minmax_ops.h38290644editdlrm
mish_op.h7940644editdlrm
mod_op.h9840644editdlrm
moments_op.h40510644editdlrm
multi_class_accuracy_op.h5390644editdlrm
negate_gradient_op.h5660644editdlrm
negative_op.h4510644editdlrm
ngram_ops.h26440644editdlrm
normalize_l1_op.h10750644editdlrm
normalize_op.h30130644editdlrm
no_default_engine_op.h10630644editdlrm
numpy_tile_op.h36430644editdlrm
one_hot_ops.h25620644editdlrm
onnx_while_op.h106550644editdlrm
operator_fallback_gpu.h41550644editdlrm
op_utils_cudnn.h21120644editdlrm
order_switch_ops.h21490644editdlrm
pack_rnn_sequence_op.h30740644editdlrm
pack_segments.h27290644editdlrm
pad_op.h29020644editdlrm
partition_ops.h99580644editdlrm
percentile_op.h10090644editdlrm
perplexity_op.h4470644editdlrm
piecewise_linear_transform_op.h82810644editdlrm
pool_op.h85250644editdlrm
pool_op_util.h11050644editdlrm
pow_op.h46770644editdlrm
prefetch_op.h46610644editdlrm
prelu_op.h10670644editdlrm
prepend_dim_op.h27600644editdlrm
quantile_op.h41200644editdlrm
quant_decode_op.h53700644editdlrm
rank_loss_op.h8200644editdlrm
reciprocal_op.h7210644editdlrm
reducer_functors.h245560644editdlrm
reduce_front_back_max_ops.h43990644editdlrm
reduce_front_back_sum_mean_ops.h53370644editdlrm
reduce_ops.h99620644editdlrm
reduction_ops.h59440644editdlrm
relu_n_op.h9900644editdlrm
relu_op.h6240644editdlrm
remove_data_blocks_op.h26510644editdlrm
replace_nan_op.h11700644editdlrm
reshape_op.h57230644editdlrm
resize_3d_op.h26770644editdlrm
resize_op.h23070644editdlrm
reverse_packed_segs_op.h27720644editdlrm
rmac_regions_op.h7080644editdlrm
rms_norm_op.h29680644editdlrm
roi_align_gradient_op.h14860644editdlrm
roi_align_op.h28570644editdlrm
roi_align_rotated_gradient_op.h13690644editdlrm
roi_align_rotated_op.h16360644editdlrm
roi_pool_op.h25030644editdlrm
rowmul_op.h19470644editdlrm
rsqrt_op.h7290644editdlrm
scale_blobs_op.h14580644editdlrm
scale_op.h10190644editdlrm
segment_reduction_op.h710220644editdlrm
self_binning_histogram_op.h62580644editdlrm
selu_op.h15450644editdlrm
sequence_ops.h82640644editdlrm
shape_op.h16380644editdlrm
sigmoid_op.h6390644editdlrm
sinh_op.h7110644editdlrm
sinusoid_position_encoding_op.h28340644editdlrm
sin_op.h7050644editdlrm
slice_op.h100710644editdlrm
softmax_op.h11740644editdlrm
softmax_utils.h4470644editdlrm
softmax_with_loss_op.h28830644editdlrm
softplus_op.h7810644editdlrm
softsign_op.h6750644editdlrm
space_batch_op.h68480644editdlrm
sparse_dropout_with_replacement_op.h11220644editdlrm
sparse_itemwise_dropout_with_replacement_op.h11630644editdlrm
sparse_lp_regularizer_op.h11300644editdlrm
sparse_normalize_op.h8340644editdlrm
sparse_to_dense_mask_op.h100510644editdlrm
sparse_to_dense_op.h39770644editdlrm
spatial_batch_norm_op.h151750644editdlrm
spatial_softmax_with_loss_op.h21820644editdlrm
sqrt_op.h4480644editdlrm
sqr_op.h4310644editdlrm
square_root_divide_op.h18570644editdlrm
stats_put_ops.h28130644editdlrm
stop_gradient.h5480644editdlrm
string_ops.h20670644editdlrm
stump_func_op.h21120644editdlrm
summarize_op.h18750644editdlrm
swish_op.h7720644editdlrm
tanh_op.h7230644editdlrm
tan_op.h7050644editdlrm
tensor_protos_db_input.h36330644editdlrm
text_file_reader_utils.h29000644editdlrm
thresholded_relu_op.h11370644editdlrm
tile_op.h87410644editdlrm
top_k.h10610644editdlrm
transpose_op.h20820644editdlrm
tt_linear_op.h65010644editdlrm
unique_ops.h16660644editdlrm
unsafe_coalesce.h24810644editdlrm
upsample_op.h22460644editdlrm
utility_ops.h499940644editdlrm
variable_length_sequence_padding.h13780644editdlrm
weighted_multi_sampling_op.h6020644editdlrm
weighted_sample_op.h7390644editdlrm
while_op.h19610644editdlrm
zero_gradient_op.h3470644editdlrm
Edit: /usr/local/lib64/python3.6/site-packages/torch/include/caffe2/operators/sparse_to_dense_mask_op.h (10051B)
#ifndef CAFFE2_OPERATORS_SPARSE_TO_DENSE_MASK_OP_H_ #define CAFFE2_OPERATORS_SPARSE_TO_DENSE_MASK_OP_H_ #include #include #include #include "caffe2/core/context.h" #include "caffe2/core/export_caffe2_op_to_c10.h" #include "caffe2/core/operator.h" #include "caffe2/core/tensor.h" #include "caffe2/utils/math.h" C10_DECLARE_EXPORT_CAFFE2_OP_TO_C10(SparseToDenseMask); namespace caffe2 { template class SparseToDenseMaskBase : public Operator { public: USE_OPERATOR_CONTEXT_FUNCTIONS; template explicit SparseToDenseMaskBase(Args&&... args) : Operator(std::forward(args)...) { std::vector mask = this->template GetRepeatedArgument("mask"); featuresCount_ = mask.size(); CAFFE_ENFORCE(!mask.empty(), "mask can't be empty"); auto biggest = *std::max_element(mask.begin(), mask.end()); dense_.assign(std::min(kMaxDenseSize, biggest + 1), -1); // NOLINTNEXTLINE(clang-diagnostic-sign-compare) for (int i = 0; i < mask.size(); i++) { int64_t id = mask[i]; CAFFE_ENFORCE_GE(id, 0, "Only positive IDs are allowed."); if (id >= kMaxDenseSize) { CAFFE_ENFORCE(sparse_.count(id) == 0, "Duplicated id: ", id); sparse_[id] = i; } else { CAFFE_ENFORCE(dense_[id] == -1, "Duplicated id: ", id); dense_[id] = i; } } } protected: const int64_t kMaxDenseSize = 1024 * 128; std::unordered_map sparse_; std::vector dense_; size_t featuresCount_; inline int getFeatureIdx(int64_t id) const { if (id >= kMaxDenseSize) { const auto& iter = sparse_.find(id); if (iter == sparse_.end()) { return -1; } else { return iter->second; } } else { // NOLINTNEXTLINE(clang-diagnostic-sign-compare) return (id >= dense_.size()) ? -1 : dense_[id]; } } }; template class SparseToDenseMaskOp : public SparseToDenseMaskBase { public: USE_OPERATOR_CONTEXT_FUNCTIONS; template explicit SparseToDenseMaskOp(Args&&... args) : SparseToDenseMaskBase(std::forward(args)...) { returnPresenceMask_ = this->template GetSingleArgument("return_presence_mask", false); maxSkippedRows_ = this->template GetSingleArgument( "max_skipped_indices", kMaxSkippedSparseIndices); } bool RunOnDevice() override { return DispatchHelper>::call( this, Input(INDICES)); } template bool DoRunWithType() { auto& sparse_indices = Input(INDICES); CAFFE_ENFORCE_EQ(sparse_indices.dim(), 1); auto& sparse_values = Input(VALUES); CAFFE_ENFORCE_GE(sparse_values.dim(), 1); CAFFE_ENFORCE_EQ(sparse_indices.numel(), sparse_values.size(0)); auto& default_value = Input(DEFAULT); CAFFE_ENFORCE_EQ(default_value.dim() + 1, sparse_values.dim()); CAFFE_ENFORCE_EQ(default_value.numel(), sparse_values.size_from_dim(1)); CAFFE_ENFORCE(sparse_values.dtype() == default_value.dtype()); const TInd* sparse_indices_vec = sparse_indices.template data(); const char* sparse_values_vec = static_cast(sparse_values.raw_data()); const void* default_val = default_value.raw_data(); int64_t block_size = default_value.numel(); size_t block_nbytes = default_value.nbytes(); const size_t cols = this->featuresCount_; int rows = -1; int32_t sparse_indices_length = sparse_indices.dim32(0); const int32_t* lengths_vec = nullptr; auto* output = Output(OUTPUTVALUE); Tensor* presence_mask = nullptr; if (returnPresenceMask_) { presence_mask = Output(PRESENCEMASK); } vector shape; if (InputSize() == 4) { auto& lengths = Input(LENGTHS); CAFFE_ENFORCE_EQ(lengths.dim(), 1); lengths_vec = lengths.template data(); rows = lengths.dim32(0); } if (rows == -1) { // if the LENGTHS is not set, the output will be a vector rows = 1; lengths_vec = &sparse_indices_length; } else { shape.push_back(rows); } shape.push_back(cols); if (returnPresenceMask_) { presence_mask->Resize(shape); } shape.insert( shape.end(), default_value.sizes().begin(), default_value.sizes().end()); output->Resize(shape); // init // TODO: consider unrolling CopyItems to make elemental types copy faster char* output_data = static_cast(output->raw_mutable_data(sparse_values.dtype())); // NOLINTNEXTLINE(clang-diagnostic-sign-compare) for (int i = 0; i < cols * rows; i++) { context_.CopyItemsSameDevice( default_value.dtype(), block_size, default_val, output_data + i * block_nbytes); } bool* presence_mask_data = nullptr; if (returnPresenceMask_) { presence_mask_data = presence_mask->template mutable_data(); math::Set( rows * cols, false, presence_mask_data, &context_); } int64_t offset = 0; for (int r = 0; r < rows; r++) { bool skippedSparseIndex = false; for (int c = 0; c < lengths_vec[r]; c++) { const auto sparse_index = sparse_indices_vec[offset + c]; if (sparse_index < 0 || sparse_index >= std::numeric_limits::max()) { skippedSparseIndex = true; LOG(WARNING) << "Skipping invalid sparse index: " << sparse_index; continue; } int idx = this->getFeatureIdx(sparse_index); if (idx != -1) { context_.CopyItemsSameDevice( sparse_values.dtype(), block_size, sparse_values_vec + (offset + c) * block_nbytes, output_data + (r * cols + idx) * block_nbytes); if (returnPresenceMask_) { presence_mask_data[r * cols + idx] = true; } } } skippedRows_ += skippedSparseIndex; CAFFE_ENFORCE_LT( skippedRows_, maxSkippedRows_, "Too many rows with invalid sparse indices skipped"); offset += lengths_vec[r]; } return true; } private: static const uint32_t kMaxSkippedSparseIndices = 50; bool returnPresenceMask_; uint32_t maxSkippedRows_ = 0; uint32_t skippedRows_ = 0; INPUT_TAGS(INDICES, VALUES, DEFAULT, LENGTHS); OUTPUT_TAGS(OUTPUTVALUE, PRESENCEMASK); }; template class SparseToDenseMaskGradientOp : public SparseToDenseMaskBase { public: USE_OPERATOR_CONTEXT_FUNCTIONS; template explicit SparseToDenseMaskGradientOp(Args&&... args) : SparseToDenseMaskBase(std::forward(args)...) {} bool RunOnDevice() override { return DispatchHelper>::call( this, Input(INDICES)); } template bool DoRunWithType() { auto& sparse_indices = Input(INDICES); CAFFE_ENFORCE_EQ(sparse_indices.dim(), 1); auto& gradient_output = Input(GOUTPUT); int64_t block_size = gradient_output.size_from_dim(1); size_t block_nbytes = gradient_output.itemsize() * block_size; const size_t cols = this->featuresCount_; int rows = -1; int iter_offset = 1; int32_t default_length = sparse_indices.dim32(0); const int32_t* lengths_vec = nullptr; auto* output = Output(GVALUES); vector shape; if (InputSize() > LENGTHS) { // if the LENGTHS is set, the gradient_output has dim: // lengths * mask.size() * feature_dim auto& lengths = Input(LENGTHS); lengths_vec = lengths.template data(); rows = lengths.dim32(0); CAFFE_ENFORCE_EQ(lengths.dim(), 1); CAFFE_ENFORCE_GE(gradient_output.dim(), 2); CAFFE_ENFORCE_EQ(gradient_output.size(0), rows); CAFFE_ENFORCE_EQ(gradient_output.size(1), cols); block_nbytes /= gradient_output.size(1); block_size /= gradient_output.size(1); iter_offset += 1; } if (rows == -1) { // if the LENGTHS is not set, the gradient_output has dim: // mask.size() * feature_dim rows = 1; lengths_vec = &default_length; CAFFE_ENFORCE_GE(gradient_output.dim(), 1); CAFFE_ENFORCE_EQ(gradient_output.size(0), cols); } shape.push_back(default_length); // insert feature_dim shape.insert( shape.end(), gradient_output.sizes().begin() + iter_offset, gradient_output.sizes().end()); output->Resize(shape); const TInd* sparse_indices_vec = sparse_indices.template data(); const char* gradient_output_vec = static_cast(gradient_output.raw_data()); char* output_data = static_cast(output->raw_mutable_data(gradient_output.dtype())); memset(output_data, 0, output->nbytes()); math::Set( default_length * gradient_output.itemsize(), 0, output_data, &context_); int32_t offset = 0; // SparseToDenseMask is not injective; gradient_used records // if the gradient is used for other input value from the same row vector gradient_used(cols, false); for (int r = 0; r < rows; r++) { std::fill(gradient_used.begin(), gradient_used.end(), false); for (int c = lengths_vec[r] - 1; c >= 0; c--) { int idx = this->getFeatureIdx(sparse_indices_vec[offset + c]); if (idx != -1 && !gradient_used[idx]) { gradient_used[idx] = true; context_.CopyItemsSameDevice( gradient_output.dtype(), block_size, gradient_output_vec + (r * cols + idx) * block_nbytes, output_data + (offset + c) * block_nbytes); } } offset += lengths_vec[r]; } return true; } private: INPUT_TAGS(INDICES, GOUTPUT, LENGTHS); OUTPUT_TAGS(GVALUES); }; } // namespace caffe2 #endif // CAFFE2_OPERATORS_SPARSE_TO_DENSE_MASK_OP_H_