libsemigroups  v3.3.0
C++ library for semigroups and monoids
Loading...
Searching...
No Matches
hpcombi.hpp
1//
2// libsemigroups - C++ library for semigroups and monoids
3// Copyright (C) 2019-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// TODO check the doc, return values and parameters are missing in some cases.
20// TODO constexpr where possible
21
22// This file contains declarations of specializations of the class adapters in
23// adapters.hpp for the element types in HPCombi.
24
25#ifndef LIBSEMIGROUPS_HPCOMBI_HPP_
26#define LIBSEMIGROUPS_HPCOMBI_HPP_
27
28// Must include config.hpp so that LIBSEMIGROUPS_HPCOMBI_ENABLED
29// is defined, if so specified at during configure.
30#include "config.hpp" // for LIBSEMIGROUPS_HPCOMBI_ENABLED
31
32// TODO fix the warnings in HPCombi that these suppressions are hear to
33// silence.
34#if defined(LIBSEMIGROUPS_HPCOMBI_ENABLED)
35#if defined(__GNUC__)
36#pragma GCC diagnostic push
37#pragma GCC diagnostic ignored "-Wpedantic"
38#pragma GCC diagnostic ignored "-Wswitch-default"
39#endif
40#include "hpcombi/hpcombi.hpp" // for `HPCombi::Perm16`, ...
41#if defined(__GNUC__)
42#pragma GCC diagnostic pop
43#endif
44
45#include <algorithm> // for max_element
46#include <cstddef> // for size_t
47#include <cstdint> // for uint8_t
48#include <initializer_list> // for begin, end, initializer_list
49#include <numeric> // for iota
50#include <string_view> // for basic_string_view
51#include <type_traits> // for is_base_of_v, enable_if_t, is_int...
52#include <unordered_map> // for swap, unordered_map
53#include <utility> // for forward, move
54#include <vector> // for vector
55
56#include "adapters.hpp" // for Complexity, Degree, ...
57#include "debug.hpp" // for LIBSEMIGROUPS_ASSERT
58#include "exception.hpp" // for LIBSEMIGROUPS_EXCEPTION
59#include "is-transf.hpp" // for throw_if_not_ptransf etc
60#include "types.hpp" // for enable_if_is_same
61#endif
62
63#if defined(LIBSEMIGROUPS_HPCOMBI_ENABLED) \
64 || defined(LIBSEMIGROUPS_PARSED_BY_DOXYGEN)
65namespace libsemigroups {
66
71
81
93 template <typename Thing>
94 struct Complexity<
95 Thing,
96 std::enable_if_t<std::is_base_of_v<HPCombi::PTransf16, Thing>>> {
109 constexpr size_t operator()(Thing const& x) const noexcept {
110 (void) x;
111 return 0;
112 }
113 };
114
125 template <typename Thing>
126 struct Degree<
127 Thing,
128 std::enable_if_t<std::is_base_of_v<HPCombi::PTransf16, Thing>>> {
139 constexpr size_t operator()(Thing const& x) const noexcept {
140 (void) x;
141 return 16;
142 }
143 };
144
155 template <typename Thing>
156 struct One<Thing,
157 std::enable_if_t<std::is_base_of_v<HPCombi::PTransf16, Thing>>> {
168 Thing operator()(size_t n = 0) const noexcept {
169 (void) n;
170 return Thing::one();
171 }
172
183 Thing operator()(Thing const& x) const noexcept {
184 (void) x;
185 return Thing::one();
186 }
187 };
188
203 template <typename Thing>
204 struct Product<
205 Thing,
206 std::enable_if_t<std::is_base_of_v<HPCombi::PTransf16, Thing>>> {
218 void operator()(Thing& xy,
219 Thing const& x,
220 Thing const& y,
221 size_t deg = 0) const noexcept {
222 (void) deg;
223 xy = y * x;
224 }
225 };
226
237 template <typename Thing>
238 struct Swap<Thing,
239 std::enable_if_t<std::is_base_of_v<HPCombi::PTransf16, Thing>>> {
249 void operator()(Thing& x, Thing& y) const noexcept {
250 std::swap(x, y);
251 }
252 };
253
265 template <typename Thing>
267 Thing,
268 std::enable_if_t<std::is_base_of_v<HPCombi::PTransf16, Thing>>> {
278 inline constexpr void operator()(Thing const& x, size_t n) const noexcept {
279 (void) x;
280 (void) n;
281 }
282 };
283
291 template <>
292 struct Inverse<HPCombi::Perm16> {
303 HPCombi::Perm16 operator()(HPCombi::Perm16 const& x) const noexcept {
304 return x.inverse();
305 }
306 };
307
318 template <typename Int>
319 struct ImageRightAction<HPCombi::Perm16,
320 Int,
321 std::enable_if_t<std::is_integral_v<Int>>> {
335 void operator()(Int& res,
336 Int const& pt,
337 HPCombi::Perm16 const& x) const noexcept {
338 LIBSEMIGROUPS_ASSERT(pt < 16);
339 res = static_cast<Int>(x[pt]);
340 }
341
356 Int operator()(Int const& pt, HPCombi::Perm16 const& x) const noexcept {
357 LIBSEMIGROUPS_ASSERT(pt < 16);
358 return x[pt];
359 }
360 };
361
370 template <>
371 struct ImageRightAction<HPCombi::PPerm16, HPCombi::PPerm16> {
383 void operator()(HPCombi::PPerm16& res,
384 HPCombi::PPerm16 const& pt,
385 HPCombi::PPerm16 const& x) const noexcept {
386 res = (x * pt).left_one();
387 }
388 };
389
398 template <>
399 struct ImageLeftAction<HPCombi::PPerm16, HPCombi::PPerm16> {
411 void operator()(HPCombi::PPerm16& res,
412 HPCombi::PPerm16 const& pt,
413 HPCombi::PPerm16 const& x) const noexcept {
414 res = (pt * x).right_one();
415 }
416 };
417
426 template <>
427 struct Complexity<HPCombi::BMat8> {
440 constexpr inline size_t operator()(HPCombi::BMat8 const& x) const noexcept {
441 (void) x;
442 return 0;
443 }
444 };
445
453 template <>
454 struct Degree<HPCombi::BMat8> {
465 constexpr inline size_t operator()(HPCombi::BMat8 const& x) const noexcept {
466 (void) x;
467 return 8;
468 }
469 };
470
480 template <>
481 struct IncreaseDegree<HPCombi::BMat8> {
491 inline void operator()(HPCombi::BMat8 const& x, size_t n) const noexcept {
492 (void) x;
493 (void) n;
494 }
495 };
496
504 template <>
505 struct One<HPCombi::BMat8> {
516 inline HPCombi::BMat8 operator()(size_t n = 0) const noexcept {
517 (void) n;
518 return HPCombi::BMat8::one();
519 }
520
531 inline HPCombi::BMat8 operator()(HPCombi::BMat8 const& x) const noexcept {
532 (void) x;
533 return x.one();
534 }
535 };
536
544 template <>
545 struct Product<HPCombi::BMat8> {
557 inline void operator()(HPCombi::BMat8& xy,
558 HPCombi::BMat8 const& x,
559 HPCombi::BMat8 const& y,
560 size_t deg = 0) const noexcept {
561 (void) deg;
562 xy = x * y;
563 }
564 };
565
575 // HERE in doc review
576 template <>
577 struct ImageRightAction<HPCombi::BMat8, HPCombi::BMat8> {
582 void operator()(HPCombi::BMat8& res,
583 HPCombi::BMat8 const& pt,
584 HPCombi::BMat8 const& x) const noexcept {
585 res = (pt * x).row_space_basis();
586 }
587 };
588
598 template <>
599 struct ImageLeftAction<HPCombi::BMat8, HPCombi::BMat8> {
604 void operator()(HPCombi::BMat8& res,
605 HPCombi::BMat8 pt,
606 HPCombi::BMat8 x) const noexcept {
607 res = (x * pt).col_space_basis();
608 }
609 };
610
618 template <>
619 struct Inverse<HPCombi::BMat8> {
623 inline HPCombi::BMat8 operator()(HPCombi::BMat8 const& x) const noexcept {
624 // The following assertion fails because x.one() is the 8x8 identity but
625 // x * x.transpose() is not always.
626 // LIBSEMIGROUPS_ASSERT(x * x.transpose() == x.one());
627 return x.transpose();
628 }
629 };
630
632 // Konieczny adapters - `HPCombi::BMat8`
634
641 template <>
642 struct LambdaValue<HPCombi::BMat8> {
648 using type = HPCombi::BMat8;
649 };
650
657 template <>
658 struct RhoValue<HPCombi::BMat8> {
664 using type = HPCombi::BMat8;
665 };
666
672 template <>
673 struct Lambda<HPCombi::BMat8, HPCombi::BMat8> {
679 void operator()(HPCombi::BMat8& res,
680 HPCombi::BMat8 const& x) const noexcept {
681 res = x.row_space_basis();
682 }
683 };
684
691 template <>
692 struct Rho<HPCombi::BMat8, HPCombi::BMat8> {
698 void operator()(HPCombi::BMat8& res,
699 HPCombi::BMat8 const& x) const noexcept {
700 res = x.col_space_basis();
701 }
702 };
703
710 template <>
711 struct Rank<HPCombi::BMat8> {
716 inline size_t operator()(HPCombi::BMat8 const& x) const noexcept {
717 return x.row_space_size();
718 }
719 };
720
722 // Konieczny adapters - `HPCombi::PPerm16`
724
731 template <>
732 struct LambdaValue<HPCombi::PPerm16> {
737 using type = HPCombi::PPerm16;
738 };
739
746 template <>
747 struct RhoValue<HPCombi::PPerm16> {
752 using type = HPCombi::PPerm16;
753 };
754
761 template <>
762 struct Lambda<HPCombi::PPerm16, HPCombi::PPerm16> {
769 void operator()(HPCombi::PPerm16& res,
770 HPCombi::PPerm16 const& x) const noexcept {
771 res = x.left_one();
772 }
773 };
774
780 template <>
781 struct Rho<HPCombi::PPerm16, HPCombi::PPerm16> {
785 void operator()(HPCombi::PPerm16& res,
786 HPCombi::PPerm16 const& x) const noexcept {
787 res = x.right_one();
788 }
789 };
790
792 // Konieczny adapters - Transf16
794
803 template <>
804 struct ImageRightAction<HPCombi::Transf16, HPCombi::PTransf16> {
809 void operator()(HPCombi::PTransf16& res,
810 HPCombi::Transf16 const& x,
811 HPCombi::PTransf16 const& y) const noexcept {
812 res = (y * static_cast<HPCombi::PTransf16>(static_cast<HPCombi::epu8>(x)))
813 .left_one();
814 }
815 };
816
825 template <>
826 struct ImageLeftAction<HPCombi::Transf16, HPCombi::Vect16> {
831 void operator()(HPCombi::Vect16& res,
832 HPCombi::Transf16 const& x,
833 HPCombi::Vect16 const& y) const noexcept;
834 };
835
843 template <>
844 struct LambdaValue<HPCombi::Transf16> {
849 using type = HPCombi::PTransf16;
850 };
851
858 template <>
859 struct RhoValue<HPCombi::Transf16> {
864 using type = HPCombi::Vect16;
865 };
866
874 template <>
875 struct Lambda<HPCombi::Transf16, HPCombi::PTransf16> {
883 void operator()(HPCombi::PTransf16& res,
884 HPCombi::Transf16 const& x) const noexcept {
885 res = x.left_one();
886 }
887 };
888
896 template <>
897 struct Rho<HPCombi::Transf16, HPCombi::Vect16> {
904 void operator()(HPCombi::Vect16& res,
905 HPCombi::Transf16 const& x) const noexcept;
906 };
907
909 // Konieczny adapters - PTransf16
911
920 template <>
921 struct ImageRightAction<HPCombi::PTransf16, HPCombi::PTransf16> {
926 void operator()(HPCombi::PTransf16& res,
927 HPCombi::PTransf16 const& pt,
928 HPCombi::PTransf16 const& x) const noexcept {
929 // Note that this is the opposite of what's stated above because
930 // composition is the wrong way around in HPCombi
931 res = (x * pt).left_one();
932 }
933 };
934
943 template <>
944 struct ImageLeftAction<HPCombi::PTransf16, HPCombi::Vect16> {
949 // We cannot use "right_one" here because in HPCombi, right_one for a
950 // partial transformation is not an L-class invariant unfortunately.
951 void operator()(HPCombi::Vect16& res,
952 HPCombi::PTransf16 const& x,
953 HPCombi::Vect16 const& y) const noexcept;
954 };
955
963 template <>
964 struct LambdaValue<HPCombi::PTransf16> {
969 using type = HPCombi::PTransf16;
970 };
971
978 template <>
979 struct RhoValue<HPCombi::PTransf16> {
984 using type = HPCombi::Vect16;
985 };
986
994 template <>
995 struct Lambda<HPCombi::PTransf16, HPCombi::PTransf16> {
1003 void operator()(HPCombi::PTransf16& res,
1004 HPCombi::PTransf16 const& x) const noexcept {
1005 // This is the opposite of what might be expected because multiplication
1006 // is the wrong way around in HPCombi
1007 res = x.left_one();
1008 }
1009 };
1010
1018 template <>
1019 struct Rho<HPCombi::PTransf16, HPCombi::Vect16> {
1026 void operator()(HPCombi::Vect16& res,
1027 HPCombi::PTransf16 const& x) const noexcept;
1028 };
1029
1031 // Konieczny adapters - generic
1033
1039 template <typename T>
1040 struct Rank<T,
1041 std::enable_if_t<std::is_base_of_v<HPCombi::PTransf16, T>,
1042 RankState<T>>> {
1055 inline size_t operator()(T const& x) const noexcept {
1056 return x.rank();
1057 }
1058 };
1059
1061
1067
1089#ifndef LIBSEMIGROUPS_PARSED_BY_DOXYGEN
1090 template <typename Return, typename Container>
1092 make(Container&& cont);
1093#else
1094 template <typename Container>
1095 [[nodiscard]] HPCombi::PTransf16 make<HPCombi::PTransf16>(Container&& cont);
1096#endif
1097
1119#ifndef LIBSEMIGROUPS_PARSED_BY_DOXYGEN
1120 template <typename Return, typename Container>
1122 make(Container&& cont);
1123#else
1124 template <typename Container>
1125 [[nodiscard]] HPCombi::Transf16 make<HPCombi::Transf16>(Container&& cont);
1126#endif
1127
1149#ifndef LIBSEMIGROUPS_PARSED_BY_DOXYGEN
1150 template <typename Return, typename Container>
1152 make(Container&& cont);
1153#else
1154 template <typename Container>
1155 [[nodiscard]] HPCombi::Perm16 make<HPCombi::Perm16>(Container&& cont);
1156#endif
1157
1179#ifndef LIBSEMIGROUPS_PARSED_BY_DOXYGEN
1180 template <typename Return, typename Container>
1182 make(Container&& cont);
1183#else
1184 template <typename Container>
1185 [[nodiscard]] HPCombi::PPerm16 make<HPCombi::PPerm16>(Container&& cont);
1186#endif
1187
1209#ifndef LIBSEMIGROUPS_PARSED_BY_DOXYGEN
1210 template <typename Return>
1212 make(std::vector<uint8_t> const& dom,
1213 std::vector<uint8_t> const& ran,
1214 size_t deg = 16);
1215#else
1216 [[nodiscard]] HPCombi::PTransf16
1218 std::vector<uint8_t> const& ran,
1219 size_t deg = 16);
1220#endif
1221
1244#ifndef LIBSEMIGROUPS_PARSED_BY_DOXYGEN
1245 template <typename Return>
1247 make(std::vector<uint8_t> const& dom,
1248 std::vector<uint8_t> const& ran,
1249 size_t deg = 16);
1250#else
1251 [[nodiscard]] HPCombi::PPerm16
1253 std::vector<uint8_t> const& ran,
1254 size_t deg = 16);
1255#endif
1256
1280#ifndef LIBSEMIGROUPS_PARSED_BY_DOXYGEN
1281 template <typename Return, typename Int>
1285 size_t M) {
1286 return make<Return>(std::vector<uint8_t>(dom.begin(), dom.end()),
1287 std::vector<uint8_t>(ran.begin(), ran.end()),
1288 M);
1289 }
1290#else
1291 template <typename Int>
1292 [[nodiscard]] HPCombi::PPerm16
1294 std::initializer_list<Int> const& ran,
1295 size_t M = 16);
1296#endif
1297
1298#ifndef LIBSEMIGROUPS_PARSED_BY_DOXYGEN
1299 // We omit the doc for this version because the return type is awful and ruins
1300 // the rest of the doc in the table at the top of the page.
1322 template <typename Return>
1323 [[nodiscard]] std::enable_if_t<std::is_base_of_v<HPCombi::PTransf16, Return>,
1324 Return>
1327 }
1328#endif
1329
1330} // namespace libsemigroups
1331
1332#include "hpcombi.tpp"
1333
1334#endif // LIBSEMIGROUPS_HPCOMBI_ENABLED
1335#endif // LIBSEMIGROUPS_HPCOMBI_HPP_
Fast boolean matrices of dimension up to 8 x 8.
Definition bmat8.hpp:74
enable_if_is_same< Return, Blocks > make(Container const &cont)
Check the arguments, construct a Blocks object, and check it.
Definition bipart.hpp:856
HPCombi::Transf16 make< HPCombi::Transf16 >(Container &&cont)
Construct a HPCombi::Transf16 from universal reference and check.
HPCombi::Perm16 make< HPCombi::Perm16 >(Container &&cont)
Construct a HPCombi::Perm16 from universal reference and check.
HPCombi::PTransf16 make< HPCombi::PTransf16 >(Container &&cont)
Construct a HPCombi::PTransf16 from universal reference and check.
HPCombi::PPerm16 make< HPCombi::PPerm16 >(Container &&cont)
Construct a HPCombi::PPerm16 from container and check.
PPerm< N, Scalar > left_one(PPerm< N, Scalar > const &f)
Returns the left one of a partial perm.
PPerm< N, Scalar > right_one(PPerm< N, Scalar > const &f)
Returns the right one of a partial perm.
std::enable_if_t< std::is_same_v< Given, Expected >, Expected > enable_if_is_same
Alias equal to the second template parameter if both template parameters are equal.
Definition types.hpp:48
T move(T... args)
Namespace for everything in the libsemigroups library.
Definition action.hpp:44
constexpr size_t operator()(HPCombi::BMat8 const &x) const noexcept
Returns 0.
Definition hpcombi.hpp:440
constexpr size_t operator()(Thing const &x) const noexcept
Returns 0.
Definition hpcombi.hpp:109
Adapter for the complexity of multiplication.
Definition adapters.hpp:128
constexpr size_t operator()(HPCombi::BMat8 const &x) const noexcept
Returns 8.
Definition hpcombi.hpp:465
constexpr size_t operator()(Thing const &x) const noexcept
Returns 16.
Definition hpcombi.hpp:139
Adapter for the degree of an element.
Definition adapters.hpp:166
void operator()(HPCombi::BMat8 &res, HPCombi::BMat8 pt, HPCombi::BMat8 x) const noexcept
Stores the image of pt under the left action of x.
Definition hpcombi.hpp:604
void operator()(HPCombi::PPerm16 &res, HPCombi::PPerm16 const &pt, HPCombi::PPerm16 const &x) const noexcept
Stores the idempotent in res.
Definition hpcombi.hpp:411
void operator()(HPCombi::Vect16 &res, HPCombi::PTransf16 const &x, HPCombi::Vect16 const &y) const noexcept
Store image of x under the left action of y.
void operator()(HPCombi::Vect16 &res, HPCombi::Transf16 const &x, HPCombi::Vect16 const &y) const noexcept
Store image of x under the left action of y.
Adapter for the value of a left action.
Definition adapters.hpp:357
void operator()(HPCombi::BMat8 &res, HPCombi::BMat8 const &pt, HPCombi::BMat8 const &x) const noexcept
Store the image of pt under the right action of x.
Definition hpcombi.hpp:582
void operator()(HPCombi::PPerm16 &res, HPCombi::PPerm16 const &pt, HPCombi::PPerm16 const &x) const noexcept
Stores the idempotent in res.
Definition hpcombi.hpp:383
void operator()(HPCombi::PTransf16 &res, HPCombi::PTransf16 const &pt, HPCombi::PTransf16 const &x) const noexcept
Store the image of x under the right action of y.
Definition hpcombi.hpp:926
void operator()(Int &res, Int const &pt, HPCombi::Perm16 const &x) const noexcept
Stores the image of pt under p.
Definition hpcombi.hpp:335
Int operator()(Int const &pt, HPCombi::Perm16 const &x) const noexcept
Stores the image of pt under p.
Definition hpcombi.hpp:356
void operator()(HPCombi::PTransf16 &res, HPCombi::Transf16 const &x, HPCombi::PTransf16 const &y) const noexcept
Store the image of x under the right action of y.
Definition hpcombi.hpp:809
Adapter for the value of a right action.
Definition adapters.hpp:399
void operator()(HPCombi::BMat8 const &x, size_t n) const noexcept
Does nothing.
Definition hpcombi.hpp:491
constexpr void operator()(Thing const &x, size_t n) const noexcept
Does nothing.
Definition hpcombi.hpp:278
Adapter for increasing the degree of an element.
Definition adapters.hpp:206
HPCombi::BMat8 operator()(HPCombi::BMat8 const &x) const noexcept
Returns the group inverse of x.
Definition hpcombi.hpp:623
HPCombi::Perm16 operator()(HPCombi::Perm16 const &x) const noexcept
Returns the inverse of x.
Definition hpcombi.hpp:303
Adapter for the inverse of an element.
Definition adapters.hpp:326
void operator()(HPCombi::BMat8 &res, HPCombi::BMat8 const &x) const noexcept
Store the lambda value of x as used in the Konieczny algorithm.
Definition hpcombi.hpp:679
void operator()(HPCombi::PPerm16 &res, HPCombi::PPerm16 const &x) const noexcept
Definition hpcombi.hpp:769
void operator()(HPCombi::PTransf16 &res, HPCombi::PTransf16 const &x) const noexcept
Stores the identity function on the image of x.
Definition hpcombi.hpp:1003
void operator()(HPCombi::PTransf16 &res, HPCombi::Transf16 const &x) const noexcept
Stores the identity function on the image of x.
Definition hpcombi.hpp:883
Adapter for the action on LambdaValue's.
Definition adapters.hpp:840
HPCombi::BMat8 type
The type of Lambda value.
Definition hpcombi.hpp:648
HPCombi::PPerm16 type
The type of Lambda values.
Definition hpcombi.hpp:737
HPCombi::PTransf16 type
The type of Lambda values.
Definition hpcombi.hpp:969
HPCombi::PTransf16 type
The type of Lambda values.
Definition hpcombi.hpp:849
Adapter for lambda functions.
Definition adapters.hpp:800
HPCombi::BMat8 operator()(HPCombi::BMat8 const &x) const noexcept
Returns the identity HPCombi::BMat8.
Definition hpcombi.hpp:531
HPCombi::BMat8 operator()(size_t n=0) const noexcept
Returns the identity HPCombi::BMat8.
Definition hpcombi.hpp:516
Thing operator()(size_t n=0) const noexcept
Returns the identity for a derived class of HPCombi::PTransf16.
Definition hpcombi.hpp:168
Thing operator()(Thing const &x) const noexcept
Returns the identity for a derived class of HPCombi::PTransf16.
Definition hpcombi.hpp:183
Adapter for the identity element of the given type.
Definition adapters.hpp:253
void operator()(HPCombi::BMat8 &xy, HPCombi::BMat8 const &x, HPCombi::BMat8 const &y, size_t deg=0) const noexcept
Modifies xy in-place to be the product of x and y.
Definition hpcombi.hpp:557
void operator()(Thing &xy, Thing const &x, Thing const &y, size_t deg=0) const noexcept
Modifies xy in-place to be the product of x and y.
Definition hpcombi.hpp:218
Adapter for the product of two elements.
Definition adapters.hpp:291
size_t operator()(HPCombi::BMat8 const &x) const noexcept
Returns the rank of x as used in the Konieczny algorithm.
Definition hpcombi.hpp:716
size_t operator()(T const &x) const noexcept
Returns the rank of x as used in the Konieczny algorithm.
Definition hpcombi.hpp:1055
Adapter for calculating ranks.
Definition adapters.hpp:937
void operator()(HPCombi::BMat8 &res, HPCombi::BMat8 const &x) const noexcept
Store the rho value of x as used in the Konieczny algorithm.
Definition hpcombi.hpp:698
void operator()(HPCombi::PPerm16 &res, HPCombi::PPerm16 const &x) const noexcept
Definition hpcombi.hpp:785
void operator()(HPCombi::Vect16 &res, HPCombi::PTransf16 const &x) const noexcept
Stores the kernel of x.
void operator()(HPCombi::Vect16 &res, HPCombi::Transf16 const &x) const noexcept
Stores the kernel of x.
Adapter for the action on RhoValue's.
Definition adapters.hpp:861
HPCombi::BMat8 type
The type of Rho values for HPCombi::BMat8.
Definition hpcombi.hpp:664
HPCombi::PPerm16 type
The type of Rho values.
Definition hpcombi.hpp:752
HPCombi::Vect16 type
The type of Rho value for HPCombi::PTransf16.
Definition hpcombi.hpp:984
HPCombi::Vect16 type
The type of Rho value for HPCombi::Transf16.
Definition hpcombi.hpp:864
Adapter for rho functions.
Definition adapters.hpp:819
void operator()(Thing &x, Thing &y) const noexcept
Swap x and y.
Definition hpcombi.hpp:249
Adapter for swapping.
Definition adapters.hpp:673
T swap(T... args)