package edu.stanford.nlp.parser.lexparser;
import java.io.*;
import java.util.*;
import edu.stanford.nlp.parser.common.ParserConstraint;
import edu.stanford.nlp.util.Generics;
public class Lattice implements Serializable, Iterable<LatticeEdge> {
private static final long serialVersionUID = 5135076134500512556L;
private final List<ParserConstraint> constraints;
private final List<LatticeEdge> edges;
private final Set<Integer> nodes;
private final Map<Integer,List<LatticeEdge>> edgeStartsAt;
private int maxNode = -1;
public Lattice() {
edges = new ArrayList<>();
nodes = Generics.newHashSet();
constraints = new ArrayList<>();
edgeStartsAt = Generics.newHashMap();
}
//TODO Do node normalization here
public void addEdge(LatticeEdge e) {
nodes.add(e.start);
nodes.add(e.end);
edges.add(e);
if(e.end > maxNode)
maxNode = e.end;
if(edgeStartsAt.get(e.start) == null) {
List<LatticeEdge> edges = new ArrayList<>();
edges.add(e);
edgeStartsAt.put(e.start, edges);
} else {
edgeStartsAt.get(e.start).add(e);
}
}
public void addConstraint(ParserConstraint c) { constraints.add(c); }
public int getNumNodes() { return nodes.size(); }
public List<ParserConstraint> getConstraints() {
return Collections.unmodifiableList(constraints);
}
public int getNumEdges() { return edges.size(); }
public List<LatticeEdge> getEdgesOverSpan(int start, int end) {
List<LatticeEdge> allEdges = edgeStartsAt.get(start);
List<LatticeEdge> spanningEdges = new ArrayList<>();
if(allEdges != null)
for(LatticeEdge e : allEdges)
if(e.end == end)
spanningEdges.add(e);
return spanningEdges;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(String.format("[ Lattice: %d edges %d nodes ]\n",edges.size(), nodes.size()));
for(LatticeEdge e : edges)
sb.append(" " + e.toString() + "\n");
return sb.toString();
}
public void setEdge(int id, LatticeEdge e) { edges.set(id, e); }
public Iterator<LatticeEdge> iterator() { return edges.iterator(); }
public void addBoundary() {
//Log prob of 0.0 since we have to take this transition
LatticeEdge boundary = new LatticeEdge(Lexicon.BOUNDARY, 0.0, maxNode, maxNode + 1);
addEdge(boundary);
}
}