joshua.ui.hypergraph_visualizer.HyperGraphViewer.java Source code

Java tutorial

Introduction

Here is the source code for joshua.ui.hypergraph_visualizer.HyperGraphViewer.java

Source

/* This file is part of the Joshua Machine Translation System.
 *
 * Joshua is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1
 * of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free
 * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */
package joshua.ui.hypergraph_visualizer;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Paint;
import java.awt.Color;
import java.awt.Stroke;
import java.awt.BasicStroke;
import java.awt.Shape;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.*;

import javax.swing.DefaultListModel;
import javax.swing.JLabel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import edu.uci.ics.jung.algorithms.layout.DAGLayout;
import edu.uci.ics.jung.algorithms.layout.StaticLayout;
import edu.uci.ics.jung.algorithms.layout.TreeLayout;
import edu.uci.ics.jung.graph.DelegateTree;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.visualization.control.DefaultModalGraphMouse;
import edu.uci.ics.jung.visualization.control.ModalGraphMouse;
import edu.uci.ics.jung.visualization.control.LayoutScalingControl;
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
import edu.uci.ics.jung.visualization.renderers.Renderer.VertexLabel.Position;

import org.apache.commons.collections15.Transformer;

import joshua.corpus.vocab.SymbolTable;
import joshua.corpus.vocab.Vocabulary;
import joshua.decoder.hypergraph.*;
import joshua.decoder.ff.tm.BilingualRule;
import joshua.decoder.ff.tm.Rule;

import java.util.ArrayList;
import java.util.HashMap;

public class HyperGraphViewer extends VisualizationViewer<Vertex, Edge> {
    public static final int DEFAULT_HEIGHT = 500;
    public static final int DEFAULT_WIDTH = 500;
    public static final Color SRC = Color.WHITE;
    public static final Color TGT = Color.RED;

    public static final String USAGE = "USAGE: HyperGraphViewer <items file> <rules file> <first sentence> <last sentence>";
    public static final double EDGE_ELLIPSE_SIZE = 10;

    private SymbolTable vocab;
    JungHyperGraph graph;

    JList edgeList;

    public HyperGraphViewer(JungHyperGraph g, SymbolTable vocab) {
        super(new StaticLayout<Vertex, Edge>(g, new HyperGraphTransformer(g)));
        this.vocab = vocab;
        this.graph = g;
        this.edgeList = new JList(new DefaultListModel());
        this.edgeList.setCellRenderer(new HyperEdgeListCellRenderer(vocab));
        this.edgeList.addListSelectionListener(new HyperEdgeListSelectionListener(this));
        //      super(new DAGLayout<Vertex,Edge>(g));
        //      DelegateTree<Vertex,Edge> gtree = new DelegateTree<Vertex,Edge>(g);
        //      gtree.setRoot(g.getRoot());
        //      setGraphLayout(new TreeLayout<Vertex,Edge>(gtree));
        //      setGraphLayout(new StaticLayout<Vertex,Edge>(g, new HyperGraphTransformer(g)));
        getRenderContext().setVertexLabelTransformer(toStringTransformer());
        //      getRenderContext().setVertexLabelTransformer(new ToStringLabeller<Vertex>());
        setVertexToolTipTransformer(toolTipTransformer());

        DefaultModalGraphMouse<Vertex, Edge> graphMouse = new DefaultModalGraphMouse<Vertex, Edge>();
        graphMouse.setMode(ModalGraphMouse.Mode.TRANSFORMING);
        this.setPickedVertexState(new HyperGraphPickedState(this));
        setGraphMouse(graphMouse);
        addKeyListener(graphMouse.getModeKeyListener());

        getRenderContext().setVertexFillPaintTransformer(vertexPainter());
        //   getRenderContext().setEdgeStrokeTransformer(es);
        getRenderContext().setVertexShapeTransformer(ns);
        //   getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR);
    }

    private Transformer<Vertex, String> toStringTransformer() {
        return new Transformer<Vertex, String>() {
            public String transform(Vertex v) {
                if (v instanceof LeafVertex) {
                    return vocab.getWord(((LeafVertex) v).getEnglish());
                } else if (v instanceof NodeVertex) {
                    String nt = vocab.getWord(((NodeVertex) v).getNode().lhs);
                    return String.format("%s{%d-%d}", nt, ((NodeVertex) v).getNode().i,
                            ((NodeVertex) v).getNode().j);
                } else {
                    Rule r = ((HyperEdgeVertex) v).getHyperEdge().getRule();
                    if (r != null) {
                        String lhs = vocab.getWord(r.getLHS());
                        String french = vocab.getWords(r.getFrench());
                        String english = vocab.getWords(r.getEnglish());
                        return String.format("%s -> { %s ; %s }", lhs, french, english);
                    } else
                        return "";
                }
            }
        };
    }

    private Transformer<Vertex, String> toolTipTransformer() {
        return new Transformer<Vertex, String>() {
            public String transform(Vertex v) {
                if (v instanceof HyperEdgeVertex) {
                    NodeVertex pred = (NodeVertex) graph.getPredecessors(v).toArray()[0];
                    int otherEdges = pred.getNode().hyperedges.size() - 1;
                    return String.format("%d other edges", otherEdges);
                } else if (v instanceof NodeVertex) {
                    return ((NodeVertex) v).getNode().getSignature();
                } else {
                    return "";
                }
            }
        };
    }

    private Transformer<Vertex, Paint> vertexPainter() {
        return new Transformer<Vertex, Paint>() {
            private Color[] colors = { Color.blue, Color.red, Color.yellow, Color.green, Color.cyan };

            public Paint transform(Vertex v) {
                return colors[v.getColor() % colors.length];
            }
        };
    }

    private static Transformer<Edge, Stroke> es = new Transformer<Edge, Stroke>() {
        public Stroke transform(Edge e) {
            if (e.isHighlighted())
                return new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f,
                        new float[] { 10.0f }, 0.0f);
            else
                return new BasicStroke(1.0f);
        }
    };

    private static Transformer<Vertex, Shape> ns = new Transformer<Vertex, Shape>() {
        public Shape transform(Vertex v) {
            //   JLabel x = new JLabel();
            double len = 20; //x.getFontMetrics(x.getFont()).stringWidth(n.toString());
            double margin = 5.0;
            if (v instanceof NodeVertex || v instanceof LeafVertex)
                return new Rectangle2D.Double((len + margin) / (-2), 0, len + 2 * margin, 20);
            else
                return new Ellipse2D.Double(-.5 * EDGE_ELLIPSE_SIZE, -.5 * EDGE_ELLIPSE_SIZE, EDGE_ELLIPSE_SIZE,
                        EDGE_ELLIPSE_SIZE);
        }
    };

    public static void visualizeHypergraphInFrame(HyperGraph hg, SymbolTable st) {
        JFrame frame = new JFrame("Joshua Hypergraph");
        frame.setLayout(new BorderLayout());
        HyperGraphViewer vv = new HyperGraphViewer(new JungHyperGraph(hg, st), st);

        frame.getContentPane().add(vv, BorderLayout.CENTER);
        frame.getContentPane().add(new JScrollPane(vv.edgeList), BorderLayout.WEST);
        frame.setSize(500, 500);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
        return;
    }

    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);
        JFrame frame = new JFrame("Joshua Hypergraph");
        frame.getContentPane().add(new HyperGraphViewer(hg, vocab));
        frame.setSize(500, 500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        return;
    }
}