Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libsemigroups for openSUSE:Factory checked in at 2021-12-17 23:54:24 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libsemigroups (Old) and /work/SRC/openSUSE:Factory/.libsemigroups.new.2520 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libsemigroups" Fri Dec 17 23:54:24 2021 rev:12 rq:940961 version:2.1.3 Changes: -------- --- /work/SRC/openSUSE:Factory/libsemigroups/libsemigroups.changes 2021-12-02 02:17:08.362306126 +0100 +++ /work/SRC/openSUSE:Factory/.libsemigroups.new.2520/libsemigroups.changes 2021-12-17 23:54:42.355539309 +0100 @@ -1,0 +2,7 @@ +Thu Dec 16 19:38:20 UTC 2021 - Jan Engelhardt <jeng...@inai.de> + +- Update to release 2.1.3 + * Some performance improvements in ActionDigraph::number_of_paths, + the suffix tree implementation, and in KnuthBendix. + +------------------------------------------------------------------- Old: ---- libsemigroups-2.1.2.tar.gz New: ---- libsemigroups-2.1.3.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libsemigroups.spec ++++++ --- /var/tmp/diff_new_pack.aG4mcb/_old 2021-12-17 23:54:42.867539733 +0100 +++ /var/tmp/diff_new_pack.aG4mcb/_new 2021-12-17 23:54:42.871539736 +0100 @@ -18,7 +18,7 @@ Name: libsemigroups %define lname libsemigroups2 -Version: 2.1.2 +Version: 2.1.3 Release: 0 Summary: Library with algorithms for computing finite and finitely presented semigroups License: GPL-3.0-or-later ++++++ libsemigroups-2.1.2.tar.gz -> libsemigroups-2.1.3.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.1.2/.VERSION new/libsemigroups-2.1.3/.VERSION --- old/libsemigroups-2.1.2/.VERSION 2021-11-30 12:24:29.179553312 +0100 +++ new/libsemigroups-2.1.3/.VERSION 2021-12-16 16:57:27.981003307 +0100 @@ -1 +1 @@ -2.1.2 \ No newline at end of file +2.1.3 \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.1.2/Makefile.in new/libsemigroups-2.1.3/Makefile.in --- old/libsemigroups-2.1.2/Makefile.in 2021-11-30 12:24:43.148316284 +0100 +++ new/libsemigroups-2.1.3/Makefile.in 2021-12-16 16:57:42.320736823 +0100 @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.16.4 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 Free Software Foundation, Inc. @@ -4340,6 +4340,10 @@ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) all-local +install-EXTRAPROGRAMS: install-libLTLIBRARIES + +install-checkPROGRAMS: install-libLTLIBRARIES + installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(eigenincludedir)" "$(DESTDIR)$(eigensrccholeskyincludedir)" "$(DESTDIR)$(eigensrccholmodsupportincludedir)" "$(DESTDIR)$(eigensrccorearchaltivecincludedir)" "$(DESTDIR)$(eigensrccorearchavx512includedir)" "$(DESTDIR)$(eigensrccorearchavxincludedir)" "$(DESTDIR)$(eigensrccorearchcudaincludedir)" "$(DESTDIR)$(eigensrccorearchdefaultincludedir)" "$(DESTDIR)$(eigensrccorearchneonincludedir)" "$(DESTDIR)$(eigensrccorearchsseincludedir)" "$(DESTDIR)$(eigensrccorearchzvectorincludedir)" "$(DESTDIR)$(eigensrccorefunctorsincludedir)" "$(DESTDIR)$(eigensrccoreincludedir)" "$(DESTDIR)$(eigensrccoreproductsincludedir)" "$(DESTDIR)$(eigensrccoreutilincludedir)" "$(DESTDIR)$(eigensrceigenvaluesincludedir)" "$(DESTDIR)$(eigensrcgeometryarchincludedir)" "$(DESTDIR)$(eigensrcgeometryincludedir)" "$(DESTDIR)$(eigensrchouseholderincludedir)" "$(DESTDIR)$(eigensrciterativelinearsolversincludedir)" "$(DESTDIR)$(eigensrcjacobiincl udedir)" "$(DESTDIR)$(eigensrcluarchincludedir)" "$(DESTDIR)$(eigensrcluincludedir)" "$(DESTDIR)$(eigensrcmetissupportincludedir)" "$(DESTDIR)$(eigensrcmiscincludedir)" "$(DESTDIR)$(eigensrcorderingmethodsincludedir)" "$(DESTDIR)$(eigensrcpardisosupportincludedir)" "$(DESTDIR)$(eigensrcpastixsupportincludedir)" "$(DESTDIR)$(eigensrcpluginsincludedir)" "$(DESTDIR)$(eigensrcqrincludedir)" "$(DESTDIR)$(eigensrcsparsecholeskyincludedir)" "$(DESTDIR)$(eigensrcsparsecoreincludedir)" "$(DESTDIR)$(eigensrcsparseluincludedir)" "$(DESTDIR)$(eigensrcsparseqrincludedir)" "$(DESTDIR)$(eigensrcspqrsupportincludedir)" "$(DESTDIR)$(eigensrcstlsupportincludedir)" "$(DESTDIR)$(eigensrcsuperlusupportincludedir)" "$(DESTDIR)$(eigensrcsvdincludedir)" "$(DESTDIR)$(eigensrcumfpacksupportincludedir)" "$(DESTDIR)$(fmtincludedir)" "$(DESTDIR)$(hpcombifallbackincludedir)" "$(DESTDIR)$(hpcombiincludedir)" "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.1.2/README.rst new/libsemigroups-2.1.3/README.rst --- old/libsemigroups-2.1.2/README.rst 2021-11-30 12:24:38.671704230 +0100 +++ new/libsemigroups-2.1.3/README.rst 2021-12-16 16:57:37.409840068 +0100 @@ -4,7 +4,7 @@ The full license is in the file LICENSE, distributed with this software. -libsemigroups - Version 2.1.2 +libsemigroups - Version 2.1.3 ============================= .. image:: https://readthedocs.org/projects/libsemigroups/badge/?version=master @@ -43,23 +43,21 @@ algorithms for computing finite, and finitely presented, semigroups and monoids. Namely: -- the `Froidure-Pin algorithm`_ for computing finite semigroups - :cite:`Froidure1997aa`; +- the `Froidure-Pin algorithm`_ for computing finite semigroups; - the `Todd-Coxeter algorithm`_ for finitely presented semigroups and monoids; - the `Knuth-Bendix algorithm`_ for finitely presented semigroups and monoids; - the `Schreier-Sims algorithm`_ for permutation groups; -- a preliminary implementation of the `Konieczny`_ :cite:`Konieczny1994aa` and - `Lallement-McFadden`_ :cite:`Lallement1990aa` algorithm for computing finite +- a preliminary implementation of the `Konieczny`_ and + `Lallement-McFadden`_ algorithm for computing finite semigroups which act on sets; -- an implementation of the `Radoszewski-Rytter`_ :cite:`Radoszewski2010aa` +- an implementation of the `Radoszewski-Rytter`_ algorithm for testing equivalence of words in free bands. - an implementation of the algorithm for solving the word problem for small overlap monoids, and for computing normal forms in such monoids; - see `Kambites <https://doi.org/10.1016/j.jalgebra.2008.09.038>`__ - :cite:`Kambites2009aa`, - `Kambites <https://doi.org/10.1016/j.jalgebra.2008.12.028>`__ - :cite:`Kambites2009ab`, and `Mitchell-Tsalakou - <http://arxiv.org/abs/2105.12125>`__ :cite:`Mitchell2021aa`. + see `Kambites <https://doi.org/10.1016/j.jalgebra.2008.09.038>`__, + `Kambites <https://doi.org/10.1016/j.jalgebra.2008.12.028>`__, and + `Mitchell-Tsalakou + <http://arxiv.org/abs/2105.12125>`__. .. _Froidure-Pin algorithm: https://www.irif.fr/~jep/PDF/Rio.pdf .. _Todd-Coxeter algorithm: https://en.wikipedia.org/wiki/Todd%E2%80%93Coxeter_algorithm @@ -131,8 +129,7 @@ - `R. Cirpons`_ contributed to ``IsObviouslyInfinite``, to integrating ``eigen``, and contributed an implementation of the `Radoszewski-Rytter`_ - :cite:`Radoszewski2010aa` algorithm for testing equivalence of words in free - bands. + algorithm for testing equivalence of words in free bands. - `F. Hivert`_ contributed many helpful ideas to ``libsemigroups``, an allocator implementation (to be included in a future version), and ``HPCombi``. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.1.2/aclocal.m4 new/libsemigroups-2.1.3/aclocal.m4 --- old/libsemigroups-2.1.2/aclocal.m4 2021-11-30 12:24:42.163017395 +0100 +++ new/libsemigroups-2.1.3/aclocal.m4 2021-12-16 16:57:41.335844564 +0100 @@ -1,4 +1,4 @@ -# generated automatically by aclocal 1.16.4 -*- Autoconf -*- +# generated automatically by aclocal 1.16.5 -*- Autoconf -*- # Copyright (C) 1996-2021 Free Software Foundation, Inc. @@ -311,7 +311,7 @@ [am__api_version='1.16' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.16.4], [], +m4_if([$1], [1.16.5], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -327,7 +327,7 @@ # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.16.4])dnl +[AM_AUTOMAKE_VERSION([1.16.5])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) @@ -764,6 +764,10 @@ # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl +m4_ifdef([_$0_ALREADY_INIT], + [m4_fatal([$0 expanded multiple times +]m4_defn([_$0_ALREADY_INIT]))], + [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.1.2/benchmarks/bench-digraph.cpp new/libsemigroups-2.1.3/benchmarks/bench-digraph.cpp --- old/libsemigroups-2.1.2/benchmarks/bench-digraph.cpp 2021-11-28 12:25:20.013779229 +0100 +++ new/libsemigroups-2.1.3/benchmarks/bench-digraph.cpp 2021-12-02 18:42:52.617463955 +0100 @@ -307,30 +307,29 @@ std::mt19937 mt; for (size_t M = 100; M < 1000; M += 100) { std::uniform_int_distribution<size_t> source(0, M - 1); - size_t v = source(mt); - uint64_t result; - auto ad - = ActionDigraph<size_t>::random(M, 15, detail::magic_number(M) * M); - BENCHMARK("algorithm::matrix: " + std::to_string(M) + " nodes, " - + std::to_string(15) + " out-degree!") { - result = ad.number_of_paths(v, 0, 16, algorithm::matrix); - }; for (size_t N = 10; N < 20; N += 5) { for (size_t nr_edges = 0; nr_edges <= detail::magic_number(M) * M; nr_edges += 500) { - ad = ActionDigraph<size_t>::random(M, N, nr_edges); + auto ad = ActionDigraph<size_t>::random(M, N, nr_edges); action_digraph_helper::add_cycle( ad, ad.cbegin_nodes(), ad.cend_nodes()); std::string m = std::to_string(ad.number_of_edges()); size_t w = source(mt); + uint64_t expected + = ad.number_of_paths(w, 0, 16, algorithm::automatic); + BENCHMARK("algorithm::matrix: " + std::to_string(M) + " nodes, " + + std::to_string(N) + " out-degree, " + m + " edges") { + REQUIRE(ad.number_of_paths(w, 0, 16, algorithm::matrix) + == expected); + }; BENCHMARK("algorithm::dfs: " + std::to_string(M) + " nodes, " + std::to_string(N) + " out-degree, " + m + " edges") { - result = ad.number_of_paths(w, 0, 16, algorithm::dfs); + REQUIRE(ad.number_of_paths(w, 0, 16, algorithm::dfs) == expected); }; BENCHMARK("algorithm::automatic: " + std::to_string(M) + " nodes, " + std::to_string(N) + " out-degree, " + m + " edges") { - REQUIRE(result - == ad.number_of_paths(w, 0, 16, algorithm::automatic)); + REQUIRE(ad.number_of_paths(w, 0, 16, algorithm::automatic) + == expected); }; std::cout << std::endl << std::string(72, '#') << std::endl; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.1.2/config/config.sub new/libsemigroups-2.1.3/config/config.sub --- old/libsemigroups-2.1.2/config/config.sub 2021-11-30 12:24:43.045654066 +0100 +++ new/libsemigroups-2.1.3/config/config.sub 2021-12-16 16:57:42.217597779 +0100 @@ -4,7 +4,7 @@ # shellcheck disable=SC2006,SC2268 # see below for rationale -timestamp='2021-07-03' +timestamp='2021-08-14' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -121,9 +121,11 @@ # Split fields of configuration type # shellcheck disable=SC2162 +saved_IFS=$IFS IFS="-" read field1 field2 field3 field4 <<EOF $1 EOF +IFS=$saved_IFS # Separate into logical components for further validation case $1 in @@ -172,6 +174,10 @@ basic_machine=$field1 basic_os=$field2 ;; + zephyr*) + basic_machine=$field1-unknown + basic_os=$field2 + ;; # Manufacturers dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ @@ -931,9 +937,11 @@ *-*) # shellcheck disable=SC2162 + saved_IFS=$IFS IFS="-" read cpu vendor <<EOF $basic_machine EOF + IFS=$saved_IFS ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and @@ -1313,9 +1321,11 @@ ;; *-*) # shellcheck disable=SC2162 + saved_IFS=$IFS IFS="-" read kernel os <<EOF $basic_os EOF + IFS=$saved_IFS ;; # Default OS when just kernel was specified nto*) @@ -1697,7 +1707,7 @@ # Now, validate our (potentially fixed-up) OS. case $os in # Sometimes we do "kernel-libc", so those need to count as OSes. - musl* | newlib* | uclibc*) + musl* | newlib* | relibc* | uclibc*) ;; # Likewise for "kernel-abi" eabi* | gnueabi*) @@ -1738,7 +1748,7 @@ | skyos* | haiku* | rdos* | toppers* | drops* | es* \ | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ - | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx*) + | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr*) ;; # This one is extra strict with allowed versions sco3.2v2 | sco3.2v[4-9]* | sco5v6*) @@ -1755,11 +1765,12 @@ # As a final step for OS-related things, validate the OS-kernel combination # (given a valid OS), if there is a kernel. case $kernel-$os in - linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* | linux-musl* | linux-uclibc* ) + linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ + | linux-musl* | linux-relibc* | linux-uclibc* ) ;; uclinux-uclibc* ) ;; - -dietlibc* | -newlib* | -musl* | -uclibc* ) + -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* ) # These are just libc implementations, not actual OSes, and thus # require a kernel. echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.1.2/configure new/libsemigroups-2.1.3/configure --- old/libsemigroups-2.1.2/configure 2021-11-30 12:24:42.526884393 +0100 +++ new/libsemigroups-2.1.3/configure 2021-12-16 16:57:41.702529132 +0100 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for libsemigroups 2.1.2. +# Generated by GNU Autoconf 2.71 for libsemigroups 2.1.3. # # 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.1.2' -PACKAGE_STRING='libsemigroups 2.1.2' +PACKAGE_VERSION='2.1.3' +PACKAGE_STRING='libsemigroups 2.1.3' PACKAGE_BUGREPORT='j...@st-andrews.ac.uk' PACKAGE_URL='' @@ -1429,7 +1429,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.1.2 to adapt to many kinds of systems. +\`configure' configures libsemigroups 2.1.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1501,7 +1501,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of libsemigroups 2.1.2:";; + short | recursive ) echo "Configuration of libsemigroups 2.1.3:";; esac cat <<\_ACEOF @@ -1642,7 +1642,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -libsemigroups configure 2.1.2 +libsemigroups configure 2.1.3 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. @@ -2481,7 +2481,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.1.2, which was +It was created by libsemigroups $as_me 2.1.3, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -4090,7 +4090,7 @@ # Define the identity of the package. PACKAGE='libsemigroups' - VERSION='2.1.2' + VERSION='2.1.3' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -23285,7 +23285,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.1.2, which was +This file was extended by libsemigroups $as_me 2.1.3, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -23353,7 +23353,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -libsemigroups config.status 2.1.2 +libsemigroups config.status 2.1.3 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.1.2/docs/requirements.txt new/libsemigroups-2.1.3/docs/requirements.txt --- old/libsemigroups-2.1.2/docs/requirements.txt 2021-11-28 12:30:48.080795090 +0100 +++ new/libsemigroups-2.1.3/docs/requirements.txt 2021-12-16 15:41:37.523000932 +0100 @@ -1,5 +1,5 @@ beautifulsoup4==4.9.3 -lxml==4.6.3 +lxml==4.6.5 breathe==4.31.0 pyyaml>=5.3.1 sphinx_rtd_theme diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.1.2/docs/source/changelog.rst new/libsemigroups-2.1.3/docs/source/changelog.rst --- old/libsemigroups-2.1.2/docs/source/changelog.rst 2021-11-30 12:24:38.672189590 +0100 +++ new/libsemigroups-2.1.3/docs/source/changelog.rst 2021-12-16 16:57:37.414028116 +0100 @@ -1,6 +1,14 @@ Changelog - version 2 ===================== +v2.1.3 (released 16/12/2021) +---------------------------- + +This is a minor release with some performance improvements in: +``ActionDigraph::number_of_paths`` (`eigen`_ is used in some circumstances when +available); the suffix tree implementation (used by ``Kambites``); and in +``KnuthBendix``. + v2.1.2 (released 30/11/2021) ---------------------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.1.2/docs/source/index.rst new/libsemigroups-2.1.3/docs/source/index.rst --- old/libsemigroups-2.1.2/docs/source/index.rst 2021-11-30 12:24:38.672600286 +0100 +++ new/libsemigroups-2.1.3/docs/source/index.rst 2021-12-16 16:57:37.419797092 +0100 @@ -1,4 +1,4 @@ -libsemigroups - Version 2.1.2 +libsemigroups - Version 2.1.3 ============================= C++ library for semigroups and monoids diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.1.2/docs/source/install.rst new/libsemigroups-2.1.3/docs/source/install.rst --- old/libsemigroups-2.1.2/docs/source/install.rst 2021-11-30 12:24:38.673622380 +0100 +++ new/libsemigroups-2.1.3/docs/source/install.rst 2021-12-16 16:57:37.422683288 +0100 @@ -1,4 +1,4 @@ -.. |libsemigroups-version| replace:: 2.1.2 +.. |libsemigroups-version| replace:: 2.1.3 .. _Installation: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.1.2/include/libsemigroups/config.hpp new/libsemigroups-2.1.3/include/libsemigroups/config.hpp --- old/libsemigroups-2.1.2/include/libsemigroups/config.hpp 2021-11-30 12:24:48.289779159 +0100 +++ new/libsemigroups-2.1.3/include/libsemigroups/config.hpp 2021-12-16 16:57:47.527046009 +0100 @@ -181,7 +181,7 @@ /* Define to the full name and version of this package. */ #ifndef LIBSEMIGROUPS_PACKAGE_STRING -#define LIBSEMIGROUPS_PACKAGE_STRING "libsemigroups 2.1.2" +#define LIBSEMIGROUPS_PACKAGE_STRING "libsemigroups 2.1.3" #endif /* Define to the one symbol short name of this package. */ @@ -196,7 +196,7 @@ /* Define to the version of this package. */ #ifndef LIBSEMIGROUPS_PACKAGE_VERSION -#define LIBSEMIGROUPS_PACKAGE_VERSION "2.1.2" +#define LIBSEMIGROUPS_PACKAGE_VERSION "2.1.3" #endif /* Define to necessary symbol if this constant uses a non-standard name on @@ -232,7 +232,7 @@ /* Version number of package */ #ifndef LIBSEMIGROUPS_VERSION -#define LIBSEMIGROUPS_VERSION "2.1.2" +#define LIBSEMIGROUPS_VERSION "2.1.3" #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.1.2/include/libsemigroups/digraph.hpp new/libsemigroups-2.1.3/include/libsemigroups/digraph.hpp --- old/libsemigroups-2.1.2/include/libsemigroups/digraph.hpp 2021-11-28 12:30:48.095937180 +0100 +++ new/libsemigroups-2.1.3/include/libsemigroups/digraph.hpp 2021-12-02 18:42:52.619647452 +0100 @@ -39,6 +39,7 @@ #include <utility> // for pair #include <vector> // for vector +#include "config.hpp" // for LIBSEMIGROUPS_EIGEN_ENABLED #include "constants.hpp" // for UNDEFINED #include "containers.hpp" // for DynamicArray2 #include "debug.hpp" // for LIBSEMIGROUPS_ASSERT @@ -51,6 +52,10 @@ #include "types.hpp" // for word_type #include "word.hpp" // for number_of_words +#ifdef LIBSEMIGROUPS_EIGEN_ENABLED +#include <Eigen/Core> +#endif + namespace libsemigroups { namespace detail { @@ -59,8 +64,14 @@ } // Implemented at end of this file. - template <typename T> - IntMat<0, 0, int64_t> adjacency_matrix(ActionDigraph<T> const& ad); + template <typename Mat, typename T> + Mat adjacency_matrix(ActionDigraph<T> const& ad); + +#ifdef LIBSEMIGROUPS_EIGEN_ENABLED + static inline Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> + pow(Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> const& x, + size_t e); +#endif } // namespace detail //! Defined in ``digraph.hpp``. @@ -126,6 +137,13 @@ //! The type of edge labels in a digraph. using label_type = T; +#ifdef LIBSEMIGROUPS_EIGEN_ENABLED + using adjacency_matrix_type + = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>; +#else + using adjacency_matrix_type = IntMat<0, 0, int64_t>; +#endif + //! The type of an index in a strongly connected component of a digraph. using scc_index_type = T; @@ -2544,9 +2562,8 @@ } } // Some edges are not defined ... - // TODO(later) why not use is_acyclic here? - auto topo = action_digraph_helper::topological_sort(*this, source); - if (topo.empty() && max == POSITIVE_INFINITY) { + if (!action_digraph_helper::is_acyclic(*this, source) + && max == POSITIVE_INFINITY) { // Not acyclic return POSITIVE_INFINITY; } @@ -2574,14 +2591,23 @@ uint64_t number_of_paths_matrix(node_type source, size_t min, size_t max) const { - // #ifdef LIBSEMIGROUPS_EIGEN_ENABLED - // TODO(later) - // #else - auto am = detail::adjacency_matrix(*this); + auto am = detail::adjacency_matrix<adjacency_matrix_type>(*this); +#ifdef LIBSEMIGROUPS_EIGEN_ENABLED + auto acc = detail::pow(am, min); + uint64_t total = 0; + for (size_t i = min; i < max; ++i) { + uint64_t add = acc.row(source).sum(); + if (add == 0) { + break; + } + total += add; + acc *= am; + } +#else auto tmp = am; uint64_t const N = number_of_nodes(); auto acc = matrix_helpers::pow(am, min); - size_t total = 0; + uint64_t total = 0; for (size_t i = min; i < max; ++i) { uint64_t add = std::accumulate(acc.cbegin() + source * N, acc.cbegin() + source * N + N, @@ -2593,17 +2619,14 @@ tmp.product_inplace(acc, am); tmp.swap(acc); } +#endif return total; - // #endif } uint64_t number_of_paths_matrix(node_type source, node_type target, size_t min, size_t max) const { - // #ifdef LIBSEMIGROUPS_EIGEN_ENABLED - // TODO(later) - // #else if (!action_digraph_helper::is_reachable(*this, source, target)) { // Complexity is O(number of nodes + number of edges). return 0; @@ -2611,11 +2634,23 @@ return POSITIVE_INFINITY; } - auto am = detail::adjacency_matrix(*this); - auto tmp = am; - uint64_t const N = number_of_nodes(); - auto acc = matrix_helpers::pow(am, min); - size_t total = 0; + auto am = detail::adjacency_matrix<adjacency_matrix_type>(*this); +#ifdef LIBSEMIGROUPS_EIGEN_ENABLED + auto acc = detail::pow(am, min); + uint64_t total = 0; + for (size_t i = min; i < max; ++i) { + uint64_t add = acc(source, target); + if (add == 0 && acc.row(source).isZero()) { + break; + } + total += add; + acc *= am; + } +#else + size_t const N = number_of_nodes(); + auto tmp = am; + auto acc = matrix_helpers::pow(am, min); + size_t total = 0; for (size_t i = min; i < max; ++i) { uint64_t add = acc(source, target); @@ -2629,8 +2664,8 @@ tmp.product_inplace(acc, am); tmp.swap(acc); } +#endif return total; - // #endif } //////////////////////////////////////////////////////////////////////// @@ -2999,11 +3034,64 @@ } namespace detail { + +#ifdef LIBSEMIGROUPS_EIGEN_ENABLED template <typename T> - IntMat<0, 0, int64_t> adjacency_matrix(ActionDigraph<T> const& ad) { - size_t const N = ad.number_of_nodes(); - IntMat<0, 0, int64_t> mat(N, N); + void init_adjacency_matrix( + ActionDigraph<T> const& ad, + Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>& mat) { + size_t const N = ad.number_of_nodes(); + mat.resize(N, N); + mat.fill(0); + } + + static inline void + identity(Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>& x) { + x.fill(0); + for (size_t i = 0; i < static_cast<size_t>(x.rows()); ++i) { + x(i, i) = 1; + } + } + + static inline Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> + pow(Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> const& x, + size_t e) { + if (x.cols() != x.rows()) { + LIBSEMIGROUPS_EXCEPTION("expected a square matrix, found %llux%llu", + static_cast<uint64_t>(x.rows()), + static_cast<uint64_t>(x.cols())); + } + auto y = x; + if (e % 2 == 0) { + identity(y); + if (e == 0) { + return y; + } + } + auto z = x; + while (e > 1) { + z *= z; + e /= 2; + if (e % 2 == 1) { + y *= z; + } + } + return y; + } +#else + template <typename T> + void init_adjacency_matrix(ActionDigraph<T> const& ad, + IntMat<0, 0, int64_t>& mat) { + size_t const N = ad.number_of_nodes(); + mat = IntMat<0, 0, int64_t>(N, N); std::fill(mat.begin(), mat.end(), 0); + } +#endif + + template <typename Mat, typename T> + Mat adjacency_matrix(ActionDigraph<T> const& ad) { + Mat mat; + init_adjacency_matrix(ad, mat); for (auto n = ad.cbegin_nodes(); n != ad.cend_nodes(); ++n) { for (auto e = ad.cbegin_edges(*n); e != ad.cend_edges(*n); ++e) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.1.2/include/libsemigroups/knuth-bendix.hpp new/libsemigroups-2.1.3/include/libsemigroups/knuth-bendix.hpp --- old/libsemigroups-2.1.2/include/libsemigroups/knuth-bendix.hpp 2021-11-28 12:30:48.098078008 +0100 +++ new/libsemigroups-2.1.3/include/libsemigroups/knuth-bendix.hpp 2021-12-16 15:41:37.523553916 +0100 @@ -633,9 +633,7 @@ void run_impl() override; - bool finished_impl() const override { - return confluent(); - } + bool finished_impl() const override; bool is_obviously_infinite_impl() override; bool is_obviously_finite_impl() override; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.1.2/include/libsemigroups/obvinf.hpp new/libsemigroups-2.1.3/include/libsemigroups/obvinf.hpp --- old/libsemigroups-2.1.2/include/libsemigroups/obvinf.hpp 2021-11-28 12:25:20.185367147 +0100 +++ new/libsemigroups-2.1.3/include/libsemigroups/obvinf.hpp 2021-12-02 18:42:52.620117701 +0100 @@ -131,7 +131,6 @@ inline bool matrix_row_sums_to_0(size_t row) { #ifdef LIBSEMIGROUPS_EIGEN_ENABLED - // static_assert(false, ""); return _matrix.row(row).sum() == 0; #else (void) row; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.1.2/src/knuth-bendix-impl.hpp new/libsemigroups-2.1.3/src/knuth-bendix-impl.hpp --- old/libsemigroups-2.1.2/src/knuth-bendix-impl.hpp 2021-11-28 12:30:48.106669448 +0100 +++ new/libsemigroups-2.1.3/src/knuth-bendix-impl.hpp 2021-12-16 15:41:37.524175898 +0100 @@ -779,6 +779,10 @@ // KnuthBendixImpl - main methods - public ////////////////////////////////////////////////////////////////////////// + bool confluent_known() const noexcept { + return _confluence_known; + } + bool confluent() const { if (!_stack.empty()) { return false; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.1.2/src/knuth-bendix.cpp new/libsemigroups-2.1.3/src/knuth-bendix.cpp --- old/libsemigroups-2.1.2/src/knuth-bendix.cpp 2021-11-28 12:30:48.106877943 +0100 +++ new/libsemigroups-2.1.3/src/knuth-bendix.cpp 2021-12-16 15:41:37.524568303 +0100 @@ -212,6 +212,10 @@ return _impl->confluent(); } + bool KnuthBendix::finished_impl() const { + return _impl->confluent_known() && _impl->confluent(); + } + void KnuthBendix::run_impl() { _impl->knuth_bendix(); report_why_we_stopped(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.1.2/src/suffix-tree.cpp new/libsemigroups-2.1.3/src/suffix-tree.cpp --- old/libsemigroups-2.1.2/src/suffix-tree.cpp 2021-11-28 12:30:48.107544304 +0100 +++ new/libsemigroups-2.1.3/src/suffix-tree.cpp 2021-12-16 15:41:37.525077830 +0100 @@ -283,12 +283,10 @@ size_t SuffixTree::distance_from_root(node_index_type i) const { LIBSEMIGROUPS_ASSERT(i < _nodes.size()); - Node n = _nodes[i]; size_t result = 0; - while (n.parent != UNDEFINED) { - result += n.length(); - i = n.parent; - n = _nodes[i]; + while (_nodes[i].parent != UNDEFINED) { + result += _nodes[i].length(); + i = _nodes[i].parent; } return result; } @@ -302,14 +300,14 @@ // Follow the path from the root labelled by _words[i], then go back // from the leaf to its parent (which is an internal node), // corresponding to the maximal_piece_prefix. - index_type l = _word_begin[j]; - index_type r = _word_begin[j + 1]; - Node m = _nodes.front(); + index_type l = _word_begin[j]; + index_type r = _word_begin[j + 1]; + node_index_type m = 0; while (l < r) { - m = _nodes[m.child(_word[l])]; - l += m.length(); + m = _nodes[m].child(_word[l]); + l += _nodes[m].length(); } - return distance_from_root(m.parent); + return distance_from_root(_nodes[m].parent); } size_t SuffixTree::maximal_piece_suffix(word_index_type j) const { @@ -340,14 +338,13 @@ // Follow the path from the root labelled by _words[i], then go back // from the leaf to its parent (which is an internal node), // corresponding to the maximal_piece_prefix. - Node m = _nodes.front(); + node_index_type m = 0; while (l < r) { - auto n = m.child(_word[l]); - LIBSEMIGROUPS_ASSERT(n != UNDEFINED); - m = _nodes[n]; - l += m.length(); + m = _nodes[m].child(_word[l]); + LIBSEMIGROUPS_ASSERT(m != UNDEFINED); + l += _nodes[m].length(); } - return distance_from_root(m.parent); + return distance_from_root(_nodes[m].parent); } size_t SuffixTree::number_of_pieces(word_index_type i) const { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.1.2/tests/test-digraph.cpp new/libsemigroups-2.1.3/tests/test-digraph.cpp --- old/libsemigroups-2.1.2/tests/test-digraph.cpp 2021-11-28 12:30:48.110680653 +0100 +++ new/libsemigroups-2.1.3/tests/test-digraph.cpp 2021-12-02 18:42:52.620940117 +0100 @@ -1539,6 +1539,7 @@ REQUIRE(ad.number_of_paths_algorithm(0, 0, 16) == algorithm::acyclic); REQUIRE(ad.number_of_paths(0, 0, 30) == 9); + REQUIRE(ad.number_of_paths(1, 0, 10, algorithm::acyclic) == 6); REQUIRE(ad.number_of_paths(1, 0, 10, algorithm::matrix) == 6); REQUIRE(ad.number_of_paths(1, 9, 0, 10, algorithm::matrix) == 3); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsemigroups-2.1.2/tests/test-kambites.cpp new/libsemigroups-2.1.3/tests/test-kambites.cpp --- old/libsemigroups-2.1.2/tests/test-kambites.cpp 2021-11-28 12:30:48.111693256 +0100 +++ new/libsemigroups-2.1.3/tests/test-kambites.cpp 2021-12-16 15:41:37.525732395 +0100 @@ -36,6 +36,7 @@ #include "libsemigroups/report.hpp" // for ReportGuard #include "libsemigroups/siso.hpp" // for const_sislo_iterator #include "libsemigroups/string.hpp" // for random_string etc +#include "libsemigroups/transf.hpp" // for LeastTransf #include "libsemigroups/types.hpp" // for tril etc #include "libsemigroups/word.hpp" // for number_of_words @@ -1817,5 +1818,22 @@ REQUIRE(l.word_to_class_index({0, 1, 0, 0}) == 100); } + LIBSEMIGROUPS_TEST_CASE("Kambites", + "078", + "(cong) large number of rules", + "[quick][kambites][cong][congruence]") { + FroidurePin<LeastTransf<6>> S({LeastTransf<6>({1, 2, 3, 4, 5, 0}), + LeastTransf<6>({1, 0, 2, 3, 4, 5}), + LeastTransf<6>({0, 1, 2, 3, 4, 0})}); + REQUIRE(S.size() == 46'656); + Kambites k; + k.set_number_of_generators(3); + for (auto it = S.cbegin_rules(); it != S.cend_rules(); ++it) { + k.add_pair(it->first, it->second); + } + REQUIRE(k.kambites().small_overlap_class() == 1); + } + } // namespace congruence + } // namespace libsemigroups