Initial revision
git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/sandbox/graph/trunk@144575 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
1 parent
4c37c8cf1d
commit
bb5d76e618
32 files changed
+3740
No files matched your search
@@ -0,0 +1,2 @@
|
||||
*~
|
||||
target
|
||||
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution, if
|
||||
* any, must include the following acknowlegement:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowlegement may appear in the software itself,
|
||||
* if and wherever such third-party acknowlegements normally appear.
|
||||
*
|
||||
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
|
||||
* Foundation" must not be used to endorse or promote products derived
|
||||
* from this software without prior written permission. For written
|
||||
* permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache"
|
||||
* nor may "Apache" appear in their names without prior written
|
||||
* permission of the Apache Group.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
--------------------------------------------------------------------------
|
||||
J A K A R T A C O M M O N S G R A P H P A C K A G E
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
Abstract:
|
||||
|
||||
Todo
|
||||
|
||||
Initial commiters:
|
||||
|
||||
Markus Dahm
|
||||
Jason van Zyl
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
--------------------------------------------------------------------------
|
||||
J A K A R T A C O M M O N S U T I L I T I E S
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
o Building
|
||||
|
||||
To build, you must have ant installed. Just type 'ant' -- the default
|
||||
target will build the jar.
|
||||
|
||||
There are also a few other targets like 'javadoc'. Look in build.xml
|
||||
|
||||
|
||||
o Use in your application
|
||||
|
||||
To use the Commons Utility package, build a commons-util.jar file,
|
||||
import the desired classes from org.apache.commons.util and and
|
||||
compile your code with cup.jar in the CLASSPATH.
|
||||
@@ -0,0 +1,21 @@
|
||||
# Component delcarations
|
||||
component.name = commons-graph
|
||||
component.title = Jakarta Graph Utilties
|
||||
component.version = 0.1-dev
|
||||
component.jar = ${component.name}.jar
|
||||
|
||||
# Paths
|
||||
build.home = target
|
||||
dist.home = dist
|
||||
source.home = src
|
||||
test.home = ${source.home}/test
|
||||
build.dir = .
|
||||
|
||||
# Compiler defaults
|
||||
compile.debug = false
|
||||
compile.deprecation = true
|
||||
compile.optimize = true
|
||||
|
||||
# Test defaults
|
||||
test.failonerror = true
|
||||
test.runner = junit.textui.TestRunner
|
||||
@@ -0,0 +1,174 @@
|
||||
<project name="Jakarta Graph Utilities" default="jar" basedir=".">
|
||||
|
||||
<!--
|
||||
$Id: build.xml,v 1.1 2001/11/12 16:05:17 jvanzyl Exp $
|
||||
-->
|
||||
|
||||
<!-- ========== Initialize Properties =================================== -->
|
||||
|
||||
|
||||
<property file="./build.properties"/> <!-- Component local -->
|
||||
<property file="../build.properties"/> <!-- Commons local -->
|
||||
<property file="${user.home}/build.properties"/> <!-- User local -->
|
||||
|
||||
|
||||
<!-- ========== Classpaths ============================================== -->
|
||||
|
||||
<path id="compile.classpath">
|
||||
<pathelement location="${build.home}/class"/>
|
||||
</path>
|
||||
|
||||
<path id="test.classpath">
|
||||
<pathelement location="${build.home}/class"/>
|
||||
<pathelement location="${build.home}/test"/>
|
||||
<pathelement location="${junit.jar}"/>
|
||||
</path>
|
||||
|
||||
|
||||
<!-- ========== Executable Targets ====================================== -->
|
||||
|
||||
<target name="init"
|
||||
description="Initialize and evaluate conditionals">
|
||||
<echo message="-------- ${component.name} ${component.version} --------"/>
|
||||
<filter token="name" value="${component.name}"/>
|
||||
<filter token="version" value="${component.version}"/>
|
||||
|
||||
<available
|
||||
classname="junit.framework.TestCase"
|
||||
property="junit.present"
|
||||
classpathref="test.classpath"/>
|
||||
</target>
|
||||
|
||||
|
||||
<target name="prepare" depends="init"
|
||||
description="Prepare build directory">
|
||||
<mkdir dir="${build.home}"/>
|
||||
<mkdir dir="${build.home}/class"/>
|
||||
<mkdir dir="${build.home}/conf"/>
|
||||
<mkdir dir="${build.home}/test"/>
|
||||
</target>
|
||||
|
||||
|
||||
<target name="static" depends="prepare"
|
||||
description="Copy static files to build directory">
|
||||
<tstamp/>
|
||||
</target>
|
||||
|
||||
<target name="compile" depends="static"
|
||||
description="Compile shareable components">
|
||||
|
||||
<javac srcdir="${source.home}/java"
|
||||
destdir="${build.home}/class"
|
||||
debug="${compile.debug}"
|
||||
deprecation="${compile.deprecation}"
|
||||
optimize="${compile.optimize}">
|
||||
<classpath refid="compile.classpath"/>
|
||||
</javac>
|
||||
|
||||
</target>
|
||||
|
||||
|
||||
<target name="clean"
|
||||
description="Clean build and distribution directories">
|
||||
<delete dir="${build.home}"/>
|
||||
<delete dir="${dist.home}"/>
|
||||
<delete file="${component.jar}"/>
|
||||
</target>
|
||||
|
||||
|
||||
<target name="all" depends="clean,compile"
|
||||
description="Clean and compile all components"/>
|
||||
|
||||
|
||||
<target name="javadoc" depends="compile"
|
||||
description="Create component Javadoc documentation">
|
||||
<mkdir dir="${dist.home}"/>
|
||||
<mkdir dir="${dist.home}/docs"/>
|
||||
<mkdir dir="${dist.home}/docs/api"/>
|
||||
<javadoc sourcepath="${source.home}/java"
|
||||
destdir="${dist.home}/docs/api"
|
||||
packagenames="org.apache.commons.*"
|
||||
author="true"
|
||||
private="true"
|
||||
version="true"
|
||||
doctitle="<h1>${component.title}</h1>"
|
||||
windowtitle="${component.title} (Version ${component.version})"
|
||||
bottom="Copyright (c) 2001 - Apache Software Foundation"/>
|
||||
</target>
|
||||
|
||||
|
||||
<target name="jar" depends="compile" description="Build jar">
|
||||
<jar jarfile="${component.jar}"
|
||||
basedir="${build.home}/class"
|
||||
manifest="${source.home}/conf/MANIFEST.MF" />
|
||||
</target>
|
||||
|
||||
|
||||
<target name="dist" depends="compile,javadoc"
|
||||
description="Create binary distribution">
|
||||
<mkdir dir="${dist.home}"/>
|
||||
<copy file="LICENSE" todir="${dist.home}"/>
|
||||
|
||||
<!-- make a complete jar w/ the MinML2 SAX stuff -->
|
||||
<unzip src="${minml2.jar}" dest="${build.home}/class"/>
|
||||
<delete dir="${build.home}/class/META-INF" quiet="true"/>
|
||||
|
||||
<jar jarfile="${dist.home}/${component.jar}"
|
||||
basedir="${build.home}/class"
|
||||
manifest="${source.home}/conf/MANIFEST.MF"/>
|
||||
</target>
|
||||
|
||||
|
||||
<target name="install-jar" depends="jar"
|
||||
description="==> Installs .jar file in ${lib.repo}">
|
||||
<copy todir="${lib.repo}" filtering="no">
|
||||
<fileset dir="${build.dir}">
|
||||
<include name="${component.jar}"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
|
||||
<target name="compile-tests" depends="prepare,compile" if="junit.present"
|
||||
description="==> compiles the test source code">
|
||||
<mkdir dir="${build.home}/test"/>
|
||||
|
||||
<javac srcdir="${test.home}"
|
||||
destdir="${build.home}/test"
|
||||
excludes="**/package.html"
|
||||
debug="${debug}"
|
||||
deprecation="${deprecation}"
|
||||
optimize="${optimize}">
|
||||
<classpath refid="test.classpath"/>
|
||||
<classpath>
|
||||
<pathelement path="${build.dest}"/>
|
||||
</classpath>
|
||||
</javac>
|
||||
</target>
|
||||
|
||||
|
||||
<!-- ========== Unit Test Targets ======================================= -->
|
||||
|
||||
<target name="run-tests" depends="prepare,compile-tests" if="junit.present"
|
||||
description="==> Runs the unit tests">
|
||||
|
||||
<taskdef name="junit"
|
||||
classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask">
|
||||
<classpath refid="test.classpath"/>
|
||||
</taskdef>
|
||||
|
||||
<junit printsummary="no" haltonfailure="yes">
|
||||
<classpath>
|
||||
<path refid="test.classpath"/>
|
||||
</classpath>
|
||||
<formatter type="plain" usefile="false"/>
|
||||
|
||||
<batchtest>
|
||||
<fileset dir="${test.home}">
|
||||
<include name="**/*Test.java"/>
|
||||
</fileset>
|
||||
</batchtest>
|
||||
</junit>
|
||||
</target>
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,6 @@
|
||||
Extension-Name: @name@
|
||||
Specification-Vendor: Apache Software Foundation
|
||||
Specification-Version: 1.0
|
||||
Implementation-Vendor: Apache Software Foundation
|
||||
Implementation-Title: commons-graph
|
||||
Implementation-Version: 0.1-dev
|
||||
@@ -0,0 +1,149 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import java.util.Vector;
|
||||
|
||||
/**
|
||||
* Visit graph with breadth first search and compute the predecessor
|
||||
* during traversal for all vertices. The algorithm could be modified
|
||||
* so that it performs Dijkstra's shortest-path algorithm, for
|
||||
* instance, if you extend the VQueue class to a Priority Queue.
|
||||
*
|
||||
* @version $Id: BFS.java,v 1.1 2001/11/12 16:05:17 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
*/
|
||||
public class BFS extends TraversalOrder {
|
||||
private VQueue q;
|
||||
|
||||
/**
|
||||
* Breadth first search algorithm.
|
||||
*
|
||||
* @param v visitor object to apply when discovering and finishing a vertex
|
||||
*/
|
||||
public BFS(Visitor v) {
|
||||
this(v, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Breadth first search algorithm.
|
||||
*
|
||||
* @param v visitor object to apply when discovering and finishing a vertex
|
||||
* @param q queue to use during traversal
|
||||
*/
|
||||
public BFS(Visitor v, VQueue q) {
|
||||
super(v);
|
||||
this.q = q;
|
||||
}
|
||||
|
||||
/**
|
||||
* Run breadth first search (BFS) algorithm.
|
||||
*
|
||||
* @param g graph to traverse
|
||||
* @param start vertex to start at (or null, starts at some vertex then)
|
||||
*/
|
||||
public void start(Graph g, Vertex start) {
|
||||
int size = g.getNoVertices();
|
||||
Vertex[] vertices = g.getVertexArray();
|
||||
|
||||
visitor.discoverGraph(g);
|
||||
|
||||
/* Initially mark all vertices as WHITE
|
||||
*/
|
||||
for(int i=0; i < size; i++) {
|
||||
vertices[i].setColor(WHITE);
|
||||
vertices[i].setPredecessor(null);
|
||||
}
|
||||
|
||||
if(start == null || !g.contains(start)) // Start BFS at (white) start vertex
|
||||
start = vertices[0];
|
||||
|
||||
if(q == null) // No queue supplied
|
||||
q = new VQueue(size);
|
||||
|
||||
visitor.discoverVertex(start); // Initialization
|
||||
|
||||
start.setColor(GRAY);
|
||||
q.enqueue(start);
|
||||
|
||||
while(!q.empty() && !stopped) {
|
||||
Vertex u = q.head();
|
||||
|
||||
vertices = g.getVertexArray(u); // Get adjacent vertices and edges
|
||||
Edge[] edges = g.getEdgeArray(u);
|
||||
size = vertices.length; // reuse var
|
||||
|
||||
for(int i=0; (i < size) && !stopped; i++) { // Explore all edges, same length
|
||||
visitor.discoverEdge(edges[i]);
|
||||
|
||||
Vertex v = vertices[i];
|
||||
if(v.getColor() == WHITE) { // Unvisited vertex?
|
||||
visitor.discoverVertex(v);
|
||||
|
||||
v.setColor(GRAY);
|
||||
q.enqueue(v);
|
||||
}
|
||||
|
||||
visitor.finishEdge(edges[i]);
|
||||
}
|
||||
|
||||
visitor.finishVertex(u);
|
||||
q.dequeue();
|
||||
u.setColor(BLACK);
|
||||
}
|
||||
|
||||
visitor.finishGraph(g);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Visit graph with BFS and compute predecessors during traversal as
|
||||
* well as the "distance" to the source node (number of edges in between).
|
||||
*
|
||||
* @version $Id: BFSVisitor.java,v 1.1 2001/11/12 16:05:17 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
* @see BFS
|
||||
*/
|
||||
public class BFSVisitor extends DefaultVisitor implements Constants {
|
||||
private VStack stack; // Stack to remember predecessors
|
||||
|
||||
public BFSVisitor() {}
|
||||
|
||||
public void discoverGraph(Graph g) {
|
||||
int size = g.getNoVertices();
|
||||
Vertex[] vertices = g.getVertexArray();
|
||||
|
||||
for(int i=0; i < size; i++) {
|
||||
vertices[i].setDistance(INFINITE);
|
||||
vertices[i].setPredecessor(null);
|
||||
}
|
||||
|
||||
stack = new VStack(size);
|
||||
}
|
||||
|
||||
public void discoverVertex(Vertex v) {
|
||||
if(stack.empty()) { // At start vertex, v == start
|
||||
v.setPredecessor(null);
|
||||
v.setDistance(0);
|
||||
}
|
||||
else {
|
||||
Vertex pred = stack.top();
|
||||
v.setPredecessor(pred);
|
||||
v.setDistance(pred.getDistance() + 1);
|
||||
}
|
||||
|
||||
stack.push(v);
|
||||
}
|
||||
|
||||
public void finishVertex(Vertex v) {
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visit(Graph g, Vertex start) {
|
||||
new BFS(this).start(g, start);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Constants useful for graph algorithms.
|
||||
*
|
||||
* @version $Id: Constants.java,v 1.1 2001/11/12 16:05:17 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
*/
|
||||
|
||||
public interface Constants {
|
||||
public static final int WHITE = 0;
|
||||
public static final int GRAY = 1;
|
||||
public static final int BLACK = 2;
|
||||
|
||||
public static final int INFINITE = Integer.MAX_VALUE;
|
||||
|
||||
/**
|
||||
* Modes for toString(int verbose), three seem sufficient, but you can use your own
|
||||
*/
|
||||
public static final int PLAIN = 0; // Simple output
|
||||
public static final int VERBOSE = 1; // Verbose output
|
||||
public static final int TALKATIVE = 2; // Even more verbose output
|
||||
public static final int V_PLAIN = 3; // Simple output for graph layout
|
||||
public static final int V_VERBOSE = 4; // Verbose output for graph layout
|
||||
public static final int V_TALKATIVE = 5; // Even more verbose output for graph layout
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Visit graph with depth first search and mark discovery and finishing time in all
|
||||
* vertices.
|
||||
*
|
||||
* @version $Id: DFS.java,v 1.1 2001/11/12 16:05:18 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
*/
|
||||
public class DFS extends TraversalOrder {
|
||||
/**
|
||||
* Depth first search algorithm.
|
||||
*
|
||||
* @param v visitor object to apply when discovering and finishing a vertex or edge
|
||||
*/
|
||||
public DFS(Visitor v) {
|
||||
super(v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Depth first search algorithm.
|
||||
*
|
||||
* @param v visitor object to apply when discovering and finishing a vertex or edge
|
||||
* @param traverse_all traverse the complete graph or stop after finishing all nodes reachable
|
||||
* from the start
|
||||
*/
|
||||
public DFS(Visitor v, boolean traverse_all) {
|
||||
super(v, traverse_all);
|
||||
}
|
||||
|
||||
/**
|
||||
* Run depth first search (DFS) algorithm.
|
||||
*
|
||||
* @param g graph to traverse
|
||||
* @param start vertex to start at (or null, starts at some vertex then)
|
||||
*/
|
||||
public void start(Graph g, Vertex start) {
|
||||
int size = g.getNoVertices();
|
||||
Vertex[] vertices = g.getVertexArray();
|
||||
|
||||
graph = g;
|
||||
|
||||
visitor.discoverGraph(g);
|
||||
|
||||
/* Initially mark all vertices as WHITE
|
||||
*/
|
||||
for(int i=0; i < size; i++)
|
||||
vertices[i].setColor(WHITE);
|
||||
|
||||
if(start != null && g.contains(start)) // Start DFS at (white) start vertex
|
||||
DFS_Visit(start);
|
||||
|
||||
if(traverse_complete_graph) {
|
||||
for(int i=0; (i < size) && !stopped; i++) {
|
||||
Vertex v = vertices[i];
|
||||
|
||||
if(v.getColor() == WHITE) // Unvisited vertex?
|
||||
DFS_Visit(v);
|
||||
}
|
||||
}
|
||||
|
||||
visitor.finishGraph(g);
|
||||
}
|
||||
|
||||
private final void DFS_Visit(Vertex u) {
|
||||
u.setColor(GRAY); // Mark as visited
|
||||
visitor.discoverVertex(u);
|
||||
|
||||
Vertex[] vertices = graph.getVertexArray(u); // Get adjacent vertices
|
||||
Edge[] edges = graph.getEdgeArray(u); // and edges
|
||||
int size = vertices.length;
|
||||
//System.out.println(java.util.Arrays.asList(edges));
|
||||
|
||||
for(int i=0; (i < size) && !stopped; i++) { // Explore all edges
|
||||
visitor.discoverEdge(edges[i]);
|
||||
|
||||
Vertex v = vertices[i];
|
||||
|
||||
if(v.getColor() == WHITE)
|
||||
DFS_Visit(v);
|
||||
|
||||
visitor.finishEdge(edges[i]);
|
||||
}
|
||||
|
||||
u.setColor(BLACK); // Mark as finished
|
||||
visitor.finishVertex(u);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Visit graph with DFS and compute predecessors during traversal as
|
||||
* well as discovery and finishing time of all vertices. Instances of
|
||||
* this class (and of course its descendants) may be passed to a DFS
|
||||
* object.
|
||||
*
|
||||
* @version $Id: DFSVisitor.java,v 1.1 2001/11/12 16:05:18 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
* @see DFS
|
||||
*/
|
||||
public class DFSVisitor extends DefaultVisitor {
|
||||
private int time; // Global time
|
||||
private VStack stack; // Stack to remember predecessors
|
||||
|
||||
public DFSVisitor() {}
|
||||
|
||||
public void discoverGraph(Graph g) {
|
||||
int size = g.getNoVertices();
|
||||
Vertex[] vertices = g.getVertexArray();
|
||||
|
||||
for(int i=0; i < size; i++)
|
||||
vertices[i].setPredecessor(null);
|
||||
|
||||
time = 0; // Reset timer
|
||||
stack = new VStack(size);
|
||||
}
|
||||
|
||||
public void discoverVertex(Vertex v) {
|
||||
if(stack.empty()) // First node
|
||||
v.setPredecessor(null);
|
||||
else
|
||||
v.setPredecessor(stack.top());
|
||||
|
||||
stack.push(v);
|
||||
v.setDiscoveryTime(time++);
|
||||
}
|
||||
|
||||
public void finishVertex(Vertex v) {
|
||||
v.setFinishingTime(time++);
|
||||
stack.pop();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,165 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import java.io.OutputStream;
|
||||
|
||||
/**
|
||||
* Visualizes directed graphs into the
|
||||
* <A HREF="http://www.informatik.uni-bremen.de/~inform/forschung/daVinci/daVinci.html">
|
||||
* DaVinci</A> format. It can only be used for directed graphs and does not support
|
||||
* labeled edges very well, unfortunately. They have to be simulated via dummy vertices.
|
||||
*
|
||||
* Traverses graph with the Sequential visitor, since it uses invariants of that algorithm.
|
||||
*
|
||||
* @version $Id: DaVinciVisualizer.java,v 1.1 2001/11/12 16:05:18 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
*/
|
||||
public class DaVinciVisualizer extends GraphVisualizer implements Constants {
|
||||
private Graph graph;
|
||||
private int no_edges, edges;
|
||||
private int no_vertices, vertices;
|
||||
|
||||
/**
|
||||
* @param out stream to print output to
|
||||
* @param verbose toggle verbosity of output
|
||||
*/
|
||||
public DaVinciVisualizer(OutputStream out, int verbose) {
|
||||
super(out, verbose);
|
||||
}
|
||||
|
||||
public void discoverGraph(Graph g) {
|
||||
graph = g;
|
||||
|
||||
no_vertices = g.getNoVertices();
|
||||
vertices = 0;
|
||||
out.println("[");
|
||||
}
|
||||
|
||||
public void finishGraph(Graph g) {
|
||||
out.println("]");
|
||||
out.close();
|
||||
}
|
||||
|
||||
public void discoverVertex(Vertex v) {
|
||||
String label = convertString(v.toString(verbose));
|
||||
//System.out.println("vertex:" + v.getIdent() + ":" + v);
|
||||
|
||||
println(1, "l(\"" + v.getIdent() + "\",");
|
||||
println(1, "n(\"anything\", [");
|
||||
println(2, "a(\"OBJECT\", \"" + label + "\"),");
|
||||
println(2, "a(\"FONTSTYLE\", \"bold\"),");
|
||||
println(2, "a(\"FONTFAMILY\", \"courier\")],");
|
||||
println(1, "["); // array of successor nodes
|
||||
|
||||
no_edges = graph.getNoEdges(v);
|
||||
edges = 0;
|
||||
}
|
||||
|
||||
public void finishVertex(Vertex v) {
|
||||
String str = (vertices < no_vertices - 1)? "]))," : "]))";
|
||||
println(1, str);
|
||||
vertices++;
|
||||
}
|
||||
|
||||
private static int label_counter=0;
|
||||
|
||||
private final String getEdgeAttribute() {
|
||||
if(graph.isDirected())
|
||||
return "";
|
||||
else
|
||||
return "a(\"_DIR\", \"none\"";
|
||||
}
|
||||
|
||||
public void discoverEdge(Edge e) {
|
||||
int u = graph.getSource(e).getIdent();
|
||||
int v = graph.getTarget(e).getIdent();
|
||||
String label = convertString(e.toString(verbose));
|
||||
|
||||
if(label.equals("")) {
|
||||
print(2, "l(\"" + u + "->" + v + "\", e(\"\", [" + getEdgeAttribute() +
|
||||
"], r(\"" + v + "\")))");
|
||||
} else { // Simulate labeled edge with intermediate node
|
||||
String dummy = "label" + label_counter++; // Dummy name for intermediate node
|
||||
|
||||
print(2, "l(\"" + u + "->" + dummy + "\", e(\"\", [a(\"_DIR\", \"none\")], " +
|
||||
"l(\"" + dummy + "\", n(\"anything\",[a(\"OBJECT\", \"" + label +
|
||||
"\"), a(\"_GO\", \"text\")], [l(\"" + dummy + "->" + v +
|
||||
"\", e(\"\",[" + getEdgeAttribute() + "], r(\"" + v + "\")))]))))");
|
||||
//System.out.println(graph.getTarget(e).getIdent() + ":" + graph.getTarget(e));
|
||||
}
|
||||
}
|
||||
|
||||
public void finishEdge(Edge e) {
|
||||
if(edges < no_edges - 1)
|
||||
out.println(", ");
|
||||
else
|
||||
out.print('\n');
|
||||
|
||||
edges++;
|
||||
}
|
||||
|
||||
/**
|
||||
* Visualize graph g with this Visualizer.
|
||||
*
|
||||
* @param g graph to visualize
|
||||
* @param start node to start at
|
||||
*/
|
||||
public void visualize(Graph g, Vertex start) {
|
||||
new Sequential(this).start(g);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Empty Visitor, i.e. all visit methods do nothing.
|
||||
*
|
||||
* @version $Id: DefaultVisitor.java,v 1.1 2001/11/12 16:05:18 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
*/
|
||||
public class DefaultVisitor implements Visitor {
|
||||
protected DFS dfs;
|
||||
|
||||
public DefaultVisitor() {}
|
||||
|
||||
public void discoverGraph(Graph g) {}
|
||||
public void finishGraph(Graph g) {}
|
||||
public void discoverVertex(Vertex v) {}
|
||||
public void finishVertex(Vertex v) { }
|
||||
public void discoverEdge(Edge e) {}
|
||||
public void finishEdge(Edge e) {}
|
||||
|
||||
public void visit(Graph g, Vertex start) {
|
||||
dfs = new DFS(this);
|
||||
dfs.start(g, start);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Describes an edge between two vertices of a graph, i.e. a relation between
|
||||
* two arbitrary vertices.
|
||||
*
|
||||
* @version $Id: Edge.java,v 1.1 2001/11/12 16:05:18 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
*/
|
||||
public class Edge implements Cloneable, Constants, java.io.Serializable {
|
||||
private int ident; // unique number, i.e. identifier
|
||||
private static int counter; // produce default numbers
|
||||
|
||||
/**
|
||||
* Create edge.
|
||||
*/
|
||||
public Edge() {
|
||||
ident = counter++;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ident, i.e. identifier of this node
|
||||
*/
|
||||
public final int getIdent() { return ident; }
|
||||
|
||||
/**
|
||||
* @return number of created edges
|
||||
*/
|
||||
public static final int getCounter() { return counter; }
|
||||
|
||||
/**
|
||||
* @return String representation.
|
||||
*/
|
||||
public String toString() {
|
||||
return toString(PLAIN);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param verbose toggle output format
|
||||
* @return String representation.
|
||||
*/
|
||||
public String toString(int verbose) {
|
||||
if((verbose == TALKATIVE) || (verbose == V_TALKATIVE))
|
||||
return "Edge(" + ident + ")";
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
/**
|
||||
* Access for visitor patterns
|
||||
*/
|
||||
public void accept(Visitor v) { v.discoverEdge(this); }
|
||||
|
||||
/**
|
||||
* @return deep copy
|
||||
*/
|
||||
public Edge copy() {
|
||||
try {
|
||||
return (Edge)clone();
|
||||
} catch(CloneNotSupportedException e) {}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/** Check for equality.
|
||||
*/
|
||||
public boolean equals(Object o) {
|
||||
if(!(o instanceof Edge))
|
||||
return false;
|
||||
|
||||
Edge e = (Edge)o;
|
||||
return e.ident == ident;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,156 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
import java.io.OutputStream;
|
||||
|
||||
/**
|
||||
* Visualizes graphs into the <A HREF="http://www.fmi.uni-passau.de/Graphlet/">GML</A>
|
||||
* format.
|
||||
*
|
||||
* @version $Id: GMLVisualizer.java,v 1.1 2001/11/12 16:05:18 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
*/
|
||||
public class GMLVisualizer extends GraphVisualizer {
|
||||
private Graph graph;
|
||||
|
||||
/**
|
||||
* @param out stream to print output to
|
||||
* @param verbose toggle verbosity of output
|
||||
*/
|
||||
public GMLVisualizer(OutputStream out, int verbose) {
|
||||
super(out, verbose);
|
||||
}
|
||||
|
||||
public void discoverGraph(Graph g) {
|
||||
String d = g.isDirected()? "1" : "0";
|
||||
|
||||
graph = g;
|
||||
|
||||
println(0, "graph [");
|
||||
println(1, "Creator\t \"GMLVisualizer\"");
|
||||
println(1, "id\t " + Vertex.getCounter()); // Make sure this is a unique number
|
||||
println(1, "directed\t " + d + "\n");
|
||||
}
|
||||
|
||||
public void finishGraph(Graph g) {
|
||||
println(0, "]\n");
|
||||
out.close();
|
||||
}
|
||||
|
||||
public void discoverVertex(Vertex v) {
|
||||
println(1, "node [");
|
||||
println(2, "id\t " + v.getIdent());
|
||||
println(2, "label");
|
||||
|
||||
out.println("\"" + v.toString(verbose) + "\"");
|
||||
|
||||
println(2, "graphics [");
|
||||
println(3, "type\t\t \"rectangle\"");
|
||||
println(3, "fill\t\t \"white\"");
|
||||
println(3, "outline\t\t \"black\"");
|
||||
println(3, "background\t \"blue\"");
|
||||
println(3, "foreground\t \"green\"");
|
||||
println(2, "]\n");
|
||||
|
||||
println(2, "LabelGraphics [");
|
||||
println(3, "type\t \"text\"");
|
||||
println(3, "fill\t \"black\"");
|
||||
println(3, "justify\t \"left\"");
|
||||
println(2, "]\n");
|
||||
|
||||
println(1, "]\n");
|
||||
}
|
||||
|
||||
public void finishVertex(Vertex v) {}
|
||||
|
||||
public void discoverEdge(Edge e) {
|
||||
int src = graph.getSource(e).getIdent();
|
||||
int target = graph.getTarget(e).getIdent();
|
||||
|
||||
println(1, "edge [");
|
||||
println(2, "source\t " + src);
|
||||
println(2, "target\t " + target);
|
||||
|
||||
println(2, "label");
|
||||
out.println("\"" + e.toString(verbose) + "\"");
|
||||
|
||||
println(2, "graphics [");
|
||||
|
||||
println(3, "fill\t \"black\"");
|
||||
//println(3, "fill\t\t \"white\"");
|
||||
|
||||
println(3, "arrow\t \"last\"");
|
||||
println(2, "]\n");
|
||||
|
||||
println(2, "LabelGraphics [");
|
||||
println(3, "type\t \"text\"");
|
||||
println(3, "fill\t \"black\"");
|
||||
println(2, "]\n");
|
||||
|
||||
println(1, "]\n");
|
||||
}
|
||||
|
||||
public void finishEdge(Edge e) {}
|
||||
|
||||
/**
|
||||
* Visualize graph g with this Visualizer.
|
||||
*
|
||||
* @param g graph to visualize
|
||||
* @param start node to start at
|
||||
*/
|
||||
public void visualize(Graph g, Vertex start) {
|
||||
new DFS(this).start(g, start);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,678 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import java.util.*;
|
||||
import java.util.zip.*;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* Describes a generic graph G = (V, E), i.e. a set of vertices and edges.
|
||||
*
|
||||
* @version $Id: Graph.java,v 1.1 2001/11/12 16:05:19 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
*/
|
||||
public class Graph implements Cloneable, Constants, Serializable {
|
||||
private boolean directed = true;
|
||||
|
||||
/* Map Vertex to VertexWrapper and Edge to EdgeWrapper,
|
||||
* respectively. Wrapper objects carry the necessary information
|
||||
* about associations between vertices. VertexWrappers contain the
|
||||
* edges coming from and leading to a vertex (if the graph is undirected both
|
||||
* vertices "have" this edge, otherwise the source vertex only "has" it).
|
||||
* EdgeWrappers contain references to the source and target vertices.
|
||||
*/
|
||||
private Map vmap = new HashMap();
|
||||
private Map emap = new HashMap();
|
||||
|
||||
/**
|
||||
* Create empty directed graph.
|
||||
*/
|
||||
public Graph() {}
|
||||
|
||||
/**
|
||||
* Create directed graph initialized with a set of subgraphs.
|
||||
*/
|
||||
public Graph(Graph[] graphs) {
|
||||
for(int i=0; i < graphs.length; i++) {
|
||||
addGraph(graphs[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create empty graph.
|
||||
* @param d graph is directed?
|
||||
*/
|
||||
public Graph(boolean d) {
|
||||
directed = d;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read graph from file using Serializable.
|
||||
*
|
||||
* @param name file name to read from
|
||||
*/
|
||||
public Graph(String name) throws IOException, ClassNotFoundException
|
||||
{
|
||||
this(new FileInputStream(name));
|
||||
}
|
||||
|
||||
/**
|
||||
* Read graph from input stream using Serializable.
|
||||
*
|
||||
* @param stream stream to read from
|
||||
*/
|
||||
public Graph(InputStream stream) throws IOException, ClassNotFoundException
|
||||
{
|
||||
ObjectInputStream oi = new ObjectInputStream(new GZIPInputStream(stream));
|
||||
Graph g = (Graph)oi.readObject();
|
||||
|
||||
this.directed = g.directed;
|
||||
this.vmap = g.vmap;
|
||||
this.emap = g.emap;
|
||||
}
|
||||
|
||||
/* Add sub graph to this graph.
|
||||
*/
|
||||
public void addGraph(Graph g) {
|
||||
Vertex[] vertices = g.getVertexArray();
|
||||
for(int j=0; j < vertices.length; j++)
|
||||
addVertex(vertices[j]);
|
||||
|
||||
Edge[] edges = g.getEdgeArray();
|
||||
for(int j=0; j < edges.length; j++)
|
||||
addEdge(g.getSource(edges[j]), g.getTarget(edges[j]), edges[j]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a vertex to the graph.
|
||||
* @param v vertex to add
|
||||
*/
|
||||
public void addVertex(Vertex v) {
|
||||
if(v == null)
|
||||
throw new GraphError("Vertex must not be null");
|
||||
|
||||
vmap.put(v, new VertexWrapper(v));
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a (default) edge between two vertices to the graph.
|
||||
*
|
||||
* @param u source vertex.
|
||||
* @param v target vertex.
|
||||
*/
|
||||
public void addEdge(Vertex u, Vertex v) {
|
||||
addEdge(u, v, new Edge());
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an edge between two vertices to the graph.
|
||||
*
|
||||
* @param u source vertex.
|
||||
* @param v target vertex.
|
||||
* @param e edge between
|
||||
*/
|
||||
public void addEdge(Vertex u, Vertex v, Edge e) {
|
||||
VertexWrapper uw = getWrapper(u);
|
||||
VertexWrapper vw = getWrapper(v);
|
||||
|
||||
if(e == null)
|
||||
throw new GraphError("Edge must not be null");
|
||||
|
||||
emap.put(e, new EdgeWrapper(e, u, v));
|
||||
uw.addEdge(e);
|
||||
|
||||
if(!directed) // Add edge to the other side, too
|
||||
vw.addEdge(e);
|
||||
|
||||
vw.addPredecessorEdge(e);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove given vertex and the edges that connect it to other vertices.
|
||||
*
|
||||
* @param v abandoned vertex.
|
||||
*/
|
||||
public void removeVertex(Vertex v) {
|
||||
VertexWrapper vw = getWrapper(v);
|
||||
|
||||
Edge[] edges = vw.getEdges(); // Remove all adjacent edges
|
||||
|
||||
if(!directed) { // Inform other side of the edge that it has to be removed
|
||||
for(int i=0; i < edges.length; i++) {
|
||||
EdgeWrapper ew = getWrapper(edges[i]);
|
||||
Vertex u = (ew.src == v)? ew.target : ew.src;
|
||||
VertexWrapper uw = getWrapper(u);
|
||||
uw.removeEdge(edges[i]);
|
||||
}
|
||||
} else {
|
||||
for(int i=0; i < edges.length; i++) {
|
||||
VertexWrapper uw = getWrapper(getWrapper(edges[i]).target);
|
||||
uw.removePredecessorEdge(edges[i]);
|
||||
}
|
||||
}
|
||||
|
||||
vmap.remove(v); // Remove vertex from the hash map
|
||||
|
||||
// Finally remove the edges from the hash map
|
||||
for(int i=0; i < edges.length; i++)
|
||||
emap.remove(edges[i]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove given edge from the graph.
|
||||
*
|
||||
* @param e abandoned edge.
|
||||
*/
|
||||
public void removeEdge(Edge e) {
|
||||
EdgeWrapper ew = getWrapper(e);
|
||||
emap.remove(e); // Remove edge from the hash map
|
||||
|
||||
// Update source vertex
|
||||
VertexWrapper vw = getWrapper(ew.src);
|
||||
vw.removeEdge(e);
|
||||
|
||||
if(!directed) { // Inform other node, too
|
||||
vw = getWrapper(ew.target);
|
||||
vw.removeEdge(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get source vertex of edge. Order between source and target doesn't
|
||||
* really matter if this graph is undirected.
|
||||
*
|
||||
* @param e edge.
|
||||
*/
|
||||
public final Vertex getSource(Edge e) { return getWrapper(e).src; }
|
||||
|
||||
/**
|
||||
* Get target vertex of edge. Order between source and target doesn't
|
||||
* really matter if this graph is undirected.
|
||||
*
|
||||
* @param e edge.
|
||||
*/
|
||||
public final Vertex getTarget(Edge e) { return getWrapper(e).target; }
|
||||
|
||||
/**
|
||||
* @return number of vertices.
|
||||
*/
|
||||
public final int getNoVertices() { return vmap.size(); }
|
||||
|
||||
/**
|
||||
* @return number of edges.
|
||||
*/
|
||||
public final int getNoEdges() { return emap.size(); }
|
||||
|
||||
/**
|
||||
* @return all vertices of the graph.
|
||||
*/
|
||||
public Collection getVertices() { return vmap.keySet(); }
|
||||
|
||||
/**
|
||||
* @return all edges of the graph.
|
||||
*/
|
||||
public Collection getEdges() { return emap.keySet(); }
|
||||
|
||||
/**
|
||||
* @return all vertices of the graph.
|
||||
*/
|
||||
public final Vertex[] getVertexArray() {
|
||||
return (Vertex[])getVertices().toArray(new Vertex[getNoVertices()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return all edges of the graph.
|
||||
*/
|
||||
public final Edge[] getEdgeArray() {
|
||||
return (Edge[])getEdges().toArray(new Edge[getNoEdges()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return all edges between source and target
|
||||
*/
|
||||
public Edge[] getEdgeArray(Vertex source, Vertex target) {
|
||||
Collection c = getEdges(source, target);
|
||||
return (Edge[])c.toArray(new Edge[c.size()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return all edges between source and target
|
||||
*/
|
||||
public Collection getEdges(Vertex source, Vertex target) {
|
||||
Edge[] edges = getEdgeArray(source);
|
||||
List list = new ArrayList();
|
||||
|
||||
for(int i=0; i < edges.length; i++)
|
||||
if(getTarget(edges[i]) == target)
|
||||
list.add(edges[i]);
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return all vertices adjacent to v.
|
||||
*/
|
||||
public Vertex[] getVertexArray(Vertex v) {
|
||||
Edge[] edges = getEdgeArray(v);
|
||||
int size = edges.length;
|
||||
Vertex[] vertices = new Vertex[size];
|
||||
|
||||
/* Take the other side of the edge, no matter if directed or not
|
||||
*/
|
||||
for(int i=0; i < size; i++) {
|
||||
EdgeWrapper ew = getWrapper(edges[i]);
|
||||
vertices[i] = (ew.src == v)? ew.target : ew.src;
|
||||
}
|
||||
|
||||
return vertices;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return number of vertices adjacent to v.
|
||||
*/
|
||||
public int getNoVertices(Vertex v) {
|
||||
VertexWrapper vw = getWrapper(v);
|
||||
return vw.edges.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return number of edges adjacent to v.
|
||||
*/
|
||||
public final int getNoEdges(Vertex v) {
|
||||
return getNoVertices(v);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return all edges adjacent to v.
|
||||
*/
|
||||
public Edge[] getEdgeArray(Vertex v) {
|
||||
VertexWrapper vw = getWrapper(v);
|
||||
return vw.getEdges();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return all vertices adjacent to v.
|
||||
*/
|
||||
public Collection getVertices(Vertex v) {
|
||||
return Arrays.asList(getVertexArray(v));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return all edges adjacent to v.
|
||||
*/
|
||||
public Collection getEdges(Vertex v) {
|
||||
return Arrays.asList(getEdgeArray(v));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all vertices from which v may be reached directly, in an undirected
|
||||
* graph, this is identical to getVertexArray(v)
|
||||
*
|
||||
* @return all predecessor vertices of v
|
||||
*/
|
||||
public Vertex[] getPredecessorArray(Vertex v) {
|
||||
if(!directed)
|
||||
return getVertexArray(v);
|
||||
|
||||
Collection c = getPredecessors(v);
|
||||
return (Vertex[])c.toArray(new Vertex[c.size()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all vertices from which v may be reached directly, in an undirected
|
||||
* graph, this is identical to getVertices(v)
|
||||
*
|
||||
* @return all predecessor vertices of v
|
||||
*/
|
||||
public Collection getPredecessors(Vertex v) {
|
||||
if(!directed)
|
||||
return getVertices(v);
|
||||
|
||||
List list = new ArrayList();
|
||||
Collection edges = getWrapper(v).pred_edges;
|
||||
|
||||
for(Iterator i = edges.iterator(); i.hasNext(); )
|
||||
list.add(getWrapper(((Edge)i.next())).src);
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
public Edge[] getPredecessorEdgeArray(Vertex v) {
|
||||
if(!directed)
|
||||
return getEdgeArray(v);
|
||||
|
||||
Collection edges = getWrapper(v).pred_edges;
|
||||
|
||||
return (Edge[])edges.toArray(new Edge[edges.size()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all edges pointing to v, in an undirected
|
||||
* graph, this is identical to getEdges(v)
|
||||
*
|
||||
* @return all predecessor vertices of v
|
||||
*/
|
||||
public Collection getPredecessorEdges(Vertex v) {
|
||||
if(!directed)
|
||||
return getEdges(v);
|
||||
|
||||
return (Collection)((ArrayList)getWrapper(v).pred_edges).clone();
|
||||
}
|
||||
|
||||
/**
|
||||
* Is v in this graph?
|
||||
*/
|
||||
public final boolean contains(Vertex v) {
|
||||
return vmap.containsKey(v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Is e in this graph?
|
||||
*/
|
||||
public final boolean contains(Edge e) {
|
||||
return emap.containsKey(e);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check, if v is a vertex of graph g.
|
||||
*/
|
||||
public static final boolean contains(Graph g, Vertex v) {
|
||||
return g.contains(v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check, if e is an edge of graph g.
|
||||
*/
|
||||
public static final boolean contains(Graph g, Edge e) {
|
||||
return g.contains(e);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check, if g is a subgraph of super_g, i.e. if all vertices and edges of g are
|
||||
* contained in super_g, too.
|
||||
*
|
||||
* @param super_g the super graph
|
||||
* @param g the subgraph
|
||||
*/
|
||||
public static final boolean contains(Graph super_g, Graph g) {
|
||||
for(Iterator i = g.getVertices().iterator(); i.hasNext();) {
|
||||
Vertex v = (Vertex)i.next();
|
||||
if(!contains(super_g, v))
|
||||
return false;
|
||||
}
|
||||
|
||||
for(Iterator i = g.getEdges().iterator(); i.hasNext();) {
|
||||
Edge e = (Edge)i.next();
|
||||
if(!contains(super_g, e))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check, if g is a subgraph of this graph. Tests for object equivalence (==).
|
||||
*/
|
||||
public final boolean contains(Graph g) {
|
||||
return contains(this, g);
|
||||
}
|
||||
|
||||
/**
|
||||
* Access for visitor patterns
|
||||
*/
|
||||
public void accept(Visitor v) { v.discoverGraph(this); }
|
||||
|
||||
/**
|
||||
* Is this graph directed?
|
||||
*/
|
||||
public final boolean isDirected() { return directed; }
|
||||
|
||||
/**
|
||||
* @return wrapper object corresponding to vertex or throw an exception.
|
||||
*/
|
||||
private final VertexWrapper getWrapper(Vertex v) {
|
||||
VertexWrapper vw = (VertexWrapper)vmap.get(v);
|
||||
|
||||
if(vw == null)
|
||||
throw new GraphError("Vertex not contained in this graph: " + v);
|
||||
|
||||
return vw;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return wrapper object corresponding to edge or throw an exception.
|
||||
*/
|
||||
private final EdgeWrapper getWrapper(Edge e) {
|
||||
EdgeWrapper ew = (EdgeWrapper)emap.get(e);
|
||||
|
||||
if(ew == null)
|
||||
throw new GraphError("Edge not contained in this graph: " + e);
|
||||
|
||||
return ew;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return toString(PLAIN);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return graph contents traversed with DFS
|
||||
*/
|
||||
public String toString(int verbose) {
|
||||
if(verbose == PLAIN)
|
||||
return printArray(getVertexArray());
|
||||
else {
|
||||
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||
PrintWriter out = new PrintWriter(bos);
|
||||
|
||||
new DFS(new PrintVisitor(out, VERBOSE)).start(this);
|
||||
out.close();
|
||||
|
||||
return bos.toString();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* All vertices and edges are copied deeply, i.e. copy() will be called on
|
||||
* them recursively.
|
||||
*
|
||||
* @return deep copy of this graph.
|
||||
*/
|
||||
public Graph copy() {
|
||||
Graph g = new Graph(directed);
|
||||
|
||||
for(Iterator i = getVertices().iterator(); i.hasNext();) {
|
||||
Vertex v = ((Vertex)i.next()).copy();
|
||||
g.addVertex(v);
|
||||
}
|
||||
|
||||
for(Iterator i = getEdges().iterator(); i.hasNext();) {
|
||||
Edge e = (Edge)i.next();
|
||||
EdgeWrapper ew = getWrapper(e);
|
||||
|
||||
g.addEdge(ew.src, ew.target, e.copy());
|
||||
}
|
||||
|
||||
return g;
|
||||
}
|
||||
|
||||
public Graph copy(Vertex start) {
|
||||
final Graph g = new Graph(directed);
|
||||
|
||||
new DFS(new DefaultVisitor() {
|
||||
public void discoverVertex(Vertex v) {
|
||||
g.addVertex(v);
|
||||
}
|
||||
|
||||
public void finishEdge(Edge e) {
|
||||
EdgeWrapper ew = getWrapper(e);
|
||||
|
||||
g.addEdge(ew.src, ew.target, e);
|
||||
}
|
||||
}, false).start(this, start);
|
||||
|
||||
return g;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return shallow copy of this graph, i.e. all vertices and edges keep their
|
||||
* object identity
|
||||
*/
|
||||
public Object clone() {
|
||||
Graph g = new Graph(directed);
|
||||
|
||||
for(Iterator i = getVertices().iterator(); i.hasNext();) {
|
||||
Vertex v = ((Vertex)i.next());
|
||||
g.addVertex(v);
|
||||
}
|
||||
|
||||
for(Iterator i = getEdges().iterator(); i.hasNext();) {
|
||||
Edge e = (Edge)i.next();
|
||||
EdgeWrapper ew = getWrapper(e);
|
||||
|
||||
g.addEdge(ew.src, ew.target, e);
|
||||
}
|
||||
|
||||
return g;
|
||||
}
|
||||
|
||||
/* Wrap association information into class, s.a.
|
||||
*/
|
||||
private static final class VertexWrapper implements Serializable {
|
||||
Vertex vertex;
|
||||
List edges = new ArrayList(3);
|
||||
List pred_edges = new ArrayList(3);
|
||||
|
||||
final void addEdge(Edge e) { edges.add(e); }
|
||||
final void addPredecessorEdge(Edge e) { pred_edges.add(e); }
|
||||
final void removeEdge(Edge e) { edges.remove(e); }
|
||||
final void removePredecessorEdge(Edge e) { pred_edges.remove(e); }
|
||||
|
||||
final Edge[] getEdges() {
|
||||
return (Edge[])edges.toArray(new Edge[edges.size()]);
|
||||
}
|
||||
|
||||
VertexWrapper(Vertex v) {
|
||||
vertex = v;
|
||||
}
|
||||
}
|
||||
|
||||
/* Wrap association information into class, s.a.
|
||||
*/
|
||||
private static final class EdgeWrapper implements Serializable {
|
||||
Edge edge;
|
||||
Vertex src, target;
|
||||
|
||||
EdgeWrapper(Edge e, Vertex u, Vertex v) {
|
||||
edge = e;
|
||||
src = u;
|
||||
target = v;
|
||||
}
|
||||
}
|
||||
|
||||
/** Clear all vertex attributes like color, distance, ...
|
||||
*/
|
||||
public void clearVertices() {
|
||||
for(Iterator i = getVertices().iterator(); i.hasNext();) {
|
||||
Vertex v = ((Vertex)i.next());
|
||||
v.setColor(-1);
|
||||
v.setDistance(-1);
|
||||
v.setDiscoveryTime(-1);
|
||||
v.setFinishingTime(-1);
|
||||
v.setPredecessor(null);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump graph to file using Serializable.
|
||||
*
|
||||
* @param name file name to dump to
|
||||
*/
|
||||
public void dump(String name) throws IOException {
|
||||
dump(new FileOutputStream(name));
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump graph to output stream using Serializable.
|
||||
*
|
||||
* @param stream stream to dump to
|
||||
*/
|
||||
public void dump(OutputStream stream) throws IOException {
|
||||
ObjectOutputStream oo = new ObjectOutputStream(new GZIPOutputStream(stream));
|
||||
oo.writeObject(this);
|
||||
oo.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Print the given array using toString() where appropiate.
|
||||
*/
|
||||
private static final String printArray(Object[] obj) {
|
||||
StringBuffer buf = new StringBuffer("{");
|
||||
|
||||
for(int i=0; i < obj.length; i++) {
|
||||
if(obj[i] != null)
|
||||
buf.append(obj[i].toString());
|
||||
else
|
||||
buf.append("null");
|
||||
|
||||
if(i < obj.length - 1)
|
||||
buf.append(", ");
|
||||
}
|
||||
buf.append('}');
|
||||
|
||||
return buf.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,149 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* Collection of graph algorithms such as transposeGraph.
|
||||
*
|
||||
* @version $Id: GraphAlgorithms.java,v 1.1 2001/11/12 16:05:18 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
*/
|
||||
public abstract class GraphAlgorithms implements Constants {
|
||||
/**
|
||||
* Compute the inverse of a graph, i.e. with all edges reverted
|
||||
*/
|
||||
public static final Graph transposeGraph(Graph g) {
|
||||
if(!g.isDirected())
|
||||
throw new GraphError("Can only transpose directed graphs");
|
||||
|
||||
Graph graph = new Graph(true);
|
||||
|
||||
for(Iterator i=g.getVertices().iterator(); i.hasNext();)
|
||||
graph.addVertex((Vertex)i.next());
|
||||
|
||||
for(Iterator i=g.getEdges().iterator(); i.hasNext();) {
|
||||
Edge f = (Edge)i.next();
|
||||
|
||||
graph.addEdge(g.getTarget(f), g.getSource(f), f);
|
||||
}
|
||||
|
||||
return graph;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test whether the SCC g is a loop.
|
||||
*
|
||||
* @param super_g super graph containing the subset of vertices
|
||||
* @param g subset of super_g (g must be SCC of super_g)
|
||||
*/
|
||||
public static final boolean isLoop(Graph super_g, Graph loop) {
|
||||
return findLoopEntry(super_g, loop) != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test whether the SCC g is a loop.
|
||||
*
|
||||
* @param super_g super graph containing the subset of vertices
|
||||
* @param g subset of super_g (g must be SCC of super_g)
|
||||
* @return root node of loop, i.e. the entry point, or null if this is no loop
|
||||
*/
|
||||
public static final Vertex findLoopEntry(Graph super_g, Graph loop) {
|
||||
switch(loop.getNoVertices()) {
|
||||
case 0:
|
||||
return null; // certainly not a loop
|
||||
|
||||
case 1: // singleton must point to itself, i.e. be a self-loop
|
||||
Vertex v = loop.getVertexArray()[0];
|
||||
Vertex[] edges = loop.getVertexArray(v);
|
||||
|
||||
for(int i=0; i < edges.length; i++)
|
||||
if(edges[i] == v)
|
||||
return v;
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/* Make sure that the root node is the only entry point to the
|
||||
* SCC, i.e. there is no way from a node v \in (super_g \ g) into
|
||||
* a node in g except via the root node.
|
||||
*
|
||||
* So we have to find the root node first ...
|
||||
*/
|
||||
Vertex root = null;
|
||||
Vertex[] vertices = super_g.getVertexArray();
|
||||
|
||||
for(int i=0; i < vertices.length; i++) {
|
||||
Vertex v = vertices[i];
|
||||
|
||||
if(loop.contains(v)) // v is in the SCC, no check needed
|
||||
continue;
|
||||
|
||||
Vertex[] edges = super_g.getVertexArray(v); // All nodes reachable from v
|
||||
for(int j=0; j < edges.length; j++) {
|
||||
Vertex u = edges[j];
|
||||
|
||||
if(loop.contains(u))
|
||||
if(root == null)
|
||||
root = u;
|
||||
else
|
||||
return null; // Can't be a loop then, i.e. has more than one root node
|
||||
}
|
||||
}
|
||||
|
||||
return root; // Has loop a root node at all !?
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @version $Id: GraphError.java,v 1.1 2001/11/12 16:05:18 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
*/
|
||||
public class GraphError extends RuntimeException {
|
||||
public GraphError(String s) { super(s); }
|
||||
}
|
||||
@@ -0,0 +1,165 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
import java.io.*;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
/**
|
||||
* Abstract super class for drivers that visualize graphs
|
||||
* in different graph formats such as
|
||||
* <A HREF="http://www.fmi.uni-passau.de/Graphlet/">GML</A> or
|
||||
* <A HREF="http://www.informatik.uni-bremen.de/~inform/forschung/daVinci/daVinci.html">
|
||||
* daVinci</A> or <A HREF="http://www.cs.uni-sb.de/RW/users/sander/html/gsvcg1.html">
|
||||
* VCG</A>.
|
||||
*
|
||||
* By default graphs are dumped in the native Java format, i.e. by using the
|
||||
* Serialization feature.
|
||||
*
|
||||
* @version $Id: GraphVisualizer.java,v 1.1 2001/11/12 16:05:19 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
* @see DaVinciVisualizer
|
||||
* @see GMLVisualizer
|
||||
* @see VCGVisualizer
|
||||
*/
|
||||
public class GraphVisualizer implements Visitor {
|
||||
protected OutputStream orig_out;
|
||||
protected PrintWriter out;
|
||||
protected int verbose;
|
||||
|
||||
/**
|
||||
* @param out stream to print output to
|
||||
* @param verbose toggle verbosity
|
||||
*/
|
||||
public GraphVisualizer(OutputStream out, int verbose) {
|
||||
orig_out = out;
|
||||
this.out = new PrintWriter(out, true);
|
||||
this.verbose = verbose;
|
||||
}
|
||||
|
||||
/**
|
||||
* Print string using ident tab as prefix, used for nested calls
|
||||
*
|
||||
* @param indent how many tabs
|
||||
* @param s string to print
|
||||
*/
|
||||
protected final void print(int indent, String s) {
|
||||
for(int i=0; i < indent; i++)
|
||||
out.print('\t');
|
||||
|
||||
out.print(s);
|
||||
}
|
||||
|
||||
/**
|
||||
* Print string using ident tab as prefix, used for nested calls
|
||||
*
|
||||
* @param indent how many tabs
|
||||
* @param s string to print
|
||||
*/
|
||||
protected final void println(int indent, String s) {
|
||||
print(indent, s);
|
||||
out.print('\n');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Escape all occurences of newline chars '\n' and quotes \"
|
||||
*/
|
||||
protected static final String convertString(String label) {
|
||||
char[] ch = label.toCharArray();
|
||||
StringBuffer buf = new StringBuffer();
|
||||
|
||||
for(int i=0; i < ch.length; i++) {
|
||||
switch(ch[i]) {
|
||||
case '\n':
|
||||
buf.append("\\n"); break;
|
||||
case '\"':
|
||||
buf.append("\\\""); break;
|
||||
case '\\':
|
||||
buf.append("\\\\"); break;
|
||||
default:
|
||||
buf.append(ch[i]); break;
|
||||
}
|
||||
}
|
||||
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Visualize graph g with this Visualizer.
|
||||
*
|
||||
* @param g graph to visualize
|
||||
* @param start node to start at
|
||||
*/
|
||||
public void visualize(Graph g, Vertex start) {
|
||||
try {
|
||||
g.dump(orig_out);
|
||||
} catch(IOException e) {
|
||||
System.err.println(e);
|
||||
}
|
||||
|
||||
out.close();
|
||||
}
|
||||
|
||||
public void discoverGraph(Graph g) {}
|
||||
public void finishGraph(Graph g) {}
|
||||
public void discoverVertex(Vertex v) {}
|
||||
public void finishVertex(Vertex v) {}
|
||||
public void discoverEdge(Edge e) {}
|
||||
public void finishEdge(Edge e) {}
|
||||
|
||||
public void visit(Graph g, Vertex start) {
|
||||
visualize(g, start);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Describes a labeled edge between two vertices of a graph.
|
||||
*
|
||||
* @version $Id: LabeledEdge.java,v 1.1 2001/11/12 16:05:19 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
*/
|
||||
public class LabeledEdge extends Edge {
|
||||
private String label;
|
||||
|
||||
/**
|
||||
* Create edge with label.
|
||||
*/
|
||||
public LabeledEdge(String l) {
|
||||
label = l;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param verbose toggle output format
|
||||
* @return String representation.
|
||||
*/
|
||||
public String toString(int verbose) {
|
||||
return label;
|
||||
}
|
||||
|
||||
public final String getLabel() { return label; }
|
||||
public final void setLabel(String l) { label = l; }
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Describes a labeled vertex of a graph.
|
||||
*
|
||||
* @version $Id: LabeledVertex.java,v 1.1 2001/11/12 16:05:19 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
*/
|
||||
public class LabeledVertex extends Vertex {
|
||||
private String label;
|
||||
|
||||
/**
|
||||
* Create vertex with label l
|
||||
*/
|
||||
public LabeledVertex(String l) {
|
||||
label = l;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param verbose toggle output format
|
||||
* @return String representation.
|
||||
*/
|
||||
public String toString(int verbose) {
|
||||
return label;
|
||||
}
|
||||
|
||||
public final String getLabel() { return label; }
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
import java.io.PrintWriter;
|
||||
|
||||
/**
|
||||
* Visit graph with depth first search and simply prints the current
|
||||
* vertices and edges as they are discovered. May be used with DFS, BFS,
|
||||
* Sequential or any other visitor. Uses DFS by default.
|
||||
*
|
||||
* @version $Id: PrintVisitor.java,v 1.1 2001/11/12 16:05:19 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
*/
|
||||
public class PrintVisitor implements Visitor {
|
||||
private PrintWriter out;
|
||||
private int verbose;
|
||||
|
||||
/**
|
||||
* Simply print vertex and edge contents, when visiting them.
|
||||
*
|
||||
* @param o stream to print to
|
||||
* @param v toggle verbosity of output
|
||||
* @see Constants
|
||||
*/
|
||||
public PrintVisitor(PrintWriter o, int v) {
|
||||
out = o;
|
||||
verbose = v;
|
||||
}
|
||||
|
||||
public void discoverGraph(Graph g) {}
|
||||
public void finishGraph(Graph g) {}
|
||||
public void finishVertex(Vertex v) {}
|
||||
public void finishEdge(Edge e) {}
|
||||
|
||||
public void discoverVertex(Vertex v) { out.println(v.toString(verbose)); }
|
||||
public void discoverEdge(Edge e) { out.println(e.toString(verbose)); }
|
||||
|
||||
public void visit(Graph g, Vertex start) {
|
||||
new DFS(this).start(g, start);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,169 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
import java.util.Vector;
|
||||
|
||||
/**
|
||||
* Visit graph computing its "Strongly Connected Components" (SCC).
|
||||
*
|
||||
* @version $Id: SCCVisitor.java,v 1.1 2001/11/12 16:05:20 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
* @see DFS
|
||||
*/
|
||||
public class SCCVisitor implements Visitor {
|
||||
private int time; // Global time
|
||||
private VStack stack; // Stack to remember members of a SCC
|
||||
private Vector sccs; // Forest of SCCs
|
||||
private Graph graph;
|
||||
private Graph[] graphs;
|
||||
private int size;
|
||||
|
||||
public SCCVisitor() {}
|
||||
|
||||
public void discoverGraph(Graph g) {
|
||||
graph = g;
|
||||
size = g.getNoVertices();
|
||||
Vertex[] vertices = g.getVertexArray();
|
||||
|
||||
for(int i=0; i < size; i++) {
|
||||
vertices[i].setDiscoveryTime(0);
|
||||
/* Should rather be setMyMinTime(), "abused" to remember local minimum
|
||||
*/
|
||||
vertices[i].setFinishingTime(size * 2); // Invalidate
|
||||
}
|
||||
|
||||
time = 0; // Reset timer
|
||||
stack = new VStack(size);
|
||||
sccs = new Vector();
|
||||
}
|
||||
|
||||
|
||||
public void discoverVertex(Vertex v) {
|
||||
int min = time++; // Clock tick
|
||||
v.setDiscoveryTime(min); // Remember time of discovery
|
||||
v.setFinishingTime(min); // Remember local minimum
|
||||
stack.push(v); // Push current node on stack
|
||||
}
|
||||
|
||||
public void discoverEdge(Edge e) {}
|
||||
|
||||
public void finishEdge(Edge e) {
|
||||
Vertex src = graph.getSource(e);
|
||||
Vertex target = graph.getTarget(e);
|
||||
int m = target.getFinishingTime();
|
||||
|
||||
/* After recursion, test if the (white) vertex just visited has now a smaller
|
||||
* minium than the local one, i.e. if target.min < src.min && !target.isBlack().
|
||||
*/
|
||||
if((m < src.getFinishingTime()) && (target.getDiscoveryTime() < size + 1))
|
||||
src.setFinishingTime(m);
|
||||
}
|
||||
|
||||
public void finishVertex(Vertex v) {
|
||||
/* If the local minimum hasn't changed, i.e. if no vertices with smaller minimums
|
||||
* have been reached, this must be the root vertex of a SCC.
|
||||
*/
|
||||
if(v.getFinishingTime() == v.getDiscoveryTime()) { // Root of SCC?
|
||||
Graph scc = new Graph(); // Gather nodes in subgraph
|
||||
Vertex p;
|
||||
|
||||
do { // Pop all nodes belonging to this SCC subgraph
|
||||
p = stack.pop();
|
||||
scc.addVertex(p); // May have no edges, so put it first in there
|
||||
p.setDiscoveryTime(size * 2); // Invalidate, i.e. mark vertex as black
|
||||
} while(p != v);
|
||||
|
||||
Vertex[] vertices = scc.getVertexArray();
|
||||
for(int j=0; j < vertices.length; j++) {
|
||||
p = vertices[j];
|
||||
|
||||
Edge[] edges = graph.getEdgeArray(p);
|
||||
for(int i=0; i < edges.length; i++) { // Build up subgraph
|
||||
Edge e = edges[i];
|
||||
Vertex src = graph.getSource(e);
|
||||
Vertex target = graph.getTarget(e);
|
||||
|
||||
// Add only edges that are within the subgraph
|
||||
if(scc.contains(src) && scc.contains(target))
|
||||
scc.addEdge(src, target, e);
|
||||
}
|
||||
}
|
||||
|
||||
sccs.addElement(scc); // Add subgraph vectorto forest of subgraphs
|
||||
}
|
||||
}
|
||||
|
||||
public void finishGraph(Graph g) {
|
||||
graphs = new Graph[sccs.size()];
|
||||
sccs.copyInto(graphs);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return all strongly connected components found during traversal
|
||||
*/
|
||||
public final Graph[] getSCCs() { return graphs; }
|
||||
|
||||
/**
|
||||
* Visit graph with DFS and find all its strongly connected components
|
||||
* which may be obtained with getSCCs().
|
||||
*
|
||||
* @param g graph to traverse
|
||||
* @param start where to start traversal
|
||||
*/
|
||||
public void visit(Graph g, Vertex start) {
|
||||
new DFS(this).start(g, start);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Visit graph in sequential order, i.e. in the order returned by Graph.getVertices().
|
||||
*
|
||||
* @version $Id: Sequential.java,v 1.1 2001/11/12 16:05:20 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
*/
|
||||
public final class Sequential extends TraversalOrder {
|
||||
/**
|
||||
* Depth first search algorithm.
|
||||
*
|
||||
* @param v visitor object to apply when discovering and finishing a vertex or edge
|
||||
*/
|
||||
public Sequential(Visitor v) {
|
||||
super(v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Visit graph in sequential order
|
||||
*
|
||||
* @param g graph to traverse
|
||||
* @param start vertex to start at (or null, starts at first vertex then)
|
||||
*/
|
||||
public void start(Graph g, Vertex start) {
|
||||
int size = g.getNoVertices();
|
||||
Vertex[] vertices = g.getVertexArray();
|
||||
int index = 0;
|
||||
|
||||
visitor.discoverGraph(g);
|
||||
|
||||
/* Initially mark all vertices as WHITE
|
||||
*/
|
||||
for(int i=0; i < size; i++) {
|
||||
vertices[i].setColor(WHITE);
|
||||
if(vertices[i] == start)
|
||||
index = i;
|
||||
}
|
||||
|
||||
for(int i=0; (i < size) && !stopped; i++) {
|
||||
Vertex v = vertices[index++ % size];
|
||||
|
||||
visitor.discoverVertex(v);
|
||||
v.setColor(GRAY);
|
||||
|
||||
Edge[] edges = g.getEdgeArray(v);
|
||||
for(int j=0; j < edges.length; j++) {
|
||||
visitor.discoverEdge(edges[j]);
|
||||
visitor.finishEdge(edges[j]);
|
||||
}
|
||||
|
||||
visitor.finishVertex(v);
|
||||
v.setColor(BLACK);
|
||||
}
|
||||
|
||||
visitor.finishGraph(g);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class takes a visitor "piggy-backed" and applies it to all nodes
|
||||
* and edges. The traversal order implemented by children of this
|
||||
* class may be Depth-first or Breadth-first search, e.g..
|
||||
*
|
||||
* This relates to the "Strategy" design pattern.
|
||||
*
|
||||
* @version $Id: TraversalOrder.java,v 1.1 2001/11/12 16:05:20 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
* @see DFS
|
||||
* @see BFS
|
||||
* @see Sequential
|
||||
*/
|
||||
public abstract class TraversalOrder implements Constants {
|
||||
protected Visitor visitor;
|
||||
protected Graph graph;
|
||||
protected boolean stopped;
|
||||
protected boolean traverse_complete_graph;
|
||||
|
||||
/**
|
||||
* Depth first search algorithm.
|
||||
*
|
||||
* @param v visitor object to apply when discovering and finishing a vertex or edge
|
||||
* @param traverse_all traverse the complete graph or stop after finishing all nodes reachable
|
||||
* from the start
|
||||
*/
|
||||
public TraversalOrder(Visitor v, boolean traverse_all) {
|
||||
visitor = v;
|
||||
traverse_complete_graph = traverse_all;
|
||||
}
|
||||
|
||||
public TraversalOrder(Visitor v) {
|
||||
this(v, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Start traversal.
|
||||
*
|
||||
* @param g graph to traverse
|
||||
* @param start vertex to start at (or null, starts at some vertex then)
|
||||
* @param all_vertices visit all vertices or just those reache from start
|
||||
*/
|
||||
public abstract void start(Graph g, Vertex start);
|
||||
|
||||
/** May be called to stop traversal, e.g. if a searched node has been found.
|
||||
*/
|
||||
public void stop() {
|
||||
stopped = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Depth first search algorithm starting at some vertex.
|
||||
*
|
||||
* @param g graph to traverse
|
||||
*/
|
||||
public void start(Graph g) {
|
||||
start(g, null);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
import java.io.OutputStream;
|
||||
|
||||
/**
|
||||
* Visualizes graphs into the <A
|
||||
* HREF="http://www.cs.uni-sb.de/RW/users/sander/html/gsvcg1.html">VCG</A>
|
||||
* format.
|
||||
*
|
||||
* @version $Id: VCGVisualizer.java,v 1.1 2001/11/12 16:05:20 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
*/
|
||||
public class VCGVisualizer extends GraphVisualizer {
|
||||
private Graph graph;
|
||||
|
||||
/**
|
||||
* @param out stream to print output to
|
||||
* @param verbose toggle verbosity of output
|
||||
*/
|
||||
public VCGVisualizer(OutputStream out, int verbose) {
|
||||
super(out, verbose);
|
||||
}
|
||||
|
||||
public void discoverGraph(Graph g) {
|
||||
String d = g.isDirected()? "1" : "0";
|
||||
|
||||
graph = g;
|
||||
|
||||
println(0, "/* Created by VCGVisualizer */\n");
|
||||
println(0, "graph: {");
|
||||
println(1, "display_edge_labels: yes");
|
||||
println(1, "port_sharing: no");
|
||||
println(1, "manhattan_edges: yes");
|
||||
println(1, "straight_phase: yes");
|
||||
println(1, "priority_phase: yes");
|
||||
println(1, "node.color: white");
|
||||
println(1, "node.bordercolor: black");
|
||||
println(1, "node.textcolor: black");
|
||||
println(1, "node.shape: box");
|
||||
println(1, "node.textmode: left_justify");
|
||||
println(1, "edge.textcolor: black");
|
||||
println(1, "edge.color: black\n");
|
||||
}
|
||||
|
||||
public void finishGraph(Graph g) {
|
||||
println(0, "}");
|
||||
out.close();
|
||||
}
|
||||
|
||||
public void discoverVertex(Vertex v) {
|
||||
String label = convertString(v.toString(verbose));
|
||||
|
||||
println(1, "node: {");
|
||||
println(2, "title: \"" + v.getIdent() + "\"");
|
||||
println(2, "label: \"" + label + "\"");
|
||||
println(1, "}");
|
||||
}
|
||||
|
||||
public void finishVertex(Vertex v) {}
|
||||
|
||||
public void discoverEdge(Edge e) {
|
||||
int src = graph.getSource(e).getIdent();
|
||||
int target = graph.getTarget(e).getIdent();
|
||||
String label = convertString(e.toString(verbose));
|
||||
|
||||
println(1, "edge: {");
|
||||
println(2, "sourcename: \"" + src + "\"");
|
||||
println(2, "targetname: \"" + target + "\"");
|
||||
if(!label.equals(""))
|
||||
println(2, "label: \"" + label + "\"");
|
||||
println(1, "}");
|
||||
}
|
||||
|
||||
public void finishEdge(Edge e) {}
|
||||
|
||||
/**
|
||||
* Visualize graph g with this Visualizer.
|
||||
*
|
||||
* @param g graph to visualize
|
||||
* @param start node to start at
|
||||
*/
|
||||
public void visualize(Graph g, Vertex start) {
|
||||
new DFS(this).start(g, start);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Implements a simple first-in, first-out queue of vertices of fixed size.
|
||||
* Can be extended, e.g., to implement a priority queue, so that the traversal
|
||||
* order of the BFS algorithm may be influenced.
|
||||
*
|
||||
* @version $Id: VQueue.java,v 1.1 2001/11/12 16:05:20 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
*/
|
||||
public class VQueue {
|
||||
protected Vertex[] vertices;
|
||||
protected int left, right;
|
||||
|
||||
public VQueue(int s) {
|
||||
vertices = new Vertex[s];
|
||||
}
|
||||
|
||||
public void enqueue(Vertex v) { vertices[right++] = v; }
|
||||
public Vertex dequeue() { return vertices[left++]; }
|
||||
public Vertex head() { return vertices[left]; }
|
||||
public boolean empty() { return right <= left; }
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Implements a simple first-in, last-out stack of vertices of fixed size.
|
||||
*
|
||||
* @version $Id: VStack.java,v 1.1 2001/11/12 16:05:20 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
*/
|
||||
final class VStack {
|
||||
private Vertex[] vertices;
|
||||
private int top;
|
||||
|
||||
VStack(int s) {
|
||||
vertices = new Vertex[s];
|
||||
}
|
||||
|
||||
final void push(Vertex v) { vertices[top++] = v; }
|
||||
final Vertex pop() { return vertices[--top]; }
|
||||
final Vertex top() { return vertices[top - 1]; }
|
||||
final boolean empty() { return top <= 0; }
|
||||
}
|
||||
@@ -0,0 +1,192 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Describes a vertex of a graph.
|
||||
*
|
||||
* @version $Id: Vertex.java,v 1.1 2001/11/12 16:05:20 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
*/
|
||||
public class Vertex implements Cloneable, Constants, java.io.Serializable {
|
||||
private int ident; // unique number, i.e. identifier
|
||||
private static int counter; // produce default numbers
|
||||
|
||||
/** Useful variables for graph algorithms, calculated by DFS.
|
||||
* @see DFS
|
||||
*/
|
||||
private int dtime, ftime;
|
||||
private int color; // Color of vertex during traversal
|
||||
private Vertex pred; // Predecessor of vertex
|
||||
private int distance; // (Shortest) path to given root node (BFS)
|
||||
|
||||
/**
|
||||
* Create vertex with default identifier.
|
||||
*/
|
||||
public Vertex() {
|
||||
ident = counter++;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ident, i.e. identifier of this node
|
||||
*/
|
||||
public final int getIdent() { return ident; }
|
||||
|
||||
/**
|
||||
* @return number of created vertices
|
||||
*/
|
||||
public static final int getCounter() { return counter; }
|
||||
|
||||
/**
|
||||
* @return String representation.
|
||||
*/
|
||||
public String toString() {
|
||||
return toString(PLAIN);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param verbose toggle output format
|
||||
* @return String representation.
|
||||
*/
|
||||
public String toString(int verbose) {
|
||||
switch(verbose) {
|
||||
case VERBOSE: case TALKATIVE:
|
||||
return "Vertex(" + ident + ", pred=" +
|
||||
((pred == null)? "null" : ("" + pred.ident)) +
|
||||
", discovery=" + dtime + ", finishing=" + ftime +
|
||||
", distance=" + distance + ")";
|
||||
|
||||
case V_VERBOSE: case V_TALKATIVE:
|
||||
return "Vertex(" + ident + ")\npred=" +
|
||||
((pred == null)? "null" : ("" + pred.ident)) +
|
||||
"\ndiscovery=" + dtime + "\nfinishing=" + ftime +
|
||||
"\ndistance=" + distance;
|
||||
|
||||
case PLAIN: case V_PLAIN: default:
|
||||
return "Vertex(" + ident + ")";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Computed by DFS, BFS or other visitors
|
||||
* @see Visitor
|
||||
*/
|
||||
public int getDiscoveryTime() { return dtime; }
|
||||
|
||||
/**
|
||||
* Computed by DFS, BFS or other visitors
|
||||
* @see Visitor
|
||||
*/
|
||||
public int getFinishingTime() { return ftime; }
|
||||
|
||||
/**
|
||||
* Computed by DFS, BFS or other visitors
|
||||
* @see Visitor
|
||||
* @deprecated use Graph.getPredecessors
|
||||
*/
|
||||
public Vertex getPredecessor() { return pred; }
|
||||
|
||||
/**
|
||||
* Computed by DFS, BFS or other visitors
|
||||
* @see Visitor
|
||||
* @return distance from start vertex (No. edges in between)
|
||||
* @see BFSVisitor
|
||||
*/
|
||||
public int getDistance() { return distance; }
|
||||
|
||||
/**
|
||||
* May be set only by classes of this package, Visitor in particular.
|
||||
*/
|
||||
public void setDistance(int d) { distance = d; }
|
||||
public void setDiscoveryTime(int d) { dtime = d; }
|
||||
public void setFinishingTime(int f) { ftime = f; }
|
||||
public void setColor(int c) { color = c; }
|
||||
public int getColor() { return color; }
|
||||
public void setPredecessor(Vertex p) { pred = p; }
|
||||
|
||||
/**
|
||||
* Access for visitors
|
||||
*/
|
||||
public void accept(Visitor v) { v.discoverVertex(this); }
|
||||
|
||||
/**
|
||||
* @return deep copy
|
||||
*/
|
||||
public Vertex copy() {
|
||||
try {
|
||||
return (Vertex)clone();
|
||||
}
|
||||
catch(CloneNotSupportedException e) {}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/** Check for equality.
|
||||
*/
|
||||
public boolean equals(Object o) {
|
||||
if(!(o instanceof Vertex))
|
||||
return false;
|
||||
|
||||
Vertex v = (Vertex)o;
|
||||
return v.ident == ident;
|
||||
}
|
||||
|
||||
// private void readObject(java.io.ObjectInputStream in)
|
||||
// throws java.io.IOException, ClassNotFoundException
|
||||
// {
|
||||
// counter++; // Adjust counter, since a new object has been created
|
||||
// in.defaultReadObject();
|
||||
// }
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Interface for visitor patterns.
|
||||
*
|
||||
* @version $Id: Visitor.java,v 1.1 2001/11/12 16:05:20 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
*/
|
||||
public interface Visitor {
|
||||
public void discoverGraph(Graph g); // may be also used as "visitGraph"
|
||||
public void finishGraph(Graph g);
|
||||
|
||||
public void discoverVertex(Vertex v); // same as above
|
||||
public void finishVertex(Vertex v);
|
||||
|
||||
public void discoverEdge(Edge e); // same as above
|
||||
public void finishEdge(Edge e);
|
||||
|
||||
public void visit(Graph g, Vertex v); // Start visiting graph g beginning at start
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
package org.apache.commons.graph;
|
||||
|
||||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2001 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache BCEL" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache BCEL", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Describes an edge with a weight.
|
||||
*
|
||||
* @version $Id: WeightedEdge.java,v 1.1 2001/11/12 16:05:20 jvanzyl Exp $
|
||||
* @author <A HREF="http://www.inf.fu-berlin.de/~dahm">M. Dahm</A>
|
||||
*/
|
||||
public class WeightedEdge extends Edge {
|
||||
private int weight;
|
||||
|
||||
/**
|
||||
* Create edge with a weight.
|
||||
*/
|
||||
public WeightedEdge(int w) {
|
||||
weight = w;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param verbose toggle output format
|
||||
* @return String representation.
|
||||
*/
|
||||
public String toString(int verbose) {
|
||||
switch(verbose) {
|
||||
case TALKATIVE: case V_TALKATIVE:
|
||||
return "WeightedEdge(" + getIdent() + "\nweight=" + weight + ")";
|
||||
default:
|
||||
return "" + weight;
|
||||
}
|
||||
}
|
||||
|
||||
public void addToWeight(int w) { weight += w; }
|
||||
public void setWeight(int weight) { this.weight = weight; }
|
||||
public int getWeight() { return weight; }
|
||||
}
|
||||
Reference in new issue
Block a user