コード例 #1
0
ファイル: Bchart.C プロジェクト: chrisleewashere/SwiRL-OSX
Bchart::
Bchart(SentRep & sentence)
: ChartBase( sentence )
{
  pretermNum = 0;
  heap = new EdgeHeap();
  int len = sentence.length();
  int i,j;
  assert(len <= MAXSENTLEN);
  char temp[512];
  for(i = 0 ; i < len ; i++)
    {
      ECString wl = toLower(sentence[i].lexeme().c_str(), temp);
      int val = wtoInt(wl);
      sentence_[i].toInt() = val;
    }
  for(i = 0 ; i < MAXSENTLEN ; i++)
    for(j = 0 ; j < MAXSENTLEN ; j++) curDemerits_[i][j] = 0;
  initDenom();
}
コード例 #2
0
double
Bchart::
parse()
{
  initDenom();
    alreadyPopedNum = 0;
    
    bool   haveS = false;
    int locTimeout = ruleiCountTimeout_;
    for (;;)
    {
      //check();
      if( ruleiCounts_ > locTimeout || popedEdgeCount_ > poppedTimeout_)
	{
	  if(printDebug(5)) wcerr << "Ran out of time" << endl;
	  break;
	}

      if(get_S() && !haveS)
	{
	  // once we have found a parse, the total edes is set to edges * 3.5;
	  haveS = true;
	  if(printDebug(10)) wcerr << "Found S " << popedEdgeCount_ << endl;
	  popedEdgeCountAtS_ = popedEdgeCount_;
	  totEdgeCountAtS_ = ruleiCounts_;
	  int newTime = (int)(ruleiCounts_ * timeFactor);  
	  if(newTime < ruleiCountTimeout_)
	    locTimeout = newTime;
	}
      // We keep track of number of ruleis to decide when time out on parsing.;
      /* get best thing off of keylist */
      Edge* edge = heap->pop(); 
      if (!edge)
	{
	  if(printDebug(5)) wcerr << "Nonthing on agenda" << endl;
	  break;
	}
      int stus = edge->status();
      int cD = curDemerits_[edge->start()][edge->loc()];
      if(edge->demerits() < cD - 5 && !haveS)
	{
	  edge->demerits() = cD;
	  edge->setmerit();
	  heap->insert(edge);
	  continue;
	}
      if(isinf(edge->prob()) || isnan(edge->prob()) || isinf(edge->merit())
	 || isnan(edge->merit()))
	{
	  if(printDebug(5)) wcerr << "Over or underflow" << endl;
	  break;
	}
      if(alreadyPopedNum >= 400000)
	{
	  if(printDebug(5)) wcerr << "alreadyPoped got too large" << endl;
	  break;
	}
      if(printDebug() > 10)
	{
	  wcerr << popedEdgeCount_ << "\tPop";
	  if(stus == 0) wcerr << "< ";
	  else if(stus == 2) wcerr << ". ";
	  else wcerr << "> ";
	  wcerr << *edge << "\t" << edge->prob() << "\t" << edge->merit();
	  wcerr << "\t" << ruleiCounts_;
	  wcerr << endl;
	}
      popedEdgeCount_++;
      alreadyPoped[alreadyPopedNum++] = edge;
      if(!haveS) addToDemerits(edge);
      /* and add it to chart */
      //heap->check();
      switch (stus)
	{
	  case 0 : add_edge(edge, 0); break; //0 => continuing left;
	  case 1 : add_edge(edge, 1); break; //1 => continung right;
	  case 2 : addFinishedEdge(edge);
	}
    }

    /* at this point we are done looking for edges etc. */
    Item           *snode = get_S();
    /* No "S" node means the sentence was unparsable. */
    if (!snode)
      {
	return badParse;
      }
    double          ans = snode->prob();

    if (ans <= 0.0L)
	error(L"zero probability parse?");
    /*
    ans = -log2(ans);
    if (ans == quiet_nan(0L))
	error("log returned quiet_nan()");
    */
    static double	nat_log_2 = log( 2.0 );
    ans = -log( ans )/ nat_log_2;
    crossEntropy_ = ans;
    return ans;
}