Flats matroids#
Matroids are characterized by a set of flats, which are sets invariant under
closure. The FlatsMatroid
class implements matroids using this information
as data.
A FlatsMatroid
can be created from another matroid or from a dictionary of
flats. For a full description of allowed inputs, see
below
. It is
recommended to use the Matroid()
function for a more flexible way of constructing a FlatsMatroid
and other
classes of matroids. For direct access to the FlatsMatroid
constructor,
run:
sage: from sage.matroids.flats_matroid import FlatsMatroid
>>> from sage.all import *
>>> from sage.matroids.flats_matroid import FlatsMatroid
AUTHORS:
Giorgos Mousa (2024-01-01): initial version
- class sage.matroids.flats_matroid.FlatsMatroid[source]#
Bases:
Matroid
INPUT:
M
– matroid (default:None
)groundset
– list (default:None
); the groundset of the matroidflats
– (default:None
); the dictionary of the lists of flats (indexed by their rank), or the list of all flats, or the lattice of flats of the matroid
Note
For a more flexible means of input, use the
Matroid()
function.- flats(k)[source]#
Return the flats of the matroid of specified rank.
INPUT:
k
– integer
OUTPUT:
SetSystem
EXAMPLES:
sage: from sage.matroids.flats_matroid import FlatsMatroid sage: M = FlatsMatroid(matroids.Uniform(3, 4)) sage: sorted(M.flats(2), key=str) [frozenset({0, 1}), frozenset({0, 2}), frozenset({0, 3}), frozenset({1, 2}), frozenset({1, 3}), frozenset({2, 3})]
>>> from sage.all import * >>> from sage.matroids.flats_matroid import FlatsMatroid >>> M = FlatsMatroid(matroids.Uniform(Integer(3), Integer(4))) >>> sorted(M.flats(Integer(2)), key=str) [frozenset({0, 1}), frozenset({0, 2}), frozenset({0, 3}), frozenset({1, 2}), frozenset({1, 3}), frozenset({2, 3})]
- flats_iterator(k)[source]#
Return an iterator over the flats of the matroid of specified rank.
INPUT:
k
– integer
EXAMPLES:
sage: from sage.matroids.flats_matroid import FlatsMatroid sage: M = FlatsMatroid(matroids.Uniform(3, 4)) sage: sorted([list(F) for F in M.flats_iterator(2)]) [[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]]
>>> from sage.all import * >>> from sage.matroids.flats_matroid import FlatsMatroid >>> M = FlatsMatroid(matroids.Uniform(Integer(3), Integer(4))) >>> sorted([list(F) for F in M.flats_iterator(Integer(2))]) [[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]]
- full_rank()[source]#
Return the rank of the matroid.
The rank of the matroid is the size of the largest independent subset of the groundset.
OUTPUT: integer
EXAMPLES:
sage: from sage.matroids.flats_matroid import FlatsMatroid sage: M = FlatsMatroid(matroids.Theta(6)) sage: M.full_rank() 6
>>> from sage.all import * >>> from sage.matroids.flats_matroid import FlatsMatroid >>> M = FlatsMatroid(matroids.Theta(Integer(6))) >>> M.full_rank() 6
- groundset()[source]#
Return the groundset of the matroid.
The groundset is the set of elements that comprise the matroid.
OUTPUT:
frozenset
EXAMPLES:
sage: from sage.matroids.flats_matroid import FlatsMatroid sage: M = FlatsMatroid(matroids.Theta(2)) sage: sorted(M.groundset()) ['x0', 'x1', 'y0', 'y1']
>>> from sage.all import * >>> from sage.matroids.flats_matroid import FlatsMatroid >>> M = FlatsMatroid(matroids.Theta(Integer(2))) >>> sorted(M.groundset()) ['x0', 'x1', 'y0', 'y1']
- is_valid()[source]#
Test if
self
obeys the matroid axioms.For a matroid defined by its flats, we check the flats axioms.
If the lattice of flats has already been computed, we instead perform the equivalent check of whether it forms a geometric lattice.
OUTPUT: boolean
EXAMPLES:
sage: Matroid(flats={0: [[]], 1: [[0], [1]], 2: [[0, 1]]}).is_valid() True sage: Matroid(flats={0: [''], 1: ['a', 'b'], 2: ['ab']}).is_valid() True sage: M = Matroid(flats={0: [[]], 1: [[0], [1]]}) # missing groundset sage: M.is_valid() False sage: M = Matroid(flats={0: [''], ....: 1: ['0','1','2','3','4','5','6','7','8','9','a','b','c'], ....: 2: ['45','46','47','4c','56','57','5c','67','6c','7c', ....: '048','149','24a','34b','059','15a','25b','358', ....: '06a','16b','268','369','07b','178','279','37a', ....: '0123c','89abc'], ....: 3: ['0123456789abc']}) sage: M.is_valid() True sage: from sage.matroids.flats_matroid import FlatsMatroid sage: FlatsMatroid(matroids.catalog.NonVamos()).is_valid() True
>>> from sage.all import * >>> Matroid(flats={Integer(0): [[]], Integer(1): [[Integer(0)], [Integer(1)]], Integer(2): [[Integer(0), Integer(1)]]}).is_valid() True >>> Matroid(flats={Integer(0): [''], Integer(1): ['a', 'b'], Integer(2): ['ab']}).is_valid() True >>> M = Matroid(flats={Integer(0): [[]], Integer(1): [[Integer(0)], [Integer(1)]]}) # missing groundset >>> M.is_valid() False >>> M = Matroid(flats={Integer(0): [''], ... Integer(1): ['0','1','2','3','4','5','6','7','8','9','a','b','c'], ... Integer(2): ['45','46','47','4c','56','57','5c','67','6c','7c', ... '048','149','24a','34b','059','15a','25b','358', ... '06a','16b','268','369','07b','178','279','37a', ... '0123c','89abc'], ... Integer(3): ['0123456789abc']}) >>> M.is_valid() True >>> from sage.matroids.flats_matroid import FlatsMatroid >>> FlatsMatroid(matroids.catalog.NonVamos()).is_valid() True
If we input a list or a lattice of flats, the method checks whether the lattice of flats is geometric:
sage: Matroid(flats=[[], [0], [1], [0, 1]]).is_valid() True sage: Matroid(flats=['', 'a', 'b', 'ab']).is_valid() True sage: M = Matroid(flats=['', # missing an extention of flat ['5'] by '6' ....: '0','1','2','3','4','5','6','7','8','9','a','b','c', ....: '45','46','47','4c','57','5c','67','6c','7c', ....: '048','149','24a','34b','059','15a','25b','358', ....: '06a','16b','268','369','07b','178','279','37a', ....: '0123c','89abc', ....: '0123456789abc']) sage: M.is_valid() False sage: Matroid(matroids.catalog.Fano().lattice_of_flats()).is_valid() True
>>> from sage.all import * >>> Matroid(flats=[[], [Integer(0)], [Integer(1)], [Integer(0), Integer(1)]]).is_valid() True >>> Matroid(flats=['', 'a', 'b', 'ab']).is_valid() True >>> M = Matroid(flats=['', # missing an extention of flat ['5'] by '6' ... '0','1','2','3','4','5','6','7','8','9','a','b','c', ... '45','46','47','4c','57','5c','67','6c','7c', ... '048','149','24a','34b','059','15a','25b','358', ... '06a','16b','268','369','07b','178','279','37a', ... '0123c','89abc', ... '0123456789abc']) >>> M.is_valid() False >>> Matroid(matroids.catalog.Fano().lattice_of_flats()).is_valid() True
Some invalid lists of flats are recognized before calling
is_valid
, upon the attempted matroid definition:sage: M = Matroid(flats=[[], [0], [1]]) # missing groundset Traceback (most recent call last): ... ValueError: not a join-semilattice: no top element sage: Matroid(flats=[[0], [1], [0, 1]]) # missing an intersection Traceback (most recent call last): ... ValueError: not a meet-semilattice: no bottom element sage: Matroid(flats=[[], [0, 1], [2], [0], [1], [0, 1, 2]]) Traceback (most recent call last): ... ValueError: the poset is not ranked
>>> from sage.all import * >>> M = Matroid(flats=[[], [Integer(0)], [Integer(1)]]) # missing groundset Traceback (most recent call last): ... ValueError: not a join-semilattice: no top element >>> Matroid(flats=[[Integer(0)], [Integer(1)], [Integer(0), Integer(1)]]) # missing an intersection Traceback (most recent call last): ... ValueError: not a meet-semilattice: no bottom element >>> Matroid(flats=[[], [Integer(0), Integer(1)], [Integer(2)], [Integer(0)], [Integer(1)], [Integer(0), Integer(1), Integer(2)]]) Traceback (most recent call last): ... ValueError: the poset is not ranked
- lattice_of_flats()[source]#
Return the lattice of flats of the matroid.
EXAMPLES:
sage: from sage.matroids.flats_matroid import FlatsMatroid sage: M = FlatsMatroid(matroids.catalog.Fano()) sage: M.lattice_of_flats() Finite lattice containing 16 elements
>>> from sage.all import * >>> from sage.matroids.flats_matroid import FlatsMatroid >>> M = FlatsMatroid(matroids.catalog.Fano()) >>> M.lattice_of_flats() Finite lattice containing 16 elements
- relabel(mapping)[source]#
Return an isomorphic matroid with relabeled groundset.
The output is obtained by relabeling each element \(e\) by
mapping[e]
, wheremapping
is a given injective map. Ifmapping[e]
is not defined, then the identity map is assumed.INPUT:
mapping
– a Python object such thatmapping[e]
is the new label of \(e\)
OUTPUT: matroid
EXAMPLES:
sage: from sage.matroids.flats_matroid import FlatsMatroid sage: M = FlatsMatroid(matroids.catalog.RelaxedNonFano()) sage: sorted(M.groundset()) [0, 1, 2, 3, 4, 5, 6] sage: N = M.relabel({'g': 'x', 0: 'z'}) # 'g': 'x' is ignored sage: from sage.matroids.utilities import cmp_elements_key sage: sorted(N.groundset(), key=cmp_elements_key) [1, 2, 3, 4, 5, 6, 'z'] sage: M.is_isomorphic(N) True
>>> from sage.all import * >>> from sage.matroids.flats_matroid import FlatsMatroid >>> M = FlatsMatroid(matroids.catalog.RelaxedNonFano()) >>> sorted(M.groundset()) [0, 1, 2, 3, 4, 5, 6] >>> N = M.relabel({'g': 'x', Integer(0): 'z'}) # 'g': 'x' is ignored >>> from sage.matroids.utilities import cmp_elements_key >>> sorted(N.groundset(), key=cmp_elements_key) [1, 2, 3, 4, 5, 6, 'z'] >>> M.is_isomorphic(N) True
- whitney_numbers()[source]#
Return the Whitney numbers of the first kind of the matroid.
The Whitney numbers of the first kind – here encoded as a vector \((w_0=1, \ldots, w_r)\) – are numbers of alternating sign, where \(w_i\) is the value of the coefficient of the \((r-i)\)-th degree term of the matroid’s characteristic polynomial. Moreover, \(|w_i|\) is the number of \((i-1)\)-dimensional faces of the broken circuit complex of the matroid.
OUTPUT: list of integers
EXAMPLES:
sage: from sage.matroids.flats_matroid import FlatsMatroid sage: M = FlatsMatroid(matroids.catalog.BetsyRoss()) sage: M.whitney_numbers() [1, -11, 35, -25]
>>> from sage.all import * >>> from sage.matroids.flats_matroid import FlatsMatroid >>> M = FlatsMatroid(matroids.catalog.BetsyRoss()) >>> M.whitney_numbers() [1, -11, 35, -25]
- whitney_numbers2()[source]#
Return the Whitney numbers of the second kind of the matroid.
The Whitney numbers of the second kind are here encoded as a vector \((W_0, ..., W_r)\), where \(W_i\) is the number of flats of rank \(i\), and \(r\) is the rank of the matroid.
OUTPUT: list of integers
EXAMPLES:
sage: from sage.matroids.flats_matroid import FlatsMatroid sage: M = FlatsMatroid(matroids.catalog.XY13()) sage: M.whitney_numbers2() [1, 13, 78, 250, 394, 191, 1]
>>> from sage.all import * >>> from sage.matroids.flats_matroid import FlatsMatroid >>> M = FlatsMatroid(matroids.catalog.XY13()) >>> M.whitney_numbers2() [1, 13, 78, 250, 394, 191, 1]