Returns the internal representation of the ground set.

Important: read the following if you encounter errors when specifying subsets of a matroid (e.g. restriction/deletion/contraction, rank of subset, etc.)

For a matroid M, there are 2 important differences between M.groundSet and the elements of M (given by M_*). First is data types: M.groundSet is a Set, and M_* is a List. Second, M.groundSet always consists of integers from 0 to n-1, where n is the number of elements of M: on the other hand, the elements of M themselves can be arbitrary (e.g. symbols, matrices, edges in a graph, etc.).

Thus, one can think of M.groundSet as the set of indices of the elements in the list M_*: the first element of M has index 0, corresponding to the element 0 in M.groundSet; the second element of M has index 1, etc.

The key point is that all sets associated to the structure of a matroid - bases, circuits, flats, etc. - are subsets of M.groundSet (not M_*). In particular, they are also of class Set (although a collection of them is usually a List), and are also indexed from 0 to n-1. (An exception here is loops and coloops, which are given as a list of indices, rather than single-element sets).

A recommended way to circumvent this distinction between indices and elements is to use $\{0, ..., n-1\}$ as the actual elements of M, in which case an element is equal to its index in M.groundSet. Most methods in this package will accept either a list of elements or a set of indices, and if the elements of M are $\{0, ..., n-1\}$, then functionally there will be no difference between inputting lists or sets.

In summary: lists are used for elements in M, and given as sublists of M_*, while sets are used for indices, and given as subsets of M.groundSet.

i1 : M = matroid({a,b,c,d},{{a,b},{a,c}}) o1 = a matroid of rank 2 on 4 elements o1 : Matroid |

i2 : peek M o2 = Matroid{bases => {set {0, 1}, set {0, 2}}} cache => CacheTable{...2...} groundSet => set {0, 1, 2, 3} rank => 2 |

i3 : M.groundSet o3 = set {0, 1, 2, 3} o3 : Set |

i4 : M_* o4 = {a, b, c, d} o4 : List |

i5 : bases M o5 = {set {0, 1}, set {0, 2}} o5 : List |

i6 : (bases M)#0 o6 = set {0, 1} o6 : Set |

i7 : circuits M o7 = {set {1, 2}, set {3}} o7 : List |

i8 : flats M o8 = {set {3}, set {0, 3}, set {1, 2, 3}, set {0, 1, 2, 3}} o8 : List |

i9 : loops M o9 = {3} o9 : List |

i10 : coloops M o10 = {0} o10 : List |

Note in particular the types of the various outputs above.

The following illustrates how to perform operations with a specified subset of M.groundSet. In the final example, a list of indices is given, which goes against the conventions above, but the elements of the list are treated (correctly) as indices, and if debugLevel is greater than 0, then a warning is printed.

i11 : N1 = M | {a,c,d} o11 = a matroid of rank 2 on 3 elements o11 : Matroid |

i12 : N2 = M | set{0,2,3} o12 = a matroid of rank 2 on 3 elements o12 : Matroid |

i13 : N1 == N2 o13 = true |

i14 : debugLevel = 1 o14 = 1 |

i15 : N3 = M | {0,2,3} -- gives a warning, but attempts to treat 0 as an index Warning: 0 is not a member of {a, b, c, d} Treating 0 as an index (cf. 'help groundSet' for how to input subsets) ... o15 = a matroid of rank 2 on 3 elements o15 : Matroid |

i16 : N3 == N2 o16 = true |

- Matroid _ List -- elements of matroid