JUNG2(Java Universal Network/Graph Framework)�Ȥ�

��Ū

2009ǯ4��ˡ�Java�饤�֥��Ǥ��� JUNG �� 2.0(JUNG2-2.0) ����꡼�����줿�褦����������ޤǤ�JUNG1.X�Ȥϲ�������äƤ������ᡤ���ܸ�Υ����ȤΥ���ץ륳���ɤ�ư�������������ܿ����������ʤ����Ȥ����Τ������˥���Ĥ����Ȼפä��Τ����ä�����

�����餯�ͥåȥ����ʬ����Ū�ǡ�JUNG��Ȥä�Java�ǥץ������򤹤뤰�餤�ʤ�Ŭ���ʥ��եȤ����Ƕ�(2009ǯ����)�Ǥϡ�R�Υ饤�֥�꤬���¤��Ƥ������Ȥ⤢�ꡤ���ΤƤ��ĤĤ���Τ��⤷��ʤ����ޤ����絬�Ϥʤ�Τˤʤ�Ȥ�Ϥ�Java����C++���ʤȤʤä�Boost��Ȥ����Ȥˤʤ����Ȥ��⤦��

��������å����åפ�Ĥ���Τ�C++���⡤Java���ڤ��Ȼפ���������������äȤ�������չ�¤�Ǥ�����ȴ������ƥ��르�ꥺ����Ȥ�Ω�Ƥ�Τ����ݡ�Ŭ���ʥ饤�֥���õ���Ƥ�����k���� JUNG2 ��Ȥ����Ȥʤä�������ۤɡ��Ť��饤�֥��Ǥ�ʤ������ɤ����ˤޤȤ�Ƥ��륵���Ȥ��餤���뤫�Ȥ���ä�����ͽ�۰ʾ�˻��ͤˤʤ륵���Ȥ����ʤ��ä��Τǥ��Ȥ��Ƥ��Υڡ�����Ĥ��Ƥ������ʤˤ������Ω�äƤ���й����Ǥ���

JUNG1.X����ΰ㤤

���Υڡ�����������褦�Ȥ���ä��⤦��Ĥ���ͳ�Ȥ��ơ�JUNG2�ȸƤФ�Ƥ���С�����󤬡�JUNG 1.X �κ��ȤϤ����������ؤ�äƤ��ޤäƤ�����ʪ�Ȥ��äƤ⤤����ΤȤʤäƤ�������

����Ū�ˡ���ΤȤ��ƴְ㤤̵���褤��ΤˤϤʤäƤ��뤬���㤨�Х饤�֥���̾�����֤��Ѥ�äƤ���Ȥ�������դι������ǤȤ���Vertex�Ȥ�Node�Ȥ��������Ƥ�����Τ�̵���ʤä��Ȥ������̸ߴ����Ϥޤä����ʤ����ͤˤ��������ȤˤʤäƤ��륵��ץ�Υ���ѥ��뤬�̤�ʤ��äƶ�ϫ������

ñ�ˡ�Java��Generic�ˤ��äƼ������ʤ������Ȥ⤤���������ɡ�

���ޤΤȤ���ʬ���äƤ���㤤�Ȥ��Ƥϥ饤�֥�꤬ʣ����JAR�ե������ʬ�䤵�줿�Τȡ�̾�����֤���ľ���줿?���ȡ����Ȥ�PageRank��DirectedGraph�Τߤ��ä��Τ� UndirectedGraph���ǽ�ˤʤä����Ȥ��������������ɬ�פ˱������ɲäǤ���ФȻפ���

�����󥹥ȡ���

�����Υ����Ȥ���Х��ʥ꡼��������롥

���������ե������Ÿ�������ɬ�פ� JAR �ե����뤬���äƤ���Τǡ������� CLASSPATH ���̤��������餯 Java �Υ��ץ���� -cp �Ȥ������ꤷ�Ƥ⤤��������¿���ΤǴĶ��ѿ������ꤷ���ۤ��������餯�ڤ��Ȼפ���

���Ȥϴ�ñ�ʥ���ץ��������ƥѥ����̤ä����ɤ������ǧ����ǧ��������ʤ� import �����ǽ�ʬ���ʡ�

import edu.uci.ics.jung.graph.*; import edu.uci.ics.jung.algorithms.layout.*; import edu.uci.ics.jung.visualization.BasicVisualizationServer; public class JungSample { }

������դμ���

JUNG2���������Ƥ��륰��դμ���ϰʲ��Ǥ��롥

  • Hypergraph<V,E>
  • JUNG2�Ǵ���Ȥʤ륯�饹�Τ褦�����Ρ��ɤȥ��å����鹽�������Τϰ���Ū�ʥ���դ��Ѥ��ʤ��������ʥ롼�פ���Ƥ���....���ʤ��ä���

    �ɤ��⤤���Ĥ����¤�����äݤ����Ȥ��������ŤߤĤ�����դ�ɤ����Ĥ����Τ���������

  • Graph<V,E>
  • �Ρ��ɤȥ��å��ǹ��������Τ��Ѥ��ʤ�����Hypergraph�ȤΤ������ϡ����å���ξü���ۤʤ�Ρ���Ʊ�Τ�Ϣ�뤵��Ƥ��뤳�Ȥ�ɬ�ܡ�

  • DirectedGraph<V,E>
  • UndirectedGraph<V,E>
  • Tree<V,E>
  • ���Τޤ��ڹ�¤��directed �ȤΤ��ȤʤΤ��������ꡥ�ƥΡ��ɤȥ롼�ȥΡ��ɤȤη�ϩ��ͣ�졩����ʤ����ƤΥΡ��ɴ֤η�ϩ��ͣ��ˤʤ�ʤ���

  • Forest<V,E>
  • �ڹ�¤�Ȥΰ㤤�Ͻ۴�ϩ���ʤ����Ĥޤ�ʣ����ϩ�Ϥ��ꤨ�롥���ȡ�consists of a collection of rooted���Ȥ���Τ�ʣ���Υ롼�ȥΡ��ɤ�����Ǥ���Τ��ʡ�

  • KPartiteGraph<V,E>
  • ���İʾ�Υ���ݡ��ͥ�Ȥ���ʤ�ͥåȥ�������Υ����ѡ����饹�� Graph �� Hypergraph ����̵���äƤ��Ȥ�¾��Ϣ�륰��դǤϤʤ��Ȥ���äƤ��ȡ�

�Ρ��ɤȥ��å������

JUNG2�Ǥϡ�Vertex��Edge���������̵���ʤäƤ��ޤä���������ϵդ�Integer��String�ʤɤδ�¸�Υ��饹�򤽤Τޤޡ��Ρ��ɤ䥨�å�������Ȥ������ѤǤ���褦�ˤʤäƤ��롥���������Ťߤ��̾�����ʤ�䤫����°�������ߤ����ʤ�Τ��������ʤΤ�Ŭ���˺�äƤ������ۤ���̵����Ȥ��⤦��

�Ȥꤢ�������������ǡ����Ѥ��Ƥ��륯�饹��Ǻܤ��Ƥ������ʲ��˽ФƤ���Vertex��Edge�ϡ������ǤΥ��饹�Τ��Ȥ򼨤���

-- Vertex.java --

class Vertex {

    private int m_id;
    private Vec m_pos;
    private String m_name;

    private static int m_tid = 0;

    public Vertex() { m_id = m_tid++; m_pos = new Vec(0,0); }
    public Vertex(double x, double y) { 
	this(); 
	m_pos = new Vec(x,y);
    }

    public int id()  { return m_id; }
    public Vec pos() { return m_pos; }
    public double x()   { return pos().x; }
    public double y()   { return pos().y; }
    
    public double distanceTo(Vertex v) {
	return pos().distance(v.pos());
    }

    public String toString() { return "n"+id()+" ("+x()+","+y()+")"; };
    public boolean equals(Vertex v) { return v.id() == id(); }
}
	     
-- Edge.java --

class Edge {

    private double m_capacity;
    private String m_name;
    private int    m_id;
    private double m_weight;

    private static int m_tid = 0;

    public Edge(double weight, double capacity) {
	m_id  = m_tid++;
	m_weight   = weight;
	m_capacity = capacity;
    }
    
    public String toString() {	return "e"+m_id;  }

    public double weight() { return m_weight; }
    public int id() { return m_id; }
}
	     

���ͥåȥ���ι�¤Ū��ħ��׻�����

�ͥåȥ���ι�¤Ū��ħ��׻�����ˤ�"edu.uci.ics.jung.algorithms.scoring.*;"�� import ����С����פʥ��르�ꥺ��Ϥۤܡ��ޤޤ�Ƥ��롥

  • BarycenterScorer
  • BetweennessCentrality
  • ClosenessCentrality
  • DegreeScorer
  • DistanceCentralityScorer
  • EigenvectorCentrality
  • HITS
  • HITS.Scores
  • HITSWithPriors
  • KStepMarkov
  • PageRank
  • PageRankWithPriors
  • VoltageScorer

��ľ�������Ĥ��Τ�ʤ���ɸ�⤢�뤬���ºݿ��äƤߤ��ʬ����Ȼפ��Τǡ��٤��������Ͼʤ���

Degree Centrality�����

Closeness Centrality�����

Betweenness Centrality�����

PageRank�����

JUNG1.X �Ǥϡ�DirectedGraph �Τߤ��оݤ��ä����� Hypergraph�˳�ĥ������UndirectedGraph��׻���ǽ�Ȥʤä��褦�����׻�Ū�ˤ��Ф����Ѥ��ʤ��Ȼפ��Τ����ʤ���������

����ʥץ������Ȥ��Ƥϡ�PageRank�Υ��֥������Ȥ�������ơ�evaluate() ����з׻��Ͻ�λ�������餯�����դ���Τ�PageRank�Υ��֥������Ȥ��������Ȥ��ˤ����������������ܳ�Ψ��page�����ʸ�Ǥ� 0.15 �����ꤵ��Ƥ��롥


  Graph graph = new SparseMultigraph();
  PageRank rank = new PageRank(graph,0.15);
  rank.evaluate();
	       

��HITS��׻�����

HITS��PageRank�Ȼ��Ƥ��ơ�WebPage�ν����٤��̤뤿��λ�ɸ�����������㤤�Ǥʤ����2������ո����η׻���ˡ���ä��褦�˻פ���

����Ū����ʬ��PageRank���Ѥ��ʤ������ߤ����������������줾��˽��Ϥ�����ͤ��㤦������ɸ�������������פʤΤ�����Ū�ʽ���Ȥ��κ��ˤ���Τ����顤�ޤ�����ʤ���

���ŤߤĤ�����դΰ���

�ɤ��� JUNG2 �˥��åפ����Ȥ��ˡ�Vertex, Edge ���饹��̵���ʤä�����ʤΤ����ŤߤĤ�����դΰ������褯�狼��ʤ����ȤˤʤäƤ��롥���������Ȥˤʤ�Toutrial��p.5��3.2�����ȡ�����դȤϤ٤Ĥ�Transformer�Ȥ������饹��edge�� weight�ȤΥ�󥯤�������ʤ��Ȥ���äݤ���������

�Ȥ����櫓�ǡ��ޤ��ϥ��å����饹������򤪤��ʤ���

Transformer������

Transformer���饹�����Ѥ���ˤ�commons collections �� import����ɬ�פ����롥


  import org.apache.commons.collections15.Transformer;
	       

³���ơ�turtorial�ˤ���褦�� Transformer ���饹�Υ��󥹥��󥹤��������Τ�����turtrial �ɤ���Ǥϥ���ѥ��뤬�̤�ʤ��ä��Τǡ��ʲ��Τ褦���ѹ�����ɬ�פ����롥


  Transformer wtTransformer =
     new Transformer() {
     public Number transform(MyLink link) {
       return link.weight;
    }
  };
��DijkstraShortestPath alg =
    new DijkstraShortestPath(g, wtTransformer);
	       

�ѹ����ϡ�Double�ȤʤäƤ���Ȥ�����Number���ѹ����ơ�new DijkstraShortestPath �� <MyNode,MyLink>���ɲä��롥

�ʤ�������齤�����˴ؤ��Ƥϡ����Ĥ����ν�����������줿��ΤǤ��롥

������դ������Ϣ

���Ρ��ɤΰ��֤���ꤹ��

StaticLayout����Ѥ���

setLocation(vertex object, x, y)�ǻ��ꤹ�뤬��x �������� y���ļ��ȤʤäƤ����ͻҡ�


��graph2 = new UndirectedSparseMultigraph();
��for(int i = 0; i < 20; i++) {  // (600,400)�����襨�ꥢ�˥����������
����// �׻���int����, Vertex �Ǥ� double �dz�Ǽ
    int x = (int)(Math.random() * 560.0) + 15;
    int y = (int)(Math.random() * 360.0) + 10; 
    Vertex v = new Vertex(x,y);
    vertices.add(v.id(), v);
    graph2.addVertex(vertices.get(v.id()));
��}
��StaticLayout layout2 = new StaticLayout(graph2);
  // �쥤�����Ⱦ��setLocation�ǥΡ��ɤκ�ɸ������
��for(Vertex i : graph2.getVertices()) {
    layout2.setLocation(i, i.x(), i.y());
��}
	       

���Ρ��ɤΥ��������ѹ�����

JUNG��Ȥä����̤����褷�Ƥߤ�ȡ����Τ褦�ˤʤ롥

����Ǥϡ��Ρ��ɤ����襵�����������礭������Τǡ������������ꡤ�Ρ��ɤ��Ȥ��礭�����Ѥ������Ȥ������Ȥ�����Ȼפ���

���ΤȤ��ˡ��ɤ�������褤���ȥ饤�֥���õ���Ƥߤ������ɤ�������ǤϤ����ʤ�������

��������Ĵ�٤Ƥߤ���̡�visualization �� RenderContext() �򤤤���Ф褵�����ʤΤ򥵥�ץ��ߤ�ʬ���ä��������ˤ���᥽�åɤ�

  • void setVertexDrawPaintTransformer(Transformer<V,Paint> vertexDrawPaintTransformer)
  • void setVertexFillPaintTransformer(Transformer<V,Paint> vertexFillPaintTransformer)
  • void setVertexFontTransformer(Transformer vertexFontTransformer)
  • void setVertexIconTransformer(Transformer vertexIconTransformer)
  • void setVertexIncludePredicate(Predicate,V>> vertexIncludePredicate)
  • void setVertexLabelRenderer(VertexLabelRenderer vertexLabelRenderer)
  • void setVertexLabelTransformer(Transformer vertexStringer)
  • void setVertexShapeTransformer(Transformer vertexShapeTransformer)
  • void setVertexStrokeTransformer(Transformer vertexStrokeTransformer)

���Τʤ��Ǥ⡤setVertexShapeTransformer ��Ȥ��Ȥɤ�������η����Τ��ѹ��Ǥ���äݤ����Ȥ������Ȥǡ�


  public class MyVertexShapeTransformer implements Transformer {
    public Shape transform(V v) {
      return new Rectangle(-5,-5,10,10);
    }
  } 
	       

�Ȥ��������ǡ�Rectangle���֤� Transformer �������


  BasicVisualizationServer vv 
    = new BasicVisualizationServer(layout);
  vv.getRenderContext().setVertexShapeTransformer(new MyVertexShapeTransformer());
	       

�ĤŤ��ơ�VisualizationServer �������ꤲ�Ƥߤ��

�Ǥ⡤����Ǥϡ��Ρ��ɤ��ͳѤȤ������褵��뤱�ɡ��ߤλ��ˤϤɤ�������Τ�����ǰ�ʤ���Shape�ˤ�Circle�Ȥ����Τ��ߤ�����ʤ����Ǥ⡤�褯������ Arc2D �Ȥ����Τ�����ΤǤ����ȤäƤߤ롥


  public class MyVertexShapeTransformer implements Transformer {
    public Shape transform(V v) {
������return new Arc2D.Double(-5, -5, 10, 10, 0, 360, Arc2D.OPEN);
    }
  } 
	       
sample graph draw

����ǡ��Ρ��ɤξ��ʤɤǷ����礭�����ѹ��Ǥ��롥��οޤǤϡ������ܤ��狼��ʤ����ɡ�������������Shape��(0,0)�����Ρ��ɤθ���(edge���򺵤�����)�ʤΤǡ�����������դ�ɬ�ס�

Arc2D.Double(����X,����Y,��,��,�߸̤λ���,�߸̤ν���, Ⱦ�¤����褹�뤫��)�ȤʤäƤ��롥���αߤ�����ϲ��̥ԥ����륵�����˸���ʤΤǡ�Window�������˱������Ѥ���ʤ餽��ʤ����ɬ�ס�

����٥��ĥ���դ�

���ä�������դ����褹��ʤ��٥��ĥ���դ�������ͤȤ������Ȥǡ���٥��ĥ���դ�����ˡ�ϴ���Ū�ˤϤ���ޤǤ�Ʊ���� Transformer ����Ѥ��Ƽ������롥

���ȻפäƤ��������äȰ�ä���

���䡤����Ū�ˤ���Ǥ����Τ������饤�֥��ˤ� ToStringLabeller �Ȥ������饹���Ѱդ���Ƥ��Ƥ���Ǥ�褤�ߤ�����


  import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
	       

�ޤ�������� import ���롥�����ơ�


  StaticLayout layout = new StaticLayout(graph);
  BasicVisualizationServer vv 
     = new BasicVisualizationServer(layout);
  vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller());
	       

�Ȥ������ǡ��������ȥ�٥뤬ĥ���դ����롥�Ǥ⡤���ΤȤ�ĥ�����٥�Ϥʤ�?�Ȥʤ�Ȥ��⤦��������ϡ��оݤȤ��륯�饹�� toString() ��������줿���ϤȤʤ롥�����ޤǤ�ʤ������Υ��饹(�����Ǥ�Vertex)�ˤ� String toString() ���������ɬ�פ����롥

�Ȥ����ǡ����Ϥΰ��֤äƤʤ�Ȥ��ʤ���Τ���

�����������ѹ�

Jung-TECHSCORE-�Ǥϡ�renderer �����Ѥ����ѹ���ˡ������ץ�Ȥ��ƤΤ����Ƥ��뤬��RendererContext �����Ѥ����ѹ���ˡ��ܤ��Ƥ�����


  import edu.uci.ics.jung.visualization.decorators.EdgeShape;
	       

���������פ��Ȼפ�������Υѥå������� import ���롥³���ơ�setEdgeShapeTransformer ����Ѥ��ƥ��å������西���פ���ꤹ�롥


  VisualizationImageServer vv = new VisualizationImageServer(layout, panelsize());
  vv.getRenderContext().setEdgeShapeTransformer(new EdgeShape.Line());
	       

����¾�ˤ�

  • EdgeShape.BentLine: ��������ޤ줿��
  • EdgeShape.Box: ����
  • EdgeShape.CubicCurve: S��������
  • EdgeShape.Line: �Ρ��ɴ֤�ľ��������
  • EdgeShape.Loop: �褯�狼��ʤ�
  • EdgeShape.Orthogonal: ľ�ѡ�
  • EdgeShape.QuadCurve: �߸�
  • EdgeShape.SimpleLoop: ����
  • EdgeShape.Wedge: ����ѥ��뤬�̤�ʤ�

���줾������Ѥ������褷���Ȥ��ˤϡ������Τ褦�ʥ���դ����褵��롥��������Wedge�ϥ���ѥ��뤬�̤�ʤ��ä�����������

graph draw sample
BentLine Draw
graph draw sample
Box, Loop, SimpleLoop draw
graph draw sample
CubicCurve Draw
graph draw sample
Line Draw
graph draw sample
Orthogonal Draw
graph draw sample
QuadCurve Draw

����󥯤ο��λ���

�����ѹ�����ݤ���ˡ�⤤����������褦����������Ū�ˤϡ�setEdgeDrawPaintTransformer(Transformer) ��ȤäƼ�������ߤ������Ȥ������Ȥǡ�sample �Υ����������ɤȤ���ߤ�ȡ�LazyMap�Ȥ���ȤäƤ��뤬��¾��Ʊ���褦�ʽ���������̵��ư��롥


  BasicVisualizationServer vv 
    = new BasicVisualizationServer(layout);
  Transformer epTransformer = new Transformer(){
    public Paint transform(Edge edge) {
	return Color.LIGHT_GRAY; // ��󥯤ο������ƥ饤�ȥ��쥤�˻���
    }
  };
  vv.getRenderContext().setEdgeDrawPaintTransformer(epTransformer);
	       

����ǡ��ǥե���ȤǤϹ����ä���󥯤ο��򡤥饤�ȥ��쥤���ѹ��Ǥ��롥

GradientEdgePaintTransformer��ȤäƤߤ롥

JUNG�Υ饤�֥��������Ƥߤ�ȡ�GradientEdgePaintTransformer �Ȥ������饹�����롥̾�����餷�ƴط����ꤽ���ʤΤǤȤꤢ�����ȤäƤߤ롥

javadoc �ˤϡ����󥹥ȥ饯���ǡ�Color��դ��ġ�VisualViewer��°���ͤȤ��ƻ��ꤹ������Ǥ����ߤ������Ȥ������Ȥǡ������Τ褦�˵��Ҥ��Ƥߤ롥


  vv.getRenderContext().setEdgeDrawPaintTransformer(new GradientEdgePaintTransformer(Color.black, 
		  Color.LIGHT_GRAY,new VisualizationViewer(layout)));		     
		 

�ʤ���VisualizationViewer��ɬ�פʤΤ��狼��ʤ��������Ѥ��Ƥ�������ѡ��Ĥ�Server���ä��Τǻ��ѤǤ��ʤ��ä����Ȥ⤢�ꡤ����� new ���Ƥߤ������褵�줿��̤ϡ�2�Ĥ�ο����濴�Ȥ��ơ�ξü����Ĥ�ο��Ȥʤ롥

¿�����ˤ���������ι������褵�줿��Τ���Ӥ��Ƥߤ�Фʤ�Ȥʤ�ʬ����ΤǤϤʤ�����������

graph draw sample
simple black Draw
sample graph draw
gradient edge paint draw

��­������������ˤ�ȾƩ����(�㤨�� new Color(0,0,0,0) �ʤ�)������ǽ���ͻҡ�

������դΥ��᡼���μ��Ф�

VisualizationViewer�Ǥϡ��ѥͥ����Τ�ĥ��Ĥ��Ƥ��ޤ������Τ��ᡤ����ռ��Τ��طʤȤ��Ƥ��뤳�ȤϤǤ��ʤ�������ʤȤ��ˤϡ�VisualizationImageServer��Ȥ��ȥ��᡼����������Ф���

����Ū����ʬ�ϡ�VisualizationViewer���Ѥ��ʤ���


  Graph g; // ¾�Ǻ�����������դ��Ѱ�
  StaticLayout layout = new StaticLayout(g);
��layout.setSize(panelsize());
��for(Vertex v: g.getVertices()) { // static layout �ʤΤǺ�ɸ��ؼ�
��    layout.setLocation(v, drawX(v.x()), drawY(v.y()));
��}
��VisualizationImageServer vv = 
      new VisualizationImageServer(layout, panelsize());
��// ��٥�ȥΡ��ɷ����λ���
  vv.getRenderContext().setVertexLabelTransformer(new MyVertexLabelTransformer());
��vv.getRenderContext().setVertexShapeTransformer(new MyVertexShapeTransformer());
  vv.setBackground(Color.gray); // �طʿ��λ��ꡥȾƩ�������ǽ
  // buf ���ط��ѥ����꡼��Хåե���
��// (0,0)����panelseize���ΰ�ޤǤΥ��᡼�����ڤ�Ф���ĥ���դ�
  buf.image(vv.getImage(new Point(0,0), panelsize()),0,0,this);
	       

�����ͥ�����