| 32 | //#define MNN_PIPELINE_MODULE_DEBUG |
| 33 | |
| 34 | ExprModule::ExprModule(EXPRP expr) { |
| 35 | mExpr = expr; |
| 36 | setName(expr->name()); |
| 37 | mInputs = expr->inputs(); |
| 38 | auto op = mExpr->get(); |
| 39 | if (op) { |
| 40 | auto typeName = EnumNameOpType(op->type()); |
| 41 | setType(typeName); |
| 42 | } |
| 43 | for (int i = 0; i < mInputs.size(); ++i) { |
| 44 | auto inputExpr = mInputs[i]->expr().first; |
| 45 | if (inputExpr->get() != nullptr) { |
| 46 | mInputs[i] = nullptr; |
| 47 | mInputIndexes.emplace_back(i); |
| 48 | continue; |
| 49 | } |
| 50 | switch (inputExpr->inputType()) { |
| 51 | case VARP::INPUT: |
| 52 | mInputs[i] = nullptr; |
| 53 | mInputIndexes.emplace_back(i); |
| 54 | break; |
| 55 | case VARP::CONSTANT: |
| 56 | break; |
| 57 | case VARP::TRAINABLE: |
| 58 | addParameter(mInputs[i]); |
| 59 | break; |
| 60 | default: |
| 61 | break; |
| 62 | } |
| 63 | } |
| 64 | // TODO: Optimize the logic |
| 65 | if (!mExpr->mCanDecompose) { |
| 66 | ExecutorScope::Current()->setLazyComputeMode(Executor::LAZY_CONTENT); |
| 67 | } |
| 68 | } |
| 69 | |
| 70 | std::vector<VARP> ExprModule::onForward(const std::vector<VARP>& inputs) { |
| 71 | MNN_ASSERT(mInputIndexes.size() == inputs.size()); |
nothing calls this directly
no test coverage detected