//
// libsemigroups - C++ library for semigroups and monoids
// Copyright (C) 2019 James D. Mitchell
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// The purpose of this file is to provide unit tests for the FpSemigroup class.
#include "catch.hpp" // for REQUIRE
#include "test-main.hpp" // for LIBSEMIGROUPS_TEST_CASE
#include "libsemigroups/fpsemi-examples.hpp" // for RennerTypeDMonoid
#include "libsemigroups/fpsemi.hpp" // for FpSemigroup
#include "libsemigroups/froidure-pin-base.hpp" // for FroidurePinBase
#include "libsemigroups/froidure-pin.hpp" // for FroidurePin<>::element_index_type
#include "libsemigroups/knuth-bendix.hpp" // for KnuthBendix
#include "libsemigroups/report.hpp" // for ReportGuard
#include "libsemigroups/todd-coxeter.hpp" // for ToddCoxeter
#include "libsemigroups/transf.hpp" // for Transf<>
#include "libsemigroups/types.hpp" // for relation_type
namespace libsemigroups {
constexpr
bool REPORT =
false;
constexpr congruence_kind twosided = congruence_kind::twosided;
using fpsemigroup::author;
using fpsemigroup::RennerTypeBMonoid;
using fpsemigroup::RennerTypeDMonoid;
using fpsemigroup::rook_monoid;
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"001",
"Renner monoid type B2 (E. G. presentation), q = 1",
"[quick][fpsemi][hivert]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(6);
for (relation_type
const& rl :
renner_type_B_monoid(2, 1, author::Godelle)) {
S.add_rule(rl);
}
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.is_obviously_finite());
REQUIRE(!S.started());
REQUIRE(!S.finished());
REQUIRE(S.has_knuth_bendix());
REQUIRE(S.has_todd_coxeter());
REQUIRE(S.size() == 57);
REQUIRE(S.started());
REQUIRE(S.finished());
REQUIRE(S.is_obviously_finite());
if (!S.has_knuth_bendix()) {
REQUIRE(S.has_todd_coxeter());
}
else {
REQUIRE(S.has_knuth_bendix());
}
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"002",
"Renner monoid type B2 (E. G. presentation), q = 0",
"[quick][fpsemi][hivert]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(6);
for (relation_type
const& rl :
renner_type_B_monoid(2, 0, author::Godelle)) {
S.add_rule(rl);
}
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.is_obviously_finite());
REQUIRE(S.size() == 57);
REQUIRE(S.is_obviously_finite());
}
// Loops for ever: Infinite monoid ???
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"003",
"Renner monoid type B3 (E. G. presentation), q = 1",
"[quick][fpsemi][hivert][no-valgrind]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(8);
S.max_threads(2);
for (relation_type
const& rl :
renner_type_B_monoid(3, 1, author::Godelle)) {
S.add_rule(rl);
}
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.is_obviously_finite());
S.froidure_pin()->enumerate(8000);
REQUIRE(S.froidure_pin()->current_size() == 8200);
REQUIRE(S.started());
// REQUIRE(S.size() == 757);
}
// Loops for ever: Infinite monoid ???
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"004",
"Renner monoid type B3 (E. G. presentation), q = 0",
"[quick][fpsemi][hivert][no-valgrind]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(8);
S.max_threads(2);
for (relation_type
const& rl :
renner_type_B_monoid(3, 0, author::Godelle)) {
S.add_rule(rl);
}
REQUIRE(!S.is_obviously_infinite());
S.froidure_pin()->enumerate(8000);
REQUIRE(S.froidure_pin()->current_size() == 8200);
// REQUIRE(S.size() == 757);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"005",
"Renner monoid type B2 (Gay-Hivert presentation), q = 1",
"[quick][fpsemi][hivert]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(6);
for (relation_type
const& rl : RennerTypeBMonoid(2, 1)) {
S.add_rule(rl);
}
REQUIRE(!S.is_obviously_infinite());
S.run();
REQUIRE(S.finished());
REQUIRE(S.size() == 57);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"006",
"Renner monoid type B2 (Gay-Hivert presentation), q = 0",
"[quick][fpsemi][hivert]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(6);
for (relation_type
const& rl : RennerTypeBMonoid(2, 0)) {
S.add_rule(rl);
}
REQUIRE(!S.is_obviously_infinite());
REQUIRE(S.size() == 57);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"007",
"Renner monoid type B3 (Gay-Hivert presentation), q = 1",
"[quick][fpsemi][hivert][no-valgrind]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(8);
for (relation_type
const& rl : RennerTypeBMonoid(3, 1)) {
S.add_rule(rl);
}
REQUIRE(!S.is_obviously_infinite());
REQUIRE(S.size() == 757);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"008",
"Renner monoid type B3 (Gay-Hivert presentation), q = 0",
"[quick][fpsemi][hivert][no-valgrind]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(8);
for (relation_type
const& rl : RennerTypeBMonoid(3, 0)) {
S.add_rule(rl);
}
REQUIRE(!S.is_obviously_infinite());
REQUIRE(S.size() == 757);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"009",
"Renner monoid type B4 (Gay-Hivert presentation), q = 1",
"[quick][fpsemi][hivert][no-valgrind]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(10);
for (relation_type
const& rl : RennerTypeBMonoid(4, 1)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 110);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
// S.knuth_bendix()->run(); // Works too but is slower :)
REQUIRE(S.size() == 13889);
REQUIRE(S.froidure_pin()->number_of_rules() == 356);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"010",
"Renner monoid type B4 (Gay-Hivert presentation), q = 0",
"[quick][fpsemi][hivert][no-valgrind]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(10);
for (relation_type
const& rl : RennerTypeBMonoid(4, 0)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 110);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
// S.knuth_bendix()->run(); // Works too :)
REQUIRE(S.size() == 13889);
REQUIRE(S.froidure_pin()->number_of_rules() == 356);
}
// This appears to be an example where KB + FP is faster than TC
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"011",
"Renner monoid type B5 (Gay-Hivert presentation), q = 1",
"[extreme][fpsemi][hivert]") {
auto rg = ReportGuard(
true);
FpSemigroup S;
S.set_alphabet(12);
for (relation_type
const& rl : RennerTypeBMonoid(5, 1)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 159);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
// S.todd_coxeter()->run(); // Takes 2m30s or so to run
REQUIRE(S.size() == 322021);
REQUIRE(S.froidure_pin()->number_of_rules() == 1453);
{
congruence::ToddCoxeter tc(
twosided,
S.froidure_pin(),
congruence::ToddCoxeter::options::froidure_pin::use_cayley_graph);
REQUIRE(tc.number_of_classes() == 322021);
// Works!
}
{
fpsemigroup::ToddCoxeter tc(S.froidure_pin());
REQUIRE(tc.number_of_rules() == 1453);
REQUIRE(tc.size() == 322021);
}
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"012",
"Renner monoid type B5 (Gay-Hivert presentation), q = 0",
"[extreme][fpsemi][hivert]") {
auto rg = ReportGuard(
true);
FpSemigroup S;
S.set_alphabet(12);
for (relation_type
const& rl : RennerTypeBMonoid(5, 0)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 159);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
// Doesn't terminate, or show signs that it will, in 5 minutes or so
// S.todd_coxeter()->run();
REQUIRE(S.size() == 322021);
REQUIRE(S.froidure_pin()->number_of_rules() == 1453);
congruence::ToddCoxeter tc(
twosided,
S.froidure_pin(),
congruence::ToddCoxeter::options::froidure_pin::use_cayley_graph);
REQUIRE(tc.number_of_classes() == 322021);
// Works!
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"013",
"Renner monoid type D2 (E. G. presentation), q = 1",
"[quick][fpsemi][hivert]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(7);
for (relation_type
const& rl :
renner_type_D_monoid(2, 1, author::Godelle)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 44);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
// S.knuth_bendix()->run(); // Works too :)
REQUIRE(S.size() == 37);
REQUIRE(S.froidure_pin()->number_of_rules() == 54);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"014",
"Renner monoid type D2 (E. G. presentation), q = 0",
"[quick][fpsemi][hivert]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(7);
for (relation_type
const& rl :
renner_type_D_monoid(2, 0, author::Godelle)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 44);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
// S.knuth_bendix()->run(); // Works too :)
REQUIRE(S.size() == 37);
REQUIRE(S.froidure_pin()->number_of_rules() == 54);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"015",
"Renner monoid type D3 (E. G. presentation), q = 1",
"[quick][fpsemi][hivert][no-valgrind]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(9);
for (relation_type
const& rl :
renner_type_D_monoid(3, 1, author::Godelle)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 78);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
// S.knuth_bendix()->run(); // Works too but is a bit slower :)
REQUIRE(S.size() == 541);
REQUIRE(S.froidure_pin()->number_of_rules() == 148);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"016",
"Renner monoid type D3 (E. G. presentation), q = 0",
"[quick][fpsemi][hivert][no-valgrind]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(9);
for (relation_type
const& rl :
renner_type_D_monoid(3, 0, author::Godelle)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 78);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
// S.knuth_bendix()->run(); // Works too but is a bit slower :)
REQUIRE(S.size() == 541);
REQUIRE(S.froidure_pin()->number_of_rules() == 148);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"017",
"Renner monoid type D4 (E. G. presentation), q = 1",
"[quick][fpsemi][hivert][no-valgrind]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(11);
S.max_threads(2);
for (relation_type
const& rl :
renner_type_D_monoid(4, 1, author::Godelle)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 119);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
REQUIRE(S.size() == POSITIVE_INFINITY);
S.froidure_pin()->enumerate(10626);
REQUIRE(S.froidure_pin()->current_number_of_rules() == 417);
REQUIRE(S.froidure_pin()->current_size() == 10626);
// REQUIRE(S.size() == 10625); // Runs forever
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"018",
"Renner monoid type D4 (E. G. presentation), q = 0",
"[quick][fpsemi][hivert][no-valgrind]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(11);
S.max_threads(2);
for (relation_type
const& rl :
renner_type_D_monoid(4, 0, author::Godelle)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 119);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
S.froidure_pin()->enumerate(10626);
REQUIRE(S.froidure_pin()->current_number_of_rules() == 417);
REQUIRE(S.froidure_pin()->current_size() == 10626);
// REQUIRE(S.size() == 10625); // Runs forever
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"019",
"Renner monoid type D2 (Gay-Hivert presentation), q = 1",
"[quick][fpsemi][hivert]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(7);
for (relation_type
const& rl : RennerTypeDMonoid(2, 1)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 44);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
// S.knuth_bendix()->run(); // Works too :)
REQUIRE(S.size() == 37);
REQUIRE(S.froidure_pin()->number_of_rules() == 54);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"020",
"Renner monoid type D2 (Gay-Hivert presentation), q = 0",
"[quick][fpsemi][hivert]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(7);
for (relation_type
const& rl : RennerTypeDMonoid(2, 0)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 44);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
// S.knuth_bendix()->run(); // Works too :)
REQUIRE(S.size() == 37);
REQUIRE(S.froidure_pin()->number_of_rules() == 54);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"021",
"Renner monoid type D3 (Gay-Hivert presentation), q = 1",
"[quick][fpsemi][hivert][no-valgrind]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(9);
for (relation_type
const& rl : RennerTypeDMonoid(3, 1)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 78);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
// S.knuth_bendix()->run(); // Works too but is a bit slower :)
REQUIRE(S.size() == 541);
REQUIRE(S.froidure_pin()->number_of_rules() == 148);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"022",
"Renner monoid type D3 (Gay-Hivert presentation), q = 0",
"[quick][fpsemi][hivert][no-valgrind]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(9);
for (relation_type
const& rl : RennerTypeDMonoid(3, 0)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 78);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
// S.knuth_bendix()->run(); // Works too but is a bit slower :)
REQUIRE(S.size() == 541);
REQUIRE(S.froidure_pin()->number_of_rules() == 148);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"023",
"Renner monoid type D4 (Gay-Hivert presentation), q = 1",
"[quick][fpsemi][hivert][no-valgrind]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(11);
for (relation_type
const& rl : RennerTypeDMonoid(4, 1)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 121);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
REQUIRE(S.size() == 10625);
REQUIRE(S.froidure_pin()->number_of_rules() == 419);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"024",
"Renner monoid type D4 (Gay-Hivert presentation), q = 0",
"[quick][fpsemi][hivert][no-valgrind]") {
auto rg = ReportGuard(
false);
FpSemigroup S;
S.set_alphabet(11);
for (relation_type
const& rl : RennerTypeDMonoid(4, 0)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 121);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
REQUIRE(S.size() == 10625);
REQUIRE(S.froidure_pin()->number_of_rules() == 419);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"025",
"Renner monoid type D5 (Gay-Hivert presentation), q = 1",
"[extreme][fpsemi][hivert]") {
auto rg = ReportGuard(
true);
FpSemigroup S;
S.set_alphabet(13);
for (relation_type
const& rl : RennerTypeDMonoid(5, 1)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 173);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
REQUIRE(S.size() == 258661);
REQUIRE(S.froidure_pin()->number_of_rules() == 1279);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"026",
"Renner monoid type D5 (Gay-Hivert presentation), q = 0",
"[extreme][fpsemi][hivert]") {
auto rg = ReportGuard(
true);
FpSemigroup S;
S.set_alphabet(13);
for (relation_type
const& rl : RennerTypeDMonoid(5, 0)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 173);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
REQUIRE(S.size() == 258661);
REQUIRE(S.froidure_pin()->number_of_rules() == 1279);
}
// Takes about 4 minutes
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"027",
"Renner monoid type D6 (Gay-Hivert presentation), q = 1",
"[extreme][fpsemi][hivert]") {
auto rg = ReportGuard(
true);
FpSemigroup S;
S.set_alphabet(15);
for (relation_type
const& rl : RennerTypeDMonoid(6, 1)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 234);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
REQUIRE(S.size() == 7464625);
REQUIRE(S.froidure_pin()->number_of_rules() == 4570);
}
// Takes about 4 minutes
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"028",
"Renner monoid type D6 (Gay-Hivert presentation), q = 0",
"[extreme][fpsemi][hivert]") {
auto rg = ReportGuard(
true);
FpSemigroup S;
S.set_alphabet(15);
for (relation_type
const& rl : RennerTypeDMonoid(6, 0)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 234);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
S.knuth_bendix()->knuth_bendix_by_overlap_length();
REQUIRE(S.size() == 7464625);
REQUIRE(S.froidure_pin()->number_of_rules() == 4570);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"029",
"Rook monoid R5, q = 0",
"[quick][fpsemi][no-valgrind]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(6);
for (relation_type
const& rl : rook_monoid(5, 0)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 33);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
REQUIRE(S.size() == 1546);
REQUIRE(S.froidure_pin()->number_of_rules() == 71);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"030",
"Rook monoid R5, q = 1",
"[quick][fpsemi][no-valgrind]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(6);
for (relation_type
const& rl : rook_monoid(5, 1)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 33);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
REQUIRE(S.size() == 1546);
REQUIRE(S.froidure_pin()->number_of_rules() == 71);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"031",
"Rook monoid R6, q = 0",
"[quick][fpsemi][no-valgrind]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(7);
for (relation_type
const& rl : rook_monoid(6, 0)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 45);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
REQUIRE(S.size() == 13327);
REQUIRE(S.froidure_pin()->number_of_rules() == 207);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"032",
"Rook monoid R6, q = 1",
"[quick][fpsemi][no-valgrind]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(7);
for (relation_type
const& rl : rook_monoid(6, 1)) {
S.add_rule(rl);
}
REQUIRE(S.number_of_rules() == 45);
REQUIRE(!S.is_obviously_infinite());
REQUIRE(!S.knuth_bendix()->confluent());
REQUIRE(S.size() == 13327);
REQUIRE(S.froidure_pin()->number_of_rules() == 207);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"033",
"normal_form",
"[quick][fpsemi]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(2);
S.add_rule(relation_type({0, 0, 0}, {0}));
S.add_rule(relation_type({0}, {1, 1}));
REQUIRE(S.size() == 5);
REQUIRE(S.normal_form({0, 0, 1}) == word_type({0, 0, 1}));
REQUIRE(S.normal_form({0, 0, 0, 0, 1}) == word_type({0, 0, 1}));
REQUIRE(S.normal_form({0, 1, 1, 0, 0, 1}) == word_type({0, 0, 1}));
REQUIRE(S.normal_form({0, 0, 0}) == word_type({0}));
REQUIRE(S.normal_form({1}) == word_type({1}));
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"034",
"for a finite semigroup",
"[quick][fpsemi]") {
auto rg = ReportGuard(REPORT);
FroidurePin<LeastTransf<5>> S(
{LeastTransf<5>({1, 3, 4, 2, 3}), LeastTransf<5>({3, 2, 1, 3, 3})});
REQUIRE(S.size() == 88);
REQUIRE(S.number_of_rules() == 18);
FpSemigroup T(S);
REQUIRE(T.number_of_rules() == 18);
T.add_rule(S.factorisation(LeastTransf<5>({3, 4, 4, 4, 4})),
S.factorisation(LeastTransf<5>({3, 1, 3, 3, 3})));
REQUIRE(T.number_of_rules() == 19);
REQUIRE(T.size() == 21);
REQUIRE(T.equal_to(S.factorisation(LeastTransf<5>({1, 3, 1, 3, 3})),
S.factorisation(LeastTransf<5>({4, 2, 4, 4, 2}))));
REQUIRE(T.normal_form(S.factorisation(LeastTransf<5>({1, 3, 1, 3, 3})))
== T.normal_form(S.factorisation(LeastTransf<5>({4, 2, 4, 4, 2}))));
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"035",
"finite fp semigroup, dihedral group of order 6",
"[quick][fpsemi]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(
"abcde");
S.add_rule(
"aa",
"a");
S.add_rule(
"ab",
"b");
S.add_rule(
"ba",
"b");
S.add_rule(
"ac",
"c");
S.add_rule(
"ca",
"c");
S.add_rule(
"ad",
"d");
S.add_rule(
"da",
"d");
S.add_rule(
"ae",
"e");
S.add_rule(
"ea",
"e");
S.add_rule(
"bc",
"a");
S.add_rule(
"cb",
"a");
S.add_rule(
"de",
"a");
S.add_rule(
"ed",
"a");
S.add_rule(
"cc",
"a");
S.add_rule(
"becdd",
"a");
S.add_rule(
"eee",
"a");
REQUIRE(S.size() == 6);
REQUIRE(S.equal_to(
"b",
"c"));
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"036",
"finite fp semigroup, size 16",
"[quick][fpsemi][kbfp]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(
"0123");
S.add_rule(
"3",
"2");
S.add_rule(
"03",
"02");
S.add_rule(
"11",
"1");
S.add_rule(
"13",
"12");
S.add_rule(
"21",
"2");
S.add_rule(
"22",
"2");
S.add_rule(
"23",
"2");
S.add_rule(
"000",
"0");
S.add_rule(
"001",
"1");
S.add_rule(
"002",
"2");
S.add_rule(
"012",
"12");
S.add_rule(
"100",
"1");
S.add_rule(
"102",
"02");
S.add_rule(
"200",
"2");
S.add_rule(
"0101",
"101");
S.add_rule(
"0202",
"202");
S.add_rule(
"1010",
"101");
S.add_rule(
"1201",
"101");
S.add_rule(
"1202",
"202");
S.add_rule(
"2010",
"201");
S.add_rule(
"2020",
"202");
REQUIRE(S.size() == 16);
REQUIRE(S.equal_to(
"2",
"3"));
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"037",
"finite fp semigroup, size 16",
"[quick][fpsemi]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(11);
S.add_rule(relation_type({2}, {1}));
S.add_rule(relation_type({4}, {3}));
S.add_rule(relation_type({5}, {0}));
S.add_rule(relation_type({6}, {3}));
S.add_rule(relation_type({7}, {1}));
S.add_rule(relation_type({8}, {3}));
S.add_rule(relation_type({9}, {3}));
S.add_rule(relation_type({10}, {0}));
S.add_rule(relation_type({0, 2}, {0, 1}));
S.add_rule(relation_type({0, 4}, {0, 3}));
S.add_rule(relation_type({0, 5}, {0, 0}));
S.add_rule(relation_type({0, 6}, {0, 3}));
S.add_rule(relation_type({0, 7}, {0, 1}));
S.add_rule(relation_type({0, 8}, {0, 3}));
S.add_rule(relation_type({0, 9}, {0, 3}));
S.add_rule(relation_type({0, 10}, {0, 0}));
S.add_rule(relation_type({1, 1}, {1}));
S.add_rule(relation_type({1, 2}, {1}));
S.add_rule(relation_type({1, 4}, {1, 3}));
S.add_rule(relation_type({1, 5}, {1, 0}));
S.add_rule(relation_type({1, 6}, {1, 3}));
S.add_rule(relation_type({1, 7}, {1}));
S.add_rule(relation_type({1, 8}, {1, 3}));
S.add_rule(relation_type({1, 9}, {1, 3}));
S.add_rule(relation_type({1, 10}, {1, 0}));
S.add_rule(relation_type({3, 1}, {3}));
S.add_rule(relation_type({3, 2}, {3}));
S.add_rule(relation_type({3, 3}, {3}));
S.add_rule(relation_type({3, 4}, {3}));
S.add_rule(relation_type({3, 5}, {3, 0}));
S.add_rule(relation_type({3, 6}, {3}));
S.add_rule(relation_type({3, 7}, {3}));
S.add_rule(relation_type({3, 8}, {3}));
S.add_rule(relation_type({3, 9}, {3}));
S.add_rule(relation_type({3, 10}, {3, 0}));
S.add_rule(relation_type({0, 0, 0}, {0}));
S.add_rule(relation_type({0, 0, 1}, {1}));
S.add_rule(relation_type({0, 0, 3}, {3}));
S.add_rule(relation_type({0, 1, 3}, {1, 3}));
S.add_rule(relation_type({1, 0, 0}, {1}));
S.add_rule(relation_type({1, 0, 3}, {0, 3}));
S.add_rule(relation_type({3, 0, 0}, {3}));
S.add_rule(relation_type({0, 1, 0, 1}, {1, 0, 1}));
S.add_rule(relation_type({0, 3, 0, 3}, {3, 0, 3}));
S.add_rule(relation_type({1, 0, 1, 0}, {1, 0, 1}));
S.add_rule(relation_type({1, 3, 0, 1}, {1, 0, 1}));
S.add_rule(relation_type({1, 3, 0, 3}, {3, 0, 3}));
S.add_rule(relation_type({3, 0, 1, 0}, {3, 0, 1}));
S.add_rule(relation_type({3, 0, 3, 0}, {3, 0, 3}));
REQUIRE(S.size() == 16);
REQUIRE(S.equal_to({0}, {5}));
REQUIRE(S.equal_to({0}, {10}));
REQUIRE(S.equal_to({1}, {2}));
REQUIRE(S.equal_to({1}, {7}));
REQUIRE(S.equal_to({3}, {4}));
REQUIRE(S.equal_to({3}, {6}));
REQUIRE(S.equal_to({3}, {8}));
REQUIRE(S.equal_to({3}, {9}));
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"038",
"fp semigroup, size 240",
"[quick][fpsemi]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(
"01");
S.add_rule(
"000",
"0");
S.add_rule(
"1111",
"1");
S.add_rule(
"01110",
"00");
S.add_rule(
"1001",
"11");
S.add_rule(
"001010101010",
"00");
REQUIRE(S.size() == 240);
REQUIRE(S.froidure_pin()->size() == 240);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"039",
"add_rule",
"[quick][fpsemi]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(
"ab");
REQUIRE(S.is_obviously_infinite());
REQUIRE(S.size() == POSITIVE_INFINITY);
S.add_rule(
"aaa",
"a");
S.add_rule(
"a",
"bb");
REQUIRE(!S.is_obviously_infinite());
REQUIRE(S.size() == 5);
auto T = S.froidure_pin();
REQUIRE(T->size() == 5);
REQUIRE(T->number_of_idempotents() == 1);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"040",
"add_rule",
"[quick][fpsemi]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(
"ab");
REQUIRE(S.is_obviously_infinite());
S.add_rule(
"aaa",
"a");
S.add_rule(
"a",
"bb");
REQUIRE(!S.is_obviously_infinite());
REQUIRE(S.knuth_bendix()->froidure_pin()->size() == 5);
REQUIRE(S.size() == 5);
auto T = S.froidure_pin();
REQUIRE(T->size() == 5);
REQUIRE(T->number_of_idempotents() == 1);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"041",
"equal_to",
"[quick][fpsemi]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(
"ab");
S.add_rule(
"aa",
"a");
S.add_rule(
"ab",
"a");
S.add_rule(
"ba",
"a");
S.max_threads(2);
REQUIRE(S.is_obviously_infinite());
REQUIRE(S.equal_to(
"ab",
"a"));
REQUIRE(S.equal_to(
"ba",
"a"));
REQUIRE(S.equal_to(
"aa",
"a"));
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"042",
"cbegin/cend_rules",
"[quick][fpsemi]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(
"ab");
S.add_rule(
"aa",
"a");
S.add_rule(
"ab",
"a");
S.add_rule(
"ba",
"a");
using rules_type = std::vector<std::pair<std::string, std::string>>;
REQUIRE(rules_type(S.cbegin_rules(), S.cend_rules())
== rules_type({{
"aa",
"a"}, {
"ab",
"a"}, {
"ba",
"a"}}));
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"043",
"semigroup of size 3",
"[todd-coxeter][quick]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(
"eab");
S.set_identity(
"e");
size_t
const N = 10;
std::string lhs =
"a" + std::string(N,
'b');
std::string rhs =
"e";
S.add_rule(lhs, rhs);
lhs = std::string(N,
'a');
rhs = std::string(N + 1,
'b');
S.add_rule(lhs, rhs);
lhs =
"ba";
rhs = std::string(N,
'b') +
"a";
S.add_rule(lhs, rhs);
REQUIRE(S.size() == 3);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"044",
"run_for/until",
"[fpsemigroup][quick]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(
"abce");
S.set_identity(
"e");
S.add_rule(
"aa",
"e");
S.add_rule(
"bc",
"e");
S.add_rule(
"bbb",
"e");
S.add_rule(
"ababababababab",
"e");
S.add_rule(
"abacabacabacabacabacabacabacabac",
"e");
S.run_for(std::chrono::nanoseconds(1));
REQUIRE(!S.finished());
size_t number_of_calls = 0;
S.run_until([&number_of_calls]() {
++number_of_calls;
return number_of_calls == 3;
});
// REQUIRE(!S.finished());
REQUIRE(number_of_calls == 3);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"045",
"constructors",
"[fpsemigroup][quick]") {
using Transf8 = LeastTransf<3>;
auto rg = ReportGuard(REPORT);
FroidurePin<Transf8> S({Transf8({1, 0, 1}), Transf8({0, 0, 0})});
FpSemigroup T(S);
REQUIRE(!T.has_froidure_pin());
REQUIRE(T.size() == S.size());
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"046",
"set_inverses",
"[fpsemigroup][quick]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(
"abAe");
S.set_identity(
"e");
REQUIRE_THROWS_AS(S.set_inverses(
"bAae"), LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"047",
"smalloverlap",
"[fpsemigroup][quick]") {
auto rg = ReportGuard(REPORT);
FpSemigroup k;
k.set_alphabet(
"abcdefg");
k.add_rule(
"abcd",
"aaaeaa");
k.add_rule(
"ef",
"dg");
REQUIRE(k.size() == POSITIVE_INFINITY);
REQUIRE(k.equal_to(
"abcd",
"aaaeaa"));
REQUIRE(k.equal_to(
"ef",
"dg"));
REQUIRE(k.equal_to(
"aaaaaef",
"aaaaadg"));
REQUIRE(k.equal_to(
"efababa",
"dgababa"));
k.froidure_pin()->enumerate(100);
REQUIRE(k.froidure_pin()->current_size() == 8205);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"048",
"quaternion group Q8",
"[fpsemigroup][quick]") {
auto rg = ReportGuard(REPORT);
FpSemigroup S;
S.set_alphabet(
"xyXYe");
S.set_identity(
"e");
S.set_inverses(
"XYxye");
S.add_rule(
"xxxx",
"e");
S.add_rule(
"xyXy",
"e");
S.add_rule(
"xxYY",
"e");
REQUIRE(S.size() == 8);
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"049",
"symmetric group Coxeter presentation",
"[fpsemigroup][quick]") {
size_t
const N = 10;
FpSemigroup S;
S.set_alphabet(N + 1);
S.set_identity(N);
S.set_inverses(S.alphabet());
for (size_t i = 0; i < N; ++i) {
S.add_rule({i, i}, {N});
}
for (size_t i = 0; i < N - 1; ++i) {
S.add_rule({i, i + 1, i, i + 1, i, i + 1}, {N});
}
for (size_t i = 0; i < N; ++i) {
for (size_t j = 0; j < N; ++j) {
if (std::abs(
static_cast<
int>(i - j)) > 1) {
S.add_rule({i, j, i, j}, {N});
}
}
}
REQUIRE(S.size() == 39916800);
// 11!
}
LIBSEMIGROUPS_TEST_CASE(
"FpSemigroup",
"050",
"https://math.stackexchange.com/questions/2649807",
"[fpsemigroup][fail]") {
fpsemigroup::ToddCoxeter S;
S.set_alphabet(
"abcABCe");
S.set_identity(
"e");
S.set_inverses(
"ABCabce");
S.add_rule(
"aa",
"e");
S.add_rule(
"bbbbbbbbbbb",
"e");
S.add_rule(
"cc",
"e");
S.add_rule(
"abababab",
"e");
S.add_rule(
"abbabbabbabbabbabb",
"e");
S.add_rule(
"abbabaBabaBBabbaB",
"e");
S.add_rule(
"acacac",
"e");
S.add_rule(
"bcbc",
"e");
S.congruence().strategy(congruence::ToddCoxeter::options::strategy::random);
REQUIRE(S.size() == 0);
}
}
// namespace libsemigroups