Gammoids¶
Let \(D\) be a directed graph and let \(E\) and \(T\) be not necessarily disjoint sets of vertices of \(D\). Say a subset \(X\) of \(E\) is in a collection \(I\) if \(X\) can be linked into a subset of \(T\). This defines a gammoid \((E, I)\), where \(E\) is the groundset of a matroid and \(I\) is its independent sets.
Some authors use a reverse convention, where instead of a set \(T\) of roots, they have a starting set \(S\) that is linked into subsets of \(E\). Here we use the convention that the vertices \(T\) are at the end of the directed paths, not the beginning.
To construct a gammoid, first import Gammoid from
sage.matroids.gammoid
.
A digraph and a list of roots from the vertex set are required for input:
sage: from sage.matroids.gammoid import *
sage: edgelist = [(0,1),(1,2),(2,3),(3,4)]
sage: D = DiGraph(edgelist)
sage: M = Gammoid(D, roots=[4]); M
Gammoid of rank 1 on 5 elements
sage: N = Gammoid(D, roots=[4], groundset=range(1,5)); N
Gammoid of rank 1 on 4 elements
sage: M.delete(0) == N
True
sage: N.is_isomorphic(matroids.Uniform(1,4))
True
sage: O = Gammoid(D, roots=[3]); O
Gammoid of rank 1 on 5 elements
sage: O.rank([0])
1
sage: O.rank([4])
0
>>> from sage.all import *
>>> from sage.matroids.gammoid import *
>>> edgelist = [(Integer(0),Integer(1)),(Integer(1),Integer(2)),(Integer(2),Integer(3)),(Integer(3),Integer(4))]
>>> D = DiGraph(edgelist)
>>> M = Gammoid(D, roots=[Integer(4)]); M
Gammoid of rank 1 on 5 elements
>>> N = Gammoid(D, roots=[Integer(4)], groundset=range(Integer(1),Integer(5))); N
Gammoid of rank 1 on 4 elements
>>> M.delete(Integer(0)) == N
True
>>> N.is_isomorphic(matroids.Uniform(Integer(1),Integer(4)))
True
>>> O = Gammoid(D, roots=[Integer(3)]); O
Gammoid of rank 1 on 5 elements
>>> O.rank([Integer(0)])
1
>>> O.rank([Integer(4)])
0
AUTHORS:
Zachary Gershkoff (2017-08-25): initial version
- class sage.matroids.gammoid.Gammoid(D, roots, groundset=None)[source]¶
Bases:
Matroid
The gammoid class.
INPUT:
D
– a loopless digraph representing the gammoidroots
– a subset of the verticesgroundset
– (optional) a subset of the vertices
OUTPUT:
Gammoid
; ifgroundset
is not specified, the entire vertex set is used (and the gammoid will be strict)EXAMPLES:
sage: from sage.matroids.gammoid import Gammoid sage: D = digraphs.TransitiveTournament(5) sage: M = Gammoid(D, roots=[3, 4]); M Gammoid of rank 2 on 5 elements sage: M.is_isomorphic(matroids.Uniform(2, 5)) True sage: D.add_vertex(6) sage: N = Gammoid(D, roots=[3, 4]) sage: N.loops() frozenset({6}) sage: O = Gammoid(D, roots=[3, 4, 6]) sage: O.coloops() frozenset({6}) sage: O.full_rank() 3 sage: P = Gammoid(D, roots=[3, 4], groundset=[0, 2, 3]); P Gammoid of rank 2 on 3 elements
>>> from sage.all import * >>> from sage.matroids.gammoid import Gammoid >>> D = digraphs.TransitiveTournament(Integer(5)) >>> M = Gammoid(D, roots=[Integer(3), Integer(4)]); M Gammoid of rank 2 on 5 elements >>> M.is_isomorphic(matroids.Uniform(Integer(2), Integer(5))) True >>> D.add_vertex(Integer(6)) >>> N = Gammoid(D, roots=[Integer(3), Integer(4)]) >>> N.loops() frozenset({6}) >>> O = Gammoid(D, roots=[Integer(3), Integer(4), Integer(6)]) >>> O.coloops() frozenset({6}) >>> O.full_rank() 3 >>> P = Gammoid(D, roots=[Integer(3), Integer(4)], groundset=[Integer(0), Integer(2), Integer(3)]); P Gammoid of rank 2 on 3 elements
- digraph()[source]¶
Return the digraph associated with the gammoid.
EXAMPLES:
sage: from sage.matroids.gammoid import Gammoid sage: edgelist = [(0, 4), (0, 5), (1, 0), (1, 4), (2, 0), (2, 1), (2, 3), ....: (2, 6), (3, 4), (3, 5), (4, 0), (5, 2), (6, 5)] sage: D = DiGraph(edgelist) sage: M = Gammoid(D, roots=[4, 5, 6]) sage: M.digraph() == D True
>>> from sage.all import * >>> from sage.matroids.gammoid import Gammoid >>> edgelist = [(Integer(0), Integer(4)), (Integer(0), Integer(5)), (Integer(1), Integer(0)), (Integer(1), Integer(4)), (Integer(2), Integer(0)), (Integer(2), Integer(1)), (Integer(2), Integer(3)), ... (Integer(2), Integer(6)), (Integer(3), Integer(4)), (Integer(3), Integer(5)), (Integer(4), Integer(0)), (Integer(5), Integer(2)), (Integer(6), Integer(5))] >>> D = DiGraph(edgelist) >>> M = Gammoid(D, roots=[Integer(4), Integer(5), Integer(6)]) >>> M.digraph() == D True
- digraph_plot()[source]¶
Plot the graph with color-coded vertices.
Vertices that are elements but not roots will be shown as blue. Vertices that are roots but not elements are red. Vertices that are both are pink, and vertices that are neither are grey.
EXAMPLES:
sage: from sage.matroids.gammoid import Gammoid sage: D = digraphs.TransitiveTournament(4) sage: M = Gammoid(D, roots=[2, 3]) sage: M.digraph_plot() Graphics object consisting of 11 graphics primitives
>>> from sage.all import * >>> from sage.matroids.gammoid import Gammoid >>> D = digraphs.TransitiveTournament(Integer(4)) >>> M = Gammoid(D, roots=[Integer(2), Integer(3)]) >>> M.digraph_plot() Graphics object consisting of 11 graphics primitives
- gammoid_extension(vertex, neighbors=[])[source]¶
Return a gammoid extended by an element.
The new element can be a vertex of the digraph that is not in the starting set, or it can be a new source vertex.
INPUT:
vertex
– a vertex of the gammoid’s digraph that is not already in the groundset, or a new vertexneighbors
– (optional) a set of vertices of the digraph
OUTPUT:
A
Gammoid
. Ifvertex
is not already in the graph, then the new vertex will be have edges toneighbors
. The new vertex will have in degree \(0\) regardless of whether or notneighbors
is specified.EXAMPLES:
sage: from sage.matroids.gammoid import Gammoid sage: edgedict = {1: [2], 2: [3], 4: [1, 5], 5: [2, 3, 8], ....: 6: [4, 7], 7: [5, 8]} sage: D = DiGraph(edgedict) sage: M = Gammoid(D, roots=[2, 3, 4], groundset=range(2, 9)) sage: M1 = M.gammoid_extension(1) sage: M1.groundset() frozenset({1, 2, 3, 4, 5, 6, 7, 8}) sage: N = Gammoid(D, roots=[2, 3, 4]) sage: M1 == N True sage: M1.delete(1) Gammoid of rank 3 on 7 elements sage: M == M1.delete(1) True sage: M2 = M.gammoid_extension(9); sorted(M2.loops()) [8, 9] sage: M4 = M.gammoid_extension(9, [1, 2, 3]) sage: M4.digraph().neighbors_out(9) [1, 2, 3] sage: M4.digraph().neighbors_in(9) []
>>> from sage.all import * >>> from sage.matroids.gammoid import Gammoid >>> edgedict = {Integer(1): [Integer(2)], Integer(2): [Integer(3)], Integer(4): [Integer(1), Integer(5)], Integer(5): [Integer(2), Integer(3), Integer(8)], ... Integer(6): [Integer(4), Integer(7)], Integer(7): [Integer(5), Integer(8)]} >>> D = DiGraph(edgedict) >>> M = Gammoid(D, roots=[Integer(2), Integer(3), Integer(4)], groundset=range(Integer(2), Integer(9))) >>> M1 = M.gammoid_extension(Integer(1)) >>> M1.groundset() frozenset({1, 2, 3, 4, 5, 6, 7, 8}) >>> N = Gammoid(D, roots=[Integer(2), Integer(3), Integer(4)]) >>> M1 == N True >>> M1.delete(Integer(1)) Gammoid of rank 3 on 7 elements >>> M == M1.delete(Integer(1)) True >>> M2 = M.gammoid_extension(Integer(9)); sorted(M2.loops()) [8, 9] >>> M4 = M.gammoid_extension(Integer(9), [Integer(1), Integer(2), Integer(3)]) >>> M4.digraph().neighbors_out(Integer(9)) [1, 2, 3] >>> M4.digraph().neighbors_in(Integer(9)) []
- gammoid_extensions(vertices=None)[source]¶
Return an iterator of Gammoid extensions.
This will only consider extensions from vertices that are already present in the digraph.
INPUT:
vertices
– (optional) a list of vertices not in the digraph
OUTPUT:
An iterator of Gammoids. If
vertices
is not specified, every vertex not already in the groundset will be considered.EXAMPLES:
sage: from sage.matroids.gammoid import Gammoid sage: M = Gammoid(digraphs.TransitiveTournament(5), roots=[3, 4], ....: groundset=[0, 1, 4]) sage: [sorted(M1.groundset()) for M1 in M.gammoid_extensions()] [[0, 1, 2, 4], [0, 1, 3, 4]] sage: N = Gammoid(digraphs.TransitiveTournament(5), roots=[3, 4]) sage: [sorted(N1.groundset()) for N1 in N.gammoid_extensions()] []
>>> from sage.all import * >>> from sage.matroids.gammoid import Gammoid >>> M = Gammoid(digraphs.TransitiveTournament(Integer(5)), roots=[Integer(3), Integer(4)], ... groundset=[Integer(0), Integer(1), Integer(4)]) >>> [sorted(M1.groundset()) for M1 in M.gammoid_extensions()] [[0, 1, 2, 4], [0, 1, 3, 4]] >>> N = Gammoid(digraphs.TransitiveTournament(Integer(5)), roots=[Integer(3), Integer(4)]) >>> [sorted(N1.groundset()) for N1 in N.gammoid_extensions()] []
sage: from sage.matroids.gammoid import Gammoid sage: edgelist =[(i, i+1) for i in range(10)] sage: M = Gammoid(DiGraph(edgelist), roots=[9], groundset=[0]) sage: sum(1 for M1 in M.gammoid_extensions(vertices=[3, 4, 5])) 3 sage: sum(1 for M1 in M.gammoid_extensions()) 9 sage: set([M1.is_isomorphic(matroids.Uniform(1, 2)) ....: for M1 in M.gammoid_extensions()]) {True} sage: len([M1 for M1 in M.gammoid_extensions([0, 1, 2])]) Traceback (most recent call last): ... ValueError: vertices must be in the digraph and not already in the groundset
>>> from sage.all import * >>> from sage.matroids.gammoid import Gammoid >>> edgelist =[(i, i+Integer(1)) for i in range(Integer(10))] >>> M = Gammoid(DiGraph(edgelist), roots=[Integer(9)], groundset=[Integer(0)]) >>> sum(Integer(1) for M1 in M.gammoid_extensions(vertices=[Integer(3), Integer(4), Integer(5)])) 3 >>> sum(Integer(1) for M1 in M.gammoid_extensions()) 9 >>> set([M1.is_isomorphic(matroids.Uniform(Integer(1), Integer(2))) ... for M1 in M.gammoid_extensions()]) {True} >>> len([M1 for M1 in M.gammoid_extensions([Integer(0), Integer(1), Integer(2)])]) Traceback (most recent call last): ... ValueError: vertices must be in the digraph and not already in the groundset
- groundset()[source]¶
Return the groundset of the matroid.
EXAMPLES:
sage: from sage.matroids.gammoid import Gammoid sage: edgelist = [(0, 4), (0, 5), (1, 0), (1, 4), (2, 0), (2, 1), (2, 3), ....: (2, 6), (3, 4), (3, 5), (4, 0), (5, 2), (6, 5)] sage: D = DiGraph(edgelist) sage: M = Gammoid(D, roots=[4, 5, 6]) sage: sorted(M.groundset()) [0, 1, 2, 3, 4, 5, 6]
>>> from sage.all import * >>> from sage.matroids.gammoid import Gammoid >>> edgelist = [(Integer(0), Integer(4)), (Integer(0), Integer(5)), (Integer(1), Integer(0)), (Integer(1), Integer(4)), (Integer(2), Integer(0)), (Integer(2), Integer(1)), (Integer(2), Integer(3)), ... (Integer(2), Integer(6)), (Integer(3), Integer(4)), (Integer(3), Integer(5)), (Integer(4), Integer(0)), (Integer(5), Integer(2)), (Integer(6), Integer(5))] >>> D = DiGraph(edgelist) >>> M = Gammoid(D, roots=[Integer(4), Integer(5), Integer(6)]) >>> sorted(M.groundset()) [0, 1, 2, 3, 4, 5, 6]