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-09-21 21:12:43
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libsemigroups (Old)
 and      /work/SRC/openSUSE:Factory/.libsemigroups.new.1899 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libsemigroups"

Tue Sep 21 21:12:43 2021 rev:9 rq:920448 version:2.0.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/libsemigroups/libsemigroups.changes      
2021-08-29 21:33:55.086673633 +0200
+++ /work/SRC/openSUSE:Factory/.libsemigroups.new.1899/libsemigroups.changes    
2021-09-21 21:13:33.866667254 +0200
@@ -1,0 +2,7 @@
+Mon Sep 20 20:41:07 UTC 2021 - Jan Engelhardt <jeng...@inai.de>
+
+- Update to release 2.0.2
+  * This release includes some missing operators, adapters, and
+    docs were added.
+
+-------------------------------------------------------------------

Old:
----
  libsemigroups-2.0.1.tar.gz

New:
----
  libsemigroups-2.0.2.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ libsemigroups.spec ++++++
--- /var/tmp/diff_new_pack.fEjucj/_old  2021-09-21 21:13:34.430667892 +0200
+++ /var/tmp/diff_new_pack.fEjucj/_new  2021-09-21 21:13:34.434667897 +0200
@@ -18,7 +18,7 @@
 
 Name:           libsemigroups
 %define lname  libsemigroups2
-Version:        2.0.1
+Version:        2.0.2
 Release:        0
 Summary:        Library with algorithms for computing finite and finitely 
presented semigroups
 License:        GPL-3.0-or-later

++++++ libsemigroups-2.0.1.tar.gz -> libsemigroups-2.0.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/.VERSION 
new/libsemigroups-2.0.2/.VERSION
--- old/libsemigroups-2.0.1/.VERSION    2021-08-28 18:59:48.580137754 +0200
+++ new/libsemigroups-2.0.2/.VERSION    2021-09-20 21:00:15.511953402 +0200
@@ -1 +1 @@
-2.0.1
\ No newline at end of file
+2.0.2
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/README.rst 
new/libsemigroups-2.0.2/README.rst
--- old/libsemigroups-2.0.1/README.rst  2021-08-28 18:59:58.362237104 +0200
+++ new/libsemigroups-2.0.2/README.rst  2021-09-20 21:00:25.382831151 +0200
@@ -4,7 +4,7 @@
 
    The full license is in the file LICENSE, distributed with this software.
 
-libsemigroups - Version 2.0.1
+libsemigroups - Version 2.0.2
 =============================
 
 .. image:: https://readthedocs.org/projects/libsemigroups/badge/?version=master
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/configure 
new/libsemigroups-2.0.2/configure
--- old/libsemigroups-2.0.1/configure   2021-08-28 19:00:02.280213220 +0200
+++ new/libsemigroups-2.0.2/configure   2021-09-20 21:00:29.725546812 +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.0.1.
+# Generated by GNU Autoconf 2.71 for libsemigroups 2.0.2.
 #
 # 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.0.1'
-PACKAGE_STRING='libsemigroups 2.0.1'
+PACKAGE_VERSION='2.0.2'
+PACKAGE_STRING='libsemigroups 2.0.2'
 PACKAGE_BUGREPORT='j...@st-andrews.ac.uk'
 PACKAGE_URL=''
 
@@ -1428,7 +1428,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.0.1 to adapt to many kinds of systems.
+\`configure' configures libsemigroups 2.0.2 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1500,7 +1500,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of libsemigroups 2.0.1:";;
+     short | recursive ) echo "Configuration of libsemigroups 2.0.2:";;
    esac
   cat <<\_ACEOF
 
@@ -1640,7 +1640,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-libsemigroups configure 2.0.1
+libsemigroups configure 2.0.2
 generated by GNU Autoconf 2.71
 
 Copyright (C) 2021 Free Software Foundation, Inc.
@@ -2479,7 +2479,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.0.1, which was
+It was created by libsemigroups $as_me 2.0.2, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -4088,7 +4088,7 @@
 
 # Define the identity of the package.
  PACKAGE='libsemigroups'
- VERSION='2.0.1'
+ VERSION='2.0.2'
 
 
 printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -23260,7 +23260,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.0.1, which was
+This file was extended by libsemigroups $as_me 2.0.2, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -23328,7 +23328,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-libsemigroups config.status 2.0.1
+libsemigroups config.status 2.0.2
 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.0.1/docs/source/changelog.rst 
new/libsemigroups-2.0.2/docs/source/changelog.rst
--- old/libsemigroups-2.0.1/docs/source/changelog.rst   2021-08-28 
18:59:58.370376728 +0200
+++ new/libsemigroups-2.0.2/docs/source/changelog.rst   2021-09-20 
21:00:25.383268197 +0200
@@ -1,6 +1,11 @@
 Changelog - version 2
 =====================
 
+v2.0.2 (released 20/09/2021)
+----------------------------
+
+This release includes some missing operators, adapters, and doc were added.
+
 v2.0.1 (released 28/08/2021)
 ----------------------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/docs/source/index.rst 
new/libsemigroups-2.0.2/docs/source/index.rst
--- old/libsemigroups-2.0.1/docs/source/index.rst       2021-08-28 
18:59:58.370949889 +0200
+++ new/libsemigroups-2.0.2/docs/source/index.rst       2021-09-20 
21:00:25.383746115 +0200
@@ -1,4 +1,4 @@
-libsemigroups - Version 2.0.1
+libsemigroups - Version 2.0.2
 =============================
 
 C++ library for semigroups and monoids
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/docs/source/install.rst 
new/libsemigroups-2.0.2/docs/source/install.rst
--- old/libsemigroups-2.0.1/docs/source/install.rst     2021-08-28 
18:59:58.371380385 +0200
+++ new/libsemigroups-2.0.2/docs/source/install.rst     2021-09-20 
21:00:25.384164537 +0200
@@ -1,4 +1,4 @@
-.. |libsemigroups-version| replace:: 2.0.1
+.. |libsemigroups-version| replace:: 2.0.2
 
 .. _Installation:
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libsemigroups-2.0.1/docs/source/matrix/dynamicmatrix-compile/operator_prod_equals.rst
 
new/libsemigroups-2.0.2/docs/source/matrix/dynamicmatrix-compile/operator_prod_equals.rst
--- 
old/libsemigroups-2.0.1/docs/source/matrix/dynamicmatrix-compile/operator_prod_equals.rst
   2021-05-26 18:33:48.191799440 +0200
+++ 
new/libsemigroups-2.0.2/docs/source/matrix/dynamicmatrix-compile/operator_prod_equals.rst
   2021-09-20 21:00:25.384593417 +0200
@@ -13,9 +13,9 @@
 
 .. cpp:function:: void operator*=(scalar_type const a)
 
-   Adds a scalar to every entry of the matrix in-place.
+   Multiplies every entry of the matrix by a scalar in-place.
 
-   :param a: the scalar to add to every entry of ``this``.
+   :param a: the scalar to multiply every entry of ``this``.
     
    :returns: (None)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libsemigroups-2.0.1/docs/source/matrix/dynamicmatrix-compile/transpose.rst 
new/libsemigroups-2.0.2/docs/source/matrix/dynamicmatrix-compile/transpose.rst
--- 
old/libsemigroups-2.0.1/docs/source/matrix/dynamicmatrix-compile/transpose.rst  
    2021-05-26 18:33:48.192103522 +0200
+++ 
new/libsemigroups-2.0.2/docs/source/matrix/dynamicmatrix-compile/transpose.rst  
    2021-09-20 21:00:25.384962219 +0200
@@ -13,7 +13,7 @@
 
 .. cpp:function::  void transpose() noexcept
 
-   Swaps the contents of ``this`` with the contents of ``that``. 
+   Transposes the matrix in-place. 
 
    :parameters: (None)
 
@@ -23,9 +23,8 @@
      this function guarantees not to throw a 
:cpp:any:`LibsemigroupsException`. 
    
    :complexity: 
-     :math:`O(mn)` where :math:`m` is the template parameter :code:`R` and
-     :math:`n` is the template parameter :code:`C`. 
-
+     :math:`O(n ^ 2)` where :math:`n` is the number of rows and
+     the number of columns in the matrix. 
+   
    .. warning:: 
-     This only works when the template parameters ``R`` and ``C`` are equal
-     (i.e. for square matrices).
+     This only works for square matrices. 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libsemigroups-2.0.1/docs/source/matrix/dynamicmatrix-run/operator_prod_equals.rst
 
new/libsemigroups-2.0.2/docs/source/matrix/dynamicmatrix-run/operator_prod_equals.rst
--- 
old/libsemigroups-2.0.1/docs/source/matrix/dynamicmatrix-run/operator_prod_equals.rst
       2021-05-26 18:33:48.192830020 +0200
+++ 
new/libsemigroups-2.0.2/docs/source/matrix/dynamicmatrix-run/operator_prod_equals.rst
       2021-09-20 21:00:25.385337437 +0200
@@ -13,9 +13,9 @@
 
 .. cpp:function:: void operator*=(scalar_type const a)
 
-   Adds a scalar to every entry of the matrix in-place.
+   Multiplies every entry of the matrix by a scalar in-place.
 
-   :param a: the scalar to add to every entry of ``this``.
+   :param a: the scalar to multiply every entry of ``this``.
     
    :returns: (None)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libsemigroups-2.0.1/docs/source/matrix/dynamicmatrix-run/transpose.rst 
new/libsemigroups-2.0.2/docs/source/matrix/dynamicmatrix-run/transpose.rst
--- old/libsemigroups-2.0.1/docs/source/matrix/dynamicmatrix-run/transpose.rst  
2021-05-26 18:33:48.193121227 +0200
+++ new/libsemigroups-2.0.2/docs/source/matrix/dynamicmatrix-run/transpose.rst  
2021-09-20 21:00:25.385828854 +0200
@@ -13,7 +13,7 @@
 
 .. cpp:function::  void transpose() noexcept
 
-   Swaps the contents of ``this`` with the contents of ``that``. 
+   Transposes the matrix in-place. 
 
    :parameters: (None)
 
@@ -23,9 +23,8 @@
      this function guarantees not to throw a 
:cpp:any:`LibsemigroupsException`. 
    
    :complexity: 
-     :math:`O(mn)` where :math:`m` is the template parameter :code:`R` and
-     :math:`n` is the template parameter :code:`C`. 
+     :math:`O(n ^ 2)` where :math:`n` is the number of rows and
+     the number of columns in the matrix. 
 
    .. warning:: 
-     This only works when the template parameters ``R`` and ``C`` are equal
-     (i.e. for square matrices).
+     This only works for square matrices. 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libsemigroups-2.0.1/docs/source/matrix/staticmatrix/operator_prod_equals.rst
 
new/libsemigroups-2.0.2/docs/source/matrix/staticmatrix/operator_prod_equals.rst
--- 
old/libsemigroups-2.0.1/docs/source/matrix/staticmatrix/operator_prod_equals.rst
    2021-05-26 18:33:48.195375260 +0200
+++ 
new/libsemigroups-2.0.2/docs/source/matrix/staticmatrix/operator_prod_equals.rst
    2021-09-20 21:00:25.386216446 +0200
@@ -13,9 +13,9 @@
 
 .. cpp:function:: void operator*=(scalar_type const a)
 
-   Adds a scalar to every entry of the matrix in-place.
+   Multiplies every entry of the matrix by a scalar in-place.
 
-   :param a: the scalar to add to every entry of ``this``.
+   :param a: the scalar to multiply every entry of ``this``.
     
    :returns: (None)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libsemigroups-2.0.1/docs/source/matrix/staticmatrix/transpose.rst 
new/libsemigroups-2.0.2/docs/source/matrix/staticmatrix/transpose.rst
--- old/libsemigroups-2.0.1/docs/source/matrix/staticmatrix/transpose.rst       
2021-05-26 18:33:48.195608509 +0200
+++ new/libsemigroups-2.0.2/docs/source/matrix/staticmatrix/transpose.rst       
2021-09-20 21:00:25.386564833 +0200
@@ -13,7 +13,7 @@
 
 .. cpp:function::  void transpose() noexcept
 
-   Swaps the contents of ``this`` with the contents of ``that``. 
+   Transposes the matrix in-place. 
 
    :parameters: (None)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/docs/yml/action.yml 
new/libsemigroups-2.0.2/docs/yml/action.yml
--- old/libsemigroups-2.0.1/docs/yml/action.yml 2021-05-26 18:33:48.197095879 
+0200
+++ new/libsemigroups-2.0.2/docs/yml/action.yml 2021-09-20 21:00:25.387143617 
+0200
@@ -67,5 +67,6 @@
   - run_until(bool(*)())
   - report_every(TIntType)
   - report_every(std::chrono::nanoseconds)
+  - report_every() const noexcept
   - report() const
   - report_why_we_stopped() const
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/docs/yml/cong-wrap.yml 
new/libsemigroups-2.0.2/docs/yml/cong-wrap.yml
--- old/libsemigroups-2.0.1/docs/yml/cong-wrap.yml      2021-06-03 
20:13:51.989874088 +0200
+++ new/libsemigroups-2.0.2/docs/yml/cong-wrap.yml      2021-09-20 
21:00:25.387508336 +0200
@@ -88,5 +88,6 @@
   - run_until(bool(*)())
   - report_every(TIntType)
   - report_every(std::chrono::nanoseconds)
+  - report_every() const noexcept
   - report() const
   - report_why_we_stopped() const
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/docs/yml/congruence.yml 
new/libsemigroups-2.0.2/docs/yml/congruence.yml
--- old/libsemigroups-2.0.1/docs/yml/congruence.yml     2021-08-28 
16:47:47.971528373 +0200
+++ new/libsemigroups-2.0.2/docs/yml/congruence.yml     2021-09-20 
21:00:25.387968672 +0200
@@ -82,5 +82,6 @@
   - run_until(bool(*)())
   - report_every(TIntType)
   - report_every(std::chrono::nanoseconds)
+  - report_every() const noexcept
   - report() const
   - report_why_we_stopped() const
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libsemigroups-2.0.1/docs/yml/congruence_knuth_bendix.yml 
new/libsemigroups-2.0.2/docs/yml/congruence_knuth_bendix.yml
--- old/libsemigroups-2.0.1/docs/yml/congruence_knuth_bendix.yml        
2021-06-03 20:13:51.990254660 +0200
+++ new/libsemigroups-2.0.2/docs/yml/congruence_knuth_bendix.yml        
2021-09-20 21:00:25.388328516 +0200
@@ -70,5 +70,6 @@
   - run_until(bool(*)())
   - report_every(TIntType)
   - report_every(std::chrono::nanoseconds)
+  - report_every() const noexcept
   - report() const
   - report_why_we_stopped() const
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libsemigroups-2.0.1/docs/yml/congruence_toddcoxeter.yml 
new/libsemigroups-2.0.2/docs/yml/congruence_toddcoxeter.yml
--- old/libsemigroups-2.0.1/docs/yml/congruence_toddcoxeter.yml 2021-06-03 
20:13:51.990467070 +0200
+++ new/libsemigroups-2.0.2/docs/yml/congruence_toddcoxeter.yml 2021-09-20 
21:00:25.388824016 +0200
@@ -140,5 +140,6 @@
   - run_until(bool(*)())
   - report_every(TIntType)
   - report_every(std::chrono::nanoseconds)
+  - report_every() const noexcept
   - report() const
   - report_why_we_stopped() const
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/docs/yml/congruencebypairs.yml 
new/libsemigroups-2.0.2/docs/yml/congruencebypairs.yml
--- old/libsemigroups-2.0.1/docs/yml/congruencebypairs.yml      2021-06-02 
12:50:19.770376804 +0200
+++ new/libsemigroups-2.0.2/docs/yml/congruencebypairs.yml      2021-09-20 
21:00:25.389178819 +0200
@@ -70,5 +70,6 @@
   - run_until(bool(*)())
   - report_every(TIntType)
   - report_every(std::chrono::nanoseconds)
+  - report_every() const noexcept
   - report() const
   - report_why_we_stopped() const
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/docs/yml/congruenceinterface.yml 
new/libsemigroups-2.0.2/docs/yml/congruenceinterface.yml
--- old/libsemigroups-2.0.1/docs/yml/congruenceinterface.yml    2021-06-03 
20:13:51.990675856 +0200
+++ new/libsemigroups-2.0.2/docs/yml/congruenceinterface.yml    2021-09-20 
21:00:25.389531164 +0200
@@ -81,5 +81,6 @@
   - run_until(bool(*)())
   - report_every(TIntType)
   - report_every(std::chrono::nanoseconds)
+  - report_every() const noexcept
   - report() const
   - report_why_we_stopped() const
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/docs/yml/dynamicptransf.yml 
new/libsemigroups-2.0.2/docs/yml/dynamicptransf.yml
--- old/libsemigroups-2.0.1/docs/yml/dynamicptransf.yml 2021-06-03 
20:13:51.991043178 +0200
+++ new/libsemigroups-2.0.2/docs/yml/dynamicptransf.yml 2021-09-20 
21:00:25.390150986 +0200
@@ -51,3 +51,4 @@
   - rank() const
   - hash_value() const
   - degree() const noexcept
+  - undef() noexcept
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/docs/yml/fpsemigroup.yml 
new/libsemigroups-2.0.2/docs/yml/fpsemigroup.yml
--- old/libsemigroups-2.0.1/docs/yml/fpsemigroup.yml    2021-08-28 
16:47:47.971641035 +0200
+++ new/libsemigroups-2.0.2/docs/yml/fpsemigroup.yml    2021-09-20 
21:00:25.390590449 +0200
@@ -83,5 +83,6 @@
   - run_until(bool(*)())
   - report_every(TIntType)
   - report_every(std::chrono::nanoseconds)
+  - report_every() const noexcept
   - report() const
   - report_why_we_stopped() const
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libsemigroups-2.0.1/docs/yml/fpsemigroup_knuth_bendix.yml 
new/libsemigroups-2.0.2/docs/yml/fpsemigroup_knuth_bendix.yml
--- old/libsemigroups-2.0.1/docs/yml/fpsemigroup_knuth_bendix.yml       
2021-06-03 20:13:51.991651285 +0200
+++ new/libsemigroups-2.0.2/docs/yml/fpsemigroup_knuth_bendix.yml       
2021-09-20 21:00:25.390976624 +0200
@@ -110,5 +110,6 @@
   - run_until(bool(*)())
   - report_every(TIntType)
   - report_every(std::chrono::nanoseconds)
+  - report_every() const noexcept
   - report() const
   - report_why_we_stopped() const
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libsemigroups-2.0.1/docs/yml/fpsemigroupinterface.yml 
new/libsemigroups-2.0.2/docs/yml/fpsemigroupinterface.yml
--- old/libsemigroups-2.0.1/docs/yml/fpsemigroupinterface.yml   2021-06-03 
20:13:51.991854778 +0200
+++ new/libsemigroups-2.0.2/docs/yml/fpsemigroupinterface.yml   2021-09-20 
21:00:25.391392381 +0200
@@ -107,5 +107,6 @@
   - run_until(bool(*)())
   - report_every(TIntType)
   - report_every(std::chrono::nanoseconds)
+  - report_every() const noexcept
   - report() const
   - report_why_we_stopped() const
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/docs/yml/froidurepin.yml 
new/libsemigroups-2.0.2/docs/yml/froidurepin.yml
--- old/libsemigroups-2.0.1/docs/yml/froidurepin.yml    2021-06-03 
20:13:51.992271391 +0200
+++ new/libsemigroups-2.0.2/docs/yml/froidurepin.yml    2021-09-20 
21:00:25.391781056 +0200
@@ -157,5 +157,6 @@
   - run_until(bool(*)())
   - report_every(TIntType)
   - report_every(std::chrono::nanoseconds)
+  - report_every() const noexcept
   - report() const
   - report_why_we_stopped() const
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/docs/yml/froidurepinbase.yml 
new/libsemigroups-2.0.2/docs/yml/froidurepinbase.yml
--- old/libsemigroups-2.0.1/docs/yml/froidurepinbase.yml        2021-06-03 
20:13:51.992485718 +0200
+++ new/libsemigroups-2.0.2/docs/yml/froidurepinbase.yml        2021-09-20 
21:00:25.392136401 +0200
@@ -88,5 +88,6 @@
   - run_until(bool(*)())
   - report_every(TIntType)
   - report_every(std::chrono::nanoseconds)
+  - report_every() const noexcept
   - report() const
   - report_why_we_stopped() const
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libsemigroups-2.0.1/docs/yml/knuthbendixcongruencebypairs.yml 
new/libsemigroups-2.0.2/docs/yml/knuthbendixcongruencebypairs.yml
--- old/libsemigroups-2.0.1/docs/yml/knuthbendixcongruencebypairs.yml   
2021-06-03 20:13:51.992885789 +0200
+++ new/libsemigroups-2.0.2/docs/yml/knuthbendixcongruencebypairs.yml   
2021-09-20 21:00:25.392491620 +0200
@@ -62,5 +62,6 @@
   - run_until(bool(*)())
   - report_every(TIntType)
   - report_every(std::chrono::nanoseconds)
+  - report_every() const noexcept
   - report() const
   - report_why_we_stopped() const
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/docs/yml/konieczny.yml 
new/libsemigroups-2.0.2/docs/yml/konieczny.yml
--- old/libsemigroups-2.0.1/docs/yml/konieczny.yml      2021-06-03 
20:13:51.993083408 +0200
+++ new/libsemigroups-2.0.2/docs/yml/konieczny.yml      2021-09-20 
21:00:25.392848465 +0200
@@ -108,6 +108,7 @@
   - run_until(bool(*)())
   - report_every(TIntType)
   - report_every(std::chrono::nanoseconds)
+  - report_every() const noexcept
   - report() const
   - report_why_we_stopped() const
   
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/docs/yml/pbr.yml 
new/libsemigroups-2.0.2/docs/yml/pbr.yml
--- old/libsemigroups-2.0.1/docs/yml/pbr.yml    2021-06-03 20:13:51.993645349 
+0200
+++ new/libsemigroups-2.0.2/docs/yml/pbr.yml    2021-09-20 21:00:25.393213559 
+0200
@@ -9,10 +9,16 @@
   - operator<<(std::ostream &,PBR const &)
 - Constructors:
   - ["This page lists the constructors of :cpp:any:`PBR`."]
-  - PBR(vector_type)
   - PBR(initializer_list_type<uint32_t>)
+  - PBR(vector_type<uint32_t>)
   - PBR(size_t)
   - PBR(initializer_list_type<int32_t>,initializer_list_type<int32_t>)
+  - PBR(vector_type<int32_t>,vector_type<int32_t>)
+  - PBR() = delete
+  - PBR(PBR const &) = default
+  - PBR(PBR &&) = default
+  - operator=(PBR const &) = default
+  - operator=(PBR &&) = default
 - Static member functions:
   - ["This page lists the static member functions of :cpp:any:`PBR`."]
   - identity() const
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/docs/yml/runner.yml 
new/libsemigroups-2.0.2/docs/yml/runner.yml
--- old/libsemigroups-2.0.1/docs/yml/runner.yml 2021-05-26 18:33:48.203730605 
+0200
+++ new/libsemigroups-2.0.2/docs/yml/runner.yml 2021-09-20 21:00:25.393563071 
+0200
@@ -9,6 +9,7 @@
 - Reporting:
   - report_every(TIntType)
   - report_every(std::chrono::nanoseconds)
+  - report_every() const noexcept
   - report() const
   - report_why_we_stopped() const
 - State:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/docs/yml/staticptransf.yml 
new/libsemigroups-2.0.2/docs/yml/staticptransf.yml
--- old/libsemigroups-2.0.1/docs/yml/staticptransf.yml  2021-06-03 
20:13:51.994235040 +0200
+++ new/libsemigroups-2.0.2/docs/yml/staticptransf.yml  2021-09-20 
21:00:25.393879127 +0200
@@ -37,3 +37,4 @@
   - rank() const
   - hash_value() const
   - degree() const noexcept
+  - undef() noexcept
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/include/libsemigroups/bipart.hpp 
new/libsemigroups-2.0.2/include/libsemigroups/bipart.hpp
--- old/libsemigroups-2.0.1/include/libsemigroups/bipart.hpp    2021-08-28 
16:47:47.973126900 +0200
+++ new/libsemigroups-2.0.2/include/libsemigroups/bipart.hpp    2021-09-20 
21:00:25.395371709 +0200
@@ -264,7 +264,7 @@
     //! This function returns the number of parts in the partition that
     //! instances of this class represent.
     //!
-    //! \returns The number of blocks in a Blocks object.
+    //! \returns The number of blocks in a Bipartition object.
     //!
     //! \exceptions
     //! \noexcept
@@ -1135,7 +1135,24 @@
   //!
   //! \complexity
   //! At worst linear in the degree of \p x and \p y.
-  bool operator!=(Bipartition const& x, Bipartition const& y);
+  inline bool operator!=(Bipartition const& x, Bipartition const& y) {
+    return !(x == y);
+  }
+
+  //! Convenience function that just calls ``operator<`` and ``operator==``.
+  inline bool operator<=(Bipartition const& x, Bipartition const& y) {
+    return x < y || x == y;
+  }
+
+  //! Convenience function that just calls ``operator<``.
+  inline bool operator>(Bipartition const& x, Bipartition const& y) {
+    return y < x;
+  }
+
+  //! Convenience function that just calls ``operator<=``.
+  inline bool operator>=(Bipartition const& x, Bipartition const& y) {
+    return y <= x;
+  }
 
   ////////////////////////////////////////////////////////////////////////
   // Adapters
@@ -1200,5 +1217,10 @@
     }
   };
 
+  template <>
+  struct IncreaseDegree<Bipartition> {
+    void operator()(Bipartition&, size_t) {}
+  };
+
 }  // namespace libsemigroups
 #endif  // LIBSEMIGROUPS_BIPART_HPP_
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/include/libsemigroups/bmat8.hpp 
new/libsemigroups-2.0.2/include/libsemigroups/bmat8.hpp
--- old/libsemigroups-2.0.1/include/libsemigroups/bmat8.hpp     2021-06-02 
12:50:19.894675293 +0200
+++ new/libsemigroups-2.0.2/include/libsemigroups/bmat8.hpp     2021-09-20 
21:00:25.395983407 +0200
@@ -680,7 +680,7 @@
   template <>
   struct IncreaseDegree<BMat8> {
     //! Does nothing.
-    inline void operator()(BMat8 const&) const noexcept {}
+    inline void operator()(BMat8 const&, size_t) const noexcept {}
   };
 
   //! Specialization of the adapter One for instances of BMat8.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/include/libsemigroups/config.hpp 
new/libsemigroups-2.0.2/include/libsemigroups/config.hpp
--- old/libsemigroups-2.0.1/include/libsemigroups/config.hpp    2021-08-28 
19:00:07.688698414 +0200
+++ new/libsemigroups-2.0.2/include/libsemigroups/config.hpp    2021-09-20 
21:00:35.518147809 +0200
@@ -176,7 +176,7 @@
 
 /* Define to the full name and version of this package. */
 #ifndef LIBSEMIGROUPS_PACKAGE_STRING
-#define LIBSEMIGROUPS_PACKAGE_STRING "libsemigroups 2.0.1"
+#define LIBSEMIGROUPS_PACKAGE_STRING "libsemigroups 2.0.2"
 #endif
 
 /* Define to the one symbol short name of this package. */
@@ -191,7 +191,7 @@
 
 /* Define to the version of this package. */
 #ifndef LIBSEMIGROUPS_PACKAGE_VERSION
-#define LIBSEMIGROUPS_PACKAGE_VERSION "2.0.1"
+#define LIBSEMIGROUPS_PACKAGE_VERSION "2.0.2"
 #endif
 
 /* Define to necessary symbol if this constant uses a non-standard name on
@@ -227,7 +227,7 @@
 
 /* Version number of package */
 #ifndef LIBSEMIGROUPS_VERSION
-#define LIBSEMIGROUPS_VERSION "2.0.1"
+#define LIBSEMIGROUPS_VERSION "2.0.2"
 #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.0.1/include/libsemigroups/matrix.hpp 
new/libsemigroups-2.0.2/include/libsemigroups/matrix.hpp
--- old/libsemigroups-2.0.1/include/libsemigroups/matrix.hpp    2021-08-28 
16:47:47.978300803 +0200
+++ new/libsemigroups-2.0.2/include/libsemigroups/matrix.hpp    2021-09-20 
21:00:25.397105853 +0200
@@ -1090,6 +1090,13 @@
       return x;
     }
 
+    static StaticMatrix identity(void const* ptr, size_t n = 0) {
+      (void) ptr;
+      LIBSEMIGROUPS_ASSERT(ptr == nullptr);
+      LIBSEMIGROUPS_ASSERT(n == 0 || n == R);
+      return identity(n);
+    }
+
     ////////////////////////////////////////////////////////////////////////
     // StaticMatrix - member function aliases - public
     ////////////////////////////////////////////////////////////////////////
@@ -1195,6 +1202,12 @@
 
     ~DynamicMatrix();
 
+    static DynamicMatrix identity(void const* ptr, size_t n) {
+      (void) ptr;
+      LIBSEMIGROUPS_ASSERT(ptr == nullptr);
+      return identity(n);
+    }
+
     static DynamicMatrix identity(size_t n) {
       DynamicMatrix x(n, n);
       std::fill(x.begin(), x.end(), ZeroOp()());
@@ -1308,9 +1321,20 @@
       return m;
     }
 
+    // No static DynamicMatrix::identity(size_t n) because we need a semiring!
+    static DynamicMatrix identity(Semiring const* sr, size_t n) {
+      DynamicMatrix x(sr, n, n);
+      std::fill(x.begin(), x.end(), x.zero());
+      for (size_t r = 0; r < n; ++r) {
+        x(r, r) = x.one();
+      }
+      return x;
+    }
+
     ~DynamicMatrix();
 
     using MatrixCommon::begin;
+    using MatrixCommon::identity;
     using MatrixCommon::number_of_cols;
     using MatrixCommon::number_of_rows;
     using MatrixCommon::resize;
@@ -2337,12 +2361,16 @@
       ProjMaxPlusMat(size_t r, size_t c)
           : _is_normalized(false), _underlying_mat(r, c) {}
 
-      ProjMaxPlusMat(
-          std::initializer_list<std::initializer_list<scalar_type>> const& m)
+      ProjMaxPlusMat(std::vector<std::vector<scalar_type>> const& m)
           : _is_normalized(false), _underlying_mat(m) {
         normalize();
       }
 
+      ProjMaxPlusMat(
+          std::initializer_list<std::initializer_list<scalar_type>> const& m)
+          : ProjMaxPlusMat(
+              std::vector<std::vector<scalar_type>>(m.begin(), m.end())) {}
+
       static ProjMaxPlusMat make(
           std::initializer_list<std::initializer_list<scalar_type>> const& il) 
{
         auto result = ProjMaxPlusMat(T::make(il));
@@ -2377,9 +2405,7 @@
       }
 
       bool operator!=(ProjMaxPlusMat const& that) const {
-        normalize();
-        that.normalize();
-        return _underlying_mat != that._underlying_mat;
+        return !(_underlying_mat == that._underlying_mat);
       }
 
       bool operator<(ProjMaxPlusMat const& that) const {
@@ -2388,6 +2414,10 @@
         return _underlying_mat < that._underlying_mat;
       }
 
+      bool operator>(ProjMaxPlusMat const& that) const {
+        return that < *this;
+      }
+
       ////////////////////////////////////////////////////////////////////////
       // Attributes
       ////////////////////////////////////////////////////////////////////////
@@ -3004,9 +3034,8 @@
   }
 
   template <typename T>
-  auto operator<<(std::ostringstream& os, T const& x) -> std::enable_if_t<
-      std::is_base_of<detail::MatrixPolymorphicBase, T>::value,
-      std::ostringstream&> {
+  auto operator<<(std::ostringstream& os, T const& x)
+      -> std::enable_if_t<IsMatrix<T>, std::ostringstream&> {
     size_t n = 0;
     if (x.number_of_rows() != 1) {
       os << "{";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/include/libsemigroups/pbr.hpp 
new/libsemigroups-2.0.2/include/libsemigroups/pbr.hpp
--- old/libsemigroups-2.0.1/include/libsemigroups/pbr.hpp       2021-06-03 
20:43:15.401591053 +0200
+++ new/libsemigroups-2.0.2/include/libsemigroups/pbr.hpp       2021-09-20 
21:00:25.397518234 +0200
@@ -42,12 +42,28 @@
 
    public:
     //! Type of constructor argument.
-    using vector_type = std::vector<std::vector<uint32_t>> const&;
+    template <typename T>
+    using vector_type = std::vector<std::vector<T>> const&;
 
     //! Type of constructor argument.
     template <typename T>
     using initializer_list_type = std::initializer_list<std::vector<T>> const&;
 
+    //! Deleted.
+    PBR() = delete;
+
+    //! Default copy constructor.
+    PBR(PBR const&) = default;
+
+    //! Default move constructor.
+    PBR(PBR&&) = default;
+
+    //! Default copy assignment operator.
+    PBR& operator=(PBR const&) = default;
+
+    //! Default move assignment operator.
+    PBR& operator=(PBR&&) = default;
+
     //! Construct from adjacencies \c 0 to `2n - 1`.
     //!
     //! The parameter \p x must be a container of vectors of
@@ -64,9 +80,9 @@
     //! No checks whatsoever on the validity of \p x are performed.
     //!
     //! \sa \ref libsemigroups::validate(PBR const&)
-    explicit PBR(vector_type x);
+    explicit PBR(vector_type<uint32_t> x);
 
-    //! \copydoc PBR(vector_type)
+    //! \copydoc PBR(vector_type<uint32_t>)
     explicit PBR(initializer_list_type<uint32_t> x);
 
     //! Construct empty PBR of given \ref degree.
@@ -102,6 +118,11 @@
     PBR(initializer_list_type<int32_t> left,
         initializer_list_type<int32_t> right);
 
+    // clang-format off
+    //! \copydoc PBR(initializer_list_type<int32_t>, 
initializer_list_type<int32_t>) NOLINT(whitespace/line_length)
+    // clang-format on
+    PBR(vector_type<int32_t> left, vector_type<int32_t> right);
+
     //! Construct and validate.
     //!
     //! \tparam T the types of the arguments
@@ -364,7 +385,24 @@
   //!
   //! \complexity
   //! At worst quadratic in the degree of \p x and \p y.
-  bool operator!=(PBR const& x, PBR const& y);
+  inline bool operator!=(PBR const& x, PBR const& y) {
+    return !(x == y);
+  }
+
+  //! Convenience function that just calls ``operator<``.
+  inline bool operator>(PBR const& x, PBR const& y) {
+    return y < x;
+  }
+
+  //! Convenience function that just calls ``operator<`` and ``operator==``.
+  inline bool operator<=(PBR const& x, PBR const& y) {
+    return x < y || x == y;
+  }
+
+  //! Convenience function that just calls ``operator<=``.
+  inline bool operator>=(PBR const& x, PBR const& y) {
+    return y <= x;
+  }
 
   namespace detail {
 
@@ -445,5 +483,10 @@
     }
   };
 
+  template <>
+  struct IncreaseDegree<PBR> {
+    void operator()(PBR&, size_t) {}
+  };
+
 }  // namespace libsemigroups
 #endif  // LIBSEMIGROUPS_PBR_HPP_
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/include/libsemigroups/runner.hpp 
new/libsemigroups-2.0.2/include/libsemigroups/runner.hpp
--- old/libsemigroups-2.0.1/include/libsemigroups/runner.hpp    2021-08-28 
18:59:58.378117856 +0200
+++ new/libsemigroups-2.0.2/include/libsemigroups/runner.hpp    2021-09-20 
21:00:25.397937199 +0200
@@ -298,6 +298,13 @@
       report_every(std::chrono::nanoseconds(t));
     }
 
+    //! Get the minimum elapsed time between reports.
+    //!
+    //! \par Parameters
+    //! (None)
+    //!
+    //! \returns
+    //! The number of nanoseconds between reports.
     std::chrono::nanoseconds report_every() const noexcept {
       return _report_time_interval;
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/include/libsemigroups/transf.hpp 
new/libsemigroups-2.0.2/include/libsemigroups/transf.hpp
--- old/libsemigroups-2.0.1/include/libsemigroups/transf.hpp    2021-08-28 
18:59:58.379203678 +0200
+++ new/libsemigroups-2.0.2/include/libsemigroups/transf.hpp    2021-09-20 
21:00:25.398915865 +0200
@@ -1683,7 +1683,10 @@
   //! Perm has the same member functions as \ref StaticPTransf and \ref
   //! DynamicPTransf, this isn't current reflected by the contents of this
   //! page.
-  template <size_t N = 0, typename Scalar = uint32_t>
+  template <
+      size_t N = 0,
+      typename Scalar
+      = std::conditional_t<N == 0, uint32_t, typename 
SmallestInteger<N>::type>>
   class Perm final : public Transf<N, Scalar> {
     using base_type = PTransf<N, Scalar>;
 
@@ -1869,15 +1872,6 @@
     }
   };
 
-  template <size_t N, typename Scalar>
-  struct ImageRightAction<Perm<N, Scalar>,
-                          Scalar,
-                          std::enable_if_t<std::is_integral<Scalar>::value>> {
-    Scalar operator()(Scalar pt, Perm<N, Scalar> const& x) {
-      return x[pt];
-    }
-  };
-
   template <typename TSubclass>
   struct Product<TSubclass, std::enable_if_t<IsDerivedFromPTransf<TSubclass>>> 
{
     void operator()(TSubclass&       xy,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/src/bipart.cpp 
new/libsemigroups-2.0.2/src/bipart.cpp
--- old/libsemigroups-2.0.1/src/bipart.cpp      2021-08-28 16:47:47.979531385 
+0200
+++ new/libsemigroups-2.0.2/src/bipart.cpp      2021-09-20 21:00:25.399462819 
+0200
@@ -201,11 +201,6 @@
     return xy;
   }
 
-  // TODO(now) Should be defined for all of the new element types
-  bool operator!=(Bipartition const& x, Bipartition const& y) {
-    return !(x == y);
-  }
-
   ////////////////////////////////////////////////////////////////////////
   // Bipartitions
   ////////////////////////////////////////////////////////////////////////
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/src/pbr.cpp 
new/libsemigroups-2.0.2/src/pbr.cpp
--- old/libsemigroups-2.0.1/src/pbr.cpp 2021-08-28 16:47:47.980269317 +0200
+++ new/libsemigroups-2.0.2/src/pbr.cpp 2021-09-20 21:00:25.399848369 +0200
@@ -158,18 +158,12 @@
 
   }  // namespace
 
-  // TODO(now) Should be defined for all of the new element types
   PBR operator*(PBR const& x, PBR const& y) {
     PBR xy(x.degree());
     xy.product_inplace(x, y);
     return xy;
   }
 
-  // TODO(now) Should be defined for all of the new element types
-  bool operator!=(PBR const& x, PBR const& y) {
-    return !(x == y);
-  }
-
   void validate(PBR const& x) {
     size_t n = x._vector.size();
     if (n % 2 == 1) {
@@ -211,6 +205,10 @@
            std::initializer_list<std::vector<int32_t>> const& right)
       : PBR(process_left_right(left, right)) {}
 
+  PBR::PBR(std::vector<std::vector<int32_t>> const& left,
+           std::vector<std::vector<int32_t>> const& right)
+      : PBR(process_left_right(left, right)) {}
+
   std::ostringstream& operator<<(std::ostringstream& os, PBR const& pbr) {
     if (pbr.degree() == 0) {
       os << "{}";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/tests/test-bipart.cpp 
new/libsemigroups-2.0.2/tests/test-bipart.cpp
--- old/libsemigroups-2.0.1/tests/test-bipart.cpp       2021-06-03 
10:17:27.299617641 +0200
+++ new/libsemigroups-2.0.2/tests/test-bipart.cpp       2021-09-20 
21:00:25.400478316 +0200
@@ -445,6 +445,10 @@
     REQUIRE_NOTHROW(validate(xxx));
     REQUIRE(x != xxx);
     REQUIRE(xx != xxx);
+    REQUIRE(xx > xxx);
+    REQUIRE(xxx < xx);
+    REQUIRE(xxx <= xx);
+    REQUIRE(xx >= xxx);
 
     REQUIRE_THROWS_AS(Bipartition::make({{0, 2, 3, 4, 5, 6, 9, -1, -2, -7},
                                          {7, 10, -3, -9, -10},
@@ -532,4 +536,9 @@
     z.product_inplace(y, id, 0);
     REQUIRE(z == y);
   }
+
+  LIBSEMIGROUPS_TEST_CASE("Bipartition", "017", "adapters", "[quick][pbr]") {
+    Bipartition x({0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 3, 1, 2, 
1});
+    REQUIRE_NOTHROW(IncreaseDegree<Bipartition>()(x, 0));
+  }
 }  // namespace libsemigroups
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/tests/test-bmat8.cpp 
new/libsemigroups-2.0.2/tests/test-bmat8.cpp
--- old/libsemigroups-2.0.1/tests/test-bmat8.cpp        2021-06-02 
12:50:19.906565359 +0200
+++ new/libsemigroups-2.0.2/tests/test-bmat8.cpp        2021-09-20 
21:00:25.400926319 +0200
@@ -648,7 +648,7 @@
     BMat8 bm1(0);
     REQUIRE(Complexity<BMat8>()(bm1) == 0);
     REQUIRE(Degree<BMat8>()(bm1) == 8);
-    REQUIRE_NOTHROW(IncreaseDegree<BMat8>()(bm1));
+    REQUIRE_NOTHROW(IncreaseDegree<BMat8>()(bm1, 0));
     REQUIRE(One<BMat8>()(bm1) == bm1.one());
     REQUIRE(One<BMat8>()(4) == bmat8_helpers::one<BMat8>(4));
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/tests/test-kbe.cpp 
new/libsemigroups-2.0.2/tests/test-kbe.cpp
--- old/libsemigroups-2.0.1/tests/test-kbe.cpp  2021-08-25 21:05:32.233189993 
+0200
+++ new/libsemigroups-2.0.2/tests/test-kbe.cpp  2021-09-20 21:00:25.401512061 
+0200
@@ -124,6 +124,9 @@
       REQUIRE(Complexity<KBE>()(x) == LIMIT_MAX);
       REQUIRE(EqualTo<KBE>()(x, x));
       REQUIRE(One<KBE>()(x) == KBE());
+      auto y(x);
+      IncreaseDegree<KBE>()(y, 10);
+      REQUIRE(x == y);
     }
 
     LIBSEMIGROUPS_TEST_CASE("KBE", "005", "conversions", "[quick]") {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/tests/test-matrix.cpp 
new/libsemigroups-2.0.2/tests/test-matrix.cpp
--- old/libsemigroups-2.0.1/tests/test-matrix.cpp       2021-06-03 
20:08:33.238082247 +0200
+++ new/libsemigroups-2.0.2/tests/test-matrix.cpp       2021-09-20 
21:00:25.402022476 +0200
@@ -318,6 +318,8 @@
       REQUIRE(r[0] == Row(sr, {1, 0, 2}));
       REQUIRE(r[1] == Row(sr, {1, 1, 0}));
       REQUIRE(r[2] == Row(sr, {2, 1, 1}));
+      REQUIRE(m * Mat::identity(sr, 3) == m);
+      REQUIRE(Mat::identity(sr, 3) * m == m);
     }
 
     template <typename Mat>
@@ -532,6 +534,8 @@
       expected.push_back({0, 1, 0, 1});
       tropical_max_plus_row_basis<4, 5>(expected);
       REQUIRE(expected.size() == 4);
+      REQUIRE(m * Mat::identity(sr, 4) == m);
+      REQUIRE(Mat::identity(sr, 4) * m == m);
     }
 
     template <typename Mat>
@@ -556,6 +560,8 @@
       y.product_inplace(x, id);
       REQUIRE(y == x);
       REQUIRE(Hash<Mat>()(y) != 0);
+      REQUIRE(x * Mat::identity(sr, 3) == x);
+      REQUIRE(Mat::identity(sr, 3) * x == x);
     }
 
     ////////////////////////////////////////////////////////////////////////
@@ -728,6 +734,8 @@
       REQUIRE(Hash<Mat>()(y) != 0);
       REQUIRE_THROWS_AS(Mat::make(sr, {{-22, 21, 0}, {10, 0, 0}, {1, 32, 1}}),
                         LibsemigroupsException);
+      REQUIRE(x * Mat::identity(sr, 3) == x);
+      REQUIRE(Mat::identity(sr, 3) * x == x);
     }
 
     ////////////////////////////////////////////////////////////////////////
@@ -754,6 +762,7 @@
       REQUIRE(y == expected);
 
       REQUIRE(x < y);
+      REQUIRE(y > x);
       REQUIRE(Degree<Mat>()(x) == 3);
       REQUIRE(Degree<Mat>()(y) == 3);
       REQUIRE(Complexity<Mat>()(x) == 27);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/tests/test-pbr.cpp 
new/libsemigroups-2.0.2/tests/test-pbr.cpp
--- old/libsemigroups-2.0.1/tests/test-pbr.cpp  2021-06-03 20:08:41.653176038 
+0200
+++ new/libsemigroups-2.0.2/tests/test-pbr.cpp  2021-09-20 21:00:25.402451690 
+0200
@@ -32,8 +32,12 @@
                           "001",
                           "universal product with convenience constructor",
                           "[quick][pbr]") {
-    PBR x({{-3, -1}, {-3, -2, -1, 1, 2, 3}, {-3, -2, -1, 1, 3}},
-          {{-3, -1, 1, 2, 3}, {-3, 1, 3}, {-3, -2, -1, 2, 3}});
+    std::vector<std::vector<int32_t>> const left
+        = {{-3, -1}, {-3, -2, -1, 1, 2, 3}, {-3, -2, -1, 1, 3}};
+
+    std::vector<std::vector<int32_t>> const right
+        = {{-3, -1, 1, 2, 3}, {-3, 1, 3}, {-3, -2, -1, 2, 3}};
+    PBR x(left, right);
 
     PBR y({{-3, -2, -1, 1}, {-3, -2, 3}, {-3, 2, 3}},
           {{-3, -2, -1, 3}, {-3, -2, -1, 3}, {-2, 2, 3}});
@@ -56,6 +60,7 @@
 
     REQUIRE(x == xx);
     REQUIRE(y == yy);
+    REQUIRE(x.degree() == 3);
 
     z.product_inplace(x, y);
 
@@ -148,7 +153,7 @@
   }
 
   LIBSEMIGROUPS_TEST_CASE("PBR", "005", "delete/copy", "[quick][pbr]") {
-    PBR x({{1}, {4}, {3}, {1}, {0, 2}, {0, 3, 4, 5}});
+    PBR x = PBR::make({{1}, {4}, {3}, {1}, {0, 2}, {0, 3, 4, 5}});
     PBR y(x);
     PBR z({{1}, {4}, {3}, {1}, {0, 2}, {0, 3, 4, 5}});
     REQUIRE(y == z);
@@ -157,6 +162,10 @@
     PBR zz(yy);
     PBR a({{1}, {4}, {3}, {1}, {0, 2}, {0, 3, 4, 5}});
     REQUIRE(zz == a);
+    PBR tt(std::move(zz));
+    REQUIRE(tt == a);
+    tt = z;
+    REQUIRE(tt == z);
   }
 
   LIBSEMIGROUPS_TEST_CASE("PBR", "006", "exceptions", "[quick][pbr]") {
@@ -185,8 +194,75 @@
             {{-4, -1}, {-3, -2, -1, 1, 2, 3}, {-3, -2, -1, 1, 3}},
             {{-3, -1, 1, 2, 3}, {-3, 1, 3}, {-3, -2, -1, 2, 3}, {-1, -2}}),
         LibsemigroupsException);
+    REQUIRE_THROWS_AS(
+        PBR::make({{-3, -1, 1, 2, 3}, {-3, 1, 3}, {-3, -2, -1, 2, 3}},
+                  {{-4, -1}, {-3, -2, -1, 1, 2, 3}, {-3, -2, -1, 1, 3}}),
+        LibsemigroupsException);
 
     REQUIRE_THROWS_AS(PBR::make({{}, {2}, {1}, {3, 0}}),
                       LibsemigroupsException);
   }
+
+  LIBSEMIGROUPS_TEST_CASE("PBR", "007", "operators", "[quick][pbr]") {
+    PBR x({{3, 5},
+           {0, 1, 2, 3, 4, 5},
+           {0, 2, 3, 4, 5},
+           {0, 1, 2, 3, 5},
+           {0, 2, 5},
+           {1, 2, 3, 4, 5}});
+    PBR y({{0, 3, 4, 5},
+           {2, 4, 5},
+           {1, 2, 5},
+           {2, 3, 4, 5},
+           {2, 3, 4, 5},
+           {1, 2, 4}});
+
+    PBR expected({{0, 1, 2, 3, 4, 5},
+                  {0, 1, 2, 3, 4, 5},
+                  {0, 1, 2, 3, 4, 5},
+                  {0, 1, 2, 3, 4, 5},
+                  {0, 1, 2, 3, 4, 5},
+                  {0, 1, 2, 3, 4, 5}});
+    REQUIRE(x * y == expected);
+    REQUIRE(y * y != expected);
+    REQUIRE(y * y > expected);
+    REQUIRE(y * y >= expected);
+    REQUIRE(expected < y * y);
+    REQUIRE(expected <= y * y);
+    REQUIRE(x * x >= expected);
+    REQUIRE(expected <= x * x);
+  }
+
+  LIBSEMIGROUPS_TEST_CASE("PBR", "008", "to_string", "[quick][pbr]") {
+    PBR x({{3, 5},
+           {0, 1, 2, 3, 4, 5},
+           {0, 2, 3, 4, 5},
+           {0, 1, 2, 3, 5},
+           {0, 2, 5},
+           {1, 2, 3, 4, 5}});
+    REQUIRE_NOTHROW(detail::to_string(x));
+    x = PBR({});
+    REQUIRE_NOTHROW(detail::to_string(x));
+    std::stringbuf buf;
+    std::ostream   os(&buf);
+    os << x;  // doesn't do anything visible
+  }
+
+  LIBSEMIGROUPS_TEST_CASE("PBR", "009", "identity", "[quick][pbr]") {
+    PBR x({{3, 5},
+           {0, 1, 2, 3, 4, 5},
+           {0, 2, 3, 4, 5},
+           {0, 1, 2, 3, 5},
+           {0, 2, 5},
+           {1, 2, 3, 4, 5}});
+    REQUIRE(x == x * x.identity());
+    REQUIRE(x == x.identity() * x);
+    REQUIRE(x == x * PBR::identity(3));
+    REQUIRE(x == PBR::identity(3) * x);
+  }
+
+  LIBSEMIGROUPS_TEST_CASE("PBR", "010", "adapters", "[quick][pbr]") {
+    PBR x({});
+    REQUIRE_NOTHROW(IncreaseDegree<PBR>()(x, 0));
+  }
 }  // namespace libsemigroups
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsemigroups-2.0.1/tests/test-todd-coxeter.cpp 
new/libsemigroups-2.0.2/tests/test-todd-coxeter.cpp
--- old/libsemigroups-2.0.1/tests/test-todd-coxeter.cpp 2021-08-28 
18:59:58.384940494 +0200
+++ new/libsemigroups-2.0.2/tests/test-todd-coxeter.cpp 2021-09-20 
21:00:25.403531223 +0200
@@ -1190,6 +1190,7 @@
                                    TCE(26), TCE(27), TCE(28), TCE(29), TCE(30),
                                    TCE(31), TCE(32), TCE(33), TCE(34)}));
       REQUIRE(detail::to_string(TCE(1)) == "1");
+      REQUIRE_NOTHROW(IncreaseDegree<TCE>()(TCE(1), 10));
 
       std::ostringstream oss;
       oss << TCE(10);  // Does not do anything visible
@@ -3531,5 +3532,16 @@
       
REQUIRE_THROWS_AS(tc.congruence().sort_generating_pairs(shortlex_compare),
                         LibsemigroupsException);
     }
+
+    LIBSEMIGROUPS_TEST_CASE("ToddCoxeter",
+                            "099",
+                            "short circuit size in obviously infinite",
+                            "[todd-coxeter][quick]") {
+      auto        rg = ReportGuard(REPORT);
+      ToddCoxeter tc;
+      tc.set_alphabet("abc");
+      tc.add_rule("aaaa", "a");
+      REQUIRE(tc.size() == POSITIVE_INFINITY);
+    }
   }  // namespace fpsemigroup
 }  // namespace libsemigroups

Reply via email to