| 627 | } |
| 628 | |
| 629 | bool Executor::registerSubGraph(const std::string& submoduleName, VARPS outputs, VARPS inputs) { |
| 630 | #ifndef MNN_REDUCE_SIZE |
| 631 | if (mSubGraph.find(submoduleName) != mSubGraph.end()) { |
| 632 | MNN_PRINT("Executor Error: Subgraph has exists: %s\n", submoduleName.c_str()); |
| 633 | return false; |
| 634 | } |
| 635 | std::shared_ptr<SubGraph> graph(new SubGraph); |
| 636 | std::vector<std::string> subInputs(inputs.size()); |
| 637 | std::vector<std::string> subOutputs(outputs.size()); |
| 638 | for (int i=0; i<inputs.size(); ++i) { |
| 639 | if (inputs[i]->name().empty()) { |
| 640 | MNN_PRINT("Executor Error: input %d name empty\n", i); |
| 641 | return false; |
| 642 | } |
| 643 | subInputs[i] = inputs[i]->name(); |
| 644 | } |
| 645 | for (int i=0; i<outputs.size(); ++i) { |
| 646 | if (outputs[i]->name().empty()) { |
| 647 | MNN_PRINT("Executor Error: output %d name empty\n", i); |
| 648 | return false; |
| 649 | } |
| 650 | subOutputs[i] = outputs[i]->name(); |
| 651 | } |
| 652 | std::unique_ptr<MNN::SubGraphProtoT> subInfo(new MNN::SubGraphProtoT); |
| 653 | subInfo->name = submoduleName; |
| 654 | std::unique_ptr<MNN::NetT> subNet(new MNN::NetT); |
| 655 | std::vector<MNN::Express::VARP> combine = inputs; |
| 656 | combine.insert(combine.end(), outputs.begin(), outputs.end()); |
| 657 | Variable::save(combine, subNet.get()); |
| 658 | std::map<std::string, int> subTensorMap; |
| 659 | for (int i=0; i<subNet->tensorName.size(); ++i) { |
| 660 | subTensorMap.insert(std::make_pair(subNet->tensorName[i], i)); |
| 661 | } |
| 662 | subInfo->tensors = std::move(subNet->tensorName); |
| 663 | subInfo->inputs.resize(inputs.size()); |
| 664 | for (int i=0; i<inputs.size(); ++i) { |
| 665 | subInfo->inputs[i] = subTensorMap[subInputs[i]]; |
| 666 | } |
| 667 | subInfo->outputs.resize(outputs.size()); |
| 668 | for (int i=0; i<outputs.size(); ++i) { |
| 669 | subInfo->outputs[i] = subTensorMap[subOutputs[i]]; |
| 670 | } |
| 671 | subInfo->nodes = std::move(subNet->oplists); |
| 672 | for (int i=0; i<subNet->subgraphs.size(); ++i) { |
| 673 | graph->depends.emplace_back(subNet->subgraphs[i]->name); |
| 674 | } |
| 675 | graph->info = std::move(subInfo); |
| 676 | mSubGraph.insert(std::make_pair(submoduleName, graph)); |
| 677 | #endif |
| 678 | return true; |
| 679 | } |
| 680 | |
| 681 | std::shared_ptr<Executor::SubGraph> Executor::findSubGraph(const std::string& submoduleName) { |
| 682 | #ifndef MNN_REDUCE_SIZE |