#ifndef CAFFE2_OPERATORS_FIND_DUPLICATE_ELEMENTS_OP_H #define CAFFE2_OPERATORS_FIND_DUPLICATE_ELEMENTS_OP_H #include #include #include "caffe2/core/context.h" #include "caffe2/core/operator.h" #include "caffe2/core/tensor.h" namespace caffe2 { template class FindDuplicateElementsOp final : public Operator { public: USE_OPERATOR_CONTEXT_FUNCTIONS; USE_SIMPLE_CTOR_DTOR(FindDuplicateElementsOp); USE_DISPATCH_HELPER; bool RunOnDevice() override { return DispatchHelper>:: call(this, Input(0)); } template bool DoRunWithType() { const auto& data = Input(0); CAFFE_ENFORCE(data.dim() == 1, "data should be 1-D."); const auto* data_ptr = data.template data(); std::unordered_map dict; std::vector dupIndices; // i is the index of unique elements, j is the index of all elements for (int64_t i = 0, j = 0; j < data.sizes()[0]; ++i, ++j) { bool retVal = dict.insert({data_ptr[j], i}).second; if (!retVal) { --i; dupIndices.push_back(j); } } const auto dupSize = dupIndices.size(); auto* output = Output(0, {static_cast(dupSize)}, at::dtype()); auto* out_ptr = output->template mutable_data(); for (size_t i = 0; i < dupSize; ++i) { out_ptr[i] = dupIndices[i]; } return true; } }; } // namespace caffe2 #endif // CAFFE2_OPERATORS_FIND_DUPLICATE_ELEMENTS_OP_H