// libsemigroups - C++ library for semigroups and monoids
// Copyright (C) 2022 Murray T. Whyte
//
// 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/>.
//
// This file is the first of three containing tests for the fpsemi-examples
// functions. The presentations here define finite semigroups, and we use
// ToddCoxeter in testing them. Exceptions and defaults are also checked in this
// file.
// #define CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER
#include "catch.hpp" // for REQUIRE, REQUIRE_NOTHROW, REQUIRE_THROWS_AS
#include "test-main.hpp" // for LIBSEMIGROUPS_TEST_CASE
#include "libsemigroups/fpsemi-examples.hpp" // for the presentations
#include "libsemigroups/report.hpp" // for ReportGuard
#include "libsemigroups/todd-coxeter.hpp" // for ToddCoxeter
#include "libsemigroups/types.hpp" // for word_type
namespace libsemigroups {
struct LibsemigroupsException;
constexpr
bool REPORT =
false;
using fpsemigroup::author;
using fpsemigroup::make;
using fpsemigroup::alternating_group;
using fpsemigroup::chinese_monoid;
using fpsemigroup::cyclic_inverse_monoid;
using fpsemigroup::dual_symmetric_inverse_monoid;
using fpsemigroup::fibonacci_semigroup;
using fpsemigroup::full_transformation_monoid;
using fpsemigroup::monogenic_semigroup;
using fpsemigroup::order_preserving_cyclic_inverse_monoid;
using fpsemigroup::order_preserving_monoid;
using fpsemigroup::orientation_preserving_monoid;
using fpsemigroup::orientation_reversing_monoid;
using fpsemigroup::partial_isometries_cycle_graph_monoid;
using fpsemigroup::partial_transformation_monoid;
using fpsemigroup::partition_monoid;
using fpsemigroup::plactic_monoid;
using fpsemigroup::rectangular_band;
using fpsemigroup::rook_monoid;
using fpsemigroup::singular_brauer_monoid;
using fpsemigroup::stellar_monoid;
using fpsemigroup::stylic_monoid;
using fpsemigroup::symmetric_group;
using fpsemigroup::symmetric_inverse_monoid;
using fpsemigroup::temperley_lieb_monoid;
using fpsemigroup::uniform_block_bijection_monoid;
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"049",
"test default values",
"[fpsemi-examples][quick]") {
// author defaults
REQUIRE(symmetric_group(4) == symmetric_group(4, author::Carmichael));
REQUIRE(alternating_group(4) == alternating_group(4, author::Moore));
REQUIRE(full_transformation_monoid(4)
== full_transformation_monoid(4, author::Iwahori));
REQUIRE(partial_transformation_monoid(4)
== partial_transformation_monoid(4, author::Sutov));
REQUIRE(symmetric_inverse_monoid(4)
== symmetric_inverse_monoid(4, author::Sutov));
REQUIRE(dual_symmetric_inverse_monoid(4)
== dual_symmetric_inverse_monoid(
4, author::Easdown + author::East + author::FitzGerald));
REQUIRE(uniform_block_bijection_monoid(4)
== uniform_block_bijection_monoid(4, author::FitzGerald));
REQUIRE(partition_monoid(4) == partition_monoid(4, author::East));
REQUIRE(cyclic_inverse_monoid(4)
== cyclic_inverse_monoid(4, author::Fernandes));
// index defaults
REQUIRE(symmetric_group(4, author::Moore)
== symmetric_group(4, author::Moore, 0));
REQUIRE(cyclic_inverse_monoid(4, author::Fernandes)
== cyclic_inverse_monoid(4, author::Fernandes, 1));
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"002",
"full_transformation_monoid author except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(full_transformation_monoid(5, author::Burnside),
LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"003",
"full_transformation_monoid degree except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(full_transformation_monoid(3, author::Iwahori),
LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"005",
"partial_transformation_monoid author except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(partial_transformation_monoid(4, author::Burnside),
LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"006",
"partial_transformation_monoid degree except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(partial_transformation_monoid(3, author::Sutov),
LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"008",
"symmetric_group auth except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(symmetric_group(9, author::Sutov),
LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"009",
"symmetric_group degree except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(symmetric_group(3, author::Carmichael),
LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"064",
"symmetric_group index except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(symmetric_group(5, author::Moore, 2),
LibsemigroupsException);
REQUIRE_THROWS_AS(symmetric_group(5, author::Carmichael, 1),
LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"012",
"dual_symmetric_inverse_monoid auth except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(dual_symmetric_inverse_monoid(9, author::East),
LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"013",
"dual_symmetric_inverse_monoid degree except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(
dual_symmetric_inverse_monoid(
2, author::Easdown + author::East + author::FitzGerald),
LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"015",
"uniform_block_bijection_monoid auth except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(uniform_block_bijection_monoid(9, author::Burnside),
LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"016",
"uniform_block_bijection_monoid degree except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(uniform_block_bijection_monoid(2, author::FitzGerald),
LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"019",
"partition_monoid auth except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(partition_monoid(3, author::Burnside),
LibsemigroupsException);
REQUIRE_THROWS_AS(partition_monoid(5, author::Machine),
LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"020",
"partition_monoid degree except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(partition_monoid(4, author::Machine),
LibsemigroupsException);
REQUIRE_THROWS_AS(partition_monoid(3, author::East),
LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"036",
"alternating_group auth except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(alternating_group(5, author::Sutov),
LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"037",
"alternating_group degree except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(alternating_group(3, author::Moore),
LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"039",
"chinese_monoid degree except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(chinese_monoid(1), LibsemigroupsException);
REQUIRE_THROWS_AS(chinese_monoid(0), LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"040",
"monogenic_semigroup degree except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(monogenic_semigroup(0, 0), LibsemigroupsException);
REQUIRE_THROWS_AS(monogenic_semigroup(5, 0), LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"041",
"rectangular_band degree except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(rectangular_band(0, 0), LibsemigroupsException);
REQUIRE_THROWS_AS(rectangular_band(1, 0), LibsemigroupsException);
REQUIRE_THROWS_AS(rectangular_band(0, 1), LibsemigroupsException);
REQUIRE_THROWS_AS(rectangular_band(0, 100), LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"042",
"stellar_monoid degree except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(stellar_monoid(0), LibsemigroupsException);
REQUIRE_THROWS_AS(stellar_monoid(1), LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"043",
"plactic_monoid degree except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(plactic_monoid(0), LibsemigroupsException);
REQUIRE_THROWS_AS(plactic_monoid(1), LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"044",
"stylic_monoid degree except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(stylic_monoid(0), LibsemigroupsException);
REQUIRE_THROWS_AS(stylic_monoid(1), LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"045",
"temperley_lieb_monoid degree except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(temperley_lieb_monoid(0), LibsemigroupsException);
REQUIRE_THROWS_AS(temperley_lieb_monoid(1), LibsemigroupsException);
REQUIRE_THROWS_AS(temperley_lieb_monoid(2), LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"046",
"singular_brauer_monoid degree except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(singular_brauer_monoid(0), LibsemigroupsException);
REQUIRE_THROWS_AS(singular_brauer_monoid(1), LibsemigroupsException);
REQUIRE_THROWS_AS(singular_brauer_monoid(2), LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"047",
"orientation_preserving_monoid degree except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(orientation_preserving_monoid(0), LibsemigroupsException);
REQUIRE_THROWS_AS(orientation_preserving_monoid(1), LibsemigroupsException);
REQUIRE_THROWS_AS(orientation_preserving_monoid(2), LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"048",
"orientation_reversing_monoid degree except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(orientation_reversing_monoid(0), LibsemigroupsException);
REQUIRE_THROWS_AS(orientation_reversing_monoid(1), LibsemigroupsException);
REQUIRE_THROWS_AS(orientation_reversing_monoid(2), LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"055",
"order_preserving_monoid degree except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(order_preserving_monoid(0), LibsemigroupsException);
REQUIRE_THROWS_AS(order_preserving_monoid(1), LibsemigroupsException);
REQUIRE_THROWS_AS(order_preserving_monoid(2), LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"061",
"cyclic_inverse_monoid degree except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(cyclic_inverse_monoid(0, author::Fernandes, 0),
LibsemigroupsException);
REQUIRE_THROWS_AS(cyclic_inverse_monoid(1, author::Fernandes, 0),
LibsemigroupsException);
REQUIRE_THROWS_AS(cyclic_inverse_monoid(2, author::Fernandes, 0),
LibsemigroupsException);
REQUIRE_THROWS_AS(cyclic_inverse_monoid(0, author::Fernandes, 1),
LibsemigroupsException);
REQUIRE_THROWS_AS(cyclic_inverse_monoid(1, author::Fernandes, 1),
LibsemigroupsException);
REQUIRE_THROWS_AS(cyclic_inverse_monoid(2, author::Fernandes, 1),
LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"062",
"cyclic_inverse_monoid author except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(cyclic_inverse_monoid(5, author::Burnside, 0),
LibsemigroupsException);
REQUIRE_THROWS_AS(cyclic_inverse_monoid(5, author::Fernandes, 3),
LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"063",
"order_preserving_monoid degree except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(order_preserving_monoid(0), LibsemigroupsException);
REQUIRE_THROWS_AS(order_preserving_monoid(1), LibsemigroupsException);
REQUIRE_THROWS_AS(order_preserving_monoid(2), LibsemigroupsException);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"069",
"partial_isometries_cycle_graph_monoid degree except",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
REQUIRE_THROWS_AS(partial_isometries_cycle_graph_monoid(0),
LibsemigroupsException);
REQUIRE_THROWS_AS(partial_isometries_cycle_graph_monoid(1),
LibsemigroupsException);
REQUIRE_THROWS_AS(partial_isometries_cycle_graph_monoid(2),
LibsemigroupsException);
}
namespace congruence {
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"001",
"full_transformation_monoid(5) Iwahori",
"[fpsemi-examples][standard]") {
auto rg = ReportGuard(REPORT);
size_t n = 5;
auto s = full_transformation_monoid(n, author::Iwahori);
auto p = make<Presentation<word_type>>(s);
p.alphabet(n + 1);
presentation::replace_word(p, word_type({}), {n});
presentation::add_identity_rules(p, n);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(n + 1);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 3125);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"004",
"partial_transformation_monoid(5) Sutov",
"[fpsemi-examples][standard]") {
auto rg = ReportGuard(REPORT);
size_t n = 5;
auto s = partial_transformation_monoid(n, author::Sutov);
auto p = make<Presentation<word_type>>(s);
p.alphabet(n + 2);
presentation::replace_word(p, word_type({}), {n + 1});
presentation::add_identity_rules(p, n + 1);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(n + 2);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 7776);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"038",
"partial_transformation_monoid(3) Machine",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
auto s = partial_transformation_monoid(3, author::Machine);
auto p = make<Presentation<word_type>>(s);
p.alphabet(5);
presentation::replace_word(p, word_type({}), {4});
presentation::add_identity_rules(p, 4);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(5);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 64);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"007",
"symmetric_inverse_monoid(5)",
"[fpsemi-examples][quick][no-valgrind]") {
auto rg = ReportGuard(REPORT);
size_t n = 5;
auto s = symmetric_inverse_monoid(n, author::Sutov);
auto p = make<Presentation<word_type>>(s);
p.alphabet(n + 1);
presentation::replace_word(p, word_type({}), {n});
presentation::add_identity_rules(p, n);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(n + 1);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 1546);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"010",
"symmetric_group(6) Burnside + Miller",
"[fpsemi-examples][quick][no-valgrind]") {
auto rg = ReportGuard(REPORT);
size_t n = 6;
auto s = symmetric_group(n, author::Burnside + author::Miller);
auto p = make<Presentation<word_type>>(s);
p.alphabet(n);
presentation::replace_word(p, word_type({}), {n - 1});
presentation::add_identity_rules(p, n - 1);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(n);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 720);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"031",
"symmetric_group(6) Carmichael",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
size_t n = 6;
auto s = symmetric_group(n, author::Carmichael);
auto p = make<Presentation<word_type>>(s);
p.alphabet(n);
presentation::replace_word(p, word_type({}), {n - 1});
presentation::add_identity_rules(p, n - 1);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(n);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 720);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"032",
"symmetric_group(6) Moore index 0",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
size_t n = 6;
auto s = symmetric_group(n, author::Moore);
auto p = make<Presentation<word_type>>(s);
p.alphabet(3);
presentation::replace_word(p, word_type({}), {2});
presentation::add_identity_rules(p, 2);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(3);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 720);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"065",
"symmetric_group(7) Moore index 1",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
size_t n = 7;
auto s = symmetric_group(n, author::Moore, 1);
auto p = make<Presentation<word_type>>(s);
p.alphabet(n);
presentation::replace_word(p, word_type({}), {n - 1});
presentation::add_identity_rules(p, n - 1);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(n);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 5040);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"033",
"symmetric_group(6) Coxeter + Moser",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
size_t n = 6;
auto s = symmetric_group(n, author::Coxeter + author::Moser);
auto p = make<Presentation<word_type>>(s);
p.alphabet(n);
presentation::replace_word(p, word_type({}), {n - 1});
presentation::add_identity_rules(p, n - 1);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(n);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 720);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"011",
"dual_symmetric_inverse_monoid(5)",
"[fpsemi-examples][quick][no-valgrind]") {
auto rg = ReportGuard(REPORT);
size_t n = 5;
auto s = dual_symmetric_inverse_monoid(
n, author::Easdown + author::East + author::FitzGerald);
auto p = make<Presentation<word_type>>(s);
p.validate();
auto m = p.alphabet().size();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(m);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 6721);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"014",
"uniform_block_bijection_monoid(5)",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
size_t n = 5;
auto s = uniform_block_bijection_monoid(n, author::FitzGerald);
auto p = make<Presentation<word_type>>(s);
p.validate();
auto m = p.alphabet().size();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(m);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 1496);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"017",
"partition_monoid(5)",
"[fpsemi-examples][standard]") {
auto rg = ReportGuard(REPORT);
size_t n = 5;
auto s = partition_monoid(n, author::East);
auto p = make<Presentation<word_type>>(s);
p.validate();
auto m = p.alphabet().size();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(m);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 115975);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"018",
"partition_monoid(3)",
"[fpsemi-examples][standard]") {
auto rg = ReportGuard(REPORT);
auto s = partition_monoid(3, author::Machine);
auto p = make<Presentation<word_type>>(s);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
auto m = p.alphabet().size();
tc.set_number_of_generators(m);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 203);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"021",
"rectangular_band(5, 9)",
"[fpsemi-examples][standard]") {
auto rg = ReportGuard(REPORT);
auto s = rectangular_band(5, 9);
auto p = make<Presentation<word_type>>(s);
p.validate();
auto m = p.alphabet().size();
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(m);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 45);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"022",
"monogenic_semigroup(4, 9)",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
auto s = monogenic_semigroup(4, 9);
auto p = make<Presentation<word_type>>(s);
p.validate();
auto m = p.alphabet().size();
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(m);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 12);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"023",
"fibonacci_semigroup(2, 5)",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
auto s = fibonacci_semigroup(2, 5);
auto p = make<Presentation<word_type>>(s);
p.validate();
auto m = p.alphabet().size();
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(m);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 11);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"024",
"temperley_lieb_monoid(10)",
"[fpsemi-examples][quick][no-valgrind]") {
auto rg = ReportGuard(REPORT);
size_t n = 10;
auto s = temperley_lieb_monoid(n);
auto p = make<Presentation<word_type>>(s);
p.alphabet(n);
presentation::add_identity_rules(p, n - 1);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(n);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 16796);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"025",
"singular_brauer_monoid(6)",
"[fpsemi-examples][quick][no-valgrind]") {
auto rg = ReportGuard(REPORT);
size_t n = 6;
auto s = singular_brauer_monoid(n);
auto p = make<Presentation<word_type>>(s);
p.validate();
auto m = p.alphabet().size();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(m);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 9675);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"026",
"orientation_preserving_monoid(6)",
"[fpsemi-examples][quick][no-valgrind]") {
auto rg = ReportGuard(REPORT);
size_t n = 6;
auto s = orientation_preserving_monoid(n);
auto p = make<Presentation<word_type>>(s);
p.validate();
auto m = p.alphabet().size();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(m);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 2742);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"027",
"orientation_reversing_monoid(5)",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
size_t n = 5;
auto s = orientation_reversing_monoid(n);
auto p = make<Presentation<word_type>>(s);
p.validate();
auto m = p.alphabet().size();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(m);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 1015);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"034",
"test for the rook monoid",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
auto s = rook_monoid(4, 1);
auto p = make<Presentation<word_type>>(s);
p.validate();
auto m = p.alphabet().size();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(m);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 209);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"035",
"alternating_group(7) Moore",
"[fpsemi-examples][quick][no-valgrind]") {
auto rg = ReportGuard(REPORT);
size_t n = 7;
auto s = alternating_group(n, author::Moore);
auto p = make<Presentation<word_type>>(s);
p.alphabet(n - 1);
presentation::replace_word(p, word_type({}), {n - 2});
presentation::add_identity_rules(p, n - 2);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(n - 1);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 2520);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"050",
"full_transformation_monoid(4) Aizenstat",
"[fpsemi-examples][standard]") {
auto rg = ReportGuard(REPORT);
size_t n = 4;
auto s = full_transformation_monoid(n, author::Aizenstat);
auto p = make<Presentation<word_type>>(s);
p.alphabet(4);
presentation::replace_word(p, word_type({}), {3});
presentation::add_identity_rules(p, 3);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(4);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 256);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"053",
"order_preserving_monoid(5)",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
size_t n = 5;
auto s = order_preserving_monoid(n);
auto p = make<Presentation<word_type>>(s);
p.alphabet(2 * n - 1);
presentation::add_identity_rules(p, 2 * n - 2);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(2 * n - 1);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 126);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"054",
"order_preserving_monoid(10)",
"[fpsemi-examples][standard]") {
auto rg = ReportGuard(REPORT);
size_t n = 10;
auto s = order_preserving_monoid(n);
auto p = make<Presentation<word_type>>(s);
p.alphabet(2 * n - 1);
presentation::add_identity_rules(p, 2 * n - 2);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(2 * n - 1);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 92
'378);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"056",
"cyclic_inverse_monoid(4) Fernandes 1",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
size_t n = 4;
auto s = cyclic_inverse_monoid(n, author::Fernandes, 1);
auto p = make<Presentation<word_type>>(s);
p.alphabet(3);
presentation::replace_word(p, word_type({}), {2});
presentation::add_identity_rules(p, 2);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(3);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 61);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"057",
"cyclic_inverse_monoid(8) Fernandes index 1",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
size_t n = 8;
auto s = cyclic_inverse_monoid(n, author::Fernandes, 1);
auto p = make<Presentation<word_type>>(s);
p.alphabet(3);
presentation::replace_word(p, word_type({}), {2});
presentation::add_identity_rules(p, 2);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(3);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 2041);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"058",
"cyclic_inverse_monoid Fernandes index 0",
"[fpsemi-examples][quick][no-valgrind]") {
auto rg = ReportGuard(REPORT);
for (size_t n = 3; n < 10; ++n) {
auto p = make<Presentation<word_type>>(
fpsemigroup::cyclic_inverse_monoid(n, author::Fernandes, 0));
REQUIRE(p.rules.size() == (n * n + 3 * n + 4));
p.alphabet(n + 2);
presentation::replace_word(p, word_type({}), {n + 1});
presentation::add_identity_rules(p, n + 1);
p.alphabet_from_rules();
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(n + 2);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == n * std::pow(2, n) - n + 1);
}
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"059",
"order_preserving_cyclic_inverse_monoid(4)",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
size_t n = 4;
auto s = order_preserving_cyclic_inverse_monoid(n);
auto p = make<Presentation<word_type>>(s);
p.alphabet(n + 1);
presentation::replace_word(p, word_type({}), {n});
presentation::add_identity_rules(p, n);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(n + 1);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 38);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"060",
"order_preserving_cyclic_inverse_monoid(10)",
"[fpsemi-examples][quick][no-valgrind]") {
auto rg = ReportGuard(REPORT);
size_t n = 11;
auto s = order_preserving_cyclic_inverse_monoid(n);
auto p = make<Presentation<word_type>>(s);
p.alphabet(n + 1);
presentation::replace_word(p, word_type({}), {n});
presentation::add_identity_rules(p, n);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(n + 1);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 6120);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"066",
"order_preserving_cyclic_inverse_monoid(10)",
"[fpsemi-examples][quick][no-valgrind]") {
auto rg = ReportGuard(REPORT);
size_t n = 11;
auto s = order_preserving_cyclic_inverse_monoid(n);
auto p = make<Presentation<word_type>>(s);
p.alphabet(n + 1);
presentation::replace_word(p, word_type({}), {n});
presentation::add_identity_rules(p, n);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(n + 1);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 6120);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"067",
"partial_isometries_cycle_graph_monoid(5)",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
size_t n = 5;
auto s = partial_isometries_cycle_graph_monoid(n);
REQUIRE(s.size() == 16);
auto p = make<Presentation<word_type>>(s);
p.alphabet(4);
presentation::replace_word(p, word_type({}), {3});
presentation::add_identity_rules(p, 3);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(4);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 286);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"070",
"partial_isometries_cycle_graph_monoid(4)",
"[fpsemi-examples][quick]") {
auto rg = ReportGuard(REPORT);
size_t n = 4;
auto s = partial_isometries_cycle_graph_monoid(n);
REQUIRE(s.size() == 13);
auto p = make<Presentation<word_type>>(s);
p.alphabet(4);
presentation::replace_word(p, word_type({}), {3});
presentation::add_identity_rules(p, 3);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(4);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 97);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"068",
"partial_isometries_cycle_graph_monoid(10)",
"[fpsemi-examples][quick][no-valgrind][no-coverage]") {
auto rg = ReportGuard(REPORT);
size_t n = 10;
auto s = partial_isometries_cycle_graph_monoid(n);
REQUIRE(s.size() == 52);
auto p = make<Presentation<word_type>>(s);
p.alphabet(4);
presentation::replace_word(p, word_type({}), {3});
presentation::add_identity_rules(p, 3);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(4);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 20
'311);
}
LIBSEMIGROUPS_TEST_CASE(
"fpsemi-examples",
"051",
"not_symmetric_group(4)",
"[fpsemi-examples][standard]") {
auto rg = ReportGuard(REPORT);
size_t n = 4;
auto s = not_symmetric_group(n,
author::Guralnick + author::Kantor
+ author::Kassabov + author::Lubotzky);
auto p = make<Presentation<word_type>>(s);
p.alphabet(n);
presentation::replace_word(p, word_type({}), {n - 1});
presentation::add_identity_rules(p, n - 1);
p.validate();
ToddCoxeter tc(congruence_kind::twosided);
tc.set_number_of_generators(n);
for (size_t i = 0; i < p.rules.size() - 1; i += 2) {
tc.add_pair(p.rules[i], p.rules[i + 1]);
}
REQUIRE(tc.number_of_classes() == 72);
}
}
// namespace congruence
}
// namespace libsemigroups