/*
* 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