| 1915 | } |
| 1916 | |
| 1917 | VARPS _Loop(VARPS x, const std::string& submoduleName) { |
| 1918 | auto subgraph = ExecutorScope::Current()->findSubGraph(submoduleName); |
| 1919 | if (nullptr == subgraph) { |
| 1920 | MNN_ERROR("Loop Error: Can't find submoduleName: %s\n", submoduleName.c_str()); |
| 1921 | return VARPS{}; |
| 1922 | } |
| 1923 | auto info = subgraph->info.get(); |
| 1924 | if (info->inputs.size() != x.size()) { |
| 1925 | MNN_ERROR("Loop Error: input number not match: x: %d : submodule: %d\n", (int)x.size(), (int)info->inputs.size()); |
| 1926 | return VARPS{}; |
| 1927 | } |
| 1928 | std::unique_ptr<MNN::OpT> op(new MNN::OpT); |
| 1929 | op->type = MNN::OpType_While; |
| 1930 | op->main.type = OpParameter_WhileParam; |
| 1931 | auto param = new MNN::WhileParamT; |
| 1932 | op->main.value = param; |
| 1933 | param->body_graph = submoduleName; |
| 1934 | // Body Input: 2 + N, Body Output: 1 + N + K, Op output: N + K |
| 1935 | int N = (int)info->inputs.size() - 2; |
| 1936 | int K = (int)info->outputs.size() - N - 1; |
| 1937 | MNN_ASSERT(info->inputs.size() >= 2); |
| 1938 | EXPRP expr = Expr::create(op.get(), x, N+K); |
| 1939 | VARPS outputs(N+K); |
| 1940 | for (int i=0; i<N+K; ++i) { |
| 1941 | outputs[i] = Variable::create(expr, i); |
| 1942 | } |
| 1943 | return outputs; |
| 1944 | } |
| 1945 | |
| 1946 | |
| 1947 | VARP _ROIPooling(VARP input, VARP roi, int pooledHeight, int pooledWidth, float spatialScale, bool outputGrad, VARP backwardDiff) { |