protected void setSpanMaxEdgeFOM(
      final HashSetChartCell leftCell, final HashSetChartCell rightCell) {
    ChartEdge edge;
    final int start = leftCell.start(), end = rightCell.end();
    float bestFOM = maxEdgeFOM[start][end];

    // System.out.println(" setSpanMax: " + leftCell + " && " + rightCell);

    Collection<Production> possibleProds;
    for (final int leftNT : leftCell.getLeftChildNTs()) {
      for (final int rightNT : rightCell.getRightChildNTs()) {
        possibleProds = grammar.getBinaryProductionsWithChildren(leftNT, rightNT);
        if (possibleProds != null) {
          for (final Production p : possibleProds) {
            // final float prob = p.prob + leftCell.getInside(leftNT) +
            // rightCell.getInside(rightNT);
            edge = chart.new ChartEdge(p, leftCell, rightCell);
            // System.out.println(" considering: " + edge);
            if (edge.fom > bestFOM) {
              bestFOM = edge.fom;
            }
          }
        }
      }
    }

    if (bestFOM > maxEdgeFOM[start][end]) {
      final HashSetChartCell parentCell = chart.getCell(start, end);
      // if (maxEdgeFOM[start][end] > Float.NEGATIVE_INFINITY) {
      // spanAgenda.remove(parentCell);
      // }
      maxEdgeFOM[start][end] = bestFOM;
      parentCell.fom = bestFOM;
      // spanAgenda.add(parentCell);
      // System.out.println(" addingSpan: " + parentCell);
    }
  }