/**
   * Creates the grammar from the language model. This Grammar contains one word per grammar node.
   * Each word (and grammar node) is connected to all other words with the given probability
   *
   * @return the initial grammar node
   */
  @Override
  protected GrammarNode createGrammar() throws IOException {
    if (lattice == null) {
      return createGrammarNode("<s>");
    }

    lattice.removeFillers();

    GrammarNode firstNode = null;
    HashMap<Node, GrammarNode> nodeMap = new HashMap<Node, GrammarNode>();
    for (Node n : lattice.getNodes()) {
      String word = n.getWord().toString();
      GrammarNode node = createGrammarNode(word);
      if (n.equals(lattice.getInitialNode())) firstNode = node;
      if (n.equals(lattice.getTerminalNode())) node.setFinalNode(true);
      nodeMap.put(n, node);
    }
    if (firstNode == null) {
      throw new Error("No lattice start found");
    }

    for (Edge e : lattice.getEdges()) {
      float logProbability = (float) e.getLMScore();
      GrammarNode prevNode = nodeMap.get(e.getFromNode());
      GrammarNode toNode = nodeMap.get(e.getToNode());
      prevNode.add(toNode, logProbability);
    }

    return firstNode;
  }