| 716 | } |
| 717 | |
| 718 | void GraphLoaderOSSV2::OprLoadContextImpl::load_single_opr( |
| 719 | const fbs::v2::Operator* fbopr) { |
| 720 | m_cur_opr_tensor_cnt = 0; |
| 721 | m_cur_opr_blob_cnt = 0; |
| 722 | m_cur_opr_param_cnt = 0; |
| 723 | |
| 724 | OperatorNodeConfig config; |
| 725 | if (fbopr->output_dtype()) { |
| 726 | config.output_dtype(fbs::intl::load_dtype(fbopr->output_dtype())); |
| 727 | } |
| 728 | if (fbopr->name()) { |
| 729 | config.name(fbopr->name()->str()); |
| 730 | } |
| 731 | if (fbopr->comp_node()) { |
| 732 | auto cnt = fbopr->comp_node()->size(); |
| 733 | cg::OperatorNodeConfig::CompNodeArray comp_node_arr(cnt); |
| 734 | for (size_t i = 0; i < cnt; i++) { |
| 735 | CompNode cn{}; |
| 736 | auto node = fbopr->comp_node()->Get(i); |
| 737 | if (node) { |
| 738 | cn = load_comp_node(node); |
| 739 | } |
| 740 | comp_node_arr[i] = cn; |
| 741 | } |
| 742 | config.comp_node_arr(comp_node_arr); |
| 743 | } |
| 744 | //! opr version must be exist |
| 745 | uint8_t opr_version = fbopr->opr_version(); |
| 746 | auto type_id = fbopr->type_id(); |
| 747 | const OprRegistryV2* registry = |
| 748 | OprRegistryV2::versioned_find_by_id(type_id, opr_version); |
| 749 | mgb_throw_if( |
| 750 | !registry, SerializationError, |
| 751 | "failed to find opr with type %s and version %d.", |
| 752 | fbopr->type()->str().c_str(), opr_version); |
| 753 | |
| 754 | // load inputs |
| 755 | VarNodeArray inputs; |
| 756 | if (fbopr->inputs()) { |
| 757 | inputs.resize(fbopr->inputs()->size()); |
| 758 | for (size_t i = 0; i < inputs.size(); ++i) { |
| 759 | inputs[i] = m_id2varnode.at(fbopr->inputs()->Get(i)); |
| 760 | } |
| 761 | } |
| 762 | |
| 763 | // call loader |
| 764 | auto accessor = registry->loader(*this, inputs, config); |
| 765 | auto opr = accessor.opr(); |
| 766 | |
| 767 | // check opr type; note that: |
| 768 | // 1. registry->type may be empty for dynamic opr loaders or legacy oprs |
| 769 | // 2. due to some optimization, an opr may be replaced by ImmutableTensor |
| 770 | mgb_assert( |
| 771 | opr && (opr->dyn_typeinfo() == registry->type || !registry->type || |
| 772 | opr->same_type<opr::ImmutableTensor>()), |
| 773 | "got_type=%s expected_type=%s", opr ? opr->dyn_typeinfo()->name : nullptr, |
| 774 | registry->type->name); |
| 775 | // record output vars; read output names |
nothing calls this directly
no test coverage detected