Val* Val:: newIth(int ith, Val* oval, bool& stop) { int ithc = oval->vec(ith); if(ithc > 0) stop = true; short nxtI = ithc +1;; //cerr<< "Wnt " << nxtI << "th var on pos " << ith << " of " << *oval<< endl; if(oval->wrd() >= 0) return NULL; //???; double ovalprob = oval->prob(); //if(oval->status == TERMINALVAL) return NULL; Val* nval = ithBst(ith,oval->bsts()).next(nxtI); if(!nval) return NULL; double ovalcompprob = ithBst(ith, oval->bsts()).nth(ithc)->prob(); double nprob = nval->prob(); //cerr << "Its prob is " << nprob << endl; if(nprob < 0) return NULL; Val* ans = new Val(oval); ans->vec(ith) = nxtI; double frac = nprob/ovalcompprob; ans->prob() *= frac; assert(nxtI <= ithBst(ith,ans->bsts()).num()); //cerr << "ith is " << ith << " " << ans->vec().size() << " " // << ans->vec()[ith] << " " << frac << endl; //cerr << "The var is " << *ans << endl; //assert(ans->check()); return ans; }
Bst& MeChart:: bestParse(Item* itm, FullHist* h, Val* cval, Val* gcval, int cdir) { curVal = cval; gcurVal = gcval; curDir = cdir; Bst& bst = recordedBP(itm, h); curVal = gcurVal = NULL; curDir = -1; if(bst.explored()) { if(printDebug() > 19) { prDp(); cerr << "already known bestParse(" << *itm << ", ...) has p = " << bst.prob() << endl; } return bst; } if(printDebug() > 10) { prDp(); cerr << "bestParse(" << *itm << ", ...)" << endl; } bst.explored() = true; //David McClosky bug; int itermInt = itm->term()->toInt(); PosMap& pm = itm->posAndheads(); PosIter pi = pm.begin(); ECString bestW; for( ; pi != pm.end() ; pi++ ) { int posInt = (*pi).first; if(printDebug() > 16) { prDp(); cerr << "consider Pos(" << *itm << ") = " << posInt << endl; } HeadMap& hm = (*pi).second; /* we are using collected counts for p(u|t) */ float hposprob = 1; /* if we have reached a preterminal, then termInt == posInt and p(posInt|termInt) == 1 */ if( itermInt != posInt) { curVal = cval; gcurVal = gcval; curDir = cdir; hposprob = meProb(posInt, h, UCALC); if(hposprob == 0) hposprob = .00001; //??? this can happen; curVal = gcurVal = NULL; curDir = -1; if(printDebug() > 16) { prDp(); cerr << "p(pos) = " << hposprob << endl; } } h->preTerm = posInt; HeadIter hi = hm.begin(); for( ;hi != hm.end();hi++) { const Wrd& subhw = (*hi).first; int wrdInt = subhw.toInt(); ECString subh = subhw.lexeme(); if(printDebug() > 16) { prDp(); cerr << "consider head(" << *itm << ") = " << subh << endl; } float hprob = 0; if(wrdInt >= 0 && wrdInt <= lastKnownWord) { hprob = pCapgt(&subhw,posInt); hprob *= (1 - pHugt(posInt)); curVal = cval; gcurVal = gcval; curDir = cdir; float hprob2 = meHeadProb(wrdInt, h); curVal = gcurVal = NULL; curDir = -1; hprob *= hprob2; if(hprob < 0) { cerr << posInt << " " << pHugt(posInt) <<" "<<hprob2 << endl; assert(hprob >=0); } } //hprob can be zero if lower case NNPS. if(wrdInt > lastKnownWord || hprob == 0) { hprob = psutt(&subhw,posInt); } if(printDebug() > 16) { prDp(); cerr << "p(hd) = "<< hprob << endl; } float hhprob = (hposprob * hprob); if(hhprob < 0) { cerr << hposprob << " " << hprob << endl; assert(hhprob >= 0); } h->hd = &subhw; Bst& bst2 = bestParseGivenHead(posInt,subhw,itm,h,(*hi).second,cval,gcval); if(bst2.empty()) continue; Val* nval = new Val(); Val* oldval0 = bst2.nth(0); nval->prob() = oldval0->prob()*hhprob; nval->bsts().push_back(&bst2); nval->status = EXTRAVAL; bst.push(nval); bst.sum() += bst2.sum()*hhprob; } } Val* nbest = bst.pop(); if(nbest) bst.addnth(nbest); if(printDebug() > 10) { prDp(); cerr << "Bestp for " << *itm << " = " << bst.prob() <<endl; } return bst; }