Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libsemigroups for openSUSE:Factory checked in at 2023-03-29 23:27:59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libsemigroups (Old) and /work/SRC/openSUSE:Factory/.libsemigroups.new.31432 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libsemigroups" Wed Mar 29 23:27:59 2023 rev:30 rq:1075158 version:2.7.1 Changes: -------- --- /work/SRC/openSUSE:Factory/libsemigroups/libsemigroups.changes 2023-03-24 15:20:58.795062768 +0100 +++ /work/SRC/openSUSE:Factory/.libsemigroups.new.31432/libsemigroups.changes 2023-03-29 23:27:59.911713029 +0200 @@ -1,0 +2,6 @@ +Wed Mar 29 08:28:03 UTC 2023 - Jan Engelhardt <jeng...@inai.de> + +- Update to release 2.7.1 + * present: fix sort_rules bug + +------------------------------------------------------------------- Old: ---- libsemigroups-2.7.0.tar.gz New: ---- libsemigroups-2.7.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libsemigroups.spec ++++++ --- /var/tmp/diff_new_pack.8yGT8Q/_old 2023-03-29 23:28:00.455715936 +0200 +++ /var/tmp/diff_new_pack.8yGT8Q/_new 2023-03-29 23:28:00.459715958 +0200 @@ -18,7 +18,7 @@ Name: libsemigroups %define lname libsemigroups2 -Version: 2.7.0 +Version: 2.7.1 Release: 0 Summary: Library with algorithms for computing finite and finitely presented semigroups License: GPL-3.0-or-later ++++++ libsemigroups-2.7.0.tar.gz -> libsemigroups-2.7.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.7.0/.VERSION new/libsemigroups-2.7.1/.VERSION --- old/libsemigroups-2.7.0/.VERSION 2023-03-22 17:48:46.017386282 +0100 +++ new/libsemigroups-2.7.1/.VERSION 2023-03-29 08:58:34.861445493 +0200 @@ -1 +1 @@ -2.7.0 \ No newline at end of file +2.7.1 \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.7.0/README.rst new/libsemigroups-2.7.1/README.rst --- old/libsemigroups-2.7.0/README.rst 2023-03-22 17:39:52.706100064 +0100 +++ new/libsemigroups-2.7.1/README.rst 2023-03-29 08:55:27.586290512 +0200 @@ -4,7 +4,7 @@ The full license is in the file LICENSE, distributed with this software. -libsemigroups - Version 2.7.0 +libsemigroups - Version 2.7.1 ============================= .. image:: https://readthedocs.org/projects/libsemigroups/badge/?version=master @@ -57,7 +57,8 @@ `Mitchell-Tsalakou <http://arxiv.org/abs/2105.12125>`__ - a version of Sims low index subgroup algorithm for computing one-sided - congruences of a semigroup or monoid; + congruences of a semigroup or monoid; see `this paper + <https://arxiv.org/abs/2302.06295>`__ for details. - a version of `Stephen's procedure`_ for finitely presented semigroups and monoids (for a given word :math:`w` this procedure is for determining words equivalent to :math:`w` or that are left divisors of :math:`w`). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.7.0/configure new/libsemigroups-2.7.1/configure --- old/libsemigroups-2.7.0/configure 2023-03-22 17:48:49.901238223 +0100 +++ new/libsemigroups-2.7.1/configure 2023-03-29 08:58:38.926086673 +0200 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for libsemigroups 2.7.0. +# Generated by GNU Autoconf 2.71 for libsemigroups 2.7.1. # # Report bugs to <j...@st-andrews.ac.uk>. # @@ -621,8 +621,8 @@ # Identity of this package. PACKAGE_NAME='libsemigroups' PACKAGE_TARNAME='libsemigroups' -PACKAGE_VERSION='2.7.0' -PACKAGE_STRING='libsemigroups 2.7.0' +PACKAGE_VERSION='2.7.1' +PACKAGE_STRING='libsemigroups 2.7.1' PACKAGE_BUGREPORT='j...@st-andrews.ac.uk' PACKAGE_URL='' @@ -1433,7 +1433,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures libsemigroups 2.7.0 to adapt to many kinds of systems. +\`configure' configures libsemigroups 2.7.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1505,7 +1505,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of libsemigroups 2.7.0:";; + short | recursive ) echo "Configuration of libsemigroups 2.7.1:";; esac cat <<\_ACEOF @@ -1647,7 +1647,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -libsemigroups configure 2.7.0 +libsemigroups configure 2.7.1 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. @@ -2486,7 +2486,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by libsemigroups $as_me 2.7.0, which was +It was created by libsemigroups $as_me 2.7.1, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -4095,7 +4095,7 @@ # Define the identity of the package. PACKAGE='libsemigroups' - VERSION='2.7.0' + VERSION='2.7.1' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -23468,7 +23468,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by libsemigroups $as_me 2.7.0, which was +This file was extended by libsemigroups $as_me 2.7.1, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -23536,7 +23536,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -libsemigroups config.status 2.7.0 +libsemigroups config.status 2.7.1 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.7.0/docs/source/changelog.rst new/libsemigroups-2.7.1/docs/source/changelog.rst --- old/libsemigroups-2.7.0/docs/source/changelog.rst 2023-03-22 17:42:17.501386759 +0100 +++ new/libsemigroups-2.7.1/docs/source/changelog.rst 2023-03-29 08:57:24.041422164 +0200 @@ -1,6 +1,14 @@ Changelog - version 2 ===================== +v2.7.1 (released 29/03/2023) +---------------------------- + +In this release a couple of bugs in ``presentation::sort_rules`` are resolved: + +* present: fix sort_rules bug by @james-d-mitchell in + https://github.com/libsemigroups/libsemigroups/pull/478 + v2.7.0 (released 22/03/2023) ---------------------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.7.0/docs/source/index.rst new/libsemigroups-2.7.1/docs/source/index.rst --- old/libsemigroups-2.7.0/docs/source/index.rst 2023-03-22 17:48:31.264951441 +0100 +++ new/libsemigroups-2.7.1/docs/source/index.rst 2023-03-29 08:58:21.322227078 +0200 @@ -1,4 +1,4 @@ -libsemigroups - Version 2.7.0 +libsemigroups - Version 2.7.1 ============================= C++ library for semigroups and monoids diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.7.0/docs/source/install.rst new/libsemigroups-2.7.1/docs/source/install.rst --- old/libsemigroups-2.7.0/docs/source/install.rst 2023-03-22 17:47:42.938300522 +0100 +++ new/libsemigroups-2.7.1/docs/source/install.rst 2023-03-29 08:58:02.552542932 +0200 @@ -1,4 +1,4 @@ -.. |libsemigroups-version| replace:: 2.7.0 +.. |libsemigroups-version| replace:: 2.7.1 .. _Installation: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.7.0/include/libsemigroups/config.hpp new/libsemigroups-2.7.1/include/libsemigroups/config.hpp --- old/libsemigroups-2.7.0/include/libsemigroups/config.hpp 2023-03-22 17:48:56.663587295 +0100 +++ new/libsemigroups-2.7.1/include/libsemigroups/config.hpp 2023-03-29 08:58:45.966325997 +0200 @@ -186,7 +186,7 @@ /* Define to the full name and version of this package. */ #ifndef LIBSEMIGROUPS_PACKAGE_STRING -#define LIBSEMIGROUPS_PACKAGE_STRING "libsemigroups 2.7.0" +#define LIBSEMIGROUPS_PACKAGE_STRING "libsemigroups 2.7.1" #endif /* Define to the one symbol short name of this package. */ @@ -201,7 +201,7 @@ /* Define to the version of this package. */ #ifndef LIBSEMIGROUPS_PACKAGE_VERSION -#define LIBSEMIGROUPS_PACKAGE_VERSION "2.7.0" +#define LIBSEMIGROUPS_PACKAGE_VERSION "2.7.1" #endif /* Define to necessary symbol if this constant uses a non-standard name on @@ -237,7 +237,7 @@ /* Version number of package */ #ifndef LIBSEMIGROUPS_VERSION -#define LIBSEMIGROUPS_VERSION "2.7.0" +#define LIBSEMIGROUPS_VERSION "2.7.1" #endif /* Define for Solaris 2.5.1 so the uint64_t typedef from <sys/synch.h>, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.7.0/include/libsemigroups/present.tpp new/libsemigroups-2.7.1/include/libsemigroups/present.tpp --- old/libsemigroups-2.7.0/include/libsemigroups/present.tpp 2023-03-22 17:38:05.928348252 +0100 +++ new/libsemigroups-2.7.1/include/libsemigroups/present.tpp 2023-03-29 08:53:09.440985458 +0200 @@ -39,6 +39,23 @@ } } + template <typename Iterator> + int lex_compare(Iterator first1, + Iterator last1, + Iterator first2, + Iterator last2) { + for (; (first1 != last1) && (first2 != last2); + ++first1, (void) ++first2) { + if (*first1 < *first2) { + return -1; + } + if (*first2 < *first1) { + return 1; + } + } + return 0; + } + // Lex compare of // [first11, last11) + [first12, last12) // and @@ -57,34 +74,52 @@ if (prefix1.size() < prefix2.size()) { size_t const k = prefix2.size() - prefix1.size(); - return std::lexicographical_compare(prefix1.cbegin(), - prefix1.cend(), - prefix2.cbegin(), - prefix2.cbegin() + prefix1.size()) - || std::lexicographical_compare(suffix1.cbegin(), - suffix1.cbegin() + k, - prefix2.cbegin() - + prefix1.size(), - prefix2.cend()) - || std::lexicographical_compare(suffix1.cbegin() + k, - suffix1.cend(), - suffix2.cbegin(), - suffix2.cend()); + + int cmp = lex_compare(prefix1.cbegin(), + prefix1.cend(), + prefix2.cbegin(), + prefix2.cbegin() + prefix1.size()); + if (cmp != 0) { + return cmp == -1; + } + + cmp = lex_compare(suffix1.cbegin(), + suffix1.cbegin() + k, + prefix2.cbegin() + prefix1.size(), + prefix2.cend()); + if (cmp != 0) { + return cmp == -1; + } + + cmp = lex_compare(suffix1.cbegin() + k, + suffix1.cend(), + suffix2.cbegin(), + suffix2.cend()); + return cmp == -1; } else { - size_t const k = prefix1.size() - prefix2.size(); - return std::lexicographical_compare(prefix1.cbegin(), - prefix1.cbegin() + prefix2.size(), - prefix2.cbegin(), - prefix2.cend()) - || std::lexicographical_compare(prefix1.cbegin() - + prefix2.size(), - prefix1.cend(), - suffix2.cbegin(), - suffix2.cbegin() + k) - || std::lexicographical_compare(suffix1.cbegin(), - suffix1.cend(), - suffix2.cbegin() + k, - suffix2.cend()); + size_t const k = prefix1.size() - prefix2.size(); + int cmp = lex_compare(prefix1.cbegin(), + prefix1.cbegin() + prefix2.size(), + prefix2.cbegin(), + prefix2.cend()); + if (cmp != 0) { + return cmp == -1; + } + + cmp = lex_compare(prefix1.cbegin() + prefix2.size(), + prefix1.cend(), + suffix2.cbegin(), + suffix2.cbegin() + k); + + if (cmp != 0) { + return cmp == -1; + } + + cmp = lex_compare(suffix1.cbegin(), + suffix1.cend(), + suffix2.cbegin() + k, + suffix2.cend()); + return cmp == -1; } } } // namespace detail @@ -408,10 +443,9 @@ void sort_rules(Presentation<W>& p) { detail::validate_rules_length(p); // Create a permutation of the even indexed entries in vec - using letter_type = typename Presentation<W>::letter_type; - std::vector<letter_type> perm; - auto n = p.rules.size() / 2; + std::vector<size_t> perm; + size_t const n = p.rules.size() / 2; perm.resize(n); std::iota(perm.begin(), perm.end(), 0); std::sort(perm.begin(), perm.end(), [&p](auto x, auto y) -> bool { @@ -421,10 +455,10 @@ p.rules[2 * y + 1]); }); // Apply the permutation (adapted from stl.hpp:apply_permutation) - for (letter_type i = 0; static_cast<decltype(n)>(i) < n; ++i) { - letter_type current = i; + for (size_t i = 0; i < n; ++i) { + size_t current = i; while (i != perm[current]) { - letter_type next = perm[current]; + size_t next = perm[current]; std::swap(p.rules[2 * current], p.rules[2 * next]); std::swap(p.rules[2 * current + 1], p.rules[2 * next + 1]); perm[current] = current; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.7.0/tests/test-present.cpp new/libsemigroups-2.7.1/tests/test-present.cpp --- old/libsemigroups-2.7.0/tests/test-present.cpp 2023-03-22 16:50:30.708414274 +0100 +++ new/libsemigroups-2.7.1/tests/test-present.cpp 2023-03-29 08:53:09.441669035 +0200 @@ -1492,4 +1492,552 @@ REQUIRE(p.rules == decltype(p.rules)({"aba", "baabaa"})); } + LIBSEMIGROUPS_TEST_CASE("Presentation", + "041", + "sort_rules bug", + "[quick][presentation]") { + std::string prefix1 = "dabd", suffix1 = "cbb", prefix2 = "abbaba", + suffix2 = "c"; + + REQUIRE( + !detail::shortlex_compare_concat(prefix1, suffix1, prefix2, suffix2)); + + Presentation<std::string> p; + p.alphabet("bacd"); + p.rules = {"baabbabaa", + "abaaba", + "abbaba", + "c", + "abb", + "d", + "daba", + "c", + "dabd", + "cbb", + "dbaca", + "caba", + "dbacc", + "cabc", + "dbacd", + "cabd", + "abaaba", + "baca", + "abaabc", + "bacc", + "abaabd", + "bacd", + "cbaaba", + "ddaca", + "cbaabc", + "ddacc", + "cbaabd", + "ddacd", + "cbbaba", + "dabc", + "dabcbb", + "cbbabd", + "bacaaba", + "ababaca", + "bacaabc", + "ababacc", + "bacaabd", + "ababacd", + "bacbaca", + "abadaca", + "bacbacc", + "abadacc", + "bacbacd", + "abadacd", + "dabcaba", + "cbbbaca", + "dabcabc", + "cbbbacc", + "dabcabd", + "cbbbacd", + "ddacaaba", + "cbabaca", + "ddacaabc", + "cbabacc", + "ddacaabd", + "cbabacd", + "ddacbaca", + "cbadaca", + "ddacbacc", + "cbadacc", + "ddacbacd", + "cbadacd", + "abababaca", + "dacaaba", + "abababacc", + "dacaabc", + "abababacd", + "dacaabd", + "ababadaca", + "dacbaca", + "ababadacc", + "dacbacc", + "ababadacd", + "dacbacd", + "daababaca", + "ccaaba", + "daababacc", + "ccaabc", + "daababacd", + "ccaabd", + "daabadaca", + "ccbaca", + "daabadacc", + "ccbacc", + "daabadacd", + "ccbacd", + "bacababaca", + "abadacaaba", + "bacababacc", + "abadacaabc", + "bacababacd", + "abadacaabd", + "bacabadaca", + "abadacbaca", + "bacabadacc", + "abadacbacc", + "bacabadacd", + "abadacbacd", + "dabcbabaca", + "cbbdacaaba", + "dabcbabacc", + "cbbdacaabc", + "dabcbabacd", + "cbbdacaabd", + "dabcbadaca", + "cbbdacbaca", + "dabcbadacc", + "cbbdacbacc", + "dabcbadacd", + "cbbdacbacd", + "abaaababaca", + "bacacaaba", + "abaaababacc", + "bacacaabc", + "abaaababacd", + "bacacaabd", + "abaaabadaca", + "bacacbaca", + "abaaabadacc", + "bacacbacc", + "abaaabadacd", + "bacacbacd", + "cbaaababaca", + "ddacacaaba", + "cbaaababacc", + "ddacacaabc", + "cbaaababacd", + "ddacacaabd", + "cbaaabadaca", + "ddacacbaca", + "cbaaabadacc", + "ddacacbacc", + "cbaaabadacd", + "ddacacbacd", + "cbbaababaca", + "dabccaaba", + "cbbaababacc", + "dabccaabc", + "cbbaababacd", + "dabccaabd", + "cbbaabadaca", + "dabccbaca", + "cbbaabadacc", + "dabccbacc", + "cbbaabadacd", + "dabccbacd", + "ddacababaca", + "cbadacaaba", + "ddacababacc", + "cbadacaabc", + "ddacababacd", + "cbadacaabd", + "ddacabadaca", + "cbadacbaca", + "ddacabadacc", + "cbadacbacc", + "ddacabadacd", + "cbadacbacd", + "ababadacbaca", + "dacabadaca", + "ababadacbacc", + "dacabadacc", + "ababadacbacd", + "dacabadacd", + "bacaaababaca", + "ababacacaaba", + "bacaaababacc", + "ababacacaabc", + "bacaaababacd", + "ababacacaabd", + "bacaaabadaca", + "ababacacbaca", + "bacaaabadacc", + "ababacacbacc", + "bacaaabadacd", + "ababacacbacd", + "daabadacbaca", + "ccabadaca", + "daabadacbacc", + "ccabadacc", + "daabadacbacd", + "ccabadacd", + "bacabadacbaca", + "abadacabadaca", + "bacabadacbacc", + "abadacabadacc", + "bacabadacbacd", + "abadacabadacd", + "dabcbadacaaba", + "cbbdacababaca", + "dabcbadacaabc", + "cbbdacababacc", + "dabcbadacaabd", + "cbbdacababacd", + "dabcbadacbaca", + "cbbdacabadaca", + "dabcbadacbacc", + "cbbdacabadacc", + "dabcbadacbacd", + "cbbdacabadacd", + "ddacaaababaca", + "cbabacacaaba", + "ddacaaababacc", + "cbabacacaabc", + "ddacaaababacd", + "cbabacacaabd", + "ddacaaabadaca", + "cbabacacbaca", + "ddacaaabadacc", + "cbabacacbacc", + "ddacaaabadacd", + "cbabacacbacd", + "abaaabadacbaca", + "bacacabadaca", + "abaaabadacbacc", + "bacacabadacc", + "abaaabadacbacd", + "bacacabadacd", + "cbaaabadacbaca", + "ddacacabadaca", + "cbaaabadacbacc", + "ddacacabadacc", + "cbaaabadacbacd", + "ddacacabadacd", + "cbbaabadacbaca", + "dabccabadaca", + "cbbaabadacbacc", + "dabccabadacc", + "cbbaabadacbacd", + "dabccabadacd", + "ddacabadacbaca", + "cbadacabadaca", + "ddacabadacbacc", + "cbadacabadacc", + "ddacabadacbacd", + "cbadacabadacd", + "bacaaabadacbaca", + "ababacacabadaca", + "bacaaabadacbacc", + "ababacacabadacc", + "bacaaabadacbacd", + "ababacacabadacd", + "dabcbabacacaaba", + "cbbdacaaababaca", + "dabcbabacacaabc", + "cbbdacaaababacc", + "dabcbabacacaabd", + "cbbdacaaababacd", + "dabcbabacacbaca", + "cbbdacaaabadaca", + "dabcbabacacbacc", + "cbbdacaaabadacc", + "dabcbabacacbacd", + "cbbdacaaabadacd", + "dabcbadacabadaca", + "cbbdacabadacbaca", + "dabcbadacabadacc", + "cbbdacabadacbacc"}; + REQUIRE(p.rules.size() == 258); + + p.validate(); + presentation::sort_each_rule(p); + presentation::sort_rules(p); + REQUIRE(presentation::are_rules_sorted(p)); + REQUIRE(p.rules + == std::vector<std::string>({"abb", + "d", + "daba", + "c", + "abbaba", + "c", + "dabd", + "cbb", + "dbaca", + "caba", + "dbacc", + "cabc", + "dbacd", + "cabd", + "abaaba", + "baca", + "abaabc", + "bacc", + "abaabd", + "bacd", + "cbbaba", + "dabc", + "cbaaba", + "ddaca", + "cbaabc", + "ddacc", + "cbaabd", + "ddacd", + "dabcbb", + "cbbabd", + "bacaaba", + "ababaca", + "bacaabc", + "ababacc", + "bacaabd", + "ababacd", + "bacbaca", + "abadaca", + "bacbacc", + "abadacc", + "bacbacd", + "abadacd", + "dabcaba", + "cbbbaca", + "dabcabc", + "cbbbacc", + "dabcabd", + "cbbbacd", + "baabbabaa", + "abaaba", + "daababaca", + "ccaaba", + "daababacc", + "ccaabc", + "daababacd", + "ccaabd", + "daabadaca", + "ccbaca", + "daabadacc", + "ccbacc", + "daabadacd", + "ccbacd", + "ddacaaba", + "cbabaca", + "ddacaabc", + "cbabacc", + "ddacaabd", + "cbabacd", + "ddacbaca", + "cbadaca", + "ddacbacc", + "cbadacc", + "ddacbacd", + "cbadacd", + "abababaca", + "dacaaba", + "abababacc", + "dacaabc", + "abababacd", + "dacaabd", + "ababadaca", + "dacbaca", + "ababadacc", + "dacbacc", + "ababadacd", + "dacbacd", + "abaaababaca", + "bacacaaba", + "abaaababacc", + "bacacaabc", + "abaaababacd", + "bacacaabd", + "abaaabadaca", + "bacacbaca", + "abaaabadacc", + "bacacbacc", + "abaaabadacd", + "bacacbacd", + "bacababaca", + "abadacaaba", + "bacababacc", + "abadacaabc", + "bacababacd", + "abadacaabd", + "bacabadaca", + "abadacbaca", + "bacabadacc", + "abadacbacc", + "bacabadacd", + "abadacbacd", + "cbbaababaca", + "dabccaaba", + "cbbaababacc", + "dabccaabc", + "cbbaababacd", + "dabccaabd", + "cbbaabadaca", + "dabccbaca", + "cbbaabadacc", + "dabccbacc", + "cbbaabadacd", + "dabccbacd", + "dabcbabaca", + "cbbdacaaba", + "dabcbabacc", + "cbbdacaabc", + "dabcbabacd", + "cbbdacaabd", + "dabcbadaca", + "cbbdacbaca", + "dabcbadacc", + "cbbdacbacc", + "dabcbadacd", + "cbbdacbacd", + "cbaaababaca", + "ddacacaaba", + "cbaaababacc", + "ddacacaabc", + "cbaaababacd", + "ddacacaabd", + "cbaaabadaca", + "ddacacbaca", + "cbaaabadacc", + "ddacacbacc", + "cbaaabadacd", + "ddacacbacd", + "daabadacbaca", + "ccabadaca", + "daabadacbacc", + "ccabadacc", + "daabadacbacd", + "ccabadacd", + "ddacababaca", + "cbadacaaba", + "ddacababacc", + "cbadacaabc", + "ddacababacd", + "cbadacaabd", + "ddacabadaca", + "cbadacbaca", + "ddacabadacc", + "cbadacbacc", + "ddacabadacd", + "cbadacbacd", + "ababadacbaca", + "dacabadaca", + "ababadacbacc", + "dacabadacc", + "ababadacbacd", + "dacabadacd", + "bacaaababaca", + "ababacacaaba", + "bacaaababacc", + "ababacacaabc", + "bacaaababacd", + "ababacacaabd", + "bacaaabadaca", + "ababacacbaca", + "bacaaabadacc", + "ababacacbacc", + "bacaaabadacd", + "ababacacbacd", + "ddacaaababaca", + "cbabacacaaba", + "ddacaaababacc", + "cbabacacaabc", + "ddacaaababacd", + "cbabacacaabd", + "ddacaaabadaca", + "cbabacacbaca", + "ddacaaabadacc", + "cbabacacbacc", + "ddacaaabadacd", + "cbabacacbacd", + "abaaabadacbaca", + "bacacabadaca", + "abaaabadacbacc", + "bacacabadacc", + "abaaabadacbacd", + "bacacabadacd", + "bacabadacbaca", + "abadacabadaca", + "bacabadacbacc", + "abadacabadacc", + "bacabadacbacd", + "abadacabadacd", + "cbbaabadacbaca", + "dabccabadaca", + "cbbaabadacbacc", + "dabccabadacc", + "cbbaabadacbacd", + "dabccabadacd", + "dabcbadacaaba", + "cbbdacababaca", + "dabcbadacaabc", + "cbbdacababacc", + "dabcbadacaabd", + "cbbdacababacd", + "dabcbadacbaca", + "cbbdacabadaca", + "dabcbadacbacc", + "cbbdacabadacc", + "dabcbadacbacd", + "cbbdacabadacd", + "cbaaabadacbaca", + "ddacacabadaca", + "cbaaabadacbacc", + "ddacacabadacc", + "cbaaabadacbacd", + "ddacacabadacd", + "ddacabadacbaca", + "cbadacabadaca", + "ddacabadacbacc", + "cbadacabadacc", + "ddacabadacbacd", + "cbadacabadacd", + "bacaaabadacbaca", + "ababacacabadaca", + "bacaaabadacbacc", + "ababacacabadacc", + "bacaaabadacbacd", + "ababacacabadacd", + "dabcbabacacaaba", + "cbbdacaaababaca", + "dabcbabacacaabc", + "cbbdacaaababacc", + "dabcbabacacaabd", + "cbbdacaaababacd", + "dabcbabacacbaca", + "cbbdacaaabadaca", + "dabcbabacacbacc", + "cbbdacaaabadacc", + "dabcbabacacbacd", + "cbbdacaaabadacd", + "dabcbadacabadaca", + "cbbdacabadacbaca", + "dabcbadacabadacc", + "cbbdacabadacbacc"})); + + std::vector<std::string> expected; + for (auto it = p.rules.cbegin(); it < p.rules.cend(); it += 2) { + expected.push_back(*it + *(it + 1)); + } + std::vector<std::string> found = expected; + std::sort(found.begin(), found.end(), ShortLexCompare<std::string>()); + REQUIRE(found == expected); + for (size_t i = 0; i != found.size(); ++i) { + REQUIRE(std::make_pair(found[i], i) == std::make_pair(expected[i], i)); + } + } + } // namespace libsemigroups