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(); }
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; }