Skip to content

Commit 031064b

Browse files
author
Release Manager
committed
gh-37340: Add class FlatsMatroid This matroid subclass allows the definition and internal representation of a matroid based on its flats (closed sets). This representation can be advantageous for some algorithms. This completes the list of the most standard matroid definitions (bases, circuits, flats, rank function). This PR is similar to #37148. - [x] The title is concise, informative, and self-explanatory. - [x] The description explains in detail what this PR is about. - [x] I have linked a relevant issue or discussion. - [x] I have created tests covering the changes. - [x] I have updated the documentation accordingly. URL: #37340 Reported by: gmou3 Reviewer(s): gmou3, Matthias Köppe
2 parents ad0a4b0 + 34564a3 commit 031064b

File tree

6 files changed

+585
-4
lines changed

6 files changed

+585
-4
lines changed

src/doc/en/reference/matroids/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ Concrete implementations
2929
sage/matroids/basis_matroid
3030
sage/matroids/circuits_matroid
3131
sage/matroids/circuit_closures_matroid
32+
sage/matroids/flats_matroid
3233
sage/matroids/linear_matroid
3334
sage/matroids/rank_matroid
3435
sage/matroids/graphic_matroid

src/sage/matroids/advanced.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
- :class:`RankMatroid <sage.matroids.rank_matroid.RankMatroid>`
1616
- :class:`CircuitClosuresMatroid <sage.matroids.circuit_closures_matroid.CircuitClosuresMatroid>`
1717
- :class:`BasisMatroid <sage.matroids.basis_matroid.BasisMatroid>`
18+
- :class:`FlatsMatroid <sage.matroids.flats_matroid.FlatsMatroid>`
1819
- :class:`LinearMatroid <sage.matroids.linear_matroid.LinearMatroid>`
1920
- :class:`RegularMatroid <sage.matroids.linear_matroid.RegularMatroid>`
2021
- :class:`BinaryMatroid <sage.matroids.linear_matroid.BinaryMatroid>`
@@ -54,6 +55,7 @@
5455
from .rank_matroid import RankMatroid
5556
from .circuit_closures_matroid import CircuitClosuresMatroid
5657
from .basis_matroid import BasisMatroid
58+
from .flats_matroid import FlatsMatroid
5759
from .linear_matroid import LinearMatroid, RegularMatroid, BinaryMatroid, TernaryMatroid, QuaternaryMatroid
5860
from .utilities import setprint, newlabel, get_nonisomorphic_matroids, lift_cross_ratios, lift_map
5961
from . import lean_matrix

src/sage/matroids/constructor.py

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@
113113
import sage.matroids.basis_exchange_matroid
114114
from .rank_matroid import RankMatroid
115115
from .circuits_matroid import CircuitsMatroid
116+
from .flats_matroid import FlatsMatroid
116117
from .circuit_closures_matroid import CircuitClosuresMatroid
117118
from .basis_matroid import BasisMatroid
118119
from .linear_matroid import LinearMatroid, RegularMatroid, BinaryMatroid, TernaryMatroid, QuaternaryMatroid
@@ -178,8 +179,9 @@ def Matroid(groundset=None, data=None, **kwds):
178179
matroid.
179180
- ``independent_sets`` -- The list of independent sets of the matroid.
180181
- ``circuits`` -- The list of circuits of the matroid.
181-
- ``nonspanning_circuits`` -- The list of nonspanning_circuits of the
182+
- ``nonspanning_circuits`` -- The list of nonspanning circuits of the
182183
matroid.
184+
- ``flats`` -- The dictionary of flats indexed by their rank.
183185
- ``graph`` -- A graph, whose edges form the elements of the matroid.
184186
- ``matrix`` -- A matrix representation of the matroid.
185187
- ``reduced_matrix`` -- A reduced representation of the matroid: if
@@ -224,6 +226,8 @@ def Matroid(groundset=None, data=None, **kwds):
224226
225227
The ``Matroid()`` method will return instances of type
226228
:class:`BasisMatroid <sage.matroids.basis_matroid.BasisMatroid>`,
229+
:class:`CircuitsMatroid <sage.matroids.circuits_matroid.CircuitsMatroid>`,
230+
:class:`FlatsMatroid <sage.matroids.flats_matroid.FlatsMatroid>`,
227231
:class:`CircuitClosuresMatroid <sage.matroids.circuit_closures_matroid.CircuitClosuresMatroid>`,
228232
:class:`LinearMatroid <sage.matroids.linear_matroid.LinearMatroid>`,
229233
:class:`BinaryMatroid <sage.matroids.linear_matroid.LinearMatroid>`,
@@ -305,7 +309,7 @@ def Matroid(groundset=None, data=None, **kwds):
305309
sage: M1 = Matroid(groundset='abc', circuits=['bc'])
306310
307311
A matroid specified by a list of circuits gets converted to a
308-
:class:`CircuitsMatroid <sage.matroids.basis_matroid.CircuitsMatroid>`
312+
:class:`CircuitsMatroid <sage.matroids.circuits_matroid.CircuitsMatroid>`
309313
internally::
310314
311315
sage: from sage.matroids.circuits_matroid import CircuitsMatroid
@@ -329,6 +333,16 @@ def Matroid(groundset=None, data=None, **kwds):
329333
sage: M.is_valid()
330334
False
331335
336+
#. Dictionary of flats:
337+
338+
::
339+
340+
sage: M = Matroid(flats={0: [''], 1: ['a', 'b'], 2: ['ab']})
341+
sage: M.is_valid()
342+
True
343+
sage: type(M)
344+
<class 'sage.matroids.flats_matroid.FlatsMatroid'>
345+
332346
#. Graph:
333347
334348
Sage has great support for graphs, see :mod:`sage.graphs.graph`.
@@ -698,8 +712,9 @@ def Matroid(groundset=None, data=None, **kwds):
698712
key = None
699713
if data is None:
700714
for k in ['bases', 'independent_sets', 'circuits',
701-
'nonspanning_circuits', 'graph', 'matrix', 'reduced_matrix',
702-
'rank_function', 'revlex', 'circuit_closures', 'matroid']:
715+
'nonspanning_circuits', 'flats', 'graph', 'matrix',
716+
'reduced_matrix', 'rank_function', 'revlex',
717+
'circuit_closures', 'matroid']:
703718
if k in kwds:
704719
data = kwds.pop(k)
705720
key = k
@@ -791,6 +806,16 @@ def Matroid(groundset=None, data=None, **kwds):
791806
nsc_defined=True
792807
)
793808

809+
# Flats
810+
elif key == 'flats':
811+
# Determine groundset
812+
if groundset is None:
813+
groundset = set()
814+
for i in data:
815+
for F in data[i]:
816+
groundset.update(F)
817+
M = FlatsMatroid(groundset=groundset, flats=data)
818+
794819
# Graphs:
795820
elif key == 'graph':
796821
from sage.graphs.graph import Graph

src/sage/matroids/flats_matroid.pxd

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from sage.matroids.matroid cimport Matroid
2+
3+
cdef class FlatsMatroid(Matroid):
4+
cdef frozenset _groundset # _E
5+
cdef int _matroid_rank # _R
6+
cdef dict _F # flats
7+
cpdef groundset(self)
8+
cpdef _rank(self, X)
9+
cpdef full_rank(self)
10+
cpdef _is_independent(self, F)
11+
12+
# enumeration
13+
cpdef flats(self, k)
14+
cpdef whitney_numbers2(self)
15+
16+
# isomorphism
17+
cpdef _is_isomorphic(self, other, certificate=*)
18+
19+
# verification
20+
cpdef is_valid(self)

0 commit comments

Comments
 (0)