7#ifndef _AUROSTD_XCOMBOS_CPP_
8#define _AUROSTD_XCOMBOS_CPP_
23#define _DEBUG_XCOMBOS_ false
83 reset(choice_count, choose_count,
mode, rpt);
134 if (
this != &other) {
179 std::cerr <<
"xcombos::reset: Unrecognized mode " <<
m_mode <<
" for permutations." << std::endl;
195 if (choice_count <= 0 || choose_count <= 0 || ((!rpt) && (choice_count < choose_count))) {
203 const std::vector<int> vec(choose_count, choice_count);
215 std::cerr <<
"Unrecognized mode " <<
m_mode <<
" for combinations." << std::endl;
231 std::cerr <<
"Unrecognized mode " <<
m_mode <<
" for enumerations." << std::endl;
237 bool all_zero =
true;
238 for (
size_t i = 0; i <
m_sets.size(); i++) {
240 std::cerr <<
"xcombos::reset: m_sets cannot contain negative numbers." << std::endl;
243 }
else if (
m_sets[i] > 0) {
264 for (
size_t i = 0; i <
m_indices.size(); i++) {
284 for (
size_t i = 0; i <
m_current.size(); i++) {
308 std::vector<int> vout;
310 for (
int i = 0; i < (int)
m_current.size(); i++) {
320 std::vector<utype> v_items_new;
332 for (
size_t i = 0; i < v_indices.size(); i++) {
333 if (v_indices[i] >= (
int) v_items.size()) {
336 v_items_new.push_back(v_items[v_indices[i]]);
340#define AST_TEMPLATE(utype) template std::vector<utype> xcombos::applyCombo(const std::vector<utype>&) const;
345 template <
class utype> std::vector<utype>
xcombos::applyCombo(
const std::vector<std::vector<utype>>& v_items)
const {
346 std::vector<utype> v_items_new;
351 for (
size_t i = 0; i < v_indices.size(); i++) {
352 if (v_indices[i] >= (
int) v_items[i].size()) {
355 v_items_new.push_back(v_items[i][v_indices[i]]);
359#define AST_TEMPLATE(utype) template std::vector<utype> xcombos::applyCombo(const std::vector<std::vector<utype>>&) const;
392 for (
int i = 1; i <
m_choose; i++) {
401 for (
int j = 0; j <
m_choose; j++) {
407 cerr <<
"xcombos::incrementPermutation(): i=" << _i <<
" j=" << _j <<
" " << endl;
411 for (
int i = 0; i < (
m_choose - _i + 1) / 2; i++) {
417 bool found_permutation =
false;
420 while (!found_permutation && count <= safety) {
434 found_permutation =
true;
443 if (count > safety) {
447 throw xerror(
__AFLOW_FILE__,
"xcombos::incrementPermutation()",
"Invalide algorithm type, only Shen (shen_alg_xcombos) and Heap's (heap_alg_xcombos) algorithms are available.",
_INPUT_ERROR_);
485 cerr <<
"xcombos::initializeCombinationsP(): p(0): ";
486 for (
size_t l = 0; l <
m_p.size(); l++) {
487 cerr <<
m_p[l] <<
" ";
512 cerr <<
"xcombos::setCombinationsIncrementParameters(): j(0)=" << j << endl;
514 while (
m_p[j] <= 0) {
518 cerr <<
"xcombos::setCombinationsIncrementParameters(): j(1)=" << j << endl;
520 if (
m_p[j + 1] == 0) {
529 cerr <<
"xcombos::setCombinationsIncrementParameters(): p(0): ";
530 for (
size_t l = 0; l <
m_p.size(); l++) {
531 cerr <<
m_p[l] <<
" ";
534 cerr <<
"xcombos::setCombinationsIncrementParameters(): x=" <<
m_x <<
"(1)" << endl;
535 cerr <<
"xcombos::setCombinationsIncrementParameters(): y=" <<
m_y <<
"(0)" << endl;
546 cerr <<
"xcombos::setCombinationsIncrementParameters(): j(2)=" << j << endl;
551 cerr <<
"xcombos::setCombinationsIncrementParameters(): i(0)=" << i << endl;
552 cerr <<
"xcombos::setCombinationsIncrementParameters(): k(0)=" << k << endl;
554 while (
m_p[i] == 0) {
558 cerr <<
"xcombos::setCombinationsIncrementParameters(): i(1)=" << i << endl;
566 cerr <<
"xcombos::setCombinationsIncrementParameters(): p(1): ";
567 for (
size_t l = 0; l <
m_p.size(); l++) {
568 cerr <<
m_p[l] <<
" ";
571 cerr <<
"x=" <<
m_x <<
"(1)" << endl;
572 cerr <<
"y=" <<
m_y <<
"(0)" << endl;
576 cerr <<
"xcombos::setCombinationsIncrementParameters(): i=" << i << endl;
577 cerr <<
"xcombos::setCombinationsIncrementParameters(): p(2): ";
578 for (
size_t l = 0; l <
m_p.size(); l++) {
579 cerr <<
m_p[l] <<
" ";
594 cerr <<
"xcombos::setCombinationsIncrementParameters(): p(3): ";
595 for (
size_t l = 0; l <
m_p.size(); l++) {
596 cerr <<
m_p[l] <<
" ";
599 cerr <<
"x=" <<
m_x <<
"(1)" << endl;
600 cerr <<
"y=" <<
m_y <<
"(0)" << endl;
624 cerr <<
"xcombos::getNextEnumeration: p(0) = " << p << endl;
631 for (
int i = p + 1; i <
m_choose; i++) {
643 cerr <<
"xcombos::getNextEnumeration: m_current(0): ";
644 for (
size_t i = 0; i <
m_current.size(); i++) {
This file contains the preprocessor macros to ensure a proper instantiation of all aurostd functions.
#define AST_GEN_1(type_selection)
autogenerate 1D code based on AST_TEMPLATE
void setCombinationsIncrementParameters()
void incrementPermutation()
const std::vector< int > & getCombo() const
std::vector< int > m_sets
algorithm_xcombos m_algorithm
void initializeCombinationsP()
void incrementCombinations()
std::vector< int > getIndices() const
std::vector< int > m_indices
void copy(const xcombos &b)
void incrementEnumerations()
void getNextEnumeration()
const xcombos & operator=(const xcombos &other)
std::vector< int > m_input
std::vector< int > m_current
std::vector< utype > applyCombo(const std::vector< utype > &v_items) const
utype mode(const xvector< utype > &a)
void sort(vector< utype1 > &arr)
string joinWDelimiter(const xvector< utype > &ientries, const char delimiter)