int tree_ngram(TreeHist* treeh, int n, int l) { static int stopTermInt = -1; if(stopTermInt < 0) { ECString stopStr("STOP"); const Term* stopTerm = Term::get(stopStr); stopTermInt = stopTerm->toInt(); } int pos = treeh->pos; int hp = treeh->hpos; int m = pos + (n * l); if(m < 0) return stopTermInt; InputTree* tree = treeh->tree; if(m >= tree->subTrees().size()) return stopTermInt; if(m > hp && l > 0) return stopTermInt; InputTree *subTree; InputTreesIter subTreeIter = tree->subTrees().begin(); int i = 0; for( ; subTreeIter != tree->subTrees().end() ; subTreeIter++ ) { if(i == m) { subTree = *subTreeIter; const Term* trm = Term::get(subTree->term()); return trm->toInt(); } i++; } assert("should never get here"); return -1; }
void addSubFeatureFns() { /* 0 t tree_term 1 l tree_parent_term 2 u tree_pos 3 h tree_head 4 i tree_parent_head 5 T tree_true 6 v tree_parent_pos 7 b tree_term_before 8 mE tree_mE //8 a tree_term_after 9 m tree_grandparent_term 10 w tree_grandparent_pos 11 j tree_ruleHead_third 12 c tree_ccparent_term 13 L1 tree_left1 14 L2 tree_left2 15 R1 tree_right1 16 R2 tree_right2 17 Qr tree_noopenQr 18 L0 tree_left0; 19 L3 tree_left3 20 R3 tree_right3 21 Ql tree_noopenQl 22 Bl tree_Bl 23 Br tree_Br 24 vE tree_vE //25 E tree_E 25 w1 tree_w1 26 w2 tree_w2 */ int (*funs[27])(TreeHist*) = {tree_term, tree_parent_term, tree_pos, tree_head, tree_parent_head, tree_true, tree_parent_pos, tree_term_before, tree_mE, tree_grandparent_term, tree_grandparent_pos, tree_ruleHead_third, tree_ccparent_term, tree_left1, tree_left2, tree_right1, tree_right2, tree_noopenQr, tree_left0, tree_left3, tree_right3,tree_noopenQl,tree_Bl,tree_Br, tree_vE, tree_w1, tree_w2 }; int i; for(i = 0 ; i < 27 ; i++) SubFeature::Funs[i] = funs[i]; string stopStr("STOP"); const Term* stopTerm = Term::get(stopStr); stopTermInt = stopTerm->toInt(); ECString wrdm = "^^"; const WordInfo* wmi = Pst::get(wrdm); cout << "wrdm: " << wrdm << endl; assert(wmi); int ans = wmi->toInt(); nullWordInt = ans; }