コード例 #1
0
ファイル: Bchart.C プロジェクト: chrisleewashere/SwiRL-OSX
/* 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);
    }
}  
コード例 #2
0
ファイル: Bchart.C プロジェクト: BLLIP/bllip-parser
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 */
}
コード例 #3
0
ファイル: Bchart.C プロジェクト: chrisleewashere/SwiRL-OSX
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);
    }
}