| 60 | } |
| 61 | |
| 62 | static bool _RebuildExternalOp(FileLoader* external, const MNN::Op* origin, flatbuffers::FlatBufferBuilder& builder) { |
| 63 | if (nullptr == external) { |
| 64 | MNN_ERROR("Can't rebuild external op because external is nullptr\n"); |
| 65 | return false; |
| 66 | } |
| 67 | builder.Clear(); |
| 68 | bool externalTmp = false; |
| 69 | if (nullptr != origin->externalPath()) { |
| 70 | external = new FileLoader(origin->externalPath()->c_str()); |
| 71 | externalTmp = true; |
| 72 | } |
| 73 | flatbuffers::Offset<flatbuffers::String> externalPathFbb = 0; |
| 74 | flatbuffers::Offset<flatbuffers::String> opNameFbb = 0; |
| 75 | if (nullptr != origin->name()) { |
| 76 | opNameFbb = builder.CreateString(origin->name()->str()); |
| 77 | } |
| 78 | flatbuffers::Offset<void> parameterMain; |
| 79 | switch (origin->main_type()) { |
| 80 | case OpParameter_Scale: |
| 81 | { |
| 82 | auto scale = origin->main_as_Scale(); |
| 83 | auto externalInfo = scale->external()->data(); |
| 84 | auto externalSize = scale->external()->size(); |
| 85 | int outputCount = static_cast<int>(externalInfo[1] / sizeof(float)); |
| 86 | std::vector<float> scaleData(outputCount); |
| 87 | external->offset(externalInfo[0]); |
| 88 | external->read((char*)scaleData.data(), externalInfo[1]); |
| 89 | auto scaleFbb = builder.CreateVector(scaleData); |
| 90 | flatbuffers::Offset<flatbuffers::Vector<float>> biasFbb = 0; |
| 91 | if (externalSize > 2) { |
| 92 | std::vector<float> biasData(outputCount); |
| 93 | external->read((char*)biasData.data(), externalInfo[2]); |
| 94 | biasFbb = builder.CreateVector(biasData); |
| 95 | } |
| 96 | ScaleBuilder builder_(builder); |
| 97 | builder_.add_biasData(biasFbb); |
| 98 | builder_.add_scaleData(scaleFbb); |
| 99 | builder_.add_channels(scale->channels()); |
| 100 | parameterMain = builder_.Finish().Union(); |
| 101 | break; |
| 102 | } |
| 103 | case OpParameter_LayerNorm: |
| 104 | { |
| 105 | auto layer_norm_param = origin->main_as_LayerNorm(); |
| 106 | auto externalInfo = layer_norm_param->external()->data(); |
| 107 | auto externalSize = layer_norm_param->external()->size(); |
| 108 | int32_t size = static_cast<int32_t>(externalInfo[1]); |
| 109 | std::vector<float> gamma(size / sizeof(float)); |
| 110 | std::vector<float> beta(size / sizeof(float)); |
| 111 | external->offset(externalInfo[0]); |
| 112 | external->read((char*)gamma.data(), externalInfo[1]); |
| 113 | external->read((char*)beta.data(), externalInfo[2]); |
| 114 | flatbuffers::Offset<flatbuffers::Vector<int>> axisFbb = 0; |
| 115 | if (nullptr != layer_norm_param->axis()) { |
| 116 | std::vector<int> axis(layer_norm_param->axis()->size()); |
| 117 | ::memcpy(axis.data(), layer_norm_param->axis()->data(), layer_norm_param->axis()->size() * sizeof(int)); |
| 118 | axisFbb = builder.CreateVector(axis); |
| 119 | } |
no test coverage detected