/*
* Created on Oct 17, 2005
*
* Copyright (c) 2005, the JUNG Project and the Regents of the University
* of California
* All rights reserved.
*
* This software is open-source under the BSD license; see either
* "license.txt" or
* http://jung.sourceforge.net/license.txt for a description.
*/
package edu.uci.ics.jung.graph;
import java.util.Collection;
import edu.uci.ics.jung.graph.util.EdgeType;
import edu.uci.ics.jung.graph.util.Pair;
/**
* A graph consisting of a set of vertices of type V
* set and a set of edges of type E
. Edges of this
* graph type have exactly two endpoints; whether these endpoints
* must be distinct depends on the implementation.
*
* This interface permits, but does not enforce, any of the following * common variations of graphs: *
Definitions (with respect to a given vertex v
):
*
v
: an edge that can be traversed
* from a neighbor of v
to reach v
* outgoing edge of v
: an edge that can be traversed
* from v
to reach some neighbor of v
* predecessor of v
: a vertex at the other end of an
* incoming edge of v
* successor of v
: a vertex at the other end of an
* outgoing edge of v
*
* Collection
view of the incoming edges incident to vertex
* in this graph.
* @param vertex the vertex whose incoming edges are to be returned
* @return a Collection
view of the incoming edges incident
* to vertex
in this graph
*/
CollectionCollection
view of the outgoing edges incident to vertex
* in this graph.
* @param vertex the vertex whose outgoing edges are to be returned
* @return a Collection
view of the outgoing edges incident
* to vertex
in this graph
*/
CollectionCollection
view of the predecessors of vertex
* in this graph. A predecessor of vertex
is defined as a vertex v
* which is connected to
* vertex
by an edge e
, where e
is an outgoing edge of
* v
and an incoming edge of vertex
.
* @param vertex the vertex whose predecessors are to be returned
* @return a Collection
view of the predecessors of
* vertex
in this graph
*/
CollectionCollection
view of the successors of vertex
* in this graph. A successor of vertex
is defined as a vertex v
* which is connected to
* vertex
by an edge e
, where e
is an incoming edge of
* v
and an outgoing edge of vertex
.
* @param vertex the vertex whose predecessors are to be returned
* @return a Collection
view of the successors of
* vertex
in this graph
*/
Collectionvertex
.
* Equivalent to getInEdges(vertex).size()
.
* @param vertex the vertex whose indegree is to be calculated
* @return the number of incoming edges incident to vertex
*/
int inDegree(V vertex);
/**
* Returns the number of outgoing edges incident to vertex
.
* Equivalent to getOutEdges(vertex).size()
.
* @param vertex the vertex whose outdegree is to be calculated
* @return the number of outgoing edges incident to vertex
*/
int outDegree(V vertex);
/**
* Returns true
if v1
is a predecessor of v2
in this graph.
* Equivalent to v1.getPredecessors().contains(v2)
.
* @param v1 the first vertex to be queried
* @param v2 the second vertex to be queried
* @return true
if v1
is a predecessor of v2
, and false otherwise.
*/
boolean isPredecessor(V v1, V v2);
/**
* Returns true
if v1
is a successor of v2
in this graph.
* Equivalent to v1.getSuccessors().contains(v2)
.
* @param v1 the first vertex to be queried
* @param v2 the second vertex to be queried
* @return true
if v1
is a successor of v2
, and false otherwise.
*/
boolean isSuccessor(V v1, V v2);
/**
* Returns the number of predecessors that vertex
has in this graph.
* Equivalent to vertex.getPredecessors().size()
.
* @param vertex the vertex whose predecessor count is to be returned
* @return the number of predecessors that vertex
has in this graph
*/
int getPredecessorCount(V vertex);
/**
* Returns the number of successors that vertex
has in this graph.
* Equivalent to vertex.getSuccessors().size()
.
* @param vertex the vertex whose successor count is to be returned
* @return the number of successors that vertex
has in this graph
*/
int getSuccessorCount(V vertex);
/**
* If directed_edge
is a directed edge in this graph, returns the source;
* otherwise returns null
.
* The source of a directed edge d
is defined to be the vertex for which
* d
is an outgoing edge.
* directed_edge
is guaranteed to be a directed edge if
* its EdgeType
is DIRECTED
.
* @param directed_edge
* @return the source of directed_edge
if it is a directed edge in this graph, or null
otherwise
*/
V getSource(E directed_edge);
/**
* If directed_edge
is a directed edge in this graph, returns the destination;
* otherwise returns null
.
* The destination of a directed edge d
is defined to be the vertex
* incident to d
for which
* d
is an incoming edge.
* directed_edge
is guaranteed to be a directed edge if
* its EdgeType
is DIRECTED
.
* @param directed_edge
* @return the destination of directed_edge
if it is a directed edge in this graph, or null
otherwise
*/
V getDest(E directed_edge);
/**
* Returns true
if vertex
is the source of edge
.
* Equivalent to getSource(edge).equals(vertex)
.
* @param vertex the vertex to be queried
* @param edge the edge to be queried
* @return true
iff vertex
is the source of edge
*/
boolean isSource(V vertex, E edge);
/**
* Returns true
if vertex
is the destination of edge
.
* Equivalent to getDest(edge).equals(vertex)
.
* @param vertex the vertex to be queried
* @param edge the edge to be queried
* @return true
iff vertex
is the destination of edge
*/
boolean isDest(V vertex, E edge);
/**
* Adds edge e
to this graph such that it connects
* vertex v1
to v2
.
* Equivalent to addEdge(e, new Pair(v1, v2))
.
* If this graph does not contain v1
, v2
,
* or both, implementations may choose to either silently add
* the vertices to the graph or throw an IllegalArgumentException
.
* If this graph assigns edge types to its edges, the edge type of
* e
will be the default for this graph.
* See Hypergraph.addEdge()
for a listing of possible reasons
* for failure.
* @param e the edge to be added
* @param v1 the first vertex to be connected
* @param v2 the second vertex to be connected
* @return true
if the add is successful, false
otherwise
* @see Hypergraph#addEdge(Object, Collection)
* @see #addEdge(Object, Object, Object, EdgeType)
*/
boolean addEdge(E e, V v1, V v2);
/**
* Adds edge e
to this graph such that it connects
* vertex v1
to v2
.
* Equivalent to addEdge(e, new Pair(v1, v2))
.
* If this graph does not contain v1
, v2
,
* or both, implementations may choose to either silently add
* the vertices to the graph or throw an IllegalArgumentException
.
* If edgeType
is not legal for this graph, this method will
* throw IllegalArgumentException
.
* See Hypergraph.addEdge()
for a listing of possible reasons
* for failure.
* @param e the edge to be added
* @param v1 the first vertex to be connected
* @param v2 the second vertex to be connected
* @param edgeType the type to be assigned to the edge
* @return true
if the add is successful, false
otherwise
* @see Hypergraph#addEdge(Object, Collection)
* @see #addEdge(Object, Object, Object)
*/
boolean addEdge(E e, V v1, V v2, EdgeType edgeType);
/**
* Returns the endpoints of edge
as a Pair
.
* @param edge the edge whose endpoints are to be returned
* @return the endpoints (incident vertices) of edge
*/
Pairedge
from vertex
.
* (That is, returns the vertex incident to edge
which is not vertex
.)
* @param vertex the vertex to be queried
* @param edge the edge to be queried
* @return the vertex at the other end of edge
from vertex
*/
V getOpposite(V vertex, E edge);
}