package edu.stanford.nlp.graph;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Set;
/**
*
* @author Sonal Gupta
* @param <V> Type of the vertices
* @param <E> Type of the edges
*/
public interface Graph<V,E> extends Serializable {
/**
* Adds vertices (if not already in the graph) and the edge between them.
* (If the graph is undirected, the choice of which vertex to call
* source and dest is arbitrary.)
*
* @param source
* @param dest
* @param data
*/
public abstract void add(V source, V dest, E data);
/**
* For adding a zero degree vertex
*
* @param v
*/
public abstract boolean addVertex(V v);
public abstract boolean removeEdges(V source, V dest);
public abstract boolean removeEdge(V source, V dest, E data);
/**
* remove a vertex (and its edges) from the graph.
*
* @param vertex
* @return true if successfully removes the node
*/
public abstract boolean removeVertex(V vertex);
public abstract boolean removeVertices(Collection<V> vertices);
public abstract int getNumVertices();
/**
* for undirected graph, it is just the edges from the node
* @param v
*/
public abstract List<E> getOutgoingEdges(V v);
/**
* for undirected graph, it is just the edges from the node
* @param v
*/
public abstract List<E> getIncomingEdges(V v);
public abstract int getNumEdges();
/**
* for undirected graph, it is just the neighbors
* @param vertex
*/
public abstract Set<V> getParents(V vertex);
/**
* for undirected graph, it is just the neighbors
* @param vertex
*/
public abstract Set<V> getChildren(V vertex);
public abstract Set<V> getNeighbors(V v);
/**
* clears the graph, removes all edges and nodes
*/
public abstract void clear();
public abstract boolean containsVertex(V v);
/**
* only checks if there is an edge from source to dest. To check if it is
* connected in either direction, use isNeighbor
*
* @param source
* @param dest
*/
public abstract boolean isEdge(V source, V dest);
public abstract boolean isNeighbor(V source, V dest);
public abstract Set<V> getAllVertices();
public abstract List<E> getAllEdges();
/**
* False if there are any vertices in the graph, true otherwise. Does not care
* about the number of edges.
*/
public abstract boolean isEmpty();
/**
* Deletes nodes with zero incoming and zero outgoing edges
*/
public abstract void removeZeroDegreeNodes();
public abstract List<E> getEdges(V source, V dest);
/**
* for undirected graph, it should just be the degree
* @param vertex
*/
public abstract int getInDegree(V vertex);
public abstract int getOutDegree(V vertex);
public abstract List<Set<V>> getConnectedComponents();
}