# -*- python -*-
# -*- coding: utf-8 -*-
#
# Graph : graph package
#
# Copyright or Copr. 2006 INRIA - CIRAD - INRA
#
# File author(s): Jerome Chopard <jerome.chopard@sophia.inria.fr>
#
# Distributed under the Cecill-C License.
# See accompanying file LICENSE.txt or copy at
# http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html
#
# VPlants WebSite : https://gforge.inria.fr/projects/vplants/
#
__doc__="""
This module provide a set of graph concepts to form a graph interface
"""
__license__= "Cecill-C"
__revision__=" $Id$ "
[docs]class GraphError(Exception):
"""
base class of all graph exceptions
"""
[docs]class InvalidEdge (GraphError, KeyError) :
"""
exception raised when a wrong edge id is provided
"""
[docs]class InvalidVertex (GraphError, KeyError) :
"""
exception raised when a wrong vertex id is provided
"""
[docs]class IGraph (object):
"""
Directed graph definition
"""
[docs] def source(self, eid):
"""
retrieve the source of an edge
:param eid: id of the edge
:type eid: eid
:rtype: vid
"""
raise NotImplementedError
[docs] def target(self, eid):
"""
retrieve the target of an edge
:param eid: id of the edge
:type eid: eid
:rtype: vid
"""
raise NotImplementedError
[docs] def edge_vertices(self, eid):
"""
retrieve the target and source of an edge
:param eid: id of the edge
:type eid: eid
:rtype: (vid,vid)
"""
raise NotImplementedError
[docs] def edge(self, source, target) :
"""
find the matching edges with same source and same target
return None if it don't succeed
:Parameters:
- `source` : id of the source vertex
- `target` : id of the target vertex
:Types:
- `source` : vid
- `target` : vid
:rtype: eid|iter of eid|None
"""
raise NotImplementedError
def __contains__(self, vid):
"""
test wether a vertex belong to the graph, see `has_vertex`
:param vid: vertex id to test
:type vid: vid
:rtype: bool
"""
raise NotImplementedError
[docs] def has_vertex(self,vid):
"""
test wether a vertex belong to the graph
:param vid: vertex id to test
:type vid: vid
:rtype: bool
"""
raise NotImplementedError
[docs] def has_edge(self,eid):
"""
test wether an edge belong to the graph
:param eid: edge id to test
:type eid: eid
:rtype: bool
"""
raise NotImplementedError
[docs] def is_valid(self):
"""
test the validity of the graph
:rtype: bool
"""
raise NotImplementedError
[docs]class IVertexListGraph (object) :
"""
interface of a graph seen as a vertex list
"""
[docs] def vertices(self):
"""
iterator on vertices
:rtype: iter of vid
"""
raise NotImplementedError
def __iter__ (self) :
"""
magic function for `vertices`
:rtype: iter of vid
"""
raise NotImplementedError
[docs] def nb_vertices(self):
"""
return the total number of vertices
:rtype: int
"""
raise NotImplementedError
def __len__(self):
"""
magic function for `nb_vertices`
:rtype: int
"""
raise NotImplementedError
[docs] def in_neighbors(self, vid):
"""
iterator on the neighbors of vid
where edges are directed from neighbor to vid
:param vid: id of the reference vertex
:type vid: vid
:rtype: iter of vid
"""
raise NotImplementedError
[docs] def out_neighbors(self, vid):
"""
iterator on the neighbors of vid
where edges are directed from vid to neighbor
:param vid: id of the reference vertex
:type vid: vid
:rtype: iter of vid
"""
raise NotImplementedError
[docs] def neighbors(self, vid):
"""
iterator on the neighbors of vid
regardless of the orientation of the edge
:param vid: id of the reference vertex
:type vid: vid
:rtype: iter of vid
"""
raise NotImplementedError
[docs] def nb_in_neighbors(self, vid):
"""
number of neighbors such as edges are directed from neighbor to vid
:param vid: id of the reference vertex
:type vid: vid
:rtype: int
"""
raise NotImplementedError
[docs] def nb_out_neighbors(self, vid):
"""
number of neighbors such as edges are directed from vid to neighbor
:param vid: id of the reference vertex
:type vid: vid
:rtype: int
"""
raise NotImplementedError
[docs] def nb_neighbors(self, vid):
"""
number of neighbors regardless of the orientation of the edge
:param vid: id of the reference vertex
:type vid: vid
:rtype: int
"""
raise NotImplementedError
[docs]class IEdgeListGraph (object) :
"""
Definition of a graph seen as a list of edges
"""
[docs] def edges(self, vid= None):
"""
retrieve the edges linked to a specified vertex,
all if vid is None
:param vid: id of the reference vertex, default=None
:type vid: vid
:rtype: iter of eid
"""
raise NotImplementedError
[docs] def nb_edges(self, vid= None):
"""
number of edges linked to a specified vertex,
total number if vid is None
:param vid: id of the reference vertex, default=None
:type vid: vid
:rtype: iter of eid
"""
raise NotImplementedError
[docs] def in_edges(self, vid):
"""
retrieve the edges linked to a specified vertex,
oriented inside the vertex
:param vid: id of the reference vertex, default=None
:type vid: vid
:rtype: iter of eid
"""
raise NotImplementedError
[docs] def out_edges(self, vid):
"""
retrieve the edges linked to a specified vertex,
oriented outside the vertex
:param vid: id of the reference vertex, default=None
:type vid: vid
:rtype: iter of eid
"""
raise NotImplementedError
[docs] def nb_in_edges(self, vid):
"""
number of edges linked to a specified vertex,
oriented inside vertex
:param vid: id of the reference vertex, default=None
:type vid: vid
:rtype: iter of eid
"""
raise NotImplementedError
[docs] def nb_out_edges(self, vid):
"""
number of edges linked to a specified vertex,
oriented outside vertex
:param vid: id of the reference vertex, default=None
:type vid: vid
:rtype: iter of eid
"""
raise NotImplementedError
[docs]class IMutableVertexGraph (object) :
"""
definition of graph edition methods for vertices
"""
[docs] def add_vertex(self, vid=None):
"""
add a vertex to the graph, if vid is not provided create a new vid
:param vid: the id of the vertex to add, default=None
:type vid: vid
:return: the id of the created vertex
:rtype: vid
"""
raise NotImplementedError
[docs] def remove_vertex(self, vid):
"""
remove a specified vertex of the graph
remove all the edges attached to it
:param vid: the id of the vertex to remove
:type vid: vid
"""
raise NotImplementedError
[docs] def clear(self):
"""
remove all vertices and edges
don't change references to objects
"""
raise NotImplementedError
[docs]class IMutableEdgeGraph (object) :
"""
definition of graph edition methods for edges
"""
[docs] def add_edge(self, edge= (None,None), eid= None):
"""
add an edge to the graph, if eid is not provided create a new eid
:Parameters:
- `edge` : a tuple (vertex source,vertex target)
- `eid` : the id of the created edge
:Types:
- `edge` : (vid,vid)
- `eid` : eid
:return: the id of the newly created edge
:rtype: eid
"""
raise NotImplementedError
[docs] def remove_edge(self,eid):
"""
remove a specified edge from the graph
:param eid: id of the edge to remove
:type eid: eid
"""
raise NotImplementedError
[docs] def clear_edges(self):
"""
remove all the edges of the graph
don't change references to objects
"""
raise NotImplementedError
[docs]class IExtendGraph (object) :
"""
allow the graph to be extended by another graph
"""
[docs] def extend(self, graph):
"""
add the specified graph to self, create new vid and eid
:param graph: the graph to add
:type graph: Graph
:return: two dictionnary specifying correspondence between graph id and self id
:rtype: ({vid:vid},{eid:eid})
"""
raise NotImplementedError
[docs]class ICopyGraph (object) :
"""
allow the graph to be copied
"""
[docs] def copy(self):
"""
make a shallow copy of the graph,
for a deep copy use the constructor `__init__`
"""
raise NotImplementedError
[docs]class IRootedGraph(object):
"""
definition of graph with a root vertex.
"""
[docs] def set_root(self, vtx_id):
""" Set the graph root.
:param vtx_id: The vertex identifier.
"""
raise NotImplementedError
[docs] def get_root(self):
""" Return the graph root.
:returns: vertex identifier
"""
raise NotImplementedError
root = property( get_root, set_root )