From 285895b583a12d531dbf9e46117a8ced2fb6611c Mon Sep 17 00:00:00 2001 From: James Mitchell Date: Sun, 18 Jan 2026 11:31:44 +0000 Subject: [PATCH 1/7] Bump libsemigroups -> v3.4.0 --- build_tools/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_tools/__init__.py b/build_tools/__init__.py index cab92492..ae8f9a7f 100644 --- a/build_tools/__init__.py +++ b/build_tools/__init__.py @@ -11,4 +11,4 @@ def minimum_libsemigroups_version(): """Returns the minimum required version of libsemigroups required to build libsemigroups_pybind11. """ - return "3.3.0" + return "3.4.0" From ba30d0a18dfef7e0be3338a84d4f97844e2dc7ec Mon Sep 17 00:00:00 2001 From: James Mitchell Date: Sun, 18 Jan 2026 11:29:07 +0000 Subject: [PATCH 2/7] to: add to(kind, WordGraph) --- .../main-algorithms/congruence/to-cong.rst | 54 +++++++++++++++++-- src/to-cong.cpp | 6 +++ tests/test_to.py | 14 +++++ 3 files changed, 70 insertions(+), 4 deletions(-) diff --git a/docs/source/main-algorithms/congruence/to-cong.rst b/docs/source/main-algorithms/congruence/to-cong.rst index 9e9518c7..7a592fa4 100644 --- a/docs/source/main-algorithms/congruence/to-cong.rst +++ b/docs/source/main-algorithms/congruence/to-cong.rst @@ -22,11 +22,12 @@ This page contains documentation relating to converting Various uses ------------ -Recall that the signature for the :any:`to` function is ``to(*args, Return)``. -In what follows, we explain how different values of *args* and *Return* may be +Recall that the signature for the :any:`to` function is ``to(*args, rtype)``. +In what follows, we explain how different values of *args* and *rtype* may be used to construct :any:`Congruence` objects. The following options are possible: - :ref:`froidure-pin-to-congruence`. + - :ref:`word-graph-to-congruence`. .. _froidure-pin-to-congruence: @@ -37,12 +38,12 @@ To construct a :any:`Congruence` from a :any:`FroidurePin`, specify all of the following values for *args*: - **knd** (:any:`congruence_kind`) -- the kind of the congruence being - construed; + constructed; - **fpb** (:any:`FroidurePin`) -- the :any:`FroidurePin` instance to be converted; and - **wg** (:any:`WordGraph`) -- the left or right Cayley graph of *fpb*. -Additionally, specify one of the following tuples for *Return*: +Additionally, specify one of the following tuples for *rtype*: - ``(Congruence, str)`` for constructing a :any:`Congruence` on words of type ``str``; or @@ -87,3 +88,48 @@ This will throw a :any:`LibsemigroupsError` if *wg* is not the >>> cong.run() >>> S.size() == cong.number_of_classes() True + +.. _word-graph-to-congruence: + +Converting a :any:`WordGraph` to a :any:`Congruence` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To construct a :any:`Congruence` from a :any:`WordGraph`, specify all of the +following values for *args*: + + - **knd** (:any:`congruence_kind`) -- the kind of the congruence being + constructed; + - **wg** (:any:`WordGraph`) -- the word graph. + +Additionally, specify one of the following tuples for *rtype*: + + - ``(Congruence, str)`` for constructing a :any:`Congruence` on words of + type ``str``; or + - ``(Congruence, list[int])`` for constructing a :any:`Congruence` on words + of type ``list[int]``. + +This function converts the :any:`WordGraph` object *wg* into a +:any:`Congruence` object. This returned :any:`Congruence` object represents the +trivial congruence over the word graph *wg*. + +.. doctest:: Python + + >>> from libsemigroups_pybind11 import ( + ... congruence_kind, + ... Congruence, + ... WordGraph, + ... to, + ... ) + + >>> wg = WordGraph(7, [[1, 2], [1, 3], [4, 2], [5, 3], [4, 6], [5, 3], [4, 6]]) + >>> cong = to(congruence_kind.twosided, wg, rtype=(Congruence, list[int])) + >>> cong.add_generating_pair([0], [1]) + <1-sided Congruence over with 1 gen. pair, 1 runners> + >>> cong.number_of_classes() + 1 + + >>> cong = to(congruence_kind.twosided, wg, rtype=(Congruence, str)) + >>> cong.add_generating_pair("a", "b") + <1-sided Congruence over with 1 gen. pair, 1 runners> + >>> cong.number_of_classes() + 1 diff --git a/src/to-cong.cpp b/src/to-cong.cpp index 2a9f6bbf..00c07997 100644 --- a/src/to-cong.cpp +++ b/src/to-cong.cpp @@ -49,12 +49,18 @@ namespace libsemigroups { WordGraph const& wg) { return to>(knd, fpb, wg); }); + m.def(fn_name.c_str(), + [](congruence_kind knd, WordGraph const& wg) { + return to>(knd, wg); + }); } } // namespace void init_to_congruence(py::module& m) { // FroidurePin bind_to_congruence(m, "string"); bind_to_congruence(m, "word"); + bind_to_congruence(m, "string"); + bind_to_congruence(m, "word"); } } // namespace libsemigroups diff --git a/tests/test_to.py b/tests/test_to.py index b2dc3c0d..d05c86d2 100644 --- a/tests/test_to.py +++ b/tests/test_to.py @@ -915,6 +915,20 @@ def test_to_Congruence_060(): assert c.py_template_params == (list[int],) +# From WordGraph + + +def test_to_Congruence_010(): + wg = WordGraph(7, [[1, 2], [1, 3], [4, 2], [5, 3], [4, 6], [5, 3], [4, 6]]) + cong = to(congruence_kind.twosided, wg, rtype=(Congruence, list[int])) + cong.add_generating_pair([0], [1]) + assert cong.number_of_classes() == 1 + + cong = to(congruence_kind.twosided, wg, rtype=(Congruence, str)) + cong.add_generating_pair("a", "b") + assert cong.number_of_classes() == 1 + + ############################################################################### # Exceptions ############################################################################### From 4456534fbbb228bae88fe07d29b49dbe6a3100e0 Mon Sep 17 00:00:00 2001 From: James Mitchell Date: Sun, 18 Jan 2026 11:29:17 +0000 Subject: [PATCH 3/7] to: correct spelling --- docs/source/main-algorithms/todd-coxeter/to-todd-coxeter.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/main-algorithms/todd-coxeter/to-todd-coxeter.rst b/docs/source/main-algorithms/todd-coxeter/to-todd-coxeter.rst index 786155f5..e78eed6c 100644 --- a/docs/source/main-algorithms/todd-coxeter/to-todd-coxeter.rst +++ b/docs/source/main-algorithms/todd-coxeter/to-todd-coxeter.rst @@ -39,7 +39,7 @@ To construct a :any:`ToddCoxeter` from a :any:`FroidurePin`, specify all of the following values for *args*: - **knd** (:any:`congruence_kind`) -- the kind of the congruence being - construed; + constructed; - **fpb** (:any:`FroidurePin`) -- the :any:`FroidurePin` instance to be converted; and - **wg** (:any:`WordGraph`) -- the left or right Cayley graph of *fpb*. From dd47225c6ea51c2065ad87fe2e63075ee5410fa2 Mon Sep 17 00:00:00 2001 From: James Mitchell Date: Sun, 18 Jan 2026 11:30:28 +0000 Subject: [PATCH 4/7] to: correct doc "rtype" not "Result" --- .../presentations/to-inverse-present.rst | 20 ++++++------ .../presentations/to-present.rst | 32 +++++++++---------- .../froidure-pin/to-froidure-pin.rst | 14 ++++---- .../knuth-bendix/to-knuth-bendix.rst | 10 +++--- .../todd-coxeter/to-todd-coxeter.rst | 8 ++--- 5 files changed, 42 insertions(+), 42 deletions(-) diff --git a/docs/source/data-structures/presentations/to-inverse-present.rst b/docs/source/data-structures/presentations/to-inverse-present.rst index 454ee2c1..4d46b4ec 100644 --- a/docs/source/data-structures/presentations/to-inverse-present.rst +++ b/docs/source/data-structures/presentations/to-inverse-present.rst @@ -22,8 +22,8 @@ using the :any:`to` function. Various uses ------------ -Recall that the signature for the :any:`to` function is ``to(*args, Return)``. -In what follows, we explain how different values of *args* and *Return* may be +Recall that the signature for the :any:`to` function is ``to(*args, rtype)``. +In what follows, we explain how different values of *args* and *rtype* may be used to construct :any:`InversePresentation` objects. The following options are possible: @@ -41,7 +41,7 @@ the following values for *args*: - **p** (:any:`Presentation`) -- the :any:`Presentation` to convert. -Additionally, specify the following for *Return*: +Additionally, specify the following for *rtype*: - ``(InversePresentation,)`` for constructing an :any:`InversePresentation` over words of the same type as those in *p*. @@ -92,7 +92,7 @@ specify the following values for *args*: - **ip** (:any:`InversePresentation`) -- the :any:`InversePresentation` to convert. -Additionally, specify one of the following for *Return*: +Additionally, specify one of the following for *rtype*: - ``(InversePresentation, str)`` for constructing an - :any:`InversePresentation` over words of type ``str``. @@ -100,14 +100,14 @@ Additionally, specify one of the following for *Return*: :any:`InversePresentation` over words of type ``list[int]``. This function behaves in one of two ways, depending on type of words in *p*, and -the type of words specified in *Return*: +the type of words specified in *rtype*: - 1. When the type of words in *ip* and type of words specified in *Return* + 1. When the type of words in *ip* and type of words specified in *rtype* are not the same, this function returns an :any:`InversePresentation` equivalent to the input :any:`InversePresentation` *ip* but with words a different type (for example, can be used to convert from ``str`` to ``list[int]``). - 2. When the type of words in *ip* and type of words specified in *Return* + 2. When the type of words in *ip* and type of words specified in *rtype* are the same, this function just returns its argument *ip*, and is included solely for the purpose of simplifying certain client code, where objects of type :any:`InversePresentation` must be converted from one @@ -120,7 +120,7 @@ of type ``list[int]``, then the conversion from one type to another is :math:`a_i \mapsto` ``human_readable_letter(a_i)``. This function throws a :any:`LibsemigroupsError` if the type of words in *ip* is -not the same as that specified in *Return* and +not the same as that specified in *rtype* and ``p.throw_if_bad_alphabet_rules_or_inverses()`` throws. .. seealso:: @@ -164,7 +164,7 @@ using a custom letter conversion function, specify the following values for - **f** (``Callable[[str | int], int | str]``) -- the function used to convert between the different types of letters. -Additionally, specify one of the following for *Return*: +Additionally, specify one of the following for *rtype*: - ``(InversePresentation, str)`` for constructing an :any:`InversePresentation` over words of type ``str``. @@ -180,7 +180,7 @@ to the other. This function throws a :any:`LibsemigroupsError` if ``ip.throw_if_bad_alphabet_rules_or_inverses()`` throws, or if the function specified by *f* does not map letters of the type used in *ip* to letters of the -type of word specified in *Return*. +type of word specified in *rtype*. .. seealso:: diff --git a/docs/source/data-structures/presentations/to-present.rst b/docs/source/data-structures/presentations/to-present.rst index f9b93ed8..733c6112 100644 --- a/docs/source/data-structures/presentations/to-present.rst +++ b/docs/source/data-structures/presentations/to-present.rst @@ -22,8 +22,8 @@ This page contains documentation relating to converting Various uses ------------ -Recall that the signature for the :any:`to` function is ``to(*args, Return)``. -In what follows, we explain how different values of *args* and *Return* may be +Recall that the signature for the :any:`to` function is ``to(*args, rtype)``. +In what follows, we explain how different values of *args* and *rtype* may be used to construct :any:`Presentation` objects. The following options are possible: @@ -46,7 +46,7 @@ following values for *args*: - **p** (:any:`Presentation`) -- the :any:`Presentation` to convert. -Additionally, specify one of the following for *Return*: +Additionally, specify one of the following for *rtype*: - ``(Presentation, str)`` for constructing a :any:`Presentation` over words of type ``str``. @@ -54,13 +54,13 @@ Additionally, specify one of the following for *Return*: words of type ``list[int]``. This function behaves in one of two ways, depending on type of words in *p*, and -the type of words specified in *Return*: +the type of words specified in *rtype*: - 1. When the type of words in *p* and type of words specified in *Return* are + 1. When the type of words in *p* and type of words specified in *rtype* are not the same, this function returns a :any:`Presentation` equivalent to the input :any:`Presentation` *p* but with words a different type (for example, can be used to convert from ``str`` to ``list[int]``). - 2. When the type of words in *p* and type of words specified in *Return* are + 2. When the type of words in *p* and type of words specified in *rtype* are the same, this function just returns its argument *p*, and is included solely for the purpose of simplifying certain client code, where presentations must be converted from one type to another sometimes, but @@ -73,7 +73,7 @@ of type ``list[int]``, then the conversion from one type to another is :math:`a_i \mapsto` ``human_readable_letter(a_i)``. This function throws a :any:`LibsemigroupsError` if the type of words in *p* is -not the same as that specified in *Return*, and +not the same as that specified in *rtype*, and ``p.throw_if_bad_alphabet_or_rules()`` throws. .. seealso:: @@ -115,7 +115,7 @@ letter conversion function, specify the following values for *args*: - **f** (``Callable[[str | int], int | str]``) -- the function used to convert between the different types of letters. -Additionally, specify one of the following for *Return*: +Additionally, specify one of the following for *rtype*: - ``(Presentation, str)`` for constructing a :any:`Presentation` over words of type ``str``. @@ -131,7 +131,7 @@ other. This function throws a :any:`LibsemigroupsError` if ``p.throw_if_bad_alphabet_or_rules()`` throws, or if the function specified by *f* does not map letters of the type used in *p* to letters of the type of word -specified in *Return*. +specified in *rtype*. .. seealso:: @@ -169,7 +169,7 @@ following values for *args*: - **kb** (:any:`KnuthBendix`) -- the :any:`KnuthBendix` from which to obtain the rules. -Additionally, specify one of the following for *Return*: +Additionally, specify one of the following for *rtype*: - ``(Presentation,)`` for constructing a :any:`Presentation` over words of the same type as that in *kb*. @@ -211,7 +211,7 @@ enumerates *kb*) prior to calling this function. >>> kb.run() >>> p2 = to(kb, rtype=(Presentation,)) >>> for p in [p1, p2]: - ... # Returns whether any changes have been made + ... # rtypes whether any changes have been made ... presentation.sort_each_rule(p) ... presentation.sort_rules(p) True @@ -230,7 +230,7 @@ following values for *args*: - **fp** (:any:`FroidurePin`) -- the :any:`FroidurePin` from which to obtain the rules. -Additionally, specify the following for *Return*: +Additionally, specify the following for *rtype*: - ``(Presentation, str)`` for constructing a :any:`Presentation` over words of type ``str``. @@ -282,7 +282,7 @@ following values for *args*: - **k** (:any:`Kambites`) -- the :any:`Kambites` from which to obtain the presentation. -Additionally, specify one of the following for *Return*: +Additionally, specify one of the following for *rtype*: - ``(Presentation,)`` for constructing a :any:`Presentation` over words of the same type as that in *k*. @@ -342,7 +342,7 @@ following values for *args*: - **tc** (:any:`ToddCoxeter`) -- the :any:`ToddCoxeter` from which to obtain the presentation. -Additionally, specify one of the following for *Return*: +Additionally, specify one of the following for *rtype*: - ``(Presentation,)`` for constructing a :any:`Presentation` over words of the same type as that in *tc*. @@ -402,7 +402,7 @@ following values for *args*: - **c** (:any:`Congruence`) -- the :any:`Congruence` from which to obtain the presentation. -Additionally, specify one of the following for *Return*: +Additionally, specify one of the following for *rtype*: - ``(Presentation,)`` for constructing a :any:`Presentation` over words of the same type as that in *c*. @@ -463,7 +463,7 @@ following values for *args*: - **s** (:any:`Stephen`) -- the :any:`Stephen` from which to obtain the presentation. -Additionally, specify one of the following for *Return*: +Additionally, specify one of the following for *rtype*: - ``(Presentation,)`` for constructing a :any:`Presentation` over words of the same type as that in *s*. diff --git a/docs/source/main-algorithms/froidure-pin/to-froidure-pin.rst b/docs/source/main-algorithms/froidure-pin/to-froidure-pin.rst index 8222cc31..10b94351 100644 --- a/docs/source/main-algorithms/froidure-pin/to-froidure-pin.rst +++ b/docs/source/main-algorithms/froidure-pin/to-froidure-pin.rst @@ -22,8 +22,8 @@ This page contains documentation relating to converting Various uses ------------ -Recall that the signature for the :any:`to` function is ``to(*args, Return)``. -In what follows, we explain how different values of *args* and *Return* may be +Recall that the signature for the :any:`to` function is ``to(*args, rtype)``. +In what follows, we explain how different values of *args* and *rtype* may be used to construct :any:`FroidurePin` objects. The following options are possible: @@ -44,7 +44,7 @@ following values for *args*: - **cong** (:any:`Congruence`) -- the :any:`Congruence` object being converted. -Additionally, specify the following for *Return*: +Additionally, specify the following for *rtype*: - ``(FroidurePin,)`` for constructing a :any:`FroidurePin`. @@ -88,7 +88,7 @@ values for *args*: - **k** (:any:`Kambites`) -- the :any:`Kambites` object being converted. -Additionally, specify the following for *Return*: +Additionally, specify the following for *rtype*: - ``(FroidurePin,)`` for constructing a :any:`FroidurePin`. @@ -138,7 +138,7 @@ following values for *args*: - **kb** (:any:`KnuthBendix`) -- the :any:`KnuthBendix` object being converted. -Additionally, specify the following for *Return*: +Additionally, specify the following for *rtype*: - ``(FroidurePin,)`` for constructing a :any:`FroidurePin`. @@ -182,7 +182,7 @@ following values for *args*: - **tc** (:any:`ToddCoxeter`) -- the :any:`ToddCoxeter` object being converted. -Additionally, specify the following for *Return*: +Additionally, specify the following for *rtype*: - ``(FroidurePin,)`` for constructing a :any:`FroidurePin`. @@ -235,7 +235,7 @@ or - **last** (:any:`int`) -- the value of :math:`b` in the following discussion. -Additionally, specify the following for *Return*: +Additionally, specify the following for *rtype*: - ``(FroidurePin,)`` for constructing a :any:`FroidurePin`. diff --git a/docs/source/main-algorithms/knuth-bendix/to-knuth-bendix.rst b/docs/source/main-algorithms/knuth-bendix/to-knuth-bendix.rst index f957dd61..fb5117f9 100644 --- a/docs/source/main-algorithms/knuth-bendix/to-knuth-bendix.rst +++ b/docs/source/main-algorithms/knuth-bendix/to-knuth-bendix.rst @@ -22,8 +22,8 @@ This page contains documentation relating to converting Various uses ------------ -Recall that the signature for the :any:`to` function is ``to(*args, Return)``. -In what follows, we explain how different values of *args* and *Return* may be +Recall that the signature for the :any:`to` function is ``to(*args, rtype)``. +In what follows, we explain how different values of *args* and *rtype* may be used to construct :any:`KnuthBendix` objects. The following options are possible: @@ -44,7 +44,7 @@ rewriter, specify all of the following values for *args*: - **tc** (:any:`ToddCoxeter`) -- the :any:`ToddCoxeter` object being converted. -Additionally, specify the following for *Return*: +Additionally, specify the following for *rtype*: - ``(KnuthBendix,)`` for constructing a :any:`KnuthBendix` with the default rewriter. @@ -97,7 +97,7 @@ following values for *args*: - **tc** (:any:`ToddCoxeter`) -- the :any:`ToddCoxeter` object being converted. -Additionally, specify one of the following for *Return*: +Additionally, specify one of the following for *rtype*: - ``(KnuthBendix, 'RewriteTrie')`` for constructing a :any:`KnuthBendix` with the the ``RewriteTrie'`` rewriter. @@ -152,7 +152,7 @@ following values for *args*: - **fpb** (:any:`FroidurePin`) -- the :any:`FroidurePin` object being converted. -Additionally, specify one of the following for *Return*: +Additionally, specify one of the following for *rtype*: - ``(KnuthBendix, str, 'RewriteTrie')`` for constructing a :any:`KnuthBendix` on words with type ``str`` using the ``RewriteTrie'`` diff --git a/docs/source/main-algorithms/todd-coxeter/to-todd-coxeter.rst b/docs/source/main-algorithms/todd-coxeter/to-todd-coxeter.rst index e78eed6c..db91188d 100644 --- a/docs/source/main-algorithms/todd-coxeter/to-todd-coxeter.rst +++ b/docs/source/main-algorithms/todd-coxeter/to-todd-coxeter.rst @@ -22,8 +22,8 @@ This page contains documentation relating to converting Various uses ------------ -Recall that the signature for the :any:`to` function is ``to(*args, Return)``. -In what follows, we explain how different values of *args* and *Return* may be +Recall that the signature for the :any:`to` function is ``to(*args, rtype)``. +In what follows, we explain how different values of *args* and *rtype* may be used to construct :any:`ToddCoxeter` objects. The following options are possible: @@ -44,7 +44,7 @@ following values for *args*: converted; and - **wg** (:any:`WordGraph`) -- the left or right Cayley graph of *fpb*. -Additionally, specify one of the following for *Return*: +Additionally, specify one of the following for *rtype*: - ``(ToddCoxeter, str)`` for constructing a :any:`ToddCoxeter` on words with type ``str``. @@ -103,7 +103,7 @@ following values for *args*: - **kb** (:any:`KnuthBendix`) -- the :any:`KnuthBendix` object being converted. -Additionally, specify the following for *Return*: +Additionally, specify the following for *rtype*: - ``(ToddCoxeter,)`` for constructing a :any:`ToddCoxeter`. From 4083ef7c6b3e037a8377809c0abe643e306c5764 Mon Sep 17 00:00:00 2001 From: James Mitchell Date: Sun, 18 Jan 2026 11:40:49 +0000 Subject: [PATCH 5/7] doc: update to-table.tex --- docs/pictures/to-table.svg | 2536 ++++++++++++++++++++---------------- docs/pictures/to-table.tex | 33 +- 2 files changed, 1401 insertions(+), 1168 deletions(-) diff --git a/docs/pictures/to-table.svg b/docs/pictures/to-table.svg index 6b8300fc..120bdfbe 100644 --- a/docs/pictures/to-table.svg +++ b/docs/pictures/to-table.svg @@ -1,10 +1,10 @@ + id="defs106"> + id="g65"> + + + + + + + id="path31" /> + id="path32" /> + id="path33" /> + id="path34" /> + id="path35" /> + id="path36" /> + id="path37" /> + id="path38" /> + id="path39" /> + id="path40" /> + id="path41" /> + id="path42" /> + id="path43" /> + id="path44" /> + id="path45" /> + id="path46" /> + id="path47" /> + id="path48" /> + id="path49" /> + id="path50" /> + id="path51" /> + id="path52" /> + id="path53" /> + id="path54" /> + id="path55" /> + id="path56" /> + id="path57" /> + id="path58" /> + id="path59" /> + id="path60" /> + id="path61" /> + id="path62" /> + id="path63" /> + id="path64" /> + id="path65" /> + d="M 0 104 L 420.566406 104 L 420.566406 106 L 0 106 Z M 0 104 " + id="path66" /> + d="M 400 107 L 420.566406 107 L 420.566406 120 L 400 120 Z M 400 107 " + id="path67" /> + d="M 0 119 L 420.566406 119 L 420.566406 121 L 0 121 Z M 0 119 " + id="path68" /> + d="M 400 120 L 420.566406 120 L 420.566406 133 L 400 133 Z M 400 120 " + id="path69" /> + d="M 0 132 L 420.566406 132 L 420.566406 133 L 0 133 Z M 0 132 " + id="path70" /> + d="M 400 132 L 420.566406 132 L 420.566406 145 L 400 145 Z M 400 132 " + id="path71" /> + d="M 0 144 L 420.566406 144 L 420.566406 146 L 0 146 Z M 0 144 " + id="path72" /> + d="M 400 145 L 420.566406 145 L 420.566406 157 L 400 157 Z M 400 145 " + id="path73" /> + d="M 0 156 L 420.566406 156 L 420.566406 158 L 0 158 Z M 0 156 " + id="path74" /> + d="M 400 157 L 420.566406 157 L 420.566406 170 L 400 170 Z M 400 157 " + id="path75" /> + d="M 0 169 L 420.566406 169 L 420.566406 170 L 0 170 Z M 0 169 " + id="path76" /> + d="M 400 169 L 420.566406 169 L 420.566406 182 L 400 182 Z M 400 169 " + id="path77" /> + d="M 0 181 L 420.566406 181 L 420.566406 183 L 0 183 Z M 0 181 " + id="path78" /> + d="M 400 182 L 420.566406 182 L 420.566406 195 L 400 195 Z M 400 182 " + id="path79" /> + d="M 0 194 L 420.566406 194 L 420.566406 195 L 0 195 Z M 0 194 " + id="path80" /> + d="M 400 194 L 420.566406 194 L 420.566406 207 L 400 207 Z M 400 194 " + id="path81" /> + d="M 0 206 L 420.566406 206 L 420.566406 207 L 0 207 Z M 0 206 " + id="path82" /> + d="M 400 206 L 420.566406 206 L 420.566406 219 L 400 219 Z M 400 206 " + id="path83" /> + d="M 0 218 L 420.566406 218 L 420.566406 220 L 0 220 Z M 0 218 " + id="path84" /> + d="M 200 218 L 201 218 L 201 231.101562 L 200 231.101562 Z M 200 218 " + id="path85" /> + d="M 200 219 L 221 219 L 221 231.101562 L 200 231.101562 Z M 200 219 " + id="path86" /> + d="M 220 218 L 222 218 L 222 231.101562 L 220 231.101562 Z M 220 218 " + id="path87" /> + d="M 221 219 L 241 219 L 241 231.101562 L 221 231.101562 Z M 221 219 " + id="path88" /> + d="M 240 218 L 242 218 L 242 231.101562 L 240 231.101562 Z M 240 218 " + id="path89" /> + d="M 241 219 L 261 219 L 261 231.101562 L 241 231.101562 Z M 241 219 " + id="path90" /> + d="M 260 218 L 262 218 L 262 231.101562 L 260 231.101562 Z M 260 218 " + id="path91" /> + d="M 261 219 L 281 219 L 281 231.101562 L 261 231.101562 Z M 261 219 " + id="path92" /> + d="M 280 218 L 281 218 L 281 231.101562 L 280 231.101562 Z M 280 218 " + id="path93" /> + d="M 280 219 L 301 219 L 301 231.101562 L 280 231.101562 Z M 280 219 " + id="path94" /> + d="M 300 218 L 301 218 L 301 231.101562 L 300 231.101562 Z M 300 218 " + id="path95" /> + d="M 300 219 L 322 219 L 322 231.101562 L 300 231.101562 Z M 300 219 " + id="path96" /> + d="M 321 218 L 322 218 L 322 231.101562 L 321 231.101562 Z M 321 218 " + id="path97" /> + d="M 321 219 L 341 219 L 341 231.101562 L 321 231.101562 Z M 321 219 " + id="path98" /> + d="M 340 218 L 342 218 L 342 231.101562 L 340 231.101562 Z M 340 218 " + id="path99" /> + d="M 341 219 L 360 219 L 360 231.101562 L 341 231.101562 Z M 341 219 " + id="path100" /> + d="M 359 218 L 360 218 L 360 231.101562 L 359 231.101562 Z M 359 218 " + id="path101" /> + d="M 359 219 L 381 219 L 381 231.101562 L 359 231.101562 Z M 359 219 " + id="path102" /> + d="M 380 218 L 381 218 L 381 231.101562 L 380 231.101562 Z M 380 218 " + id="path103" /> + d="M 380 219 L 400 219 L 400 231.101562 L 380 231.101562 Z M 380 219 " + id="path104" /> + d="M 399 218 L 401 218 L 401 231.101562 L 399 231.101562 Z M 399 218 " + id="path105" /> + d="M 400 219 L 420.566406 219 L 420.566406 231.101562 L 400 231.101562 Z M 400 219 " + id="path106" /> + id="path107" /> + id="g116"> + id="use107" /> + id="use108" /> + id="use109" /> + id="use110" /> + id="use111" /> + id="use112" /> + id="use113" /> + id="use114" /> + id="use115" /> + id="use116" /> + id="path116" /> + id="g127"> + id="use117" /> + id="use118" /> + id="use119" /> + id="use120" /> + id="use121" /> + id="use122" /> + id="use123" /> + id="use124" /> + id="use125" /> + id="use126" /> + id="use127" /> + id="path127" /> + id="g146"> + id="use128" /> + id="use129" /> + id="use130" /> + id="use131" /> + id="use132" /> + id="use133" /> + id="use134" /> + id="use135" /> + id="use136" /> + id="use137" /> + id="use138" /> + id="use139" /> + id="use140" /> + id="use141" /> + id="use142" /> + id="use143" /> + id="use144" /> + id="use145" /> + id="use146" /> + id="path146" /> + id="g154"> + id="use147" /> + id="use148" /> + id="use149" /> + id="use150" /> + id="use151" /> + id="use152" /> + id="use153" /> + id="use154" /> + id="path154" /> + id="g165"> + id="use155" /> + id="use156" /> + id="use157" /> + id="use158" /> + id="use159" /> + id="use160" /> + id="use161" /> + id="use162" /> + id="use163" /> + id="use164" /> + id="use165" /> + id="path165" /> + id="g174"> + id="use166" /> + id="use167" /> + id="use168" /> + id="use169" /> + id="use170" /> + id="use171" /> + id="use172" /> + id="use173" /> + id="use174" /> + id="path174" /> + id="g186"> + id="use175" /> + id="use176" /> + id="use177" /> + id="use178" /> + id="use179" /> + id="use180" /> + id="use181" /> + id="use182" /> + id="use183" /> + id="use184" /> + id="use185" /> + id="use186" /> + id="path186" /> + id="g198"> + id="use187" /> + id="use188" /> + id="use189" /> + id="use190" /> + id="use191" /> + id="use192" /> + id="use193" /> + id="use194" /> + id="use195" /> + id="use196" /> + id="use197" /> + id="use198" /> + id="path198" /> + id="g205"> + id="use199" /> + id="use200" /> + id="use201" /> + id="use202" /> + id="use203" /> + id="use204" /> + id="use205" /> + id="path205" /> + id="g216"> + id="use206" /> + id="use207" /> + id="use208" /> + id="use209" /> + id="use210" /> + id="use211" /> + id="use212" /> + id="use213" /> + id="use214" /> + id="use215" /> + id="use216" /> + - + fill="rgb(0%, 0%, 0%)" + fill-opacity="1" + id="g225"> + + + + + + + + + + clip-path="url(#clip-0)" + id="g226"> + d="M 0 -0.0016875 L 420.566406 -0.0016875 " + transform="matrix(1, 0, 0, -1, 0, 104.928)" + id="path225" /> + id="g234"> + id="use226" /> + id="use227" /> + id="use228" /> + id="use229" /> + id="use230" /> + id="use231" /> + id="use232" /> + id="use233" /> + id="use234" /> + id="g251"> + id="use235" /> + id="use236" /> + id="use237" /> + id="use238" /> + id="use239" /> + id="use240" /> + id="use241" /> + id="use242" /> + id="use243" /> + id="use244" /> + id="use245" /> + id="use246" /> + id="use247" /> + id="use248" /> + id="use249" /> + id="use250" /> + id="use251" /> + id="path251" /> + id="path252" /> + id="g252"> + id="use252" /> + id="path253" /> + id="path254" /> + id="g254"> + id="use254" /> + id="path255" /> + id="path256" /> + id="g256"> + id="use256" /> + id="path257" /> + id="path258" /> + id="g258"> + id="use258" /> + id="path259" /> + id="path260" /> + id="g260"> + id="use260" /> + id="path261" /> + id="path262" /> + id="g262"> + id="use262" /> + id="path263" /> + id="path264" /> + id="g264"> + id="use264" /> + id="path265" /> + id="path266" /> + id="g266"> + id="use266" /> + id="path267" /> + id="path268" /> + id="g268"> + id="use268" /> + id="path269" /> + id="path270" /> + id="g270"> + id="use270" /> + + clip-path="url(#clip-1)" + id="g272"> + fill-rule="nonzero" + fill="rgb(75%, 100%, 75%)" + fill-opacity="1" + d="M 400.308594 119.921875 L 420.566406 119.921875 L 420.566406 107.964844 L 400.308594 107.964844 Z M 400.308594 119.921875 " + id="path272" /> + fill="rgb(0%, 0%, 0%)" + fill-opacity="1" + id="g273"> + + + + d="M 0 0.0018125 L 420.566406 0.0018125 " + transform="matrix(1, 0, 0, -1, 0, 120.119)" + id="path273" /> + id="g282"> + id="use274" /> + id="use275" /> + id="use276" /> + id="use277" /> + id="use278" /> + id="use279" /> + id="use280" /> + id="use281" /> + id="use282" /> + id="g300"> + id="use283" /> + id="use284" /> + id="use285" /> + id="use286" /> + id="use287" /> + id="use288" /> + id="use289" /> + id="use290" /> + id="use291" /> + id="use292" /> + id="use293" /> + id="use294" /> + id="use295" /> + id="use296" /> + id="use297" /> + id="use298" /> + id="use299" /> + id="use300" /> + id="path300" /> + id="path301" /> + id="g301"> + id="use301" /> + id="path302" /> + id="path303" /> + id="g303"> + id="use303" /> + id="path304" /> + id="path305" /> + id="g305"> + id="use305" /> + id="path306" /> + id="path307" /> + id="g307"> + id="use307" /> + id="path308" /> + id="path309" /> + id="g309"> + id="use309" /> + id="path310" /> + id="path311" /> + id="g311"> + id="use311" /> + id="path312" /> + id="path313" /> + id="g313"> + id="use313" /> + id="path314" /> + id="path315" /> + id="g315"> + id="use315" /> + id="path316" /> + id="path317" /> + id="g317"> + id="use317" /> + id="path318" /> + id="path319" /> + id="g319"> + id="use319" /> + + clip-path="url(#clip-3)" + id="g321"> + fill-rule="nonzero" + fill="rgb(75%, 100%, 75%)" + fill-opacity="1" + d="M 400.308594 132.273438 L 420.566406 132.273438 L 420.566406 120.320312 L 400.308594 120.320312 Z M 400.308594 132.273438 " + id="path321" /> + fill="rgb(0%, 0%, 0%)" + fill-opacity="1" + id="g322"> + + + + d="M 0 0.00034375 L 420.566406 0.00034375 " + transform="matrix(1, 0, 0, -1, 0, 132.473)" + id="path322" /> + id="g331"> + id="use323" /> + id="use324" /> + id="use325" /> + id="use326" /> + id="use327" /> + id="use328" /> + id="use329" /> + id="use330" /> + id="use331" /> + id="g357"> + id="use332" /> + id="use333" /> + id="use334" /> + id="use335" /> + id="use336" /> + id="use337" /> + id="use338" /> + id="use339" /> + id="use340" /> + id="use341" /> + id="use342" /> + id="use343" /> + id="use344" /> + id="use345" /> + id="use346" /> + id="use347" /> + id="use348" /> + id="use349" /> + id="use350" /> + id="use351" /> + id="use352" /> + id="use353" /> + id="use354" /> + id="use355" /> + id="use356" /> + id="use357" /> + id="path357" /> + id="path358" /> + id="g358"> + id="use358" /> + id="path359" /> + id="path360" /> + id="g360"> + id="use360" /> + id="path361" /> + id="path362" /> + id="g362"> + id="use362" /> + id="path363" /> + id="path364" /> + id="g364"> + id="use364" /> + id="path365" /> + id="path366" /> + id="g366"> + id="use366" /> + id="path367" /> + id="path368" /> + id="g368"> + id="use368" /> + id="path369" /> + id="path370" /> + id="g370"> + id="use370" /> + id="path371" /> + id="path372" /> + id="g372"> + id="use372" /> + id="path373" /> + id="path374" /> + id="g374"> + id="use374" /> + id="path375" /> + id="path376" /> + id="g376"> + id="use376" /> + + clip-path="url(#clip-5)" + id="g378"> + fill-rule="nonzero" + fill="rgb(100%, 75%, 75%)" + fill-opacity="1" + d="M 400.308594 144.628906 L 420.566406 144.628906 L 420.566406 132.671875 L 400.308594 132.671875 Z M 400.308594 144.628906 " + id="path378" /> + fill="rgb(0%, 0%, 0%)" + fill-opacity="1" + id="g379"> + + + + d="M 0 -0.001125 L 420.566406 -0.001125 " + transform="matrix(1, 0, 0, -1, 0, 144.827)" + id="path379" /> + id="g388"> + id="use380" /> + id="use381" /> + id="use382" /> + id="use383" /> + id="use384" /> + id="use385" /> + id="use386" /> + id="use387" /> + id="use388" /> + id="g403"> + id="use389" /> + id="use390" /> + id="use391" /> + id="use392" /> + id="use393" /> + id="use394" /> + id="use395" /> + id="use396" /> + id="use397" /> + id="use398" /> + id="use399" /> + id="use400" /> + id="use401" /> + id="use402" /> + id="use403" /> + id="path403" /> + id="path404" /> + id="g404"> + id="use404" /> + id="path405" /> + id="path406" /> + id="g406"> + id="use406" /> + id="path407" /> + id="path408" /> + id="g408"> + id="use408" /> + id="path409" /> + id="path410" /> + id="g410"> + id="use410" /> + id="path411" /> + id="path412" /> + id="g412"> + id="use412" /> + id="path413" /> + id="path414" /> + id="g414"> + id="use414" /> + id="path415" /> + id="path416" /> + id="g416"> + id="use416" /> + id="path417" /> + id="path418" /> + id="g418"> + id="use418" /> + id="path419" /> + id="path420" /> + id="g420"> + id="use420" /> + id="path421" /> + id="path422" /> + id="g422"> + id="use422" /> + + clip-path="url(#clip-7)" + id="g424"> + fill-rule="nonzero" + fill="rgb(100%, 75%, 75%)" + fill-opacity="1" + d="M 400.308594 156.980469 L 420.566406 156.980469 L 420.566406 145.027344 L 400.308594 145.027344 Z M 400.308594 156.980469 " + id="path424" /> + fill="rgb(0%, 0%, 0%)" + fill-opacity="1" + id="g425"> + + + + d="M 0 0.0003125 L 420.566406 0.0003125 " + transform="matrix(1, 0, 0, -1, 0, 157.18)" + id="path425" /> + id="g434"> + id="use426" /> + id="use427" /> + id="use428" /> + id="use429" /> + id="use430" /> + id="use431" /> + id="use432" /> + id="use433" /> + id="use434" /> + id="g452"> + id="use435" /> + id="use436" /> + id="use437" /> + id="use438" /> + id="use439" /> + id="use440" /> + id="use441" /> + id="use442" /> + id="use443" /> + id="use444" /> + id="use445" /> + id="use446" /> + id="use447" /> + id="use448" /> + id="use449" /> + id="use450" /> + id="use451" /> + id="use452" /> + id="path452" /> + id="path453" /> + id="g453"> + id="use453" /> + id="path454" /> + id="path455" /> + id="g455"> + id="use455" /> + id="path456" /> + id="path457" /> + id="g457"> + id="use457" /> + id="path458" /> + id="path459" /> + id="g459"> + id="use459" /> + id="path460" /> + id="path461" /> + id="g461"> + id="use461" /> + id="path462" /> + id="path463" /> + id="g463"> + id="use463" /> + id="path464" /> + id="path465" /> + id="g465"> + id="use465" /> + id="path466" /> + id="path467" /> + id="g467"> + id="use467" /> + id="path468" /> + id="path469" /> + id="g469"> + id="use469" /> + id="path470" /> + id="path471" /> + id="g471"> + id="use471" /> + + clip-path="url(#clip-9)" + id="g473"> + fill-rule="nonzero" + fill="rgb(100%, 75%, 75%)" + fill-opacity="1" + d="M 400.308594 169.335938 L 420.566406 169.335938 L 420.566406 157.378906 L 400.308594 157.378906 Z M 400.308594 169.335938 " + id="path473" /> + fill="rgb(0%, 0%, 0%)" + fill-opacity="1" + id="g474"> + + + + d="M 0 -0.00115625 L 420.566406 -0.00115625 " + transform="matrix(1, 0, 0, -1, 0, 169.534)" + id="path474" /> + id="g483"> + id="use475" /> + id="use476" /> + id="use477" /> + id="use478" /> + id="use479" /> + id="use480" /> + id="use481" /> + id="use482" /> + id="use483" /> + id="g499"> + id="use484" /> + id="use485" /> + id="use486" /> + id="use487" /> + id="use488" /> + id="use489" /> + id="use490" /> + id="use491" /> + id="use492" /> + id="use493" /> + id="use494" /> + id="use495" /> + id="use496" /> + id="use497" /> + id="use498" /> + id="use499" /> + id="path499" /> + id="path500" /> + id="g500"> + id="use500" /> + id="path501" /> + id="path502" /> + id="g502"> + id="use502" /> + id="path503" /> + id="path504" /> + id="g504"> + id="use504" /> + id="path505" /> + id="path506" /> + id="g506"> + id="use506" /> + id="path507" /> + id="path508" /> + id="g508"> + id="use508" /> + id="path509" /> + id="path510" /> + id="g510"> + id="use510" /> + id="path511" /> + id="path512" /> + id="g512"> + id="use512" /> + id="path513" /> + id="path514" /> + id="g514"> + id="use514" /> + id="path515" /> + id="path516" /> + id="g516"> + id="use516" /> + id="path517" /> + id="path518" /> + id="g518"> + id="use518" /> + + clip-path="url(#clip-11)" + id="g520"> + fill-rule="nonzero" + fill="rgb(100%, 75%, 75%)" + fill-opacity="1" + d="M 400.308594 181.6875 L 420.566406 181.6875 L 420.566406 169.734375 L 400.308594 169.734375 Z M 400.308594 181.6875 " + id="path520" /> + fill="rgb(0%, 0%, 0%)" + fill-opacity="1" + id="g521"> + + + + d="M 0 0.00128125 L 420.566406 0.00128125 " + transform="matrix(1, 0, 0, -1, 0, 181.888)" + id="path521" /> + id="g530"> + id="use522" /> + id="use523" /> + id="use524" /> + id="use525" /> + id="use526" /> + id="use527" /> + id="use528" /> + id="use529" /> + id="use530" /> + id="g549"> + id="use531" /> + id="use532" /> + id="use533" /> + id="use534" /> + id="use535" /> + id="use536" /> + id="use537" /> + id="use538" /> + id="use539" /> + id="use540" /> + id="use541" /> + id="use542" /> + id="use543" /> + id="use544" /> + id="use545" /> + id="use546" /> + id="use547" /> + id="use548" /> + id="use549" /> + id="path549" /> + id="path550" /> + id="g550"> + id="use550" /> + id="path551" /> + id="path552" /> + id="g552"> + id="use552" /> + id="path553" /> + id="path554" /> + id="g554"> + id="use554" /> + id="path555" /> + id="path556" /> + id="g556"> + id="use556" /> + id="path557" /> + id="path558" /> + id="g558"> + id="use558" /> + id="path559" /> + id="path560" /> + id="g560"> + id="use560" /> + id="path561" /> + id="path562" /> + id="g562"> + id="use562" /> + id="path563" /> + id="path564" /> + id="g564"> + id="use564" /> + id="path565" /> + id="path566" /> + id="g566"> + id="use566" /> + id="path567" /> + id="path568" /> + id="g568"> + id="use568" /> + + clip-path="url(#clip-13)" + id="g570"> + fill-rule="nonzero" + fill="rgb(100%, 75%, 75%)" + fill-opacity="1" + d="M 400.308594 194.042969 L 420.566406 194.042969 L 420.566406 182.085938 L 400.308594 182.085938 Z M 400.308594 194.042969 " + id="path570" /> + fill="rgb(0%, 0%, 0%)" + fill-opacity="1" + id="g571"> + + + + d="M 0 -0.0011875 L 420.566406 -0.0011875 " + transform="matrix(1, 0, 0, -1, 0, 194.241)" + id="path571" /> + id="g580"> + id="use572" /> + id="use573" /> + id="use574" /> + id="use575" /> + id="use576" /> + id="use577" /> + id="use578" /> + id="use579" /> + id="use580" /> + id="g599"> + id="use581" /> + id="use582" /> + id="use583" /> + id="use584" /> + id="use585" /> + id="use586" /> + id="use587" /> + id="use588" /> + id="use589" /> + id="use590" /> + id="use591" /> + id="use592" /> + id="use593" /> + id="use594" /> + id="use595" /> + id="use596" /> + id="use597" /> + id="use598" /> + id="use599" /> + id="path599" /> + id="path600" /> + id="g600"> + id="use600" /> + id="path601" /> + id="path602" /> + id="g602"> + id="use602" /> + id="path603" /> + id="path604" /> + id="g604"> + id="use604" /> + id="path605" /> + id="path606" /> + id="g606"> + id="use606" /> + id="path607" /> + id="path608" /> + id="g608"> + id="use608" /> + id="path609" /> + id="path610" /> + id="g610"> + id="use610" /> + id="path611" /> + id="path612" /> + id="g612"> + id="use612" /> + id="path613" /> + id="path614" /> + id="g614"> + id="use614" /> + id="path615" /> + id="path616" /> + id="g616"> + id="use616" /> + id="path617" /> + id="path618" /> + id="g618"> + id="use618" /> + + clip-path="url(#clip-15)" + id="g620"> + fill-rule="nonzero" + fill="rgb(100%, 75%, 75%)" + fill-opacity="1" + d="M 400.308594 206.394531 L 420.566406 206.394531 L 420.566406 194.441406 L 400.308594 194.441406 Z M 400.308594 206.394531 " + id="path620" /> + fill="rgb(0%, 0%, 0%)" + fill-opacity="1" + id="g621"> + + + + d="M 0 0.00125 L 420.566406 0.00125 " + transform="matrix(1, 0, 0, -1, 0, 206.595)" + id="path621" /> + id="g630"> + id="use622" /> + id="use623" /> + id="use624" /> + id="use625" /> + id="use626" /> + id="use627" /> + id="use628" /> + id="use629" /> + id="use630" /> + id="g644"> + id="use631" /> + id="use632" /> + id="use633" /> + id="use634" /> + id="use635" /> + id="use636" /> + id="use637" /> + id="use638" /> + id="use639" /> + id="use640" /> + id="use641" /> + id="use642" /> + id="use643" /> + id="use644" /> + id="path644" /> + id="path645" /> + id="g645"> + id="use645" /> + id="path646" /> + id="path647" /> + id="g647"> + id="use647" /> + id="path648" /> + id="path649" /> + id="g649"> + id="use649" /> + id="path650" /> + id="path651" /> + id="g651"> + id="use651" /> + id="path652" /> + id="path653" /> + id="g653"> + id="use653" /> + id="path654" /> + id="path655" /> + id="g655"> + id="use655" /> + id="path656" /> + id="path657" /> + id="g657"> + id="use657" /> + id="path658" /> + id="path659" /> + id="g659"> + id="use659" /> + id="path660" /> + id="path661" /> + id="g661"> + id="use661" /> + id="path662" /> + id="path663" /> + id="g663"> + id="use663" /> + + clip-path="url(#clip-17)" + id="g665"> + fill-rule="nonzero" + fill="rgb(100%, 75%, 75%)" + fill-opacity="1" + d="M 400.308594 218.75 L 420.566406 218.75 L 420.566406 206.792969 L 400.308594 206.792969 Z M 400.308594 218.75 " + id="path665" /> + fill="rgb(0%, 0%, 0%)" + fill-opacity="1" + id="g666"> + + + + d="M 0 -0.00021875 L 420.566406 -0.00021875 " + transform="matrix(1, 0, 0, -1, 0, 218.949)" + id="path666" /> + id="g675"> + id="use667" /> + id="use668" /> + id="use669" /> + id="use670" /> + id="use671" /> + id="use672" /> + id="use673" /> + id="use674" /> + id="use675" /> + id="g693"> + id="use676" /> + id="use677" /> + id="use678" /> + id="use679" /> + id="use680" /> + id="use681" /> + id="use682" /> + id="use683" /> + id="use684" /> + id="use685" /> + id="use686" /> + id="use687" /> + id="use688" /> + id="use689" /> + id="use690" /> + id="use691" /> + id="use692" /> + id="use693" /> + clip-path="url(#clip-19)" + id="g694"> + id="path693" /> + clip-path="url(#clip-20)" + id="g695"> + id="path694" /> + id="g696"> + id="use695" /> + clip-path="url(#clip-21)" + id="g697"> + id="path696" /> + clip-path="url(#clip-22)" + id="g698"> + id="path697" /> + id="g699"> + id="use698" /> + clip-path="url(#clip-23)" + id="g700"> + id="path699" /> + clip-path="url(#clip-24)" + id="g701"> + id="path700" /> + id="g702"> + id="use701" /> + clip-path="url(#clip-25)" + id="g703"> + id="path702" /> + clip-path="url(#clip-26)" + id="g704"> + id="path703" /> + id="g705"> + id="use704" /> + clip-path="url(#clip-27)" + id="g706"> + id="path705" /> + clip-path="url(#clip-28)" + id="g707"> + id="path706" /> + id="g708"> + id="use707" /> + clip-path="url(#clip-29)" + id="g709"> + id="path708" /> + clip-path="url(#clip-30)" + id="g710"> + id="path709" /> + id="g711"> + id="use710" /> + clip-path="url(#clip-31)" + id="g712"> + id="path711" /> + clip-path="url(#clip-32)" + id="g713"> + id="path712" /> + id="g714"> + id="use713" /> + clip-path="url(#clip-33)" + id="g715"> + id="path714" /> + clip-path="url(#clip-34)" + id="g716"> + id="path715" /> + id="g717"> + id="use716" /> + clip-path="url(#clip-35)" + id="g718"> + id="path717" /> + clip-path="url(#clip-36)" + id="g719"> + id="path718" /> + id="g720"> + id="use719" /> + clip-path="url(#clip-37)" + id="g721"> + id="path720" /> + clip-path="url(#clip-38)" + id="g722"> + id="path721" /> + id="g723"> + id="use722" /> + clip-path="url(#clip-39)" + id="g724"> + id="path723" /> + + + + + + diff --git a/docs/pictures/to-table.tex b/docs/pictures/to-table.tex index 2df37a67..ad6dc316 100644 --- a/docs/pictures/to-table.tex +++ b/docs/pictures/to-table.tex @@ -20,29 +20,40 @@ \rotatebox{90}{\texttt{Presentation}} & \rotatebox{90}{\texttt{SchreierSims}} & \rotatebox{90}{\texttt{Stephen}} & - \rotatebox{90}{\texttt{ToddCoxeter}} + \rotatebox{90}{\texttt{ToddCoxeter}} & + \rotatebox{90}{\texttt{WordGraph}} \\ \midrule \texttt{to(*args, rtype=Congruence)} & \xmark & \cmark & - \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \xmark \\\hline + \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \xmark + & \cmark \\\hline \texttt{to(*args, rtype=FroidurePin)} & \cmark & \xmark & - \xmark & \cmark & \cmark & \xmark & \xmark & \xmark & \xmark & \cmark \\\hline + \xmark & \cmark & \cmark & \xmark & \xmark & \xmark & \xmark & \cmark + & \cmark \\\hline \texttt{to(*args, rtype=InversePresentation)} & \xmark & \xmark & - \cmark & \xmark & \xmark & \xmark & \cmark & \xmark & \xmark & \xmark \\\hline + \cmark & \xmark & \xmark & \xmark & \cmark & \xmark & \xmark & \xmark + & \xmark \\\hline \texttt{to(*args, rtype=Kambites)} & \xmark & \xmark & - \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \xmark \\\hline + \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \xmark + & \xmark \\\hline \texttt{to(*args, rtype=KnuthBendix)} & \xmark & \cmark & - \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \cmark \\\hline + \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \cmark + & \xmark \\\hline \texttt{to(*args, rtype=Konieczny)} & \xmark & \xmark & - \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \xmark \\\hline + \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \xmark + & \xmark \\\hline \texttt{to(*args, rtype=Presentation)} & \cmark & \cmark & - \xmark & \cmark & \cmark & \xmark & \cmark & \xmark & \cmark & \cmark \\\hline + \xmark & \cmark & \cmark & \xmark & \cmark & \xmark & \cmark & \cmark + & \xmark \\\hline \texttt{to(*args, rtype=SchreierSims)} & \xmark & \xmark & - \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \xmark \\\hline + \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \xmark + & \xmark \\\hline \texttt{to(*args, rtype=Stephen)} & \xmark & \xmark & - \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \xmark \\\hline + \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \xmark & \xmark + & \xmark \\\hline \texttt{to(*args, rtype=ToddCoxeter)} & \xmark & \cmark & - \xmark & \xmark & \cmark & \xmark & \xmark & \xmark & \xmark & \xmark \\ + \xmark & \xmark & \cmark & \xmark & \xmark & \xmark & \xmark & \xmark + & \xmark \\ \end{tabular} % \cmark = implemented, \xmark = not yet implemented, - % = not applicable From a963c766e6981cf176dd32af3aec02c9f727cecd Mon Sep 17 00:00:00 2001 From: James Mitchell Date: Sun, 18 Jan 2026 11:41:45 +0000 Subject: [PATCH 6/7] gitignore: ignore latex generated files --- .gitignore | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 68123c1d..20b60b7c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,22 +1,25 @@ +_build +_generate +.cache +.ccls +.coverage +.DS_Store *.aux *.ccls-cache *.egg-info +*.fdb_latexmk +*.fls *.gv *.log *.pdf *.py[cod] *.so *.whl -.DS_Store -.cache -.ccls -.coverage -compile_commands.json -MANIFEST -_build -_generate build +compile_commands.json coverage.xml +docs/pictures/to-table.synctex.gz gh-pages/ htmlcov +MANIFEST src/libsemigroups_pybind11/_version.py From c0f619fd3bbfaea9547245d61ae9654dc8a7d5bf Mon Sep 17 00:00:00 2001 From: James Mitchell Date: Sun, 18 Jan 2026 12:00:17 +0000 Subject: [PATCH 7/7] doc: minor fixes --- docs/source/data-structures/to-function.rst | 5 +++++ src/libsemigroups_pybind11/to.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/source/data-structures/to-function.rst b/docs/source/data-structures/to-function.rst index d315c740..626ed6fa 100644 --- a/docs/source/data-structures/to-function.rst +++ b/docs/source/data-structures/to-function.rst @@ -7,6 +7,10 @@ .. currentmodule:: libsemigroups_pybind11 +.. |br| raw:: html + +
+ The ``to`` function =================== @@ -26,6 +30,7 @@ A summary of the possible conversions available in ``libsemigroups_pybind11`` of :align: center :alt: A table containing the possible conversions of libsemigroups_pybind11 types. +|br| A tick indicates that this conversion is implemented, and a cross that it is not yet implemented. diff --git a/src/libsemigroups_pybind11/to.py b/src/libsemigroups_pybind11/to.py index 955866aa..5fcbf96e 100644 --- a/src/libsemigroups_pybind11/to.py +++ b/src/libsemigroups_pybind11/to.py @@ -88,7 +88,7 @@ def _nice_name(type_list): def to(*args, rtype: tuple): - """Convert from one type of `libsemigroups` object to another + """Convert from one type of ``libsemigroups_pybind11`` object to another. This function converts the the arguments specified in *args* to object of type *rtype*.