<#list tc.architectureInputSymbols as input> vector ${tc.getName(input)} = CNNTranslator::translate(${input.name}<#if input.arrayAccess.isPresent()>[${input.arrayAccess.get().intValue.get()?c}]); <#if tc.architectureOutputSymbols?size gt 1> <#assign outputName = tc.getNameWithoutIndex(tc.getName(tc.architectureOutputSymbols[0]))> vector> ${outputName}(${tc.architectureOutputSymbols?size}); for (size_t i = 0; i < ${outputName}.size(); ++i) { ${outputName}[i].emplace_back(${tc.join(tc.architectureOutputSymbols[0].ioDeclaration.type.dimensions, " * ")}); } <#else> <#list tc.architectureOutputSymbols as output> vector ${tc.getName(output)}(${tc.join(tc.architectureOutputSymbols[0].ioDeclaration.type.dimensions, " * ")});<#sep>, <#list tc.getLayerVariableMembers()?keys as member> vector ${member}(${tc.join(tc.getLayerVariableMembers()[member], " * ")}); <#list tc.architecture.constants as constant> vector ${tc.getName(constant)}{${constant.intValue?c}}; <#list tc.architecture.networkInstructions as networkInstruction> <#if networkInstruction.isUnroll()> { int k = ${tc.getBeamSearchWidth(networkInstruction)}; <#list tc.getUnrollInputNames(networkInstruction, "1") as inputName> <#if tc.getNameWithoutIndex(inputName) == tc.outputName> vector>, double>> sequences{make_pair(vector{${inputName}}, 1.0)}; for (size_t i = 1; i < ${tc.getBeamSearchMaxLength(networkInstruction)}; ++i) { vector>, double>> allCandidates; for (const pair>& pair : sequences) { vector> seq = pair.first; double score = pair.second; <#list tc.getUnrollInputNames(networkInstruction, "i") as inputName> <#if tc.getNameWithoutIndex(inputName) == tc.outputName> ${inputName} = seq.back(); _predictor_${networkInstruction?index}_.predict(${tc.join(tc.getUnrollInputNames(networkInstruction, "i"), ", ")}, ${tc.join(tc.getUnrollOutputNames(networkInstruction, "i"), ", ")}); <#list tc.getUnrollOutputNames(networkInstruction, "i") as outputName> <#if tc.getNameWithoutIndex(outputName) == tc.outputName> vector& out = ${outputName}; vector> topk; for (size_t i = 0; i < out.size(); ++i) { topk.emplace_back(i, out[i]); } sort(topk.begin(), topk.end(), [] (const pair& p1, const pair& p2) { return p1.second > p2.second; }; topk = vector>(topk.begin(), topk.begin() + std::min(k, topk.size())); for (const pair& pair : topk) { vector> currentSeq = seq; currentSeq.push_back(vector{pair.first}); allCandidates.emplace_back(currentSeq, score * pair.second); } } sort(allCandidates.begin(), allCandidates.end(), [] (const pair>, double>& p1, const pair>, double>& p2) { return p1.second > p2.second; }); sequences = vector>, double>>(allCandidates.begin(), allCandidates.begin() + std::min(k, allCandidates.size())); } for (size_t i = 1; i < ${tc.getBeamSearchMaxLength(networkInstruction)}; ++i) { <#list tc.getUnrollOutputNames(networkInstruction, "i") as outputName> <#if tc.getNameWithoutIndex(outputName) == tc.outputName> ${outputName} = sequences[0].first[i]; } } <#else> _predictor_${networkInstruction?index}_.predict(${tc.join(tc.getStreamInputNames(networkInstruction.body, true), ", ")}, ${tc.join(tc.getStreamOutputNames(networkInstruction.body, true), ", ")}); <#list tc.architectureOutputSymbols as output> <#assign shape = output.ioDeclaration.type.dimensions> <#if shape?size == 1> <#if (output.ioDeclaration.type.domain.isNaturalNumber() || output.ioDeclaration.type.domain.isWholeNumber())> ${output.name}<#if output.arrayAccess.isPresent()>[${output.arrayAccess.get().intValue.get()?c}] = CNNTranslator::translateToIntCol(${tc.getNameAsArray(tc.getName(output))}, std::vector {${shape[0]?c}}); <#else> ${output.name}<#if output.arrayAccess.isPresent()>[${output.arrayAccess.get().intValue.get()?c}] = CNNTranslator::translateToCol(${tc.getNameAsArray(tc.getName(output))}, std::vector {${shape[0]?c}}); <#if shape?size == 2> <#if (output.ioDeclaration.type.domain.isNaturalNumber() || output.ioDeclaration.type.domain.isWholeNumber())> ${output.name}<#if output.arrayAccess.isPresent()>[${output.arrayAccess.get().intValue.get()?c}] = CNNTranslator::translateToIntMat(${tc.getNameAsArray(tc.getName(output))}, std::vector {${shape[0]?c}, ${shape[1]?c}}); <#else> ${output.name}<#if output.arrayAccess.isPresent()>[${output.arrayAccess.get().intValue.get()?c}] = CNNTranslator::translateToMat(${tc.getNameAsArray(tc.getName(output))}, std::vector {${shape[0]?c}, ${shape[1]?c}}); <#if shape?size == 3> <#if (output.ioDeclaration.type.domain.isNaturalNumber() || output.ioDeclaration.type.domain.isWholeNumber())> ${output.name}<#if output.arrayAccess.isPresent()>[${output.arrayAccess.get().intValue.get()?c}] = CNNTranslator::translateToIntCube(${tc.getNameAsArray(tc.getName(output))}, std::vector {${shape[0]?c}, ${shape[1]?c}, ${shape[2]?c}}); <#else> ${output.name}<#if output.arrayAccess.isPresent()>[${output.arrayAccess.get().intValue.get()?c}] = CNNTranslator::translateToCube(${tc.getNameAsArray(tc.getName(output))}, std::vector {${shape[0]?c}, ${shape[1]?c}, ${shape[2]?c}});