libsemigroups  v3.0.0
C++ library for semigroups and monoids
Loading...
Searching...
No Matches
todd-coxeter-class.hpp
1//
2// libsemigroups - C++ library for semigroups and monoids
3// Copyright (C) 2025 James D. Mitchell
4//
5// This program is free software: you can redistribute it and/or modify
6// it under the terms of the GNU General Public License as published by
7// the Free Software Foundation, either version 3 of the License, or
8// (at your option) any later version.
9//
10// This program is distributed in the hope that it will be useful,
11// but WITHOUT ANY WARRANTY; without even the implied warranty of
12// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13// GNU General Public License for more details.
14//
15// You should have received a copy of the GNU General Public License
16// along with this program. If not, see <http://www.gnu.org/licenses/>.
17//
18
19// This file contains the declaration of the ToddCoxeter class. This class
20// exists mostly to wrap ToddCoxeterImpl (where the action happens) to make it
21// more user friendly. In particular, ToddCoxeter presentation()
22// and generating_pairs() return the input presentation and generating pairs,
23// whatever their type, and not the normalized Presentation<word_type> required
24// by ToddCoxeterImpl.
25
26#ifndef LIBSEMIGROUPS_TODD_COXETER_CLASS_HPP_
27#define LIBSEMIGROUPS_TODD_COXETER_CLASS_HPP_
28
29#include <algorithm> // for equal
30#include <cstddef> // for ptrdiff_t, size_t
31#include <iterator> // for bidirectional_iterator_tag
32#include <string> // for basic_string, string
33#include <type_traits> // for is_same_v
34#include <utility> // for move
35#include <vector> // for vector
36
37#include "presentation.hpp" // for Presentation
38#include "to-presentation.hpp" // for to<Presentation>
39#include "types.hpp" // for congruence_kind
40
41#include "detail/citow.hpp" // for detail::citow and detail::itow
42#include "detail/cong-common-class.hpp" // for detail::CongruenceCommon
43#include "detail/fmt.hpp" // for fmt
44#include "detail/todd-coxeter-impl.hpp" // for ToddCoxeterImpl
45
46namespace libsemigroups {
47
56
135 template <typename Word>
136 class ToddCoxeter : public detail::ToddCoxeterImpl {
137 private:
138 std::vector<Word> _generating_pairs;
139 Presentation<Word> _presentation;
140
141 public:
142#ifdef LIBSEMIGROUPS_PARSED_BY_DOXYGEN
150 struct options : public FelschGraphSettings_::options {
161 enum class strategy {
166
171
181
190
200
211 };
212
229
236 enum class lookahead_style {
241
246 };
247
289
290 // NOTE: The next enum (def_version) is actually defined in FelschGraph,
291 // not in ToddCoxeter
292
313 enum class def_version : uint8_t {
318 };
319 };
320
335 [[nodiscard]] congruence_kind kind() const noexcept;
336
352 [[nodiscard]] size_t number_of_generating_pairs() const noexcept;
353#endif
354
362 using native_word_type = Word;
363
370 using node_type = typename detail::ToddCoxeterImpl::node_type;
371
378 using word_graph_type = typename detail::ToddCoxeterImpl::word_graph_type;
379
395 using index_type = typename detail::ToddCoxeterImpl::index_type;
396
403 using label_type = typename detail::ToddCoxeterImpl::label_type;
404
410 ToddCoxeter() = default;
411
424
427 ToddCoxeter(ToddCoxeter const&) = default;
428
432
438
444
445 ~ToddCoxeter();
446
461
477
481 // call the rval ref constructor
482 : ToddCoxeter(knd, Presentation<Word>(p)) {}
483
487 // call the rval ref init
488 return init(knd, Presentation<Word>(p));
489 }
490
507 : ToddCoxeterImpl(knd, tc), _presentation(tc.presentation()) {}
508
526 ToddCoxeterImpl::init(knd, tc);
527 _presentation = tc.presentation();
528 return *this;
529 }
530
549 template <typename Node>
551 : ToddCoxeter() {
552 init(knd, wg);
553 }
554
571 template <typename Node>
573
574#ifndef LIBSEMIGROUPS_PARSED_BY_DOXYGEN
575 // Used in Sims
576 // TODO(1) could this and the next function be removed, and replaced
577 // with something else?
578 template <typename Node>
580 Presentation<Word> const& p,
581 WordGraph<Node> const& wg) {
582 init(knd, p, wg);
583 }
584
585 // TODO(1) a "make" variant that throws if params are valid
586 template <typename Node>
587 ToddCoxeter& init(congruence_kind knd,
588 Presentation<Word> const& p,
589 WordGraph<Node> const& wg);
590#endif
591
610 template <typename Iterator1, typename Iterator2>
612 Iterator2 last) const {
613 presentation().throw_if_letter_not_in_alphabet(first, last);
614 }
615
629 [[nodiscard]] std::vector<Word> const& generating_pairs() const noexcept {
630 return _generating_pairs;
631 }
632
649 [[nodiscard]] Presentation<Word> const& presentation() const noexcept {
650 return _presentation;
651 }
652
654 // ToddCoxeter - interface requirements - add_generating_pair
656
674 template <typename Iterator1,
675 typename Iterator2,
676 typename Iterator3,
677 typename Iterator4>
679 Iterator2 last1,
680 Iterator3 first2,
681 Iterator4 last2);
682
697 template <typename Iterator1,
698 typename Iterator2,
699 typename Iterator3,
700 typename Iterator4>
702 Iterator2 last1,
703 Iterator3 first2,
704 Iterator4 last2) {
705 // Call detail::CongruenceCommon version so that we perform bound checks
706 // in ToddCoxeter and not ToddCoxeterImpl
707 return detail::CongruenceCommon::add_generating_pair<ToddCoxeter>(
708 first1, last1, first2, last2);
709 }
710
712 // ToddCoxeter - interface requirements - contains
714
735 template <typename Iterator1,
736 typename Iterator2,
737 typename Iterator3,
738 typename Iterator4>
740 Iterator2 last1,
741 Iterator3 first2,
742 Iterator4 last2) const {
743 return ToddCoxeterImpl::currently_contains_no_checks(
744 detail::citow(this, first1),
745 detail::citow(this, last1),
746 detail::citow(this, first2),
747 detail::citow(this, last2));
748 }
749
770 template <typename Iterator1,
771 typename Iterator2,
772 typename Iterator3,
773 typename Iterator4>
774 tril currently_contains(Iterator1 first1,
775 Iterator2 last1,
776 Iterator3 first2,
777 Iterator4 last2) const {
778 // Call detail::CongruenceCommon version so that we perform bound checks
779 // in ToddCoxeter and not ToddCoxeterImpl
780 return detail::CongruenceCommon::currently_contains<ToddCoxeter>(
781 first1, last1, first2, last2);
782 }
783
801 template <typename Iterator1,
802 typename Iterator2,
803 typename Iterator3,
804 typename Iterator4>
805 bool contains_no_checks(Iterator1 first1,
806 Iterator2 last1,
807 Iterator3 first2,
808 Iterator4 last2) {
809 return ToddCoxeterImpl::contains_no_checks(detail::citow(this, first1),
810 detail::citow(this, last1),
811 detail::citow(this, first2),
812 detail::citow(this, last2));
813 }
814
832 template <typename Iterator1,
833 typename Iterator2,
834 typename Iterator3,
835 typename Iterator4>
836 bool contains(Iterator1 first1,
837 Iterator2 last1,
838 Iterator3 first2,
839 Iterator4 last2);
840
842 // ToddCoxeter - interface requirements - reduce
844
866 template <typename OutputIterator,
867 typename InputIterator1,
868 typename InputIterator2>
869 OutputIterator reduce_no_run_no_checks(OutputIterator d_first,
870 InputIterator1 first,
871 InputIterator2 last) const {
872 return ToddCoxeterImpl::reduce_no_run_no_checks(
873 detail::itow(this, d_first),
874 detail::citow(this, first),
875 detail::citow(this, last))
876 .get();
877 }
878
899 template <typename OutputIterator,
900 typename InputIterator1,
901 typename InputIterator2>
902 OutputIterator reduce_no_run(OutputIterator d_first,
903 InputIterator1 first,
904 InputIterator2 last) const {
905 return detail::CongruenceCommon::reduce_no_run<ToddCoxeter>(
906 d_first, first, last);
907 }
908
932 template <typename OutputIterator,
933 typename InputIterator1,
934 typename InputIterator2>
935 OutputIterator reduce_no_checks(OutputIterator d_first,
936 InputIterator1 first,
937 InputIterator2 last) {
938 return ToddCoxeterImpl::reduce_no_checks(detail::itow(this, d_first),
939 detail::citow(this, first),
940 detail::citow(this, last))
941 .get();
942 }
943
967 template <typename OutputIterator,
968 typename InputIterator1,
969 typename InputIterator2>
970 OutputIterator reduce(OutputIterator d_first,
971 InputIterator1 first,
972 InputIterator2 last) {
973 // Call detail::CongruenceCommon version so that we perform bound checks
974 // in ToddCoxeter and not ToddCoxeterImpl
975 return detail::CongruenceCommon::reduce<ToddCoxeter>(
976 d_first, first, last);
977 }
978
980 // ToddCoxeterImpl - word -> index
982
997
1022 // NOTE THAT: the graph contains one more node than there are element if
1023 // the underlying presentation does not contain the empty word
1024 template <typename Iterator1, typename Iterator2>
1026 Iterator2 last) const {
1027 return ToddCoxeterImpl::current_index_of_no_checks(
1028 detail::citow(this, first), detail::citow(this, last));
1029 }
1030
1054 template <typename Iterator1, typename Iterator2>
1055 index_type current_index_of(Iterator1 first, Iterator2 last) const {
1057 return current_index_of_no_checks(first, last);
1058 }
1059
1084 template <typename Iterator1, typename Iterator2>
1085 index_type index_of_no_checks(Iterator1 first, Iterator2 last) {
1086 return ToddCoxeterImpl::index_of_no_checks(detail::citow(this, first),
1087 detail::citow(this, last));
1088 }
1089
1114 template <typename Iterator1, typename Iterator2>
1115 index_type index_of(Iterator1 first, Iterator2 last) {
1117 return index_of_no_checks(first, last);
1118 }
1119
1121
1123 // ToddCoxeter - index -> word
1125
1142
1167 // NOTE THAT: the graph contains one more node than there are element if
1168 // the underlying presentation does not contain the empty word
1169 template <typename OutputIterator>
1170 OutputIterator current_word_of_no_checks(OutputIterator d_first,
1171 index_type i) const {
1172 return ToddCoxeterImpl::current_word_of_no_checks(
1173 detail::itow(this, d_first), i)
1174 .get();
1175 }
1176
1199 template <typename OutputIterator>
1200 OutputIterator current_word_of(OutputIterator d_first, index_type i) const {
1201 return ToddCoxeterImpl::current_word_of(detail::itow(this, d_first), i)
1202 .get();
1203 }
1204
1227 template <typename Iterator>
1228 Iterator word_of_no_checks(Iterator d_first, index_type i) {
1229 return ToddCoxeterImpl::word_of_no_checks(detail::itow(this, d_first), i)
1230 .get();
1231 }
1232
1256 template <typename Iterator>
1257 Iterator word_of(Iterator d_first, index_type i) {
1258 return ToddCoxeterImpl::word_of(detail::itow(this, d_first), i).get();
1259 }
1260
1262 }; // class ToddCoxeter
1263
1265 //
1272 template <typename Word>
1273 ToddCoxeter(congruence_kind, Presentation<Word> const&) -> ToddCoxeter<Word>;
1274
1276 //
1283 template <typename Word>
1285
1287 //
1294 template <typename Word>
1295 ToddCoxeter(congruence_kind, ToddCoxeter<Word> const&) -> ToddCoxeter<Word>;
1296
1298 //
1305 template <typename Node>
1307 -> ToddCoxeter<word_type>;
1308
1310 //
1317 template <typename Node>
1318 ToddCoxeter(congruence_kind, WordGraph<Node>&&) -> ToddCoxeter<word_type>;
1319
1321 //
1328 template <typename Word>
1329 ToddCoxeter(ToddCoxeter<Word> const&) -> ToddCoxeter<Word>;
1330
1332 //
1339 template <typename Word>
1340 ToddCoxeter(ToddCoxeter<Word>&&) -> ToddCoxeter<Word>;
1341
1358 template <typename Word>
1359 std::string to_human_readable_repr(ToddCoxeter<Word> const& tc);
1360} // namespace libsemigroups
1361
1362#include "todd-coxeter-class.tpp"
1363#endif // LIBSEMIGROUPS_TODD_COXETER_CLASS_HPP_
For an implementation of presentations for semigroups or monoids.
Definition presentation.hpp:102
Class for representing word graphs.
Definition word-graph.hpp:82
std::string to_human_readable_repr(AhoCorasick const &ac)
Return a string representation.
Presentation(Presentation< Word > const &) -> Presentation< Word >
Deduction guide.
ToddCoxeter(congruence_kind, Presentation< Word > const &) -> ToddCoxeter< Word >
Deduction guide.
OutputIterator current_word_of(OutputIterator d_first, index_type i) const
Insert a current word representing a class with given index into an output iterator.
Definition todd-coxeter-class.hpp:1200
Iterator word_of_no_checks(Iterator d_first, index_type i)
Insert the word representing a class with given index into an output iterator.
Definition todd-coxeter-class.hpp:1228
Iterator word_of(Iterator d_first, index_type i)
Insert the word representing a class with given index into an output iterator.
Definition todd-coxeter-class.hpp:1257
OutputIterator current_word_of_no_checks(OutputIterator d_first, index_type i) const
Insert a current word representing a class with given index into an output iterator.
Definition todd-coxeter-class.hpp:1170
ToddCoxeter(congruence_kind knd, Presentation< Word > &&p)
Construct from congruence_kind and Presentation.
Definition todd-coxeter-class.hpp:458
ToddCoxeter & init(congruence_kind knd, Presentation< Word > &&p)
Re-initialize a ToddCoxeter instance.
ToddCoxeter & operator=(ToddCoxeter &&)=default
Move assignment operator.
ToddCoxeter()=default
Default constructor.
ToddCoxeter & init(congruence_kind knd, WordGraph< Node > const &wg)
Re-initialize a ToddCoxeter instance.
void throw_if_letter_not_in_alphabet(Iterator1 first, Iterator2 last) const
Throws if any letter in a range is out of bounds.
Definition todd-coxeter-class.hpp:611
ToddCoxeter & operator=(ToddCoxeter const &)=default
Copy assignment operator.
ToddCoxeter(ToddCoxeter const &)=default
ToddCoxeter(congruence_kind knd, WordGraph< Node > const &wg)
Construct from congruence_kind and WordGraph.
Definition todd-coxeter-class.hpp:550
ToddCoxeter(congruence_kind knd, Presentation< Word > const &p)
Construct from congruence_kind and Presentation.
Definition todd-coxeter-class.hpp:480
ToddCoxeter(ToddCoxeter &&)=default
ToddCoxeter & init(congruence_kind knd, Presentation< Word > const &p)
Re-initialize a ToddCoxeter instance.
Definition todd-coxeter-class.hpp:486
ToddCoxeter & init()
Re-initialize a ToddCoxeter instance.
ToddCoxeter & init(congruence_kind knd, ToddCoxeter const &tc)
Re-initialize a ToddCoxeter instance.
Definition todd-coxeter-class.hpp:525
ToddCoxeter(congruence_kind knd, ToddCoxeter const &tc)
Construct from congruence_kind and ToddCoxeter.
Definition todd-coxeter-class.hpp:506
OutputIterator reduce_no_checks(OutputIterator d_first, InputIterator1 first, InputIterator2 last)
Reduce a word with no checks.
Definition todd-coxeter-class.hpp:935
bool contains_no_checks(Iterator1 first1, Iterator2 last1, Iterator3 first2, Iterator4 last2)
Check containment of a pair of words via iterators.
Definition todd-coxeter-class.hpp:805
tril currently_contains(Iterator1 first1, Iterator2 last1, Iterator3 first2, Iterator4 last2) const
Check containment of a pair of words via iterators.
Definition todd-coxeter-class.hpp:774
OutputIterator reduce(OutputIterator d_first, InputIterator1 first, InputIterator2 last)
Reduce a word.
Definition todd-coxeter-class.hpp:970
size_t number_of_generating_pairs() const noexcept
Returns the number of generating pairs.
ToddCoxeter & add_generating_pair(Iterator1 first1, Iterator2 last1, Iterator3 first2, Iterator4 last2)
Add generating pair via iterators.
Definition todd-coxeter-class.hpp:701
std::vector< Word > const & generating_pairs() const noexcept
Get the generating pairs of the congruence.
Definition todd-coxeter-class.hpp:629
tril currently_contains_no_checks(Iterator1 first1, Iterator2 last1, Iterator3 first2, Iterator4 last2) const
Check containment of a pair of words via iterators.
Definition todd-coxeter-class.hpp:739
bool contains(Iterator1 first1, Iterator2 last1, Iterator3 first2, Iterator4 last2)
Check containment of a pair of words via iterators.
ToddCoxeter & add_generating_pair_no_checks(Iterator1 first1, Iterator2 last1, Iterator3 first2, Iterator4 last2)
Add generating pair via iterators.
congruence_kind kind() const noexcept
The kind of the congruence (1- or 2-sided).
Presentation< Word > const & presentation() const noexcept
Get the presentation used to define a ToddCoxeter instance (if any).
Definition todd-coxeter-class.hpp:649
OutputIterator reduce_no_run_no_checks(OutputIterator d_first, InputIterator1 first, InputIterator2 last) const
Reduce a word with no enumeration or checks.
Definition todd-coxeter-class.hpp:869
OutputIterator reduce_no_run(OutputIterator d_first, InputIterator1 first, InputIterator2 last) const
Reduce a word with no enumeration.
Definition todd-coxeter-class.hpp:902
typename detail::ToddCoxeterImpl::word_graph_type word_graph_type
The type of the underlying WordGraph.
Definition todd-coxeter-class.hpp:378
typename detail::ToddCoxeterImpl::node_type node_type
The type of the nodes in the word graph.
Definition todd-coxeter-class.hpp:370
typename detail::ToddCoxeterImpl::index_type index_type
The type of the index of a class.
Definition todd-coxeter-class.hpp:395
typename detail::ToddCoxeterImpl::label_type label_type
The type of the edge-labels in the word graph.
Definition todd-coxeter-class.hpp:403
Word native_word_type
Type of the letters in the relations of the presentation stored in a ToddCoxeter instance.
Definition todd-coxeter-class.hpp:362
index_type current_index_of(Iterator1 first, Iterator2 last) const
Returns the current index of the class containing a word.
Definition todd-coxeter-class.hpp:1055
index_type current_index_of_no_checks(Iterator1 first, Iterator2 last) const
Returns the current index of the class containing a word.
Definition todd-coxeter-class.hpp:1025
index_type index_of_no_checks(Iterator1 first, Iterator2 last)
Returns the index of the class containing a word.
Definition todd-coxeter-class.hpp:1085
index_type index_of(Iterator1 first, Iterator2 last)
Returns the index of the class containing a word.
Definition todd-coxeter-class.hpp:1115
tril
Enum to indicate true, false or not currently knowable.
Definition types.hpp:56
congruence_kind
Enum to indicate the sided-ness of a congruence.
Definition types.hpp:69
T move(T... args)
Namespace for everything in the libsemigroups library.
Definition action.hpp:44
Struct containing various options that can be used to control the behaviour of Todd-Coxeter.
Definition todd-coxeter-class.hpp:150
lookahead_style
Enum class for specifying the style of any lookahead performed.
Definition todd-coxeter-class.hpp:236
lookahead_extent
Enum class for specifying the extent of any lookahead performed.
Definition todd-coxeter-class.hpp:219
@ partial
Definition todd-coxeter-class.hpp:227
@ full
Definition todd-coxeter-class.hpp:223
strategy
Enum class containing various strategies.
Definition todd-coxeter-class.hpp:161
@ CR
Definition todd-coxeter-class.hpp:180
@ Cr
Definition todd-coxeter-class.hpp:199
@ hlt
Definition todd-coxeter-class.hpp:165
@ felsch
Definition todd-coxeter-class.hpp:170
@ Rc
Definition todd-coxeter-class.hpp:210
@ R_over_C
Definition todd-coxeter-class.hpp:189
def_version
Values for specifying how to handle edge definitions.
Definition todd-coxeter-class.hpp:313
@ two
Version 2 definition processing.
Definition todd-coxeter-class.hpp:317
@ one
Version 1 definition processing.
Definition todd-coxeter-class.hpp:315
def_policy
Enum class containing values for specifying how to handle edge definitions.
Definition todd-coxeter-class.hpp:267
@ discard_all_if_no_space
Definition todd-coxeter-class.hpp:284
@ unlimited
Definition todd-coxeter-class.hpp:287
@ no_stack_if_no_space
Definition todd-coxeter-class.hpp:270
@ purge_from_top
Definition todd-coxeter-class.hpp:275
@ purge_all
Definition todd-coxeter-class.hpp:280