libsemigroups  v3.0.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// This file contains specializations of the class adapters in adapters.hpp
20// for the element types in HPCombi.
21
22#ifndef LIBSEMIGROUPS_HPCOMBI_HPP_
23#define LIBSEMIGROUPS_HPCOMBI_HPP_
24
25// Must include config.hpp so that LIBSEMIGROUPS_HPCOMBI_ENABLED
26// is defined, if so specified at during configure.
27#include "config.hpp" // for LIBSEMIGROUPS_HPCOMBI_ENABLED
28
29#if defined(LIBSEMIGROUPS_HPCOMBI_ENABLED)
30#if defined(__GNUC__)
31#pragma GCC diagnostic push
32#pragma GCC diagnostic ignored "-Wpedantic"
33#pragma GCC diagnostic ignored "-Wswitch-default"
34#endif
35#include "hpcombi/hpcombi.hpp" // for HPCombi::Perm16, ...
36#if defined(__GNUC__)
37#pragma GCC diagnostic pop
38#endif
39
40#include <type_traits> // for decay_t etc
41#include <unordered_map> // for unordered_map
42
43#include "adapters.hpp" // for Complexity, Degree, ...
44#include "constants.hpp" // for UNDEFINED
45#include "debug.hpp" // for LIBSEMIGROUPS_ASSERT
46#include "exception.hpp" // for LIBSEMIGROUPS_EXCEPTION
47#include "types.hpp" // for enable_if_is_same
48#else
49#include <type_traits> // for decay_t etc
50#include <unordered_map> // for unordered_map
51
52#include "exception.hpp" // for LIBSEMIGROUPS_EXCEPTION
53#endif
54
55namespace libsemigroups {
56 namespace detail {
58 // TODO(1) to tpp
59 template <typename Iterator>
60 void throw_if_duplicates(
61 Iterator first,
62 Iterator last,
63 std::unordered_map<std::decay_t<decltype(*first)>, size_t>& seen) {
64 seen.clear();
65 for (auto it = first; it != last; ++it) {
66 if (*it != UNDEFINED) {
67 auto [pos, inserted] = seen.emplace(*it, seen.size());
68 if (!inserted) {
70 "duplicate value, found {} in position {}, first "
71 "occurrence in position {}",
72 *it,
73 std::distance(first, it),
74 pos->second);
75 }
76 }
77 }
78 }
79
81 template <typename Iterator>
82 void throw_if_duplicates(Iterator first, Iterator last) {
83 std::unordered_map<std::decay_t<decltype(*first)>, size_t> seen;
84 throw_if_duplicates(first, last, seen);
85 }
86 } // namespace detail
87
88#if defined(LIBSEMIGROUPS_HPCOMBI_ENABLED) \
89 || defined(LIBSEMIGROUPS_PARSED_BY_DOXYGEN)
101
111 template <typename TPTransf16Subclass>
112 struct Complexity<TPTransf16Subclass,
113 std::enable_if_t<std::is_base_of_v<HPCombi::PTransf16,
114 TPTransf16Subclass>>> {
121 constexpr size_t operator()(TPTransf16Subclass const&) const noexcept {
122 return 0;
123 }
124 };
125
134 template <typename TPTransf16Subclass>
135 struct Degree<TPTransf16Subclass,
136 std::enable_if_t<std::is_base_of_v<HPCombi::PTransf16,
137 TPTransf16Subclass>>> {
144 constexpr size_t operator()(TPTransf16Subclass const&) const noexcept {
145 return 16;
146 }
147 };
148
157 template <typename TPTransf16Subclass>
158 struct One<TPTransf16Subclass,
159 std::enable_if_t<
160 std::is_base_of_v<HPCombi::PTransf16, TPTransf16Subclass>>> {
167 TPTransf16Subclass operator()(size_t = 0) const noexcept {
168 return TPTransf16Subclass::one();
169 }
170
176 TPTransf16Subclass operator()(TPTransf16Subclass const&) const noexcept {
177 return TPTransf16Subclass::one();
178 }
179 };
180
192 template <typename TPTransf16Subclass>
193 struct Product<TPTransf16Subclass,
194 std::enable_if_t<std::is_base_of_v<HPCombi::PTransf16,
195 TPTransf16Subclass>>> {
202 void operator()(TPTransf16Subclass& xy,
203 TPTransf16Subclass const& x,
204 TPTransf16Subclass const& y,
205 size_t = 0) const noexcept {
206 xy = y * x;
207 }
208 };
209
218 template <typename TPTransf16Subclass>
219 struct Swap<TPTransf16Subclass,
220 std::enable_if_t<
221 std::is_base_of_v<HPCombi::PTransf16, TPTransf16Subclass>>> {
228 void operator()(TPTransf16Subclass& x,
229 TPTransf16Subclass& y) const noexcept {
230 std::swap(x, y);
231 }
232 };
233
241 template <>
242 struct Inverse<HPCombi::Perm16> {
249 HPCombi::Perm16 operator()(HPCombi::Perm16 const& x) const noexcept {
250 return x.inverse();
251 }
252 };
253
262 template <typename TIntType>
263 struct ImageRightAction<HPCombi::Perm16,
264 TIntType,
265 std::enable_if_t<std::is_integral_v<TIntType>>> {
273 void operator()(TIntType& res,
274 TIntType const& pt,
275 HPCombi::Perm16 const& p) const noexcept {
276 LIBSEMIGROUPS_ASSERT(pt < 16);
277 res = static_cast<TIntType>(p[pt]);
278 }
279
281 TIntType operator()(TIntType const& pt,
282 HPCombi::Perm16 const& p) const noexcept {
283 LIBSEMIGROUPS_ASSERT(pt < 16);
284 return p[pt];
285 }
286 };
287
296 template <>
297 struct ImageRightAction<HPCombi::PPerm16, HPCombi::PPerm16> {
306 void operator()(HPCombi::PPerm16& res,
307 HPCombi::PPerm16 const& x,
308 HPCombi::PPerm16 const& y) const noexcept {
309 res = (y * x).left_one();
310 }
311 };
312
321 template <>
322 struct ImageLeftAction<HPCombi::PPerm16, HPCombi::PPerm16> {
330 void operator()(HPCombi::PPerm16& res,
331 HPCombi::PPerm16 const& x,
332 HPCombi::PPerm16 const& y) const noexcept {
333 res = (x * y).right_one();
334 }
335 };
336
345 template <>
346 struct Complexity<HPCombi::BMat8> {
350 constexpr inline size_t operator()(HPCombi::BMat8 const&) const noexcept {
351 return 0;
352 }
353 };
354
362 template <>
363 struct Degree<HPCombi::BMat8> {
367 constexpr inline size_t operator()(HPCombi::BMat8 const&) const noexcept {
368 return 8;
369 }
370 };
371
381 template <>
382 struct IncreaseDegree<HPCombi::BMat8> {
386 inline void operator()(HPCombi::BMat8 const&) const noexcept {}
387 };
388
396 template <>
397 struct One<HPCombi::BMat8> {
401 inline HPCombi::BMat8 operator()(HPCombi::BMat8 const& x) const noexcept {
402 return x.one();
403 }
404
407 inline HPCombi::BMat8 operator()(size_t = 0) const noexcept {
408 return HPCombi::BMat8::one();
409 }
410 };
411
419 template <>
420 struct Product<HPCombi::BMat8> {
424 inline void operator()(HPCombi::BMat8& xy,
425 HPCombi::BMat8 const& x,
426 HPCombi::BMat8 const& y,
427 size_t = 0) const noexcept {
428 xy = x * y;
429 }
430 };
431
441 template <>
442 struct ImageRightAction<HPCombi::BMat8, HPCombi::BMat8> {
447 void operator()(HPCombi::BMat8& res,
448 HPCombi::BMat8 const& pt,
449 HPCombi::BMat8 const& x) const noexcept {
450 res = (pt * x).row_space_basis();
451 }
452 };
453
463 template <>
464 struct ImageLeftAction<HPCombi::BMat8, HPCombi::BMat8> {
469 void operator()(HPCombi::BMat8& res,
470 HPCombi::BMat8 pt,
471 HPCombi::BMat8 x) const noexcept {
472 res = (x * pt).col_space_basis();
473 }
474 };
475
483 template <>
484 struct Inverse<HPCombi::BMat8> {
488 inline HPCombi::BMat8 operator()(HPCombi::BMat8 const& x) const noexcept {
489 LIBSEMIGROUPS_ASSERT(x * x.transpose() == x.one());
490 return x.transpose();
491 }
492 };
493
495 // Konieczny adapters - HPCombi::BMat8
497
504 template <>
505 struct LambdaValue<HPCombi::BMat8> {
511 using type = HPCombi::BMat8;
512 };
513
520 template <>
521 struct RhoValue<HPCombi::BMat8> {
527 using type = HPCombi::BMat8;
528 };
529
535 template <>
536 struct Lambda<HPCombi::BMat8, HPCombi::BMat8> {
542 void operator()(HPCombi::BMat8& res,
543 HPCombi::BMat8 const& x) const noexcept {
544 res = x.row_space_basis();
545 }
546 };
547
554 template <>
555 struct Rho<HPCombi::BMat8, HPCombi::BMat8> {
561 void operator()(HPCombi::BMat8& res,
562 HPCombi::BMat8 const& x) const noexcept {
563 res = x.col_space_basis();
564 }
565 };
566
573 template <>
574 struct Rank<HPCombi::BMat8> {
579 inline size_t operator()(HPCombi::BMat8 const& x) const noexcept {
580 return x.row_space_size();
581 }
582 };
583
585 // Konieczny adapters - HPCombi::PPerm16
587
594 template <>
595 struct LambdaValue<HPCombi::PPerm16> {
600 using type = HPCombi::PPerm16;
601 };
602
609 template <>
610 struct RhoValue<HPCombi::PPerm16> {
615 using type = HPCombi::PPerm16;
616 };
617
624 template <>
625 struct Lambda<HPCombi::PPerm16, HPCombi::PPerm16> {
632 void operator()(HPCombi::PPerm16& res,
633 HPCombi::PPerm16 const& x) const noexcept {
634 res = x.left_one();
635 }
636 };
637
643 template <>
644 struct Rho<HPCombi::PPerm16, HPCombi::PPerm16> {
648 void operator()(HPCombi::PPerm16& res,
649 HPCombi::PPerm16 const& x) const noexcept {
650 res = x.right_one();
651 }
652 };
653
655 // Konieczny adapters - Transf16
657
666 template <>
667 struct ImageRightAction<HPCombi::Transf16, HPCombi::PTransf16> {
672 void operator()(HPCombi::PTransf16& res,
673 HPCombi::Transf16 const& x,
674 HPCombi::PTransf16 const& y) const noexcept {
675 res = (y * static_cast<HPCombi::PTransf16>(static_cast<HPCombi::epu8>(x)))
676 .left_one();
677 }
678 };
679
688 template <>
689 struct ImageLeftAction<HPCombi::Transf16, HPCombi::Vect16> {
694 void operator()(HPCombi::Vect16& res,
695 HPCombi::Transf16 const& x,
696 HPCombi::Vect16 const& y) const noexcept {
697 HPCombi::Vect16 buf = {0xff,
698 0xff,
699 0xff,
700 0xff,
701 0xff,
702 0xff,
703 0xff,
704 0xff,
705 0xff,
706 0xff,
707 0xff,
708 0xff,
709 0xff,
710 0xff,
711 0xff,
712 0xff};
713 size_t next = 0;
714 for (size_t i = 0; i < 16; ++i) {
715 if (buf[x[y[i]]] == 0xff) {
716 buf[x[y[i]]] = next++;
717 }
718 res[i] = buf[x[y[i]]];
719 }
720 }
721 };
722
730 template <>
731 struct LambdaValue<HPCombi::Transf16> {
736 using type = HPCombi::PTransf16;
737 };
738
745 template <>
746 struct RhoValue<HPCombi::Transf16> {
751 using type = HPCombi::Vect16;
752 };
753
761 template <>
762 struct Lambda<HPCombi::Transf16, HPCombi::PTransf16> {
770 void operator()(HPCombi::PTransf16& res,
771 HPCombi::Transf16 const& x) const noexcept {
772 res = x.left_one();
773 }
774 };
775
783 template <>
784 struct Rho<HPCombi::Transf16, HPCombi::Vect16> {
791 void operator()(HPCombi::Vect16& res,
792 HPCombi::Transf16 const& x) const noexcept {
793 HPCombi::Vect16 buf = {0xff,
794 0xff,
795 0xff,
796 0xff,
797 0xff,
798 0xff,
799 0xff,
800 0xff,
801 0xff,
802 0xff,
803 0xff,
804 0xff,
805 0xff,
806 0xff,
807 0xff,
808 0xff};
809 size_t next = 0;
810 for (size_t i = 0; i < 16; ++i) {
811 if (buf[x[i]] == 0xff) {
812 buf[x[i]] = next++;
813 }
814 res[i] = buf[x[i]];
815 }
816 }
817 };
818
820 // Konieczny adapters - generic
822
828 template <typename T>
829 struct Rank<T,
830 std::enable_if_t<std::is_base_of_v<HPCombi::PTransf16, T>,
831 RankState<T>>> {
837 inline size_t operator()(T const& x) const noexcept {
838 return x.rank();
839 }
840 };
841
843
866 template <typename Return, typename Container>
868 make(Container&& cont) {
869 if (cont.size() > 16) {
870 LIBSEMIGROUPS_EXCEPTION("the 1st argument (container) must have size at "
871 "most 16, but found {}",
872 cont.size());
873 }
874 auto result = HPCombi::Transf16(cont);
875 if (!result.validate()) {
876 auto it = std::find_if(std::begin(cont),
877 std::begin(cont),
878 [](auto const& val) { return val > 15; });
879 LIBSEMIGROUPS_EXCEPTION("image value out of bounds, expected value in "
880 "[0, 16), found {} in position {}",
881 *it,
882 std::distance(std::begin(cont), it));
883 }
884 return result;
885 }
886
909 template <typename Return, typename Container>
911 make(Container&& cont) {
912 if (cont.size() > 16) {
913 LIBSEMIGROUPS_EXCEPTION("the 1st argument (container) must have size at "
914 "most 16, but found {}",
915 cont.size());
916 }
917 auto result = HPCombi::Perm16(cont);
918 if (!result.HPCombi::Transf16::validate()) {
919 auto it = std::find_if(std::begin(cont),
920 std::begin(cont),
921 [](auto const& val) { return val > 15; });
922 LIBSEMIGROUPS_EXCEPTION("image value out of bounds, expected value in "
923 "[0, 16), found {} in position {}",
924 *it,
925 std::distance(std::begin(cont), it));
926 }
927 if (!result.validate()) {
928 detail::throw_if_duplicates(std::begin(cont), std::end(cont));
929 // TODO(1) check if result contains UNDEFINED
930 }
931 return result;
932 }
933
956 template <typename Return, typename Container>
958 make(Container&& cont) {
959 if (cont.size() > 16) {
960 LIBSEMIGROUPS_EXCEPTION("the 1st argument (container) must have size at "
961 "most 16, but found {}",
962 cont.size());
963 }
964 auto result = HPCombi::PPerm16(cont);
965 if (!result.HPCombi::PTransf16::validate()) {
966 auto it = std::find_if(
967 std::begin(cont), std::begin(cont), [](auto const& val) {
968 return val != 0xFF && val > 15;
969 });
970 LIBSEMIGROUPS_EXCEPTION("image value out of bounds, expected value in "
971 "[0, 16) or 0xFF (= {}), found {} in position {}",
972 0xFF,
973 *it,
974 std::distance(std::begin(cont), it));
975 }
976 if (!result.validate()) {
977 detail::throw_if_duplicates(std::begin(cont), std::end(cont));
978 }
979 return result;
980 }
981
1005 template <typename Return>
1008 std::vector<uint8_t> const& ran,
1009 size_t deg = 16) {
1010 if (deg > 16) {
1012 "the 3rd argument is not valid, expected <=16, found {}", deg);
1013 } else if (dom.size() != ran.size()) {
1014 LIBSEMIGROUPS_EXCEPTION("domain and range size mismatch, domain has "
1015 "size {} but range has size {}",
1016 dom.size(),
1017 ran.size());
1018 } else if (!(dom.empty()
1019 || deg > *std::max_element(dom.cbegin(), dom.cend()))) {
1021 "domain value out of bounds, found {}, must be less than {}",
1022 *std::max_element(dom.cbegin(), dom.cend()),
1023 deg);
1024 }
1025 // TODO(1) check ran for out of bounds values too
1027 detail::throw_if_duplicates(dom.cbegin(), dom.cend(), seen);
1028 detail::throw_if_duplicates(ran.cbegin(), ran.cend(), seen);
1029 HPCombi::PPerm16 result(dom, ran, deg);
1030 LIBSEMIGROUPS_ASSERT(result.validate());
1031 return result;
1032 }
1033
1057 template <typename Return, typename Int>
1061 size_t M) {
1062 return make<Return>(std::vector<uint8_t>(dom.begin(), dom.end()),
1063 std::vector<uint8_t>(ran.begin(), ran.end()),
1064 M);
1065 }
1066
1088 template <typename Return>
1089 [[nodiscard]] std::enable_if_t<std::is_base_of_v<HPCombi::PTransf16, Return>,
1090 Return>
1094#endif // LIBSEMIGROUPS_HPCOMBI_ENABLED
1095
1096} // namespace libsemigroups
1097
1098#endif // LIBSEMIGROUPS_HPCOMBI_HPP_
T begin(T... args)
Fast boolean matrices of dimension up to 8 x 8.
Definition bmat8.hpp:74
T distance(T... args)
T empty(T... args)
T end(T... args)
T find_if(T... args)
Undefined const UNDEFINED
Value for something undefined.
#define LIBSEMIGROUPS_EXCEPTION(...)
Throw a LibsemigroupsException.
Definition exception.hpp:95
enable_if_is_same< Return, Blocks > make(Container const &cont)
Check the arguments, construct a Blocks object, and check it.
Definition bipart.hpp:798
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:50
T max_element(T... args)
T move(T... args)
Namespace for everything in the libsemigroups library.
Definition action.hpp:44
T size(T... args)
constexpr size_t operator()(HPCombi::BMat8 const &) const noexcept
Returns 0.
Definition hpcombi.hpp:350
constexpr size_t operator()(TPTransf16Subclass const &) const noexcept
Returns 0.
Definition hpcombi.hpp:121
Adapter for the complexity of multiplication.
Definition adapters.hpp:121
constexpr size_t operator()(HPCombi::BMat8 const &) const noexcept
Returns 8.
Definition hpcombi.hpp:367
constexpr size_t operator()(TPTransf16Subclass const &) const noexcept
Returns 16.
Definition hpcombi.hpp:144
Adapter for the degree of an element.
Definition adapters.hpp:159
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:469
void operator()(HPCombi::PPerm16 &res, HPCombi::PPerm16 const &x, HPCombi::PPerm16 const &y) const noexcept
Stores the idempotent in res.
Definition hpcombi.hpp:330
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.
Definition hpcombi.hpp:694
Adapter for the value of a left action.
Definition adapters.hpp:350
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:447
void operator()(HPCombi::PPerm16 &res, HPCombi::PPerm16 const &x, HPCombi::PPerm16 const &y) const noexcept
Stores the idempotent in res.
Definition hpcombi.hpp:306
TIntType operator()(TIntType const &pt, HPCombi::Perm16 const &p) const noexcept
Returns the image of pt under p.
Definition hpcombi.hpp:281
void operator()(TIntType &res, TIntType const &pt, HPCombi::Perm16 const &p) const noexcept
Stores the image of pt under p.
Definition hpcombi.hpp:273
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:672
Adapter for the value of a right action.
Definition adapters.hpp:392
void operator()(HPCombi::BMat8 const &) const noexcept
Does nothing.
Definition hpcombi.hpp:386
Adapter for increasing the degree of an element.
Definition adapters.hpp:199
HPCombi::BMat8 operator()(HPCombi::BMat8 const &x) const noexcept
Returns the group inverse of x.
Definition hpcombi.hpp:488
HPCombi::Perm16 operator()(HPCombi::Perm16 const &x) const noexcept
Returns the inverse of x.
Definition hpcombi.hpp:249
Adapter for the inverse of an element.
Definition adapters.hpp:319
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:542
void operator()(HPCombi::PPerm16 &res, HPCombi::PPerm16 const &x) const noexcept
Definition hpcombi.hpp:632
void operator()(HPCombi::PTransf16 &res, HPCombi::Transf16 const &x) const noexcept
Stores the identity function on the image of x.
Definition hpcombi.hpp:770
Adapter for the action on LambdaValue's.
Definition adapters.hpp:833
HPCombi::BMat8 type
The type of Lambda value.
Definition hpcombi.hpp:511
HPCombi::PPerm16 type
The type of Lambda values.
Definition hpcombi.hpp:600
HPCombi::PTransf16 type
The type of Lambda values.
Definition hpcombi.hpp:736
Adapter for lambda functions.
Definition adapters.hpp:793
HPCombi::BMat8 operator()(HPCombi::BMat8 const &x) const noexcept
Returns x.one().
Definition hpcombi.hpp:401
HPCombi::BMat8 operator()(size_t=0) const noexcept
Returns HPCombi::BMat8::one.
Definition hpcombi.hpp:407
TPTransf16Subclass operator()(size_t=0) const noexcept
Returns the identity for HPCombi::PTransf16.
Definition hpcombi.hpp:167
TPTransf16Subclass operator()(TPTransf16Subclass const &) const noexcept
Returns the identity for HPCombi::PTransf16.
Definition hpcombi.hpp:176
Adapter for the identity element of the given type.
Definition adapters.hpp:246
void operator()(HPCombi::BMat8 &xy, HPCombi::BMat8 const &x, HPCombi::BMat8 const &y, size_t=0) const noexcept
Changes xy in-place to hold the product of x and y.
Definition hpcombi.hpp:424
void operator()(TPTransf16Subclass &xy, TPTransf16Subclass const &x, TPTransf16Subclass const &y, size_t=0) const noexcept
Modifies xy in-place to be the product of x and y.
Definition hpcombi.hpp:202
Adapter for the product of two elements.
Definition adapters.hpp:284
size_t operator()(HPCombi::BMat8 const &x) const noexcept
Returns the rank of x as used in the Konieczny algorithm.
Definition hpcombi.hpp:579
size_t operator()(T const &x) const noexcept
Returns the rank of x as used in the Konieczny algorithm.
Definition hpcombi.hpp:837
Adapter for calculating ranks.
Definition adapters.hpp:930
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:561
void operator()(HPCombi::PPerm16 &res, HPCombi::PPerm16 const &x) const noexcept
Definition hpcombi.hpp:648
void operator()(HPCombi::Vect16 &res, HPCombi::Transf16 const &x) const noexcept
Stores the kernel of x.
Definition hpcombi.hpp:791
Adapter for the action on RhoValue's.
Definition adapters.hpp:854
HPCombi::BMat8 type
The type of Rho values for HPCombi::BMat8.
Definition hpcombi.hpp:527
HPCombi::PPerm16 type
The type of Rho values.
Definition hpcombi.hpp:615
HPCombi::Vect16 type
The type of Rho value for HPCombi::Transf16.
Definition hpcombi.hpp:751
Adapter for rho functions.
Definition adapters.hpp:812
void operator()(TPTransf16Subclass &x, TPTransf16Subclass &y) const noexcept
Swap x and y.
Definition hpcombi.hpp:228
Adapter for swapping.
Definition adapters.hpp:666
T swap(T... args)