libsemigroups  v3.3.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 "types.hpp" // for congruence_kind
39
40#include "detail/citow.hpp" // for detail::citow and detail::itow
41#include "detail/cong-common-class.hpp" // for detail::CongruenceCommon
42#include "detail/fmt.hpp" // for fmt
43#include "detail/todd-coxeter-impl.hpp" // for ToddCoxeterImpl
44
45namespace libsemigroups {
46
55
142 template <typename Word>
143 class ToddCoxeter : public detail::ToddCoxeterImpl {
144 private:
145 std::vector<Word> _generating_pairs;
146 Presentation<Word> _presentation;
147
148 public:
149#ifdef LIBSEMIGROUPS_PARSED_BY_DOXYGEN
157 struct options : public FelschGraphSettings_::options {
168 enum class strategy {
173
178
188
197
207
218 };
219
236
243 enum class lookahead_style {
248
253 };
254
296
297 // NOTE: The next enum (def_version) is actually defined in FelschGraph,
298 // not in ToddCoxeter
299
320 enum class def_version : uint8_t {
325 };
326 };
327
342 [[nodiscard]] congruence_kind kind() const noexcept;
343
359 [[nodiscard]] size_t number_of_generating_pairs() const noexcept;
360#endif
361
369 using native_word_type = Word;
370
377 using node_type = typename detail::ToddCoxeterImpl::node_type;
378
385 using word_graph_type = typename detail::ToddCoxeterImpl::word_graph_type;
386
402 using index_type = typename detail::ToddCoxeterImpl::index_type;
403
410 using label_type = typename detail::ToddCoxeterImpl::label_type;
411
417 ToddCoxeter() = default;
418
431
434 ToddCoxeter(ToddCoxeter const&) = default;
435
439
445
451
452 ~ToddCoxeter();
453
468
484
488 // call the rval ref constructor
489 : ToddCoxeter(knd, Presentation<Word>(p)) {}
490
494 // call the rval ref init
495 return init(knd, Presentation<Word>(p));
496 }
497
514 init(knd, tc);
515 }
516
534 ToddCoxeterImpl::init(knd, tc);
535 _presentation = tc.presentation();
536 _presentation.rules.insert(_presentation.rules.end(),
537 tc.generating_pairs().cbegin(),
538 tc.generating_pairs().cend());
539 // Clear generating pairs last, in case &tc == this!!!
540 _generating_pairs.clear();
541 // TODO(1) check KnuthBendix et al
542 return *this;
543 }
544
563 template <typename Node>
565 : ToddCoxeter() {
566 init(knd, wg);
567 }
568
585 template <typename Node>
587
588#ifndef LIBSEMIGROUPS_PARSED_BY_DOXYGEN
589 // Used in Sims
590 // TODO(1) could this and the next function be removed, and replaced
591 // with something else?
592 template <typename Node>
594 Presentation<Word> const& p,
595 WordGraph<Node> const& wg) {
596 init(knd, p, wg);
597 }
598
599 // TODO(1) a "make" variant that throws if params are valid
600 template <typename Node>
601 ToddCoxeter& init(congruence_kind knd,
602 Presentation<Word> const& p,
603 WordGraph<Node> const& wg);
604#endif
605
624 template <typename Iterator1, typename Iterator2>
626 Iterator2 last) const {
627 presentation().throw_if_letter_not_in_alphabet(first, last);
628 }
629
643 [[nodiscard]] std::vector<Word> const& generating_pairs() const noexcept {
644 return _generating_pairs;
645 }
646
663 [[nodiscard]] Presentation<Word> const& presentation() const noexcept {
664 return _presentation;
665 }
666
668 // ToddCoxeter - interface requirements - add_generating_pair
670
688 template <typename Iterator1,
689 typename Iterator2,
690 typename Iterator3,
691 typename Iterator4>
693 Iterator2 last1,
694 Iterator3 first2,
695 Iterator4 last2);
696
711 template <typename Iterator1,
712 typename Iterator2,
713 typename Iterator3,
714 typename Iterator4>
716 Iterator2 last1,
717 Iterator3 first2,
718 Iterator4 last2) {
719 // Call detail::CongruenceCommon version so that we perform bound checks
720 // in ToddCoxeter and not ToddCoxeterImpl
721 return detail::CongruenceCommon::add_generating_pair<ToddCoxeter>(
722 first1, last1, first2, last2);
723 }
724
726 // ToddCoxeter - interface requirements - contains
728
749 template <typename Iterator1,
750 typename Iterator2,
751 typename Iterator3,
752 typename Iterator4>
754 Iterator2 last1,
755 Iterator3 first2,
756 Iterator4 last2) const {
757 return ToddCoxeterImpl::currently_contains_no_checks(
758 detail::citow(this, first1),
759 detail::citow(this, last1),
760 detail::citow(this, first2),
761 detail::citow(this, last2));
762 }
763
784 template <typename Iterator1,
785 typename Iterator2,
786 typename Iterator3,
787 typename Iterator4>
788 tril currently_contains(Iterator1 first1,
789 Iterator2 last1,
790 Iterator3 first2,
791 Iterator4 last2) const {
792 // Call detail::CongruenceCommon version so that we perform bound checks
793 // in ToddCoxeter and not ToddCoxeterImpl
794 return detail::CongruenceCommon::currently_contains<ToddCoxeter>(
795 first1, last1, first2, last2);
796 }
797
815 template <typename Iterator1,
816 typename Iterator2,
817 typename Iterator3,
818 typename Iterator4>
819 bool contains_no_checks(Iterator1 first1,
820 Iterator2 last1,
821 Iterator3 first2,
822 Iterator4 last2) {
823 return ToddCoxeterImpl::contains_no_checks(detail::citow(this, first1),
824 detail::citow(this, last1),
825 detail::citow(this, first2),
826 detail::citow(this, last2));
827 }
828
846 template <typename Iterator1,
847 typename Iterator2,
848 typename Iterator3,
849 typename Iterator4>
850 bool contains(Iterator1 first1,
851 Iterator2 last1,
852 Iterator3 first2,
853 Iterator4 last2);
854
856 // ToddCoxeter - interface requirements - reduce
858
880 template <typename OutputIterator,
881 typename InputIterator1,
882 typename InputIterator2>
883 OutputIterator reduce_no_run_no_checks(OutputIterator d_first,
884 InputIterator1 first,
885 InputIterator2 last) const {
886 return ToddCoxeterImpl::reduce_no_run_no_checks(
887 detail::itow(this, d_first),
888 detail::citow(this, first),
889 detail::citow(this, last))
890 .get();
891 }
892
913 template <typename OutputIterator,
914 typename InputIterator1,
915 typename InputIterator2>
916 OutputIterator reduce_no_run(OutputIterator d_first,
917 InputIterator1 first,
918 InputIterator2 last) const {
919 return detail::CongruenceCommon::reduce_no_run<ToddCoxeter>(
920 d_first, first, last);
921 }
922
946 template <typename OutputIterator,
947 typename InputIterator1,
948 typename InputIterator2>
949 OutputIterator reduce_no_checks(OutputIterator d_first,
950 InputIterator1 first,
951 InputIterator2 last) {
952 return ToddCoxeterImpl::reduce_no_checks(detail::itow(this, d_first),
953 detail::citow(this, first),
954 detail::citow(this, last))
955 .get();
956 }
957
981 template <typename OutputIterator,
982 typename InputIterator1,
983 typename InputIterator2>
984 OutputIterator reduce(OutputIterator d_first,
985 InputIterator1 first,
986 InputIterator2 last) {
987 // Call detail::CongruenceCommon version so that we perform bound checks
988 // in ToddCoxeter and not ToddCoxeterImpl
989 return detail::CongruenceCommon::reduce<ToddCoxeter>(
990 d_first, first, last);
991 }
992
994 // ToddCoxeterImpl - word -> index
996
1011
1036 // NOTE THAT: the graph contains one more node than there are element if
1037 // the underlying presentation does not contain the empty word
1038 template <typename Iterator1, typename Iterator2>
1040 Iterator2 last) const {
1041 return ToddCoxeterImpl::current_index_of_no_checks(
1042 detail::citow(this, first), detail::citow(this, last));
1043 }
1044
1068 template <typename Iterator1, typename Iterator2>
1069 index_type current_index_of(Iterator1 first, Iterator2 last) const {
1071 return current_index_of_no_checks(first, last);
1072 }
1073
1098 template <typename Iterator1, typename Iterator2>
1099 index_type index_of_no_checks(Iterator1 first, Iterator2 last) {
1100 return ToddCoxeterImpl::index_of_no_checks(detail::citow(this, first),
1101 detail::citow(this, last));
1102 }
1103
1128 template <typename Iterator1, typename Iterator2>
1129 index_type index_of(Iterator1 first, Iterator2 last) {
1131 return index_of_no_checks(first, last);
1132 }
1133
1135
1137 // ToddCoxeter - index -> word
1139
1156
1181 // NOTE THAT: the graph contains one more node than there are element if
1182 // the underlying presentation does not contain the empty word
1183 template <typename OutputIterator>
1184 OutputIterator current_word_of_no_checks(OutputIterator d_first,
1185 index_type i) const {
1186 return ToddCoxeterImpl::current_word_of_no_checks(
1187 detail::itow(this, d_first), i)
1188 .get();
1189 }
1190
1213 template <typename OutputIterator>
1214 OutputIterator current_word_of(OutputIterator d_first, index_type i) const {
1215 return ToddCoxeterImpl::current_word_of(detail::itow(this, d_first), i)
1216 .get();
1217 }
1218
1241 template <typename Iterator>
1242 Iterator word_of_no_checks(Iterator d_first, index_type i) {
1243 return ToddCoxeterImpl::word_of_no_checks(detail::itow(this, d_first), i)
1244 .get();
1245 }
1246
1270 template <typename Iterator>
1271 Iterator word_of(Iterator d_first, index_type i) {
1272 return ToddCoxeterImpl::word_of(detail::itow(this, d_first), i).get();
1273 }
1274
1276 }; // class ToddCoxeter
1277
1279 //
1286 template <typename Word>
1287 ToddCoxeter(congruence_kind, Presentation<Word> const&) -> ToddCoxeter<Word>;
1288
1290 //
1297 template <typename Word>
1299
1301 //
1308 template <typename Word>
1309 ToddCoxeter(congruence_kind, ToddCoxeter<Word> const&) -> ToddCoxeter<Word>;
1310
1312 //
1319 template <typename Node>
1321 -> ToddCoxeter<word_type>;
1322
1324 //
1331 template <typename Node>
1332 ToddCoxeter(congruence_kind, WordGraph<Node>&&) -> ToddCoxeter<word_type>;
1333
1335 //
1342 template <typename Word>
1343 ToddCoxeter(ToddCoxeter<Word> const&) -> ToddCoxeter<Word>;
1344
1346 //
1353 template <typename Word>
1354 ToddCoxeter(ToddCoxeter<Word>&&) -> ToddCoxeter<Word>;
1355
1372 template <typename Word>
1373 std::string to_human_readable_repr(ToddCoxeter<Word> const& tc);
1374} // namespace libsemigroups
1375
1376#include "todd-coxeter-class.tpp"
1377#endif // LIBSEMIGROUPS_TODD_COXETER_CLASS_HPP_
For an implementation of presentations for semigroups or monoids.
Definition presentation.hpp:103
Class for representing word graphs.
Definition word-graph.hpp:83
std::string to_human_readable_repr(Action< Element, Point, Func, Traits, LeftOrRight > const &action)
Return a human readable representation of an Action object.
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:1214
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:1242
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:1271
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:1184
ToddCoxeter(congruence_kind knd, Presentation< Word > &&p)
Construct from congruence_kind and Presentation.
Definition todd-coxeter-class.hpp:465
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:625
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:564
ToddCoxeter(congruence_kind knd, Presentation< Word > const &p)
Construct from congruence_kind and Presentation.
Definition todd-coxeter-class.hpp:487
ToddCoxeter(ToddCoxeter &&)=default
ToddCoxeter & init(congruence_kind knd, Presentation< Word > const &p)
Re-initialize a ToddCoxeter instance.
Definition todd-coxeter-class.hpp:493
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:533
ToddCoxeter(congruence_kind knd, ToddCoxeter const &tc)
Construct from congruence_kind and ToddCoxeter.
Definition todd-coxeter-class.hpp:513
OutputIterator reduce_no_checks(OutputIterator d_first, InputIterator1 first, InputIterator2 last)
Reduce a word with no checks.
Definition todd-coxeter-class.hpp:949
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:819
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:788
OutputIterator reduce(OutputIterator d_first, InputIterator1 first, InputIterator2 last)
Reduce a word.
Definition todd-coxeter-class.hpp:984
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:715
std::vector< Word > const & generating_pairs() const noexcept
Get the generating pairs of the congruence.
Definition todd-coxeter-class.hpp:643
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:753
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:663
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:883
OutputIterator reduce_no_run(OutputIterator d_first, InputIterator1 first, InputIterator2 last) const
Reduce a word with no enumeration.
Definition todd-coxeter-class.hpp:916
typename detail::ToddCoxeterImpl::word_graph_type word_graph_type
The type of the underlying WordGraph.
Definition todd-coxeter-class.hpp:385
typename detail::ToddCoxeterImpl::node_type node_type
The type of the nodes in the word graph.
Definition todd-coxeter-class.hpp:377
typename detail::ToddCoxeterImpl::index_type index_type
The type of the index of a class.
Definition todd-coxeter-class.hpp:402
typename detail::ToddCoxeterImpl::label_type label_type
The type of the edge-labels in the word graph.
Definition todd-coxeter-class.hpp:410
Word native_word_type
Type of the letters in the relations of the presentation stored in a ToddCoxeter instance.
Definition todd-coxeter-class.hpp:369
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:1069
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:1039
index_type index_of_no_checks(Iterator1 first, Iterator2 last)
Returns the index of the class containing a word.
Definition todd-coxeter-class.hpp:1099
index_type index_of(Iterator1 first, Iterator2 last)
Returns the index of the class containing a word.
Definition todd-coxeter-class.hpp:1129
tril
Enum to indicate true, false or not currently knowable.
Definition types.hpp:54
congruence_kind
Enum to indicate the sided-ness of a congruence.
Definition types.hpp:67
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:157
lookahead_style
Enum class for specifying the style of any lookahead performed.
Definition todd-coxeter-class.hpp:243
lookahead_extent
Enum class for specifying the extent of any lookahead performed.
Definition todd-coxeter-class.hpp:226
@ partial
Definition todd-coxeter-class.hpp:234
@ full
Definition todd-coxeter-class.hpp:230
strategy
Enum class containing various strategies.
Definition todd-coxeter-class.hpp:168
@ CR
Definition todd-coxeter-class.hpp:187
@ Cr
Definition todd-coxeter-class.hpp:206
@ hlt
Definition todd-coxeter-class.hpp:172
@ felsch
Definition todd-coxeter-class.hpp:177
@ Rc
Definition todd-coxeter-class.hpp:217
@ R_over_C
Definition todd-coxeter-class.hpp:196
def_version
Values for specifying how to handle edge definitions.
Definition todd-coxeter-class.hpp:320
@ two
Version 2 definition processing.
Definition todd-coxeter-class.hpp:324
@ one
Version 1 definition processing.
Definition todd-coxeter-class.hpp:322
def_policy
Enum class containing values for specifying how to handle edge definitions.
Definition todd-coxeter-class.hpp:274
@ discard_all_if_no_space
Definition todd-coxeter-class.hpp:291
@ unlimited
Definition todd-coxeter-class.hpp:294
@ no_stack_if_no_space
Definition todd-coxeter-class.hpp:277
@ purge_from_top
Definition todd-coxeter-class.hpp:282
@ purge_all
Definition todd-coxeter-class.hpp:287