std::vector<CGNodeInfo> DecisionTreeCompiler::compileSubtrees(CGNodeInfo rootNode, const CompilerSession &session) { std::vector<CGNodeInfo> nodesNextLevel = {rootNode}; uint8_t remainingLevels = session.Tree.getNumLevels(); while (remainingLevels > 0) { CodeGenerator *codegen = session.selectCodeGenerator(remainingLevels); bool isLeafSubtree = (remainingLevels == codegen->getJointSubtreeDepth()); std::vector<CGNodeInfo> roots = std::move(nodesNextLevel); if (isLeafSubtree && codegen->canEmitLeafEvaluation()) { compileLeafSubtrees(codegen, std::move(roots), session); return {}; // endpoints connected already } nodesNextLevel = compileNestedSubtrees(codegen, std::move(roots), session); remainingLevels -= codegen->getJointSubtreeDepth(); } return nodesNextLevel; // unconnected endpoints }