Semigroupe
==========

The algorithm implemented in the class ``FroidurePin``
is based on `Algorithms for computing finite
semigroups <https://www.irif.fr/~jep/PDF/Rio.pdf>`__, `Expository
Slides <https://www.irif.fr/~jep/PDF/Exposes/StAndrews.pdf>`__, and
`Semigroupe
2.01 <https://www.irif.fr/~jep/Logiciels/Semigroupe2.0/semigroupe2.html>`__
by Jean-Eric Pin.

Some of the features of `Semigroupe
2.01 <https://www.irif.fr/~jep/Logiciels/Semigroupe2.0/semigroupe2.html>`__
are not yet implemented in ``FroidurePin``, this is a work in progress.
Missing features include those for:

-  Green’s relations, or classes
-  finding a zero
-  minimal ideal, principal left/right ideals, or indeed any ideals
-  inverses
-  local submonoids
-  the kernel
-  variety tests.

These may be included in a future version.

``libsemigroups`` performs roughly the same as `Semigroupe
2.01 <https://www.irif.fr/~jep/Logiciels/Semigroupe2.0/semigroupe2.html>`__
when there is a known upper bound on the size of the semigroup being
enumerated, and this is used to initialise the data structures for the
semigroup; see ``libsemigroups::FroidurePin::reserve`` for more details. Note
that in `Semigroupe
2.01 <https://www.irif.fr/~jep/Logiciels/Semigroupe2.0/semigroupe2.html>`__
it is always necessary to provide such an upper bound, but in
``libsemigroups`` it is not.

The ``FroidurePin`` class has some advantages over `Semigroupe
2.01 <https://www.irif.fr/~jep/Logiciels/Semigroupe2.0/semigroupe2.html>`__

-  there is a (hopefully) convenient C++ API, which makes it relatively
   easy to create and manipulate semigroups and monoids
-  more types of elements are supported
-  it is relatively straightforward to add support for further types of
   elements
-  it is possible to enumerate a certain number of elements of a
   semigroup or monoid (say if you are looking for an element with a
   particular property), to stop, and then to start the enumeration
   again at a later point
-  it is possible to add more generators after a semigroup or monoid has
   been constructed, without losing or having to recompute any
   information that was previously known
