public void addUnaryExtensionsToLexProds() {
   for (int i = 0; i < chart.size(); i++) {
     final HashSetChartCell cell = chart.getCell(i, i + 1);
     for (final int pos : cell.getPosNTs()) {
       for (final Production unaryProd : grammar.getUnaryProductionsWithChild(pos)) {
         // cell.addEdge(unaryProd, cell, null, cell.getBestEdge(pos).inside + unaryProd.prob);
         cell.updateInside(unaryProd, cell.getInside(pos) + unaryProd.prob);
       }
     }
   }
 }
 protected void addLexicalProductions(final int sent[]) {
   // ChartEdge newEdge;
   HashSetChartCell cell;
   for (int i = 0; i < chart.size(); i++) {
     cell = chart.getCell(i, i + 1);
     for (final Production lexProd : grammar.getLexicalProductionsWithChild(sent[i])) {
       // newEdge = chart.new ChartEdge(lexProd, chart.getCell(i, i + 1));
       // chart.getCell(i, i + 1).addEdge(newEdge);
       cell.updateInside(lexProd, lexProd.prob);
     }
   }
 }
  protected void addBestEdgesToChart(
      final HashSetChartCell cell, final ChartEdge[] bestEdges, final int maxEdgesToAdd) {
    ChartEdge edge, unaryEdge;
    int numAdded = 0;

    final PriorityQueue<ChartEdge> agenda = new PriorityQueue<ChartEdge>();
    for (int i = 0; i < bestEdges.length; i++) {
      if (bestEdges[i] != null) {
        addEdgeToAgenda(bestEdges[i], agenda);
      }
    }

    while (agenda.isEmpty() == false && numAdded <= maxEdgesToAdd) {
      edge = agenda.poll();
      // addedEdge = cell.addEdge(edge);
      // if (addedEdge) {
      final int nt = edge.prod.parent;
      final float insideProb = edge.inside();
      if (insideProb > cell.getInside(edge.prod.parent)) {
        cell.updateInside(nt, insideProb);
        // System.out.println(" addingEdge: " + edge);
        numAdded++;
        // Add unary productions to agenda so they can compete with binary productions
        for (final Production p : grammar.getUnaryProductionsWithChild(edge.prod.parent)) {
          unaryEdge = chart.new ChartEdge(p, cell);
          addEdgeToAgenda(unaryEdge, agenda);
        }
      }
    }

    // TODO: should I decrease the maxEdgeFOM here according to the best edge NOT in the chart?
    // won't this just be overrun when we expand the frontier?
    if (agenda.isEmpty()) {
      maxEdgeFOM[cell.start()][cell.end()] = Float.NEGATIVE_INFINITY;
    } else {
      maxEdgeFOM[cell.start()][cell.end()] = agenda.peek().fom;
    }
  }