// // CPUUnique.cpp // MNN // // Created by MNN on 2019/6/11. // Copyright © 2018 Alibaba. All rights reserved. // #include #include "backend/cpu/CPUUnique.hpp" namespace MNN { ErrorCode CPUUnique::onExecute(const std::vector& inputs, const std::vector& outputs) { auto input = inputs[0]; auto output = outputs[0]; auto outputPtr = output->host(); int outputSize = 0; auto eleSize = input->elementSize(); if (outputs.size() <= 2) { std::map idx_map; for (int i = 0; i < eleSize; ++i) { auto value = input->host()[i]; idx_map[value]; } for (auto& kv : idx_map) { kv.second = outputSize; outputPtr[outputSize++] = kv.first; } if (outputs.size() > 1) { auto outIdx = outputs[1]->host(); for (int i = 0; i < eleSize; ++i) { auto value = input->host()[i]; outIdx[i] = idx_map[value]; } } } else { MNN_ASSERT(outputs.size() <= 4); auto outIdx = outputs[1]->host(); auto reverseIdx = outputs[2]->host(); int* count = nullptr; if (outputs.size() > 3) { count = outputs[3]->host(); ::memset(count, 0, outputs[3]->usize()); } std::map idx_map; for (int i = 0; i < eleSize; ++i) { auto value = input->host()[i]; idx_map[value]; } for (auto& kv : idx_map) { outIdx[outputSize] = -1; kv.second = outputSize; outputPtr[outputSize++] = kv.first; } for (int i = 0; i < eleSize; ++i) { auto value = input->host()[i]; int pos = idx_map[value]; reverseIdx[i] = pos; if (outIdx[pos] < 0) { outIdx[pos] = i; } if (nullptr != count) { count[pos]++; } } } return NO_ERROR; } class CPUUniqueCreator : public CPUBackend::Creator { public: virtual Execution* onCreate(const std::vector& inputs, const std::vector& outputs, const MNN::Op* op, Backend* backend) const { return new CPUUnique(backend); } }; REGISTER_CPU_OP_CREATOR(CPUUniqueCreator, OpType_Unique); }; // namespace MNN