/*
* 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;
/**
* A hypergraph, consisting of a set of vertices of type V
* and a set of hyperedges of type E
which connect the vertices.
* This is the base interface for all JUNG graph types.
*
* This interface permits, but does not enforce, any of the following * common variations of graphs: *
Notes: *
Hypergraph
instances
* should be treated in general as if read-only. While they are not contractually
* guaranteed (or required) to be immutable,
* this interface does not define the outcome if they are mutated.
* Mutations should be done via {add,remove}{Edge,Vertex}
, or
* in the constructor.
*
* Collection
contract, and therefore makes no guarantees
* about the ordering of the vertices within the set.
* @return a Collection
view of all edges in this graph
*/
CollectionCollection
contract, and therefore makes no guarantees
* about the ordering of the vertices within the set.
* @return a Collection
view of all vertices in this graph
*/
Collectionvertex
.
* Equivalent to getVertices().contains(vertex)
.
* @param vertex the vertex whose presence is being queried
* @return true iff this graph contains a vertex vertex
*/
boolean containsVertex(V vertex);
/**
* Returns true if this graph's edge collection contains edge
.
* Equivalent to getEdges().contains(edge)
.
* @param edge the edge whose presence is being queried
* @return true iff this graph contains an edge edge
*/
boolean containsEdge(E edge);
/**
* Returns the number of edges in this graph.
* @return the number of edges in this graph
*/
int getEdgeCount();
/**
* Returns the number of vertices in this graph.
* @return the number of vertices in this graph
*/
int getVertexCount();
/**
* Returns the collection of vertices which are connected to vertex
* via any edges in this graph.
* If vertex
is connected to itself with a self-loop, then
* it will be included in the collection returned.
*
* @param vertex the vertex whose neighbors are to be returned
* @return the collection of vertices which are connected to vertex
,
* or null
if vertex
is not present
*/
Collectionvertex
.
*
* @param vertex the vertex whose incident edges are to be returned
* @return the collection of edges which are connected to vertex
,
* or null
if vertex
is not present
*/
Collectionedge
.
* Note that for some graph types there are guarantees about the size of this collection
* (i.e., some graphs contain edges that have exactly two endpoints, which may or may
* not be distinct). Implementations for those graph types may provide alternate methods
* that provide more convenient access to the vertices.
*
* @param edge the edge whose incident vertices are to be returned
* @return the collection of vertices which are connected to edge
,
* or null
if edge
is not present
*/
Collectionv
.
* If this edge is not uniquely
* defined (that is, if the graph contains more than one edge connecting
* v1
to v2
), any of these edges
* may be returned. findEdgeSet(v1, v2)
may be
* used to return all such edges.
* Returns null if either of the following is true:
* v2
is not connected to v1
* either v1
or v2
are not present in this graph
* Note: for purposes of this method, v1
is only considered to be connected to
* v2
via a given directed edge e
if
* v1 == e.getSource() && v2 == e.getDest()
evaluates to true
.
* (v1
and v2
are connected by an undirected edge u
if
* u
is incident to both v1
and v2
.)
*
* @return an edge that connects v1
to v2
,
* or null
if no such edge exists (or either vertex is not present)
* @see Hypergraph#findEdgeSet(Object, Object)
*/
E findEdge(V v1, V v2);
/**
* Returns all edges that connects this vertex to v
.
* If this edge is not uniquely
* defined (that is, if the graph contains more than one edge connecting
* v1
to v2
), any of these edges
* may be returned. findEdgeSet(v1, v2)
may be
* used to return all such edges.
* Returns null if v2
is not connected to v1
.
*
Returns an empty collection if either v1
or v2
are not present in this graph.
*
*
Note: for purposes of this method, Fails under the following circumstances:
* Equivalent to Equivalent to Equivalent to v1
is only considered to be connected to
* v2
via a given directed edge d
if
* v1 == d.getSource() && v2 == d.getDest()
evaluates to true
.
* (v1
and v2
are connected by an undirected edge u
if
* u
is incident to both v1
and v2
.)
*
* @return a collection containing all edges that connect v1
to v2
,
* or null
if either vertex is not present
* @see Hypergraph#findEdge(Object, Object)
*/
Collectionvertex
to this graph.
* Fails if vertex
is null or already in the graph.
*
* @param vertex the vertex to add
* @return true
if the add is successful, and false
otherwise
* @throws IllegalArgumentException if vertex
is null
*/
boolean addVertex(V vertex);
/**
* Adds edge
to this graph.
* Fails under the following circumstances:
*
*
*
* @param edge
* @param vertices
* @return edge
is already an element of the graph
* either edge
or vertices
is null
* vertices
has the wrong number of vertices for the graph type
* vertices
are already connected by another edge in this graph,
* and this graph does not accept parallel edges
* true
if the add is successful, and false
otherwise
* @throws IllegalArgumentException if edge
or vertices
is null,
* or if a different vertex set in this graph is already connected by edge
,
* or if vertices
are not a legal vertex set for edge
*/
boolean addEdge(E edge, Collection extends V> vertices);
/**
* Adds edge
to this graph with type edge_type
.
* Fails under the following circumstances:
*
*
*
* @param edge
* @param vertices
* @return edge
is already an element of the graph
* either edge
or vertices
is null
* vertices
has the wrong number of vertices for the graph type
* vertices
are already connected by another edge in this graph,
* and this graph does not accept parallel edges
* edge_type
is not legal for this graph
* true
if the add is successful, and false
otherwise
* @throws IllegalArgumentException if edge
or vertices
is null,
* or if a different vertex set in this graph is already connected by edge
,
* or if vertices
are not a legal vertex set for edge
*/
boolean addEdge(E edge, Collection extends V> vertices, EdgeType
edge_type);
/**
* Removes vertex
from this graph.
* As a side effect, removes any edges e
incident to vertex
if the
* removal of vertex
would cause e
to be incident to an illegal
* number of vertices. (Thus, for example, incident hyperedges are not removed, but
* incident edges--which must be connected to a vertex at both endpoints--are removed.)
*
*
*
*
* @param vertex the vertex to remove
* @return vertex
is not an element of this graph
* vertex
is null
* true
if the removal is successful, false
otherwise
*/
boolean removeVertex(V vertex);
/**
* Removes edge
from this graph.
* Fails if edge
is null, or is otherwise not an element of this graph.
*
* @param edge the edge to remove
* @return true
if the removal is successful, false
otherwise
*/
boolean removeEdge(E edge);
/**
* Returns true
if v1
and v2
share an incident edge.
* Equivalent to getNeighbors(v1).contains(v2)
.
*
* @param v1 the first vertex to test
* @param v2 the second vertex to test
* @return true
if v1
and v2
share an incident edge
*/
boolean isNeighbor(V v1, V v2);
/**
* Returns true
if vertex
and edge
* are incident to each other.
* Equivalent to getIncidentEdges(vertex).contains(edge)
and to
* getIncidentVertices(edge).contains(vertex)
.
* @param vertex
* @param edge
* @return true
if vertex
and edge
* are incident to each other
*/
boolean isIncident(V vertex, E edge);
/**
* Returns the number of edges incident to vertex
.
* Special cases of interest:
*
* Incident self-loops are counted once.
*
* getNeighborCount
).
* getIncidentEdges(vertex).size()
.
*
* @param vertex the vertex whose degree is to be returned
* @return the degree of this node
* @see Hypergraph#getNeighborCount(Object)
*/
int degree(V vertex);
/**
* Returns the number of vertices that are adjacent to vertex
* (that is, the number of vertices that are incident to edges in vertex
's
* incident edge set).
*
* getNeighbors(vertex).size()
.
* @param vertex the vertex whose neighbor count is to be returned
* @return the number of neighboring vertices
*/
int getNeighborCount(V vertex);
/**
* Returns the number of vertices that are incident to edge
.
* For hyperedges, this can be any nonnegative integer; for edges this
* must be 2 (or 1 if self-loops are permitted).
*
* getIncidentVertices(edge).size()
.
* @param edge the edge whose incident vertex count is to be returned
* @return the number of vertices that are incident to edge
.
*/
int getIncidentCount(E edge);
/**
* Returns the edge type of edge
in this graph.
* @param edge
* @return the EdgeType
of edge
, or null
if edge
has no defined type
*/
EdgeType getEdgeType(E edge);
/**
* Returns the default edge type for this graph.
*
* @return the default edge type for this graph
*/
EdgeType getDefaultEdgeType();
/**
* Returns the collection of edges in this graph which are of type edge_type
.
* @param edge_type the type of edges to be returned
* @return the collection of edges which are of type edge_type
, or
* null
if the graph does not accept edges of this type
* @see EdgeType
*/
Collectionedge_type
in this graph.
* @param edge_type the type of edge for which the count is to be returned
* @return the number of edges of type edge_type
in this graph
*/
int getEdgeCount(EdgeType edge_type);
/**
* Returns a 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
*/
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);
/**
* 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 a Collection
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
*/
Collection