| 756 | } |
| 757 | |
| 758 | void GraphLoaderOSS::OprLoadContextImpl::load_single_opr(const fbs::Operator* fbopr) { |
| 759 | m_cur_opr_tensor_cnt = 0; |
| 760 | m_cur_opr_blob_cnt = 0; |
| 761 | m_cur_opr_param_cnt = 0; |
| 762 | |
| 763 | OperatorNodeConfig config; |
| 764 | if (fbopr->output_dtype()) { |
| 765 | config.output_dtype(fbs::intl::load_dtype(fbopr->output_dtype())); |
| 766 | } |
| 767 | if (fbopr->name()) { |
| 768 | config.name(fbopr->name()->str()); |
| 769 | } |
| 770 | if (fbopr->comp_node()) { |
| 771 | auto cnt = fbopr->comp_node()->size(); |
| 772 | cg::OperatorNodeConfig::CompNodeArray comp_node_arr(cnt); |
| 773 | for (size_t i = 0; i < cnt; i++) { |
| 774 | CompNode cn{}; |
| 775 | auto node = fbopr->comp_node()->Get(i); |
| 776 | if (node) { |
| 777 | cn = load_comp_node(node); |
| 778 | } |
| 779 | comp_node_arr[i] = cn; |
| 780 | } |
| 781 | config.comp_node_arr(comp_node_arr); |
| 782 | } |
| 783 | const OprRegistry* registry; |
| 784 | if (magic_compare) { |
| 785 | registry = OprRegistry::find_by_id(fbopr->type_id()); |
| 786 | } else { |
| 787 | registry = OprRegistry::find_by_unversioned_id(fbopr->type_id()); |
| 788 | } |
| 789 | mgb_throw_if( |
| 790 | !registry, SerializationError, |
| 791 | "failed to find opr with type %s, use python env " |
| 792 | "config.dump_registered_oprs() to get a dict that maps from " |
| 793 | "opr id to opr name", |
| 794 | std::to_string(fbopr->type_id()).c_str()); |
| 795 | |
| 796 | // load inputs |
| 797 | VarNodeArray inputs; |
| 798 | if (fbopr->inputs()) { |
| 799 | inputs.resize(fbopr->inputs()->size()); |
| 800 | for (size_t i = 0; i < inputs.size(); ++i) { |
| 801 | inputs[i] = m_id2varnode.at(fbopr->inputs()->Get(i)); |
| 802 | } |
| 803 | } |
| 804 | |
| 805 | // call loader |
| 806 | auto accessor = registry->loader(*this, inputs, config); |
| 807 | auto opr = accessor.opr(); |
| 808 | |
| 809 | // check opr type; note that: |
| 810 | // 1. registry->type may be empty for dynamic opr loaders or legacy oprs |
| 811 | // 2. due to some optimization, an opr may be replaced by ImmutableTensor |
| 812 | mgb_assert( |
| 813 | opr && (opr->dyn_typeinfo() == registry->type || !registry->type || |
| 814 | opr->same_type<opr::ImmutableTensor>()), |
| 815 | "got_type=%s expected_type=%s", opr ? opr->dyn_typeinfo()->name : nullptr, |
nothing calls this directly
no test coverage detected