/* probDiff is the new probability which should be added to the prob of item (which for an initially created item will be zero. If probDiff plus whatever previously unused prob in item->storeP is over threshold then recurse */ void Bchart:: redoP(Item *item, double probDiff) { double oldItemP = item->prob(); double itemStoreP = item->storeP() + probDiff; item->storeP() = itemStoreP; if ( oldItemP != 0.0 ) if( itemStoreP / oldItemP < storeCutoff ) { return; } item->prob() += itemStoreP; //cerr << "P( " << *item << " ) goes from " << oldItemP //<< " -> " << item->prob() << endl; item->storeP() = 0.0; if( oldItemP == 0.0 ) { return; } double pRatio = item->prob() / oldItemP; NeedmeIter nmi(item); Edge* edge; while(nmi.next(edge)) { redoP(edge,pRatio); } }
void Bchart:: addFinishedEdge(Edge* newEdge) { if(guided && !inGuide(newEdge)) return; if(printDebug() > 250) cerr << "addFinishedEdge " << *newEdge << endl; if(newEdge->finishedParent() && (newEdge->finishedParent()->term()->terminal_p())) { add_reg_item(newEdge->finishedParent()); return; } Item *regi; regi = in_chart( NULL, newEdge->lhs(), newEdge->start(), newEdge->loc()); if(regi) { /* redoP is a crucial function. It uses the probability of the edge to see what the new prob of regi should be, and if it is over the threshold for propogating probs, it will recursively do this up the chart. */ redoP(regi, newEdge->prob()); } else { //regi = new Item(newEdge->lhs(), // newEdge->start(), newEdge->loc()); regi = addtochart(newEdge->lhs()); regi->start() = newEdge->start(); regi->finish() = newEdge->loc(); regi->prob() = newEdge->prob(); //regi->headp() = newEdge->headp(); add_reg_item(regi); } if(newEdge->finishedParent()) { assert(newEdge->finishedParent() == regi); } else { newEdge->setFinishedParent( regi ); } regi->ineed().push_back( newEdge ); /* setFinishedParent tells newEdge that the consitutent that it build is regi */ }
void Bchart:: redoP(Edge* edge, double probRatio) { //cerr << "rpEdge " << *edge << endl; double oldEdgeP = edge->prob(); //if(oldEdgeP == 0) cerr << "Zprob " << *edge << endl; if(edge->heapPos() >= 0) heap->del(edge); edge->prob() *= probRatio; edge->setmerit(); if(edge->heapPos() >= 0) heap->insert(edge); //heap->check(); if(edge->finishedParent()) { redoP(edge->finishedParent(), edge->prob()-oldEdgeP); } }