void Bchart:: assignRProb(Edge* edge) { LeftRightGotIter lrgi(edge); globalGi = &lrgi; int sz = lrgi.size(); int i; int hp = edge->headPos(); double ans = 1; cerr << "ARP " << *edge << endl; for(i = 0 ; i < sz ; i++) { lrgi.pos() = i; int whichInt = i < hp ? LCALC : i == hp ? MCALC : RCALC; FullHist fh(edge); fh.pos = i; double p = meFHProb(lrgi.index(i)->term(),fh, whichInt); //cerr << "p" << whichInt << "(" << *lrgi.index(i) << ")= " << p << endl; ans *= p; } //if(ans == 0) cerr << "Assigned zero prob to " << *edge << endl; edge->prob() = ans; }
void Bchart:: extend_rule(Edge* edge, Item * item, int right) { Edge* newEdge = new Edge(*edge, *item, right); if(printDebug() > 140) cerr << "extend_rule " << *edge << " " << *item << endl; const Term* itemTerm = item->term(); LeftRightGotIter lrgi(newEdge); globalGi = &lrgi; if(edge->loc() == edge->start()) { newEdge->prob() *= meEdgeProb(item->term(), newEdge, MCALC); /*stoprightp is p of stopping after seeing what currently passes for the rhs of the edge */ newEdge->rightMerit() = computeMerit(newEdge,RUCALC); delete edge; // just created; } else if(right) { newEdge->prob() *= meEdgeProb(item->term(),newEdge, RCALC); } else newEdge->prob() *= meEdgeProb(item->term(),newEdge, LCALC); if(right) { newEdge->rightMerit() = computeMerit(newEdge,RMCALC); } else { /* this is the left boundary stat for constituents that are continuing left, given the label and whatever currently appears on the left boundary of the constit. we only need this when going left */ newEdge->leftMerit() = computeMerit(newEdge,LMCALC); } if(itemTerm == Term::stopTerm) newEdge->status() = right ? 2 : 1; if(newEdge->status() == 2) newEdge->prob() *= endFactorComp(newEdge); if(printDebug() > 250 ) cerr << "Constructed " << *newEdge << "\t" << newEdge->leftMerit() << "\t" << newEdge->prob() << "\t" << newEdge->rightMerit() << endl; int tmp = curDemerits_[newEdge->start()][newEdge->loc()]; newEdge->demerits() = tmp; if(repeatRule(newEdge)) { newEdge->rightMerit() = 0; } newEdge->setmerit(); //cerr << "DEM " << tmp << " " << newEdge->merit() << endl; globalGi = NULL; if(newEdge->merit() == 0) { assert(alreadyPopedNum < 450000); alreadyPoped[alreadyPopedNum++] = newEdge; Edge* prd = newEdge->pred(); if(prd) prd->sucs().pop_front(); return; } ++ruleiCounts_; heap->insert(newEdge); if(itemTerm != Term::stopTerm) item->needme().push_back(newEdge); }