11#ifndef _TPF_NCRNPR_HPP
12#define _TPF_NCRNPR_HPP
19 #if _MSVC_LANG < 201703L
20 #error This libary requires C++17 Standard (Visual Studio 2017).
24 #if __cplusplus < 201703
25 #error This library requires C++17 Standard (GNU g++ version 8.0 or clang++ version 8.0 above)
41#if defined(_GLIBCXX_PARALLEL)
42 #include <parallel/algorithm>
43#elif defined (_MSC_VER)
50 #include <tbb/parallel_for.h>
65 using namespace types;
66 using namespace euclidean;
76 template<
template<
typename,
typename...>
class ContainerType,
77 typename EleType,
typename... Types>
78 int sgn(
const ContainerType<EleType, Types...>& cntr)
80 EleType
count = 0, cntr_i;
81 EleType size = cntr.size();
82 for(EleType i = 1; i < size; ++i)
86 for(EleType j=0; j < i; ++j)
87 if(cntr_i < cntr[j]) ++
count;
90 return (
count%2 ? -1:1);
93 class range_t:
public std::pair<size_t, size_t>
97 using base_t = std::pair<size_t, size_t>;
99 size_t begin() {
return this->first; }
100 size_t end() {
return this->second; }
101 size_t cbegin()
const {
return this->first; }
102 size_t cend()
const {
return this->second; }
113 template<
typename Type1,
typename Type2>
120 std::ostringstream os;
122 os <<
"[" << this->first <<
", "
123 << this->second <<
")("
124 << (this->second - this->first)<<
")";
131 std::wostringstream os;
133 os << L
"[" << this->first << L
", "
134 << this->second << L
")("
135 << (this->second - this->first)<<L
")";
172 template<
typename SpanType,
typename StartType,
typename EndType>
175 size_t dist = (size_t)ed - (
size_t)st;
176 size_t rnd = (size_t)dist % (
size_t)min_span;
177 size_t count = (size_t)dist / (
size_t)min_span;
183 rng.emplace_back(
range_t{(size_t)st, (
size_t)ed});
188 size_t prev = (size_t)st;
189 for (
size_t i = 0; i <
count; ++i)
191 rng.emplace_back(
range_t{prev, prev + min_span});
200 size_t span1 = min_span + 1;
202 size_t prev = (size_t)st;
203 for (
size_t i = 0; i < rnd; ++i)
205 rng.emplace_back(
range_t(prev, prev + span1));
210 for (
size_t i = 0; i <
count; ++i)
212 rng.emplace_back(
range_t{prev, prev + min_span});
224 template<
typename CountType,
typename StartType,
typename EndType>
227 size_t dist = (size_t)ed - (
size_t)st;
228 size_t span = (size_t)dist / (
size_t)
count;
229 size_t rnd = (size_t)dist % (
size_t)
count;
236 for (
size_t i = 0; i <
count; ++i)
238 rng.emplace_back(
range_t{prev, prev + span});
246 size_t span1 = span + (size_t)1;
249 for (
size_t i = 0; i < rnd; ++i)
251 rng.emplace_back(
range_t{prev, prev + span1});
258 for (
size_t i = 0; i <
count; ++i)
260 rng.emplace_back(
range_t{prev, prev + span});
268 template<
typename NumberType,
269 typename = std::enable_if_t<is_unsigned_integer_v<NumberType>>>
286 template<
typename Type>
333 template<
typename RationalType>
334 friend decltype(
auto)
340 if constexpr(std::is_rvalue_reference_v<
decltype(r)>)
344 return std::forward<RationalType>(r);
348 auto rlt = r; rlt *= n;
353 template<
typename RationalType1,
typename RationalType2>
354 friend decltype(
auto)
355 operator*(RationalType1&& r1, RationalType1&& r2)
362 if constexpr(std::is_rvalue_reference_v<
decltype(r1)>)
366 return std::forward<RationalType1>(r1);
368 else if constexpr(std::is_rvalue_reference_v<
decltype(r2)>)
371 return std::forward<RationalType2>(r2);
375 auto r = r1; r *= r2;
382 os <<
"(" << r.m_p <<
", " << r.m_q <<
")";
388 template<
typename Type1,
typename Type2,
typename ReturnType =
unsigned long long>
389 enable_if_all_in_list_t<types::type_list_t<Type1, Type2>,
integral_list_t, ReturnType>
392 size_t r = (size_t)rr;
size_t n = (size_t)nn;
400 if (r == 0 || n == r)
404 else if (r == 1 || r == (n - 1))
412 if(r > (n-r) ) r = n-r;
414 rational_t rlt{(ReturnType)n, (ReturnType)r};
416 for(ReturnType i = 1; i < (ReturnType)(r); ++i)
418 rlt *= rational_t((ReturnType)n - i, (ReturnType)r - i);
426 template<
typename Type1,
typename Type2,
typename ReturnType =
unsigned long long>
427 enable_if_all_in_list_t<types::type_list_t<Type1, Type2>,
integral_list_t, ReturnType>
430 size_t n = (size_t)nn;
size_t r=(size_t)rr;
440 for (ReturnType i = 1; i < (ReturnType)r; ++i)
450 template<
typename Type,
typename ReturnType =
unsigned long long>
451 enable_if_in_list_t<Type, integral_list_t, ReturnType>
469 template<
typename Type>
500 template<
typename Type>
531 template<
typename Type>
568 template<
typename Type>
572 template<
typename Type1,
typename Type2>
578 template<
typename Type1,
typename Type2>
588 template<
typename Type>
602 template<
typename Type>
693 template<
typename Type1,
typename Type2>
704 template<
typename Type>
710 os <<
"{" << cb.
m_n <<
" C "
711 << cb.
m_r <<
" = " << cb.
m_ncr <<
"}";
721 template<
template<
typename,
typename...>
class SetContainer = std::vector,
typename... ContainerTails,
722 typename MthType =
combination::m_th_t,
typename EleType = int,
typename SelectCountType = size_t,
723 typename ReturnType = std::vector<EleType>>
725 SetContainer<EleType, ContainerTails...> from_set, SelectCountType select_count)
727 constexpr auto is_from_set_vector =
729 std::vector<EleType>>;
731 constexpr auto is_return_vector =
732 types::is_same_template_v<ReturnType, std::vector<EleType>>;
734 size_t set_size = from_set.size();
736 ReturnType selected_set;
738 if constexpr(is_from_set_vector)
741 if constexpr(is_return_vector)
742 selected_set.reserve((
size_t)select_count);
745 if (select_count == 0)
749 else if ((
size_t)select_count == set_size)
751 append_to_container<is_from_set_vector>(selected_set, std::move(from_set));
758 if constexpr(is_from_set_vector)
767 if constexpr(is_from_set_vector)
787 template<
template<
typename,
typename...>
class ReturnContainer = std::vector,
788 template<
typename,
typename...>
class SetContainer = std::list,
typename... ContainerTails,
789 typename MthType =
combination::m_th_t,
typename EleType = int,
typename SelectCountType = size_t,
793 SetContainer<EleType, ContainerTails...> from_set, SelectCountType select_count)
795 constexpr auto is_from_set_vector =
798 constexpr auto is_return_vector =
799 types::is_same_template_v<ReturnContainer<EleType>, std::vector<EleType>>;
801 size_t set_size = from_set.size();
804 auto& [selected_set, complement_set] = duet_set;
806 if constexpr(is_from_set_vector)
809 if constexpr(is_return_vector)
811 selected_set.reserve((
size_t)select_count);
812 complement_set.reserve((
size_t)set_size - (size_t)select_count);
817 if (select_count == 0)
819 append_to_container<is_from_set_vector>(complement_set, std::move(from_set));
823 else if ((
size_t)select_count == set_size)
825 append_to_container<is_from_set_vector>(selected_set, std::move(from_set));
833 if constexpr(is_from_set_vector)
842 if constexpr(is_from_set_vector)
862 template<
template<
typename,
typename...>
class ReturnContainer = std::vector,
864 typename SetSizeType = size_t,
typename SelectCountType = size_t,
869 std::vector<int> from_set;
871 size_t size = (size_t)set_size;
873 from_set.reserve(size);
875 for(
size_t i = 0; i < size; ++i)
876 from_set.emplace_back((
int)i);
894 template<
template<
typename,
typename...>
class ReturnContainer = std::vector,
895 template<
typename,
typename...>
class SetContainer = std::list,
typename... ContainerTails,
896 typename MthType =
combination::m_th_t,
typename EleType = int,
typename SelectCountType = size_t,
902 size_t set_size = from_set.size();
910 m_th_t max_m_th =
ncr((m_th_t)set_size, (m_th_t)select_count);
911 sets.reserve(max_m_th);
915 for(m_th_t m_th = 0; m_th < max_m_th; ++m_th)
916 sets.emplace_back(enumerate_combination_and_complement<ReturnContainer>
917 (cmb, m_th, from_set, (
size_t)select_count));
925 for(
size_t r = 0; r <= set_size; ++r)
927 m_th_t m_th_max =
ncr((m_th_t)set_size, (m_th_t)r);
931 for(m_th_t m_th = 0; m_th < m_th_max; ++m_th)
932 sets.emplace_back(enumerate_combination_and_complement<ReturnContainer>
933 (cmb, m_th, from_set, (
size_t)r));
946 template<
template<
typename,
typename...>
class ReturnContainer = std::vector,
951 std::vector<int> from_set, SelectCountType select_count)
953 constexpr auto is_return_vector =
954 types::is_same_template_v<ReturnContainer<int>, std::vector<int>>;
957 auto& [selected_set, complement_set] = duet_set;
959 size_t set_size = from_set.size();
961 if constexpr(is_return_vector)
963 selected_set.reserve((
size_t)select_count);
964 complement_set.reserve((
size_t)set_size - (size_t)select_count);
971 if (select_count <= 0)
973 append_to_container<true>(complement_set, std::move(from_set));
977 else if ((
size_t)select_count == set_size)
979 append_to_container<true>(selected_set, std::move(from_set));
1009 template<
template<
typename,
typename...>
class ReturnContainer = std::vector,
1010 typename SetSizeType = size_t,
typename SelectCountType = size_t,
1016 std::vector<int> from_set;
1017 from_set.reserve(set_size);
1019 for(
size_t i = set_size-1; i != 0; --i)
1020 from_set.emplace_back((
int)i);
1022 from_set.emplace_back(0);
1030 m_th_t m_th_max =
ncr(set_size, select_count);
1031 sets.reserve(m_th_max);
1035 for(m_th_t m_th = 0; m_th < m_th_max; ++m_th)
1036 sets.emplace_back(enumerate_combinations_and_offsets_indices<ReturnContainer>
1037 (cmb, m_th, from_set, select_count));
1045 for(
size_t r = 0; r <= set_size; ++r)
1047 m_th_t m_th_max =
ncr((m_th_t)set_size, (m_th_t)r);
1051 for(m_th_t m_th = 0; m_th < m_th_max; ++m_th)
1052 sets.emplace_back(enumerate_combinations_and_offsets_indices<ReturnContainer>
1053 (cmb, m_th, from_set, r));
1064 template<
template<
typename,
typename...>
class ReturnContainer = std::vector,
1065 typename SetSizeType = size_t,
typename SelectCountType = size_t,
1072 include_set.end(), std::greater<int>{});
1074 std::vector<int> from_set;
1076 for(
size_t i = set_size-1; i != 0; --i)
1078 if(!std::binary_search(include_set.crbegin(), include_set.crend(), i))
1079 from_set.emplace_back(i);
1082 if(!std::binary_search(include_set.crbegin(), include_set.crend(), 0))
1083 from_set.emplace_back(0);
1091 size_t choice_count = select_count - include_set.size();
1092 m_th_t m_th_max =
ncr(from_set.size(), choice_count);
1093 sets.reserve(m_th_max);
1097 for(m_th_t m_th = 0; m_th < m_th_max; ++m_th)
1098 sets.emplace_back(enumerate_combinations_and_offsets_indices<ReturnContainer>
1105 types::append_to_container<false>(v, include_set);
1107 v.erase(std::unique(v.begin(), v.end()), v.end());
1114 set_size = from_set.size();
1117 for(
size_t r = 0; r <= set_size; ++r)
1119 m_th_t m_th_max =
ncr((m_th_t)set_size, (m_th_t)r);
1123 for(m_th_t m_th = 0; m_th < m_th_max; ++m_th)
1124 sets.emplace_back(enumerate_combinations_and_offsets_indices<ReturnContainer>
1132 types::append_to_container<false>(v, include_set);
1134 v.erase(std::unique(v.begin(), v.end()), v.end());
1145 template<
template<
typename,
typename...>
class ReturnContainer = std::vector,
1146 typename SetSizeType = size_t,
typename SelectCountType = size_t,
1153 exclude_set.end(), std::greater<int>{});
1155 std::vector<int> from_set;
1157 for(
size_t i = set_size-1; i != 0; --i)
1159 if(!std::binary_search(exclude_set.crbegin(), exclude_set.crend(), i))
1160 from_set.emplace_back(i);
1163 if(!std::binary_search(exclude_set.crbegin(), exclude_set.crend(), 0))
1164 from_set.emplace_back(0);
1172 m_th_t m_th_max =
ncr(from_set.size(), select_count);
1173 sets.reserve(m_th_max);
1177 for(m_th_t m_th = 0; m_th < m_th_max; ++m_th)
1178 sets.emplace_back(enumerate_combinations_and_offsets_indices<ReturnContainer>
1185 types::append_to_container<false>(c, exclude_set);
1187 v.erase(std::unique(c.begin(), c.end()), c.end());
1194 set_size = from_set.size();
1197 for(
size_t r = 0; r <= set_size; ++r)
1199 m_th_t m_th_max =
ncr((m_th_t)set_size, (m_th_t)r);
1203 for(m_th_t m_th = 0; m_th < m_th_max; ++m_th)
1204 sets.emplace_back(enumerate_combinations_and_offsets_indices<ReturnContainer>
1212 types::append_to_container<false>(c, exclude_set);
1214 v.erase(std::unique(c.begin(), c.end()), c.end());
1232 this->
m_n = {}; this->
m_r = {};
1239 template<
typename Type1,
typename Type2>
1248 template<
typename Type1,
typename Type2>
1257 template<
typename Type>
1260 friend std::ostream&
1263 os <<
"{" << p.
m_n <<
" P "
1264 << p.
m_r <<
" = " << p.
m_npr <<
"}";
1270 template<
typename RType,
typename MType>
1276 number_t n = (number_t)e.size();
1278 if (!(r < 1 || n < 1 || (
size_t)r > n))
1280 v.reserve((
size_t)r);
1282 number_t
permu =
npr((number_t)n - 1, (number_t)r - 1);
1287 size_t s = ((size_t)m_th / (
size_t)
permu);
1288 m_th %= (MType)
permu;
1291 v.emplace_back(e[s]);
1295 e.erase(e.begin() + s); --r; --n;
1297 if (n > 1)
permu /= (number_t)n;
1305 template<
typename T>
1310 if (!(r < 1 || n < 1 || r > n))
1312 v.reserve((
size_t)r);
1314 std::vector<T> e((
size_t)n);
1318 for (
size_t i = 0; i < size_t(n); ++i)
1326 size_t s = (size_t)(m_th /
permu);
1330 v.emplace_back(e[s]);
1335 if (n > 1)
permu /= (T)n;
1343 template<
typename T>
1348 if (!(r < 1 || n < 1 || r > n))
1350 v.reserve((
size_t)r);
1352 std::vector<T> e((
size_t)n);
1356 for (
size_t i = 0; i < size_t(n); ++i)
1364 size_t s = (size_t)(m_th /
permu);
1368 v.emplace_back(e[s]);
1371 erase(e, s); --r; --n;
1373 if (n > 1)
permu /= (T)n;
1378 for(
auto ele: e) v.emplace_back(ele);
1386 template<
typename PType,
typename NRType,
typename MType>
1389 int e[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
1390 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
1391 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
1392 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
1393 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
1394 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
1395 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
1396 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
1397 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
1398 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100 };
1400 constexpr size_t ele_count =
sizeof(e)/
sizeof(
size_t) - 1;
1402 int v[ele_count+1];
auto rr = r;
1404 if (!(r < 1 || n < 1 || r > n))
1409 size_t s = (size_t)(m_th / (MType)
permu);
1410 m_th %= (MType)
permu;
1416 for(
size_t i = s ; i < ele_count; ++i)
1421 if (n > 1)
permu /= (PType)n;
1425 return { &v[0], &v[rr] };
1429 template<
typename T>
1434 if (!(r < 1 || n < 1 || r > n))
1436 v.reserve((
size_t)r);
1442 for (
size_t i = 0; i < size_t(n); ++i)
1450 size_t s = size_t(mth /
permu);
1454 auto itr = e.begin();
1455 std::advance(itr, s);
1457 v.emplace_back(*itr);
1460 e.erase(itr); --r; --n;
1462 if (n > 1)
permu /= (T)n;
1473 template<
template<
typename,
typename...>
class ReturnContainer = std::vector,
1474 template<
typename,
typename...>
class SetContainer = std::list,
typename... ContainerTails,
1475 typename MthType =
unsigned long long,
typename EleType = int,
typename CountType =
int>
1477 SetContainer<EleType, ContainerTails...> from_set, CountType r)
1481 size_t select_count = (size_t)r;
1482 size_t n = from_set.size();
1486 if (!(r < 1 || n < 1 || r > n))
1488 v.reserve((
size_t)r);
1493 for (
size_t i = 0; i < n; ++i)
1496 number_t
permu =
npr((number_t)n - 1, (number_t)r - 1);
1501 size_t s = (size_t)(m_th /
permu);
1505 auto itr = e.begin(); std::advance(itr, s);
1506 v.emplace_back(*itr);
1511 if (n > 1)
permu /= (number_t)n;
1515 ReturnContainer<EleType> rtn;
1519 constexpr auto is_return_vector =
1520 types::is_same_template_v<ReturnContainer<EleType>, std::vector<EleType>>;
1522 if constexpr(is_return_vector)
1523 rtn.reserve(select_count);
1526 rtn.emplace_back(from_set[(
size_t)idx]);
1544 template<
typename CallbackType,
typename... ArgTypes>
1546 CallbackType&& callback, ArgTypes&&... args)
1548 for(
size_t i =
range.first;
1549 i <
range.second; ++i)
1550 callback(std::forward<ArgTypes>(args)...);
1564 template<
typename CallbackType,
typename... ArgTypes>
1567 CallbackType&& callback, ArgTypes&&... args)
1570 const auto& [start, end] =
range.base();
1575 using future_t = std::future<void>;
1576 using futures_t = std::vector<future_t>;
1579 futures.reserve(ranges.size());
1581 auto parallel_func =
1582 visit<tpf::remove_cv_ref_t<CallbackType>,
1585 for(
size_t i = 0; i < ranges.size(); ++i)
1587 futures.emplace_back(
1588 std::async(std::launch::async,
1589 parallel_func, ranges[i],
1590 std::forward<CallbackType>(callback),
1591 std::forward<ArgTypes>(args)...));
1594 for(
size_t i = 0; i < ranges.size(); ++i)
1610 template<
typename CallbackType,
typename... ArgTypes>
1612 CallbackType&& callback, ArgTypes&&... args)
1614 for(
size_t i =
range.first;
1615 i <
range.second; ++i)
1616 callback(i, std::forward<ArgTypes>(args)...);
1630 template<
typename CallbackType,
typename... ArgTypes>
1633 CallbackType&& callback, ArgTypes&&... args)
1636 const auto& [start, end] =
range.base();
1641 using future_t = std::future<void>;
1642 using futures_t = std::vector<future_t>;
1645 futures.reserve(ranges.size());
1647 auto parallel_func =
1648 visit_index<tpf::remove_cv_ref_t<CallbackType>,
1651 for(
size_t i = 0; i < ranges.size(); ++i)
1653 futures.emplace_back(
1654 std::async(std::launch::async,
1655 parallel_func, ranges[i],
1656 std::forward<CallbackType>(callback),
1657 std::forward<ArgTypes>(args)...));
1660 for(
auto& f: futures) f.get();
1675 template<
typename NRType,
typename CallbackType,
typename... ArgTypes>
1679 const auto& [start, end] =
range.base();
1685 for(number_t m_th = start; m_th < end; ++m_th)
1688 std::forward<ArgTypes>(args)...);
1705 template<
typename TCType,
typename NRType,
typename CallbackType,
typename... ArgTypes>
1708 CallbackType&& callback, ArgTypes&&... args)
1716 using future_t = std::future<void>;
1717 using futures_t = std::vector<future_t>;
1720 futures.reserve(ranges.size());
1722 auto parallel_func = visit_permutations<NRType, tpf::remove_cv_ref_t<CallbackType>,
1725 for(
size_t i = 0; i <ranges.size(); ++i)
1727 futures.emplace_back(
1728 std::async(std::launch::async,
1731 std::forward<CallbackType>(callback),
1732 std::forward<ArgTypes>(args)...));
1735 for(
auto& f: futures) f.get();
1738 template<
typename CallbackType,
typename... ArgTypes>
1740 const std::pair<size_t, size_t> permutation_specification,
1741 CallbackType&& callback, ArgTypes&&... args)
1743 const auto& [n, r] = permutation_specification;
1750 auto nn = n;
auto rr = r;
1757 #if defined(_GLIBCXX_PARALLEL)
1759 #pragma omp parallel for
1760 for(number_t m_th = 0; m_th < max_m_th; ++m_th)
1763 #elif defined(_MSC_VER)
1767 #elif defined(__ICL)
1788 template<
typename CallbackType,
typename... ArgTypes>
1792 const auto& [n, r] = combination_specification;
1793 const auto& [start, end] =
range.base();
1795 std::vector<int> from_set;
1796 from_set.reserve((
size_t)n);
1798 for(
size_t i = 0; i < (size_t)n; ++i)
1799 from_set.emplace_back(i);
1805 for(number_t m_th = start; m_th < end; ++m_th)
1808 std::forward<ArgTypes>(args)...);
1812 template<
typename NRType,
typename CallbackType,
typename... ArgTypes>
1816 const auto& [start, end] =
range.base();
1822 std::vector<int> from_set;
1823 from_set.reserve((
size_t)n);
1825 for(
size_t i = 0; i < (size_t)n; ++i)
1826 from_set.emplace_back((
int)i);
1828 for(number_t m_th = start; m_th < end; ++m_th)
1831 std::forward<ArgTypes>(args)...);
1835 template<
typename NRType,
typename CallbackType,
typename... ArgTypes>
1837 CallbackType&& callback, ArgTypes&&... args)
1844 std::vector<int> from_set;
1845 from_set.reserve((
size_t)n);
1847 for(
size_t i = 0; i < (size_t)n; ++i)
1848 from_set.emplace_back((
int)i);
1850 auto go_parallel = [&cmb, &from_set, n, r, &callback, &args...](
auto m_th)
1855 #if defined(_GLIBCXX_PARALLEL)
1857 #pragma omp parallel for
1858 for(number_t m_th = 0; m_th < max_m_th; ++m_th)
1861 #elif defined(_MSC_VER)
1864 #elif defined(__ICL)
1871 template<
typename NRType,
typename CallbackType,
typename... ArgTypes>
1873 CallbackType&& callback, ArgTypes&&... args)
1880 std::vector<int> from_set;
1881 from_set.reserve((
size_t)n);
1883 for(
size_t i = 0; i < (size_t)n; ++i)
1884 from_set.emplace_back((
int)i);
1888 auto go_parallel = [&cmb, &from_set, n, r, &callback, &args...](
auto m_th)
1893 #if defined(_GLIBCXX_PARALLEL)
1895 #pragma omp parallel for
1896 for(number_t m_th = 0; m_th < max_m_th; ++m_th)
1899 #elif defined(_MSC_VER)
1902 #elif defined(__ICL)
1920 template<
typename ThreadCountType,
typename CallbackType,
typename... ArgTypes>
1922 const std::pair<size_t, size_t>& combination_specification,
1923 CallbackType&& callback, ArgTypes&&... args)
1925 const auto& [n, r] = combination_specification;
1933 using future_t = std::future<void>;
1934 using futures_t = std::vector<future_t>;
1937 futures.reserve(ranges.size());
1939 auto parallel_func =
1940 visit_combinations_and_offsets<tpf::remove_cv_ref_t<CallbackType>,
1943 for(
size_t i = 0; i < ranges.size(); ++i)
1945 futures.emplace_back(
1946 std::async(std::launch::async,
1948 combination_specification, ranges[i],
1949 std::forward<CallbackType>(callback),
1950 std::forward<ArgTypes>(args)...));
1953 for(
auto& f: futures) f.get();
void go_parallel(Policy &&policy, IteratorBegin &&begin, IteratorEnd &&end, Callback &&callback)
bool parallel_for(CallbackType &&callback, PolicyType &&policy, BeginType begin_index, EndType end_index)
number_t reset(Type1 n=Type1{}, Type2 r=Type2{})
number_t operator()() const
combination(Type1 n, Type2 r)
combination & operator=(const combination &)=default
friend std::ostream & operator<<(std::ostream &os, const combination &cb)
combination(const combination &)=default
big_integer_t signed_m_th_t
void offset_n(Type offset)
void offset_nr(Type offset)
void offset_r(Type offset)
permutation(const permutation &)=default
friend std::ostream & operator<<(std::ostream &os, const permutation &p)
permutation & operator=(const permutation &)=default
number_t operator()(Type1 n, Type2 r)
permutation(Type1 n, Type2 r)
number_t operator()() const
const base_t & base() const
range_t & operator=(range_t &&)=default
friend std::ostream & operator<<(std::ostream &os, const range_t &range)
range_t(const range_t &)=default
range_t & operator=(const range_t &)=default
std::pair< size_t, size_t > base_t
range_t(range_t &&)=default
range_t(Type1 start, Type2 end)
std::wstring wstr() const
simple_positive_rational & operator=(const simple_positive_rational &)=default
friend std::ostream & operator<<(std::ostream &os, const simple_positive_rational &r)
simple_positive_rational(number_t p)
simple_positive_rational & operator*=(simple_positive_rational r)
simple_positive_rational(const simple_positive_rational &)=default
simple_positive_rational & operator*=(number_t n)
simple_positive_rational()
simple_positive_rational(number_t p, number_t q)
unsigned long long big_unsigned_t
constexpr size_t InvalidIndex
enable_if_in_list_t< Type, integral_list_t, void > reduce(Type &a, Type &b)
int sgn(const ContainerType< EleType, Types... > &cntr)
Computes the inversion of a permutation.
ReturnType enumerate_combination_and_complement(combination cmb, MthType m_th, SetContainer< EleType, ContainerTails... > from_set, SelectCountType select_count)
range_vector_t split_range_count(CountType count, StartType st, EndType ed)
enable_if_all_in_list_t< types::type_list_t< Type1, Type2 >, integral_list_t, ReturnType > npr(Type1 nn, Type2 rr)
enable_if_all_in_list_t< types::type_list_t< Type1, Type2 >, integral_list_t, ReturnType > ncr(Type1 nn, Type2 rr)
auto enumerate_combination_excluding_indices(std::vector< int > exclude_set, SetSizeType set_size, SelectCountType select_count=tpf::InvalidIndex)
std::vector< T > enum_permutation(T n, T r, T m_th)
std::vector< range_t > range_vector_t
ReturnType enumerate_combinations_and_offsets_indices(combination cmb, MthType m_th, std::vector< int > from_set, SelectCountType select_count)
std::vector< NRType > enum_permutation_static(PType permu, NRType n, NRType r, MType m_th)
std::vector< int > enumerate_permutation(std::vector< int > e, RType r, MType m_th)
std::vector< T > enum_permutation_remainder(T n, T r, T m_th)
range_vector_t split_range_span(SpanType min_span, StartType st, EndType ed)
Split range.
auto enumerate_combinations_and_offsets(SetContainer< EleType, ContainerTails... > from_set, SelectCountType select_count=tpf::InvalidIndex)
enable_if_in_list_t< Type, integral_list_t, ReturnType > fact(Type n)
ReturnType enumerate_combination(combination cmb, MthType m_th, SetContainer< EleType, ContainerTails... > from_set, SelectCountType select_count)
auto enumerate_combination_including_indices(std::vector< int > include_set, SetSizeType set_size, SelectCountType select_count=tpf::InvalidIndex)
std::vector< T > enum_permutation_list(T n, T r, T mth)
types::enable_if_integral_t< Type > safe_mul(Type a, Type b)
Safe multiplication of integral types.
ContainerType< EleType > sort(ContainerType< EleType, Types... > container, sort_order order=sort_order::ascending, sort_method method=sort_method::size)
Type to string name conversions are defined.
auto erase(ContainerType< EleType, Types... > &container, size_t index)
void reverse_order_in_place(ContainerType< Type, Types... > &container)
void emplace_back(ContainerType< Type, Types... > &container, EleTypes &&... eles)
auto pop_front(ContainerType< Type, Types... > &container)
constexpr auto is_same_template_v
auto pop_back(ContainerType< Type, Types... > &container)
type_list_t< char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long > integral_list_t
Type list of integral type INCLUDING character type, but EXCLUDING boolean type.
Includes subnamespace conversion.
void visit_index(const ncrnpr::range_t &range, CallbackType &&callback, ArgTypes &&... args)
Calls callback(index, args...) in sequence. Iteration index is passed to the callback() function.
void visit_index_parallel(unsigned int thread_count, const ncrnpr::range_t &range, CallbackType &&callback, ArgTypes &&... args)
calls callback(index, args...) in parallel. Iteration index is passed to the callback() as the first ...
constexpr unsigned long long two_power_n(Type n)
void visit_combinations_and_offsets(const std::pair< size_t, size_t > &combination_specification, const ncrnpr::range_t &range, CallbackType &&callback, ArgTypes &&... args)
Calls callback(enumerated_combination, args...) in sequence enumerated_combination is generated and p...
typename SetTagType::duet_set_t duet_set_t
void parallel_visit_combinations_and_complements(NRType n, NRType r, CallbackType &&callback, ArgTypes &&... args)
void visit(const ncrnpr::range_t &range, CallbackType &&callback, ArgTypes &&... args)
Calls callback(args...) function in sequence. Iteration index is not passed to the callback() functio...
void visit_parallel(unsigned int thread_count, const ncrnpr::range_t &range, CallbackType &&callback, ArgTypes &&... args)
Calls callback(args...) function in parallel. Iteration index is not passed to the callback() functio...
void parallel_visit_permutations(const std::pair< size_t, size_t > permutation_specification, CallbackType &&callback, ArgTypes &&... args)
std::remove_cv_t< std::remove_reference_t< Type > > remove_cv_ref_t
Remove const volatile reference from Type.
typename SetTagType::set_of_duets_t set_of_duets_t
void parallel_visit_combinations(NRType n, NRType r, CallbackType &&callback, ArgTypes &&... args)
void visit_permutations_parallel(TCType thread_count, NRType n, NRType r, CallbackType &&callback, ArgTypes &&... args)
Calls callback(enumerated_permutation, args...) in parallel.
void visit_combinations(NRType n, NRType r, const ncrnpr::range_t &range, CallbackType &&callback, ArgTypes &&... args)
void visit_combinations_and_offsets_parallel(ThreadCountType thread_count, const std::pair< size_t, size_t > &combination_specification, CallbackType &&callback, ArgTypes &&... args)
Calls callback(enumerated_combination, args...) in parallel.
void visit_permutations(NRType n, NRType r, const ncrnpr::range_t &range, CallbackType &&callback, ArgTypes &&... args)
Calls callback(enumerated_permutation, args...) in sequence.
std::atomic< int > thread_count
This file implements safe arithmetic.