Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
r""" Paths in Directed Acyclic Graphs """ #***************************************************************************** # Copyright (C) 2007 Mike Hansen <mhansen@gmail.com>, # # Distributed under the terms of the GNU General Public License (GPL) # # This code is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # The full text of the GPL is available at: # # http://www.gnu.org/licenses/ #***************************************************************************** from __future__ import absolute_import
from .combinat import CombinatorialClass import sage.graphs.digraph as digraph
def GraphPaths(g, source=None, target=None): """ Returns the combinatorial class of paths in the directed acyclic graph g.
EXAMPLES::
sage: G = DiGraph({1:[2,2,3], 2:[3,4], 3:[4], 4:[5,5]}, multiedges=True)
If source and target are not given, then the returned class contains all paths (including trivial paths containing only one vertex).
::
sage: p = GraphPaths(G); p Paths in Multi-digraph on 5 vertices sage: p.cardinality() 37 sage: p.random_element() [1, 2, 3, 4, 5]
If the source is specified, then the returned class contains all of the paths starting at the vertex source (including the trivial path).
::
sage: p = GraphPaths(G, source=3); p Paths in Multi-digraph on 5 vertices starting at 3 sage: p.list() [[3], [3, 4], [3, 4, 5], [3, 4, 5]]
If the target is specified, then the returned class contains all of the paths ending at the vertex target (including the trivial path).
::
sage: p = GraphPaths(G, target=3); p Paths in Multi-digraph on 5 vertices ending at 3 sage: p.cardinality() 5 sage: p.list() [[3], [1, 3], [2, 3], [1, 2, 3], [1, 2, 3]]
If both the target and source are specified, then the returned class contains all of the paths from source to target.
::
sage: p = GraphPaths(G, source=1, target=3); p Paths in Multi-digraph on 5 vertices starting at 1 and ending at 3 sage: p.cardinality() 3 sage: p.list() [[1, 2, 3], [1, 2, 3], [1, 3]]
Note that G must be a directed acyclic graph.
::
sage: G = DiGraph({1:[2,2,3,5], 2:[3,4], 3:[4], 4:[2,5,7], 5:[6]}, multiedges=True) sage: GraphPaths(G) Traceback (most recent call last): ... TypeError: g must be a directed acyclic graph """ raise TypeError("g must be a DiGraph")
raise ValueError("source must be in g") raise ValueError("target must be in g") else: raise ValueError("source must be in g") raise ValueError("target must be in g")
class GraphPaths_common: def outgoing_edges(self, v): """ Returns a list of v's outgoing edges.
EXAMPLES::
sage: G = DiGraph({1:[2,2,3], 2:[3,4], 3:[4], 4:[5,5]}, multiedges=True) sage: p = GraphPaths(G) sage: p.outgoing_edges(2) [(2, 3, None), (2, 4, None)] """
def incoming_edges(self, v): """ Returns a list of v's incoming edges.
EXAMPLES::
sage: G = DiGraph({1:[2,2,3], 2:[3,4], 3:[4], 4:[5,5]}, multiedges=True) sage: p = GraphPaths(G) sage: p.incoming_edges(2) [(1, 2, None), (1, 2, None)] """
def outgoing_paths(self, v): """ Returns a list of the paths that start at v.
EXAMPLES::
sage: G = DiGraph({1:[2,2,3], 2:[3,4], 3:[4], 4:[5,5]}, multiedges=True) sage: gp = GraphPaths(G) sage: gp.outgoing_paths(3) [[3], [3, 4], [3, 4, 5], [3, 4, 5]] sage: gp.outgoing_paths(2) [[2], [2, 3], [2, 3, 4], [2, 3, 4, 5], [2, 3, 4, 5], [2, 4], [2, 4, 5], [2, 4, 5]] """
def incoming_paths(self, v): """ Returns a list of paths that end at v.
EXAMPLES::
sage: G = DiGraph({1:[2,2,3], 2:[3,4], 3:[4], 4:[5,5]}, multiedges=True) sage: gp = GraphPaths(G) sage: gp.incoming_paths(2) [[2], [1, 2], [1, 2]] """
def paths_from_source_to_target(self, source, target): """ Returns a list of paths from source to target.
EXAMPLES::
sage: G = DiGraph({1:[2,2,3], 2:[3,4], 3:[4], 4:[5,5]}, multiedges=True) sage: gp = GraphPaths(G) sage: gp.paths_from_source_to_target(2,4) [[2, 3, 4], [2, 4]] """
def paths(self): """ Returns a list of all the paths of self.
EXAMPLES::
sage: G = DiGraph({1:[2,2,3], 2:[3,4], 3:[4], 4:[5,5]}, multiedges=True) sage: gp = GraphPaths(G) sage: len(gp.paths()) 37 """
class GraphPaths_all(CombinatorialClass, GraphPaths_common): """ EXAMPLES::
sage: G = DiGraph({1:[2,2,3], 2:[3,4], 3:[4], 4:[5,5]}, multiedges=True) sage: p = GraphPaths(G) sage: p.cardinality() 37 """ def __init__(self, g): """ TESTS::
sage: G = DiGraph({1:[2,2,3], 2:[3,4], 3:[4], 4:[5,5]}, multiedges=True) sage: p = GraphPaths(G) sage: p == loads(dumps(p)) True """
def __repr__(self): """ TESTS::
sage: G = DiGraph({1:[2,2,3], 2:[3,4], 3:[4], 4:[5,5]}, multiedges=True) sage: p = GraphPaths(G) sage: repr(p) 'Paths in Multi-digraph on 5 vertices' """
def list(self): """ Returns a list of the paths of self.
EXAMPLES::
sage: G = DiGraph({1:[2,2,3], 2:[3,4], 3:[4], 4:[5,5]}, multiedges=True) sage: len(GraphPaths(G).list()) 37 """
class GraphPaths_t(CombinatorialClass, GraphPaths_common): def __init__(self, g, target): """ TESTS::
sage: G = DiGraph({1:[2,2,3], 2:[3,4], 3:[4], 4:[5,5]}, multiedges=True) sage: p = GraphPaths(G, target=4) sage: p == loads(dumps(p)) True """
def __repr__(self): """ TESTS::
sage: G = DiGraph({1:[2,2,3], 2:[3,4], 3:[4], 4:[5,5]}, multiedges=True) sage: p = GraphPaths(G, target=4) sage: repr(p) 'Paths in Multi-digraph on 5 vertices ending at 4' """
def list(self): """ EXAMPLES::
sage: G = DiGraph({1:[2,2,3], 2:[3,4], 3:[4], 4:[5,5]}, multiedges=True) sage: p = GraphPaths(G, target=4) sage: p.list() [[4], [2, 4], [1, 2, 4], [1, 2, 4], [3, 4], [1, 3, 4], [2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]] """
class GraphPaths_s(CombinatorialClass, GraphPaths_common): def __init__(self, g, source): """ TESTS::
sage: G = DiGraph({1:[2,2,3], 2:[3,4], 3:[4], 4:[5,5]}, multiedges=True) sage: p = GraphPaths(G, 4) sage: p == loads(dumps(p)) True """
def __repr__(self): """ TESTS::
sage: G = DiGraph({1:[2,2,3], 2:[3,4], 3:[4], 4:[5,5]}, multiedges=True) sage: p = GraphPaths(G, 4) sage: repr(p) 'Paths in Multi-digraph on 5 vertices starting at 4' """
def list(self): """ EXAMPLES::
sage: G = DiGraph({1:[2,2,3], 2:[3,4], 3:[4], 4:[5,5]}, multiedges=True) sage: p = GraphPaths(G, 4) sage: p.list() [[4], [4, 5], [4, 5]] """
class GraphPaths_st(CombinatorialClass, GraphPaths_common): """ EXAMPLES::
sage: G = DiGraph({1:[2,2,3], 2:[3,4], 3:[4], 4:[5,5]}, multiedges=True) sage: GraphPaths(G,1,2).cardinality() 2 sage: GraphPaths(G,1,3).cardinality() 3 sage: GraphPaths(G,1,4).cardinality() 5 sage: GraphPaths(G,1,5).cardinality() 10 sage: GraphPaths(G,2,3).cardinality() 1 sage: GraphPaths(G,2,4).cardinality() 2 sage: GraphPaths(G,2,5).cardinality() 4 sage: GraphPaths(G,3,4).cardinality() 1 sage: GraphPaths(G,3,5).cardinality() 2 sage: GraphPaths(G,4,5).cardinality() 2 """ def __init__(self, g, source, target): """ TESTS::
sage: G = DiGraph({1:[2,2,3], 2:[3,4], 3:[4], 4:[5,5]}, multiedges=True) sage: p = GraphPaths(G,1,2) sage: p == loads(dumps(p)) True """
def __repr__(self): """ TESTS::
sage: G = DiGraph({1:[2,2,3], 2:[3,4], 3:[4], 4:[5,5]}, multiedges=True) sage: p = GraphPaths(G,1,2) sage: repr(p) 'Paths in Multi-digraph on 5 vertices starting at 1 and ending at 2' """
def list(self): """ EXAMPLES::
sage: G = DiGraph({1:[2,2,3], 2:[3,4], 3:[4], 4:[5,5]}, multiedges=True) sage: p = GraphPaths(G,1,2) sage: p.list() [[1, 2], [1, 2]] """ |