svoid ai_parseTree_makeWeights(AI_BottomUpParser1 parser, L productions, final PTElement e) { ret ai_parseTree_makeWeights(parser, productions, e, 1, ai_bottomUpParser_maxDepth()); } svoid ai_parseTree_makeWeights(AI_BottomUpParser1 parser, L productions, final PTElement e, int level, int maxLevel) { ping(); if (level >= maxLevel) fail("Max parse tree level reached: " + maxLevel); // Descend first for (PTElement child : ai_parseTree_getChildren(parser, productions, e)) ai_parseTree_makeWeights(parser, productions, child, level+1, maxLevel); // Then calculate this node's weight // check for explicit anti-examples if (e instanceof HaveCategory && contains(ai_antiWordCategoriesWithElements().get(e/HaveCategory.category), e.text())) ret with e.weight = 0.1; if (e instanceof ChoosePart) e.weight = avg(first(e.children).weight, second(e.children).weight); else if (e instanceof HaveCategory && empty(e.children)) e.weight = or(ai_getWordToCategoryWeight(e.text(), e/HaveCategory.category), 1.0); else e.weight = collectMaxDouble(e.children, 'weight); ai_Reconstructed r = e instanceof ChoosePart ? e/ChoosePart.reconstruction : e instanceof HaveCategory ? e/HaveCategory.reconstruction : null; if (r != null) e.weight *= r.production.weight; }