| 496 | } |
| 497 | |
| 498 | static NetT* _replaceConstOp(const void* buffer, size_t bufferSize, |
| 499 | std::map<int, std::tuple<int, int, std::vector<int>, std::vector<char>>>& constTensorData, |
| 500 | std::vector<int>& constOpId) { |
| 501 | auto net = flatbuffers::GetRoot<Net>(buffer)->UnPack(); |
| 502 | for (int i = 0; i < constOpId.size(); ++i) { |
| 503 | auto op = net->oplists[constOpId[i]].get(); |
| 504 | auto index = op->outputIndexes[0]; |
| 505 | auto iter = constTensorData.find(index); |
| 506 | if (iter == constTensorData.end()) { |
| 507 | continue; |
| 508 | } |
| 509 | auto name = op->name; |
| 510 | std::unique_ptr<MNN::OpT> newOp(new OpT); |
| 511 | newOp->type = OpType_Const; |
| 512 | newOp->name = name + "_Const"; |
| 513 | auto blob = new BlobT; |
| 514 | blob->dataFormat = (MNN_DATA_FORMAT)std::get<0>(iter->second); |
| 515 | blob->dims = std::get<2>(iter->second); |
| 516 | if (std::get<1>(iter->second) == halide_type_float) { |
| 517 | blob->dataType = DataType_DT_FLOAT; |
| 518 | blob->float32s.resize(std::get<3>(iter->second).size() / 4); |
| 519 | memcpy(blob->float32s.data(), std::get<3>(iter->second).data(), std::get<3>(iter->second).size()); |
| 520 | } else if (std::get<1>(iter->second) == halide_type_int) { |
| 521 | blob->dataType = DataType_DT_INT32; |
| 522 | blob->int32s.resize(std::get<3>(iter->second).size() / 4); |
| 523 | memcpy(blob->int32s.data(), std::get<3>(iter->second).data(), std::get<3>(iter->second).size()); |
| 524 | } else { |
| 525 | continue; |
| 526 | } |
| 527 | newOp->main.value = blob; |
| 528 | newOp->main.type = OpParameter_Blob; |
| 529 | newOp->outputIndexes = {index}; |
| 530 | net->oplists[constOpId[i]] = std::move(newOp); |
| 531 | } |
| 532 | auto oplist = std::move(net->oplists); |
| 533 | for (auto& op : oplist) { |
| 534 | if (nullptr != op.get()) { |
| 535 | net->oplists.emplace_back(std::move(op)); |
| 536 | } |
| 537 | } |
| 538 | return net; |
| 539 | // flatbuffers::GetRoot<Net>(buffer)->Pack(builder, net); |
| 540 | // std::ofstream outputOs(dstMNN, std::ios::binary); |
| 541 | // outputOs.write((const char*)builder.GetBufferPointer(), builder.GetSize()); |
| 542 | } |
| 543 | |
| 544 | static std::vector<int> _findBreakIndex(const SubModuleInfo& info, const Net* net, std::shared_ptr<Schedule::ScheduleInfo> sharedConst) { |
| 545 | // 0: not used, 1: const, 2: output |