25 #include "../base/assert.h" 26 #include "../base/vector.h" 37 static size_t CountCombos(
size_t max_count,
size_t combo_size);
39 ComboIDs(
size_t in_max,
size_t combo_size);
48 size_t &
operator[](
const size_t index) {
return cur_combo[index]; }
49 const size_t &
operator[](
const size_t index)
const {
return cur_combo[index]; }
62 size_t size() {
return num_combos; }
66 : max_count(in_max), cur_combo(combo_size), max_combo(combo_size),
67 num_combos(CountCombos(in_max, combo_size))
70 const size_t diff = in_max - combo_size;
71 for (
size_t i = 0; i < cur_combo.
size(); i++) {
73 max_combo[i] = i+diff;
79 for (
size_t i = 0; i < cur_combo.
size(); i++) {
87 size_t inc_pos = cur_combo.
size() - 1;
91 while (inc_pos > 0 && cur_combo[inc_pos] > max_combo[inc_pos]) {
97 if (cur_combo[0] > max_combo[0]) {
103 for (
size_t i = inc_pos + 1; i < cur_combo.
size(); i++) {
104 cur_combo[i] = cur_combo[i-1] + 1;
115 cur_combo.
resize(new_size);
116 max_combo.
resize(new_size);
117 num_combos = CountCombos(max_count, new_size);
119 const size_t diff = max_count - new_size;
120 for (
size_t i = 0; i < new_size; i++) {
122 max_combo[i] = i+diff;
129 size_t inverse_size = max_count - cur_combo.
size();
134 for (
size_t i = 0; i < max_count; i++) {
135 if (norm_pos < cur_combo.
size() && cur_combo[norm_pos] == i) {
137 }
else inverse_combo[inv_pos++] = i;
139 return inverse_combo;
143 size_t ComboIDs::CountCombos(
size_t max_count,
size_t combo_size)
145 if (combo_size * 2 > max_count) combo_size = max_count - combo_size;
147 size_t choose_product = 1;
148 size_t total_product = 1;
149 for (
size_t i = 0; i < combo_size; i++) {
150 choose_product *= i+1;
151 total_product *= max_count - i;
154 return total_product / choose_product;
~ComboIDs()
Definition: combos.h:40
bool NextCombo()
Definition: combos.h:85
const emp::vector< size_t > & GetMaxCombo() const
Definition: combos.h:44
size_t size() const
Definition: vector.h:151
const emp::vector< size_t > & GetCombo() const
Definition: combos.h:43
size_t size()
Definition: combos.h:62
emp::vector< size_t > GetInverseCombo()
Definition: combos.h:127
ComboIDs & operator++(int)
Definition: combos.h:61
const size_t & operator[](const size_t index) const
Definition: combos.h:49
void resize(size_t new_size)
Definition: vector.h:161
size_t GetNumCombos() const
Definition: combos.h:46
If we are in emscripten, make sure to include the header.
Definition: array.h:37
const emp::vector< size_t > & Reset()
Definition: combos.h:77
#define emp_assert(...)
Definition: assert.h:199
ComboIDs & operator++()
Definition: combos.h:60
ComboIDs(size_t in_max, size_t combo_size)
Definition: combos.h:65
size_t GetComboSize() const
Definition: combos.h:45
size_t & operator[](const size_t index)
Definition: combos.h:48
void ResizeCombos(size_t new_size)
Definition: combos.h:110