def __init__(self, Q): """ Initialize ``self``. INPUT: - a :class:`~sage.graphs.digraph.DiGraph`. EXAMPLES: Note that usually a path semigroup is created using :meth:`sage.graphs.digraph.DiGraph.path_semigroup`. Here, we demonstrate the direct construction:: sage: Q = DiGraph({1:{2:['a','b'], 3:['c']}, 2:{3:['d']}}, immutable=True) sage: from sage.quivers.path_semigroup import PathSemigroup sage: P = PathSemigroup(Q) sage: P is DiGraph({1:{2:['a','b'], 3:['c']}, 2:{3:['d']}}).path_semigroup() # indirect doctest True sage: P Partial semigroup formed by the directed paths of Multi-digraph on 3 vertices While hardly of any use, it is possible to construct the path semigroup of an empty quiver (it is, of course, empty):: sage: D = DiGraph({}) sage: A = D.path_semigroup(); A Partial semigroup formed by the directed paths of Digraph on 0 vertices sage: A.list() [] """ ######### ## Verify that the graph labels are acceptable for this implementation ## # Check that edges are labelled with nonempty strings and don't begin # with 'e_' or contain '*' for x in Q.edge_labels(): if not isinstance(x, str) or x == '': raise ValueError( "edge labels of the digraph must be nonempty strings") if x[0:2] == 'e_': raise ValueError( "edge labels of the digraph must not begin with 'e_'") if x.find('*') != -1: raise ValueError( "edge labels of the digraph must not contain '*'") # Check validity of input: vertices have to be labelled 1,2,3,... and # edge labels must be unique for v in Q: if v not in ZZ: raise ValueError( "vertices of the digraph must be labelled by integers") if len(set(Q.edge_labels())) != Q.num_edges(): raise ValueError("edge labels of the digraph must be unique") nvert = len(Q.vertices()) ## Determine the category which this (partial) semigroup belongs to if Q.is_directed_acyclic() and not Q.has_loops(): cat = FiniteEnumeratedSets() else: cat = InfiniteEnumeratedSets() names = ['e_{0}'.format(v) for v in Q.vertices()] + [e[2] for e in Q.edges()] self._quiver = Q if nvert == 1: cat = cat.join([cat, Monoids()]) else: # TODO: Make this the category of "partial semigroups" cat = cat.join([cat, Semigroups()]) Parent.__init__(self, names=names, category=cat)
def __init__(self, Q): """ Initialize ``self``. INPUT: - a :class:`~sage.graphs.digraph.DiGraph`. EXAMPLES: Note that usually a path semigroup is created using :meth:`sage.graphs.digraph.DiGraph.path_semigroup`. Here, we demonstrate the direct construction:: sage: Q = DiGraph({1:{2:['a','b'], 3:['c']}, 2:{3:['d']}}, immutable=True) sage: from sage.quivers.path_semigroup import PathSemigroup sage: P = PathSemigroup(Q) sage: P is DiGraph({1:{2:['a','b'], 3:['c']}, 2:{3:['d']}}).path_semigroup() # indirect doctest True sage: P Partial semigroup formed by the directed paths of Multi-digraph on 3 vertices While hardly of any use, it is possible to construct the path semigroup of an empty quiver (it is, of course, empty):: sage: D = DiGraph({}) sage: A = D.path_semigroup(); A Partial semigroup formed by the directed paths of Digraph on 0 vertices sage: A.list() [] .. TODO:: When the graph has more than one edge, the proper category would be a "partial semigroup" or a "semigroupoid" but definitely not a semigroup! """ ######### ## Verify that the graph labels are acceptable for this implementation ## # Check that edges are labelled with nonempty strings and don't begin # with 'e_' or contain '*' labels = Q.edge_labels() if len(set(labels)) != len(labels): raise ValueError("edge labels of the digraph must be unique") for x in labels: if not isinstance(x, str) or x == '': raise ValueError("edge labels of the digraph must be nonempty strings") if x[0:2] == 'e_': raise ValueError("edge labels of the digraph must not begin with 'e_'") if x.find('*') != -1: raise ValueError("edge labels of the digraph must not contain '*'") # Check validity of input: vertices have to be labelled 1,2,3,... and # edge labels must be unique for v in Q: if not isinstance(v, integer_types + (Integer,)): raise ValueError("vertices of the digraph must be labelled by integers") ## Determine the category which this (partial) semigroup belongs to if Q.is_directed_acyclic(): cat = FiniteEnumeratedSets() else: cat = InfiniteEnumeratedSets() self._sorted_edges = tuple(sorted(Q.edges(), key=lambda x:x[2])) self._labels = tuple([x[2] for x in self._sorted_edges]) self._label_index = {s[2]: i for i,s in enumerate(self._sorted_edges)} self._nb_arrows = max(len(self._sorted_edges), 1) names = ['e_{0}'.format(v) for v in Q.vertices()] + list(self._labels) self._quiver = Q if Q.num_verts() == 1: cat = cat.join([cat,Monoids()]) else: cat = cat.join([cat,Semigroups()]) Parent.__init__(self, names=names, category=cat)
def __init__(self, Q): """ Initialize ``self``. INPUT: - a :class:`~sage.graphs.digraph.DiGraph`. EXAMPLES: Note that usually a path semigroup is created using :meth:`sage.graphs.digraph.DiGraph.path_semigroup`. Here, we demonstrate the direct construction:: sage: Q = DiGraph({1:{2:['a','b'], 3:['c']}, 2:{3:['d']}}, immutable=True) sage: from sage.quivers.path_semigroup import PathSemigroup sage: P = PathSemigroup(Q) sage: P is DiGraph({1:{2:['a','b'], 3:['c']}, 2:{3:['d']}}).path_semigroup() # indirect doctest True sage: P Partial semigroup formed by the directed paths of Multi-digraph on 3 vertices While hardly of any use, it is possible to construct the path semigroup of an empty quiver (it is, of course, empty):: sage: D = DiGraph({}) sage: A = D.path_semigroup(); A Partial semigroup formed by the directed paths of Digraph on 0 vertices sage: A.list() [] """ ######### ## Verify that the graph labels are acceptable for this implementation ## # Check that edges are labelled with nonempty strings and don't begin # with 'e_' or contain '*' for x in Q.edge_labels(): if not isinstance(x, str) or x == '': raise ValueError("edge labels of the digraph must be nonempty strings") if x[0:2] == 'e_': raise ValueError("edge labels of the digraph must not begin with 'e_'") if x.find('*') != -1: raise ValueError("edge labels of the digraph must not contain '*'") # Check validity of input: vertices have to be labelled 1,2,3,... and # edge labels must be unique for v in Q: if v not in ZZ: raise ValueError("vertices of the digraph must be labelled by integers") if len(set(Q.edge_labels())) != Q.num_edges(): raise ValueError("edge labels of the digraph must be unique") nvert = len(Q.vertices()) ## Determine the category which this (partial) semigroup belongs to if Q.is_directed_acyclic() and not Q.has_loops(): cat = FiniteEnumeratedSets() else: cat = InfiniteEnumeratedSets() names = ['e_{0}'.format(v) for v in Q.vertices()] + [e[2] for e in Q.edges()] self._quiver = Q if nvert == 1: cat = cat.join([cat,Monoids()]) else: # TODO: Make this the category of "partial semigroups" cat = cat.join([cat,Semigroups()]) Parent.__init__(self, names=names, category=cat)