package joshua.ui.hypergraph_visualizer;
import java.util.ArrayList;
import java.util.HashMap;
import joshua.corpus.vocab.SymbolTable;
import joshua.corpus.vocab.Vocabulary;
import joshua.decoder.hypergraph.*;
import edu.uci.ics.jung.graph.DirectedOrderedSparseMultigraph;
public class JungHyperGraph extends DirectedOrderedSparseMultigraph<Vertex,Edge> {
private Vertex root;
private SymbolTable vocab;
private int targetIndex;
private boolean checkDuplicateVertices;
public Vertex picked;
private ArrayList<Vertex> nonTreeEdgeEndpoints;
public static final String USAGE = "usage: JungHyperGraph <items file> <rules file> <first sentence> <last sentence>";
public static void main(String [] argv)
{
if (argv.length < 4) {
System.err.println(USAGE);
System.exit(1);
}
String itemsFile = argv[0];
String rulesFile = argv[1];
int firstSentence = Integer.parseInt(argv[2]);
int lastSentence = Integer.parseInt(argv[3]);
HashMap<Integer,Integer> chosenSentences = new HashMap<Integer,Integer>();
for (int i = firstSentence; i < lastSentence; i++) {
chosenSentences.put(i, i);
}
Vocabulary vocab = new Vocabulary();
DiskHyperGraph dhg = new DiskHyperGraph(vocab, 0, true, null);
dhg.initRead(itemsFile, rulesFile, chosenSentences);
JungHyperGraph hg = new JungHyperGraph(dhg.readHyperGraph(), vocab);
return;
}
public JungHyperGraph(HyperGraph hg, SymbolTable st)
{
checkDuplicateVertices = false;
vocab = st;
targetIndex = 0;
nonTreeEdgeEndpoints = new ArrayList<Vertex>();
addNode(hg.goalNode, null);
}
public Vertex getRoot()
{
return root;
}
public void addNode(HGNode n, Vertex edge_out)
{
Vertex v = new NodeVertex(n);
if (checkDuplicateVertices && getVertices().contains(v)) {
// addEdge(new Edge(false), edge_out, v);
ArrayList<Vertex> vertexList = (ArrayList<Vertex>) getVertices();
nonTreeEdgeEndpoints.add(edge_out);
nonTreeEdgeEndpoints.add(vertexList.get(vertexList.indexOf(v)));
return;
}
if (edge_out != null)
addEdge(new Edge(false), edge_out, v);
else
root = v;
addHyperEdge(v, n.bestHyperedge);
return;
}
public void addHyperEdge(Vertex parent, HyperEdge e)
{
if (e == null)
return;
Vertex v = new HyperEdgeVertex(e);
addEdge(new Edge(false), parent, v);
if (e.getRule() != null) {
ArrayList<HGNode> items = null;
if (e.getAntNodes() != null)
items = new ArrayList<HGNode>(e.getAntNodes());
for (int t : e.getRule().getEnglish()) {
if (vocab.isNonterminal(t)) {
addNode(items.get(0), v);
items.remove(0);
}
else {
LeafVertex leaf = new LeafVertex(t, targetIndex);
if (checkDuplicateVertices && getVertices().contains(leaf)) {
System.err.println("Leaf already in tree: " + t + "/" + targetIndex);
ArrayList<Vertex> vertexList = (ArrayList<Vertex>) getVertices();
nonTreeEdgeEndpoints.add(v);
nonTreeEdgeEndpoints.add(vertexList.get(vertexList.indexOf(leaf)));
}
else {
addEdge(new Edge(false), v, leaf);
}
targetIndex++;
}
}
}
else {
for (HGNode i : e.getAntNodes()) {
addNode(i, v);
}
}
return;
}
public void incrementHyperEdge(NodeVertex v)
{
removeSubtreeBelow(v);
addHyperEdge(v, v.incrementEdge());
return;
}
private void removeSubtreeBelow(Vertex v)
{
if (getSuccessorCount(v) == 0)
return;
else {
for (Vertex s : getSuccessors(v)) {
removeSubtreeBelow(s);
for (Edge e : findEdgeSet(v, s)) {
removeEdge(e);
}
removeVertex(s);
}
}
return;
}
public void addNonTreeEdges()
{
int i = 0;
while (i < nonTreeEdgeEndpoints.size() - 2) {
addEdge(new Edge(false), nonTreeEdgeEndpoints.get(i), nonTreeEdgeEndpoints.get(i + 1));
i += 2;
}
return;
}
public void replaceSubtrees(Object [] objectList)
{
if (objectList.length < 1)
return;
nonTreeEdgeEndpoints.clear();
removeSubtreeBelow(picked);
checkDuplicateVertices = true;
for (Object o : objectList) {
HyperEdge e = (HyperEdge) o;
addHyperEdge(picked, e);
}
int color = 1;
for (Vertex v : getSuccessors(picked)) {
setSubTreeColor(v, color);
color++;
}
checkDuplicateVertices = false;
return;
}
public void setSubTreeColor(Vertex v, int color)
{
v.setColor(color);
for (Vertex s : getSuccessors(v)) {
setSubTreeColor(s, color);
}
}
}