From 37708e6c709211e7920496cee4b1c6cb0ac32281 Mon Sep 17 00:00:00 2001 From: James Mitchell Date: Thu, 9 Apr 2026 16:51:39 +0100 Subject: [PATCH] konieczny: add support for MaxPlusTrunc matrices --- src/konieczny.cpp | 12 +++++++++++- src/libsemigroups_pybind11/konieczny.py | 5 +++++ tests/test_konieczny.py | 16 ++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/konieczny.cpp b/src/konieczny.cpp index 1f395ba2e..cd05168ba 100644 --- a/src/konieczny.cpp +++ b/src/konieczny.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include // pybind11. .. . @@ -55,6 +56,14 @@ function is :any:`Runner.run`, which implements Konieczny's Algorithm. If the size, partial order of :math:`\mathscr{D}`-classes, and frames for each :math:`\mathscr{D}`-class are known. +Currently :any:`Konieczny` supports the following element types: + +* :any:`BMat8` +* boolean matrices (:any:`MatrixKind.Boolean`) +* :any:`Transf` +* :any:`PPerm` +* max-plus truncated matrices (:any:`MatrixKind.MaxPlusTrunc`) + .. seealso:: :any:`Konieczny.DClass` and :any:`Runner`. .. |name| replace:: :any:`Konieczny` @@ -739,7 +748,7 @@ not already known. int )pbdoc"); } // bind_konieczny - } // namespace + } // namespace void init_konieczny(py::module& m) { bind_konieczny(m, "BMat8"); @@ -750,6 +759,7 @@ not already known. bind_konieczny>(m, "PPerm1"); bind_konieczny>(m, "PPerm2"); bind_konieczny>(m, "PPerm4"); + bind_konieczny>(m, "MaxPlusTruncMat"); #ifdef LIBSEMIGROUPS_HPCOMBI_ENABLED bind_konieczny(m, "HPCombiPTransf16"); diff --git a/src/libsemigroups_pybind11/konieczny.py b/src/libsemigroups_pybind11/konieczny.py index 8321659f9..1c7005dc2 100644 --- a/src/libsemigroups_pybind11/konieczny.py +++ b/src/libsemigroups_pybind11/konieczny.py @@ -21,6 +21,8 @@ KoniecznyBMat8 as _KoniecznyBMat8, KoniecznyBMat8DClass as _KoniecznyBMat8DClass, KoniecznyBMatDClass as _KoniecznyBMatDClass, + KoniecznyMaxPlusTruncMat as _KoniecznyMaxPlusTruncMat, + KoniecznyMaxPlusTruncMatDClass as _KoniecznyMaxPlusTruncMatDClass, KoniecznyPPerm1 as _KoniecznyPPerm1, KoniecznyPPerm1DClass as _KoniecznyPPerm1DClass, KoniecznyPPerm2 as _KoniecznyPPerm2, @@ -33,6 +35,7 @@ KoniecznyTransf2DClass as _KoniecznyTransf2DClass, KoniecznyTransf4 as _KoniecznyTransf4, KoniecznyTransf4DClass as _KoniecznyTransf4DClass, + MaxPlusTruncMat as _MaxPlusTruncMat, PPerm1 as _PPerm1, PPerm2 as _PPerm2, PPerm4 as _PPerm4, @@ -77,6 +80,7 @@ class Konieczny(_CxxWrapper): _py_template_params_to_cxx_type = { (_BMat,): _KoniecznyBMat, (_BMat8,): _KoniecznyBMat8, + (_MaxPlusTruncMat,): _KoniecznyMaxPlusTruncMat, (_PPerm1,): _KoniecznyPPerm1, (_PPerm2,): _KoniecznyPPerm2, (_PPerm4,): _KoniecznyPPerm4, @@ -116,6 +120,7 @@ class DClass(_CxxWrapper): { (_BMat,): _KoniecznyBMatDClass, (_BMat8,): _KoniecznyBMat8DClass, + (_MaxPlusTruncMat,): _KoniecznyMaxPlusTruncMatDClass, (_PPerm1,): _KoniecznyPPerm1DClass, (_PPerm2,): _KoniecznyPPerm2DClass, (_PPerm4,): _KoniecznyPPerm4DClass, diff --git a/tests/test_konieczny.py b/tests/test_konieczny.py index 2be08c0b6..154c87206 100644 --- a/tests/test_konieczny.py +++ b/tests/test_konieczny.py @@ -451,3 +451,19 @@ def test_konieczny_hpcombi_ptranf16(): hpcombi.PTransf16([1, 1, 2, 3, 4, 5, 6, 7, 8]), ) assert S.size() == 43_046_721 + + +def test_froidure_pin_max_plus_trunc(): + ReportGuard(False) + K = Konieczny(Matrix(MatrixKind.MaxPlusTrunc, 11, [[1, 0], [0, 1]])) + assert K.size() == 12 + assert K.number_of_idempotents() == 1 + assert K.number_of_D_classes() == 12 + assert K.number_of_R_classes() == 12 + assert K.number_of_L_classes() == 12 + assert K.number_of_H_classes() == 12 + + assert K.generator(0) == Matrix(MatrixKind.MaxPlusTrunc, 11, [[1, 0], [0, 1]]) + assert K.D_class_of_element(K.generator(0)).size() == 1 + assert K.D_class_of_element(K.generator(0)).number_of_idempotents() == 0 + assert not K.D_class_of_element(K.generator(0)).is_regular_D_class()