| 236 | } |
| 237 | |
| 238 | static std::pair<bool, std::tuple<float, float, float>> _countForTensorValid(MNN::Tensor* ntensor) { |
| 239 | bool valid = false; |
| 240 | std::tuple<float, float, float> res; |
| 241 | if (ntensor->elementSize() <= 0) { |
| 242 | return std::make_pair(valid, res); |
| 243 | } |
| 244 | bool validforType = false; |
| 245 | if (ntensor->getType().code == halide_type_float || ntensor->getType().code == halide_type_int || ntensor->getType().code == halide_type_uint) { |
| 246 | validforType = true; |
| 247 | } |
| 248 | if (!validforType) { |
| 249 | return std::make_pair(valid, res); |
| 250 | } |
| 251 | valid = true; |
| 252 | auto outDimType = ntensor->getDimensionType(); |
| 253 | std::shared_ptr<MNN::Tensor> expectTensor(new MNN::Tensor(ntensor, outDimType)); |
| 254 | bool copyRes = ntensor->copyToHostTensor(expectTensor.get()); |
| 255 | if (copyRes) { |
| 256 | ntensor = expectTensor.get(); |
| 257 | } |
| 258 | std::tuple<float, float, float> data; |
| 259 | if (ntensor->getType().code == halide_type_float) { |
| 260 | data = _countTensor<float>(ntensor); |
| 261 | } else if (ntensor->getType().code == halide_type_int) { |
| 262 | if (ntensor->getType().bits == 32) { |
| 263 | data = _countTensor<int32_t>(ntensor); |
| 264 | } else if (ntensor->getType().bits == 8) { |
| 265 | data = _countTensor<int8_t>(ntensor); |
| 266 | } |
| 267 | } else if (ntensor->getType().code == halide_type_uint) { |
| 268 | if (ntensor->getType().bits == 32) { |
| 269 | data = _countTensor<uint32_t>(ntensor); |
| 270 | } else if (ntensor->getType().bits == 8) { |
| 271 | data = _countTensor<uint8_t>(ntensor); |
| 272 | } |
| 273 | } |
| 274 | return std::make_pair(valid, data); |
| 275 | } |
| 276 | static void _initTensorStatic() { |
| 277 | MNN::TensorCallBackWithInfo beforeCallBack = [&](const std::vector<MNN::Tensor*>& ntensors, const MNN::OperatorInfo* info) { |
| 278 | auto opName = info->name(); |
no test coverage detected