Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/flats_matroid' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
gmou3 committed May 22, 2024
2 parents 8a0377e + 9bf7105 commit fc1fbdb
Show file tree
Hide file tree
Showing 12 changed files with 189 additions and 345 deletions.
3 changes: 1 addition & 2 deletions src/sage/matroids/advanced.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
- :class:`CircuitClosuresMatroid <sage.matroids.circuit_closures_matroid.CircuitClosuresMatroid>`
- :class:`BasisMatroid <sage.matroids.basis_matroid.BasisMatroid>`
- :class:`FlatsMatroid <sage.matroids.flats_matroid.FlatsMatroid>`
- :class:`LatticeOfFlatsMatroid <sage.matroids.flats_matroid.LatticeOfFlatsMatroid>`
- :class:`LinearMatroid <sage.matroids.linear_matroid.LinearMatroid>`
- :class:`RegularMatroid <sage.matroids.linear_matroid.RegularMatroid>`
- :class:`BinaryMatroid <sage.matroids.linear_matroid.BinaryMatroid>`
Expand Down Expand Up @@ -59,7 +58,7 @@
from .circuits_matroid import CircuitsMatroid
from .circuit_closures_matroid import CircuitClosuresMatroid
from .basis_matroid import BasisMatroid
from .flats_matroid import FlatsMatroid, LatticeOfFlatsMatroid
from .flats_matroid import FlatsMatroid
from .linear_matroid import LinearMatroid, RegularMatroid, BinaryMatroid, TernaryMatroid, QuaternaryMatroid
from .utilities import setprint, newlabel, get_nonisomorphic_matroids, lift_cross_ratios, lift_map
from . import lean_matrix
Expand Down
3 changes: 1 addition & 2 deletions src/sage/matroids/basis_exchange_matroid.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,10 @@ from .matroid cimport Matroid
from .set_system cimport SetSystem

cdef class BasisExchangeMatroid(Matroid):
cdef long _groundset_size, _matroid_rank, _bitset_size
cdef long _groundset_size, _bitset_size
cdef bitset_t _current_basis, _inside, _outside, _input, _input2, _output, _temp
cdef tuple _E
cdef dict _idx
cdef frozenset _groundset

cdef _bcount
cdef _weak_invariant_var, _strong_invariant_var, _heuristic_invariant_var
Expand Down
4 changes: 1 addition & 3 deletions src/sage/matroids/circuit_closures_matroid.pxd
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
from sage.matroids.matroid cimport Matroid

cdef class CircuitClosuresMatroid(Matroid):
cdef frozenset _groundset # _E
cdef dict _circuit_closures # _CC
cdef int _matroid_rank # _R
cdef dict _circuit_closures
cpdef frozenset groundset(self)
cpdef int _rank(self, frozenset X)
cpdef full_rank(self)
Expand Down
2 changes: 0 additions & 2 deletions src/sage/matroids/circuits_matroid.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ from .matroid cimport Matroid
from .set_system cimport SetSystem

cdef class CircuitsMatroid(Matroid):
cdef frozenset _groundset
cdef int _matroid_rank
cdef set _C # circuits
cdef dict _k_C # k-circuits (k=len)
cdef list _sorted_C_lens
Expand Down
54 changes: 29 additions & 25 deletions src/sage/matroids/constructor.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@
# ****************************************************************************

from itertools import combinations
from sage.combinat.posets.lattices import FiniteLatticePoset
from sage.matrix.constructor import Matrix
from sage.structure.element import is_Matrix
from sage.rings.integer_ring import ZZ
Expand All @@ -116,16 +117,10 @@
import sage.matroids.basis_exchange_matroid
from .rank_matroid import RankMatroid
from .circuits_matroid import CircuitsMatroid
from .flats_matroid import (FlatsMatroid, LatticeOfFlatsMatroid)
from .flats_matroid import FlatsMatroid
from .circuit_closures_matroid import CircuitClosuresMatroid
from .basis_matroid import BasisMatroid
from .linear_matroid import (
LinearMatroid,
RegularMatroid,
BinaryMatroid,
TernaryMatroid,
QuaternaryMatroid
)
from .linear_matroid import LinearMatroid, RegularMatroid, BinaryMatroid, TernaryMatroid, QuaternaryMatroid
from .graphic_matroid import GraphicMatroid
import sage.matroids.utilities

Expand Down Expand Up @@ -194,7 +189,7 @@ def Matroid(groundset=None, data=None, **kwds):
- ``circuits`` -- The list of circuits of the matroid.
- ``nonspanning_circuits`` -- The list of nonspanning circuits of the
matroid.
- ``flats`` -- The dictionary or list of flats of the matroid.
- ``flats`` -- The dictionary, list, or lattice of flats of the matroid.
- ``graph`` -- A graph, whose edges form the elements of the matroid.
- ``matrix`` -- A matrix representation of the matroid.
- ``reduced_matrix`` -- A reduced representation of the matroid: if
Expand Down Expand Up @@ -247,7 +242,6 @@ def Matroid(groundset=None, data=None, **kwds):
:class:`BasisMatroid <sage.matroids.basis_matroid.BasisMatroid>`,
:class:`CircuitsMatroid <sage.matroids.circuits_matroid.CircuitsMatroid>`,
:class:`FlatsMatroid <sage.matroids.flats_matroid.FlatsMatroid>`,
:class:`LatticeOfFlatsMatroid <sage.matroids.flats_matroid.LatticeOfFlatsMatroid>`,
:class:`CircuitClosuresMatroid <sage.matroids.circuit_closures_matroid.CircuitClosuresMatroid>`,
:class:`LinearMatroid <sage.matroids.linear_matroid.LinearMatroid>`,
:class:`BinaryMatroid <sage.matroids.linear_matroid.LinearMatroid>`,
Expand Down Expand Up @@ -343,32 +337,30 @@ def Matroid(groundset=None, data=None, **kwds):
Strange things can happen if the input does not satisfy the circuit
axioms, and these can be caught by the
:meth:`is_valid() <sage.matroids.matroid.Matroid.is_valid>` method. So
always check whether your input makes sense!
:meth:`is_valid() <sage.matroids.circuits_matroid.CircuitsMatroid.is_valid>`
method. So please check that your input makes sense!
::
sage: M = Matroid('abcd', circuits=['ab', 'acd'])
sage: M.is_valid()
False
#. Dictionary or list of flats:
#. Flats:
Given a dictionary of flats indexed by their rank, we get a
:class:`FlatsMatroid <sage.matroids.circuits_matroid.FlatsMatroid>`::
:class:`FlatsMatroid <sage.matroids.flats_matroid.FlatsMatroid>`::
sage: M = Matroid(flats={0: [''], 1: ['a', 'b'], 2: ['ab']})
sage: M.is_valid()
sage: M.is_isomorphic(matroids.Uniform(2, 2)) and M.is_valid()
True
sage: type(M)
<class 'sage.matroids.flats_matroid.FlatsMatroid'>
If instead we simply provide a list of flats, then we get a subclass
:class:`LatticeOfFlatsMatroid <sage.matroids.circuits_matroid.LatticeOfFlatsMatroid>`
of :class:`FlatsMatroid <sage.matroids.circuits_matroid.FlatsMatroid>`.
This class computes and stores the lattice of flats upon definition.
This can be time-consuming, but after it's done we benefit from some
faster methods (e.g., ``is_valid``)::
If instead we simply provide a list of flats, then the class computes
and stores the lattice of flats upon definition. This can be
time-consuming, but after it's done we benefit from some faster methods
(e.g., :meth:`is_valid() <sage.matroids.flats_matroid.FlatsMatroid.is_valid>`)::
sage: M = Matroid(flats=['', 'a', 'b', 'ab'])
sage: for i in range(M.rank() + 1): # print flats by rank
Expand All @@ -379,7 +371,18 @@ def Matroid(groundset=None, data=None, **kwds):
sage: M.is_valid()
True
sage: type(M)
<class 'sage.matroids.flats_matroid.LatticeOfFlatsMatroid'>
<class 'sage.matroids.flats_matroid.FlatsMatroid'>
Finally, we can also directly provide a lattice of flats::
sage: from sage.combinat.posets.lattices import LatticePoset
sage: flats = [frozenset(F) for F in powerset('ab')]
sage: L_M = LatticePoset((flats, lambda x, y: x < y))
sage: M = Matroid(L_M)
sage: M.is_isomorphic(matroids.Uniform(2, 2)) and M.is_valid()
True
sage: type(M)
<class 'sage.matroids.flats_matroid.FlatsMatroid'>
#. Graph:
Expand Down Expand Up @@ -846,6 +849,8 @@ def Matroid(groundset=None, data=None, **kwds):
key = 'matroid'
elif isinstance(data, str):
key = 'lex'
elif isinstance(data, dict) or isinstance(data, FiniteLatticePoset):
key = 'flats'
elif data is None:
raise TypeError("no input data given for Matroid()")
else:
Expand Down Expand Up @@ -920,11 +925,10 @@ def Matroid(groundset=None, data=None, **kwds):
for i in data:
for F in data[i]:
groundset.update(F)
M = FlatsMatroid(groundset=groundset, flats=data)
else:
else: # iterable of flats (including lattice)
for F in data:
groundset.update(F)
M = LatticeOfFlatsMatroid(groundset=groundset, flats=data)
M = FlatsMatroid(groundset=groundset, flats=data)

# Graphs:
elif key == 'graph':
Expand Down
16 changes: 6 additions & 10 deletions src/sage/matroids/flats_matroid.pxd
Original file line number Diff line number Diff line change
@@ -1,29 +1,25 @@
from .matroid cimport Matroid
from sage.combinat.posets.lattices import FiniteLatticePoset
from .set_system cimport SetSystem

cdef class FlatsMatroid(Matroid):
cdef frozenset _groundset # _E
cdef int _matroid_rank # _R
cdef dict _F # flats
cdef object _L # lattice of flats
cpdef frozenset groundset(self)

cpdef int _rank(self, frozenset X)
cpdef full_rank(self)
cpdef frozenset _closure(self, frozenset X)
cpdef bint _is_closed(self, frozenset X)

cpdef full_rank(self)

# enumeration
cpdef SetSystem flats(self, long k)
cpdef list whitney_numbers(self)
cpdef list whitney_numbers2(self)

# isomorphism and relabeling
cpdef _is_isomorphic(self, other, certificate=*)
cpdef relabel(self, mapping)
cpdef Matroid relabel(self, mapping)

# verification
cpdef bint is_valid(self)

cdef class LatticeOfFlatsMatroid(FlatsMatroid):
cdef object _L # lattice_of_flats
cpdef list whitney_numbers(self)
cpdef bint is_valid(self)
Loading

0 comments on commit fc1fbdb

Please sign in to comment.