27 #ifndef DOXYGEN_SHOULD_SKIP_THIS 38 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
41 TABLE< GUM_SCALAR >* (*combine)(
const TABLE< GUM_SCALAR >&,
42 const TABLE< GUM_SCALAR >&),
43 TABLE< GUM_SCALAR >* (*project)(
const TABLE< GUM_SCALAR >&,
44 const Set< const DiscreteVariable* >&)) :
45 MultiDimCombineAndProject< GUM_SCALAR, TABLE >(),
46 __combination(new MultiDimCombinationDefault< GUM_SCALAR, TABLE >(combine)),
47 __projection(new MultiDimProjection< GUM_SCALAR, TABLE >(project)) {
53 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
56 const MultiDimCombineAndProjectDefault< GUM_SCALAR, TABLE >& from) :
65 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
75 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
76 MultiDimCombineAndProjectDefault< GUM_SCALAR, TABLE >*
78 return new MultiDimCombineAndProjectDefault< GUM_SCALAR, TABLE >(*this);
82 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
83 Set< const TABLE< GUM_SCALAR >* >
85 Set<
const TABLE< GUM_SCALAR >* > table_set,
86 Set< const DiscreteVariable* > del_vars) {
100 Set< const DiscreteVariable* > all_vars;
102 for (
typename Set<
const TABLE< GUM_SCALAR >* >::const_iterator_safe iter =
103 table_set.beginSafe();
104 iter != table_set.endSafe();
106 const Sequence< const DiscreteVariable* >& iter_vars =
107 (*iter)->variablesSequence();
110 iter_vars.beginSafe();
111 it != iter_vars.endSafe();
113 all_vars.insert(*it);
117 nb_vars = all_vars.size();
121 HashTable< const DiscreteVariable*, Set< const TABLE< GUM_SCALAR >* > >
122 tables_per_var(nb_vars);
128 HashTable<
const DiscreteVariable*,
129 HashTable< const DiscreteVariable*, unsigned int > >
130 tables_vars_per_var(nb_vars);
134 Set< const TABLE< GUM_SCALAR >* > empty_set(table_set.size());
135 HashTable< const DiscreteVariable*, unsigned int > empty_hash(nb_vars);
138 del_vars.beginSafe();
139 iter != del_vars.endSafe();
141 tables_per_var.insert(*iter, empty_set);
142 tables_vars_per_var.insert(*iter, empty_hash);
146 for (
typename Set<
const TABLE< GUM_SCALAR >* >::const_iterator_safe iter =
147 table_set.beginSafe();
148 iter != table_set.endSafe();
150 const Sequence< const DiscreteVariable* >& vars =
151 (*iter)->variablesSequence();
153 for (
unsigned int i = 0; i < vars.size(); ++i) {
154 if (del_vars.contains(vars[i])) {
156 tables_per_var[vars[i]].insert(*iter);
158 HashTable< const DiscreteVariable*, unsigned int >& iter_vars =
159 tables_vars_per_var[vars[i]];
161 for (
unsigned int j = 0; j < vars.size(); ++j) {
163 ++iter_vars[vars[j]];
164 }
catch (
const NotFound&) { iter_vars.insert(vars[j], 1); }
172 PriorityQueue< const DiscreteVariable*, float > product_size;
176 for (
typename HashTable<
const DiscreteVariable*,
177 HashTable< const DiscreteVariable*, unsigned int > >::
178 const_iterator_safe iter = tables_vars_per_var.beginSafe();
179 iter != tables_vars_per_var.endSafe();
182 const HashTable< const DiscreteVariable*, unsigned int >& vars = iter.val();
185 for (
typename HashTable<
const DiscreteVariable*,
186 unsigned int >::const_iterator_safe iter2 =
188 iter2 != vars.endSafe();
190 size *= iter2.key()->domainSize();
193 product_size.insert(iter.key(), size);
199 Set< const TABLE< GUM_SCALAR >* > tmp_marginals(table_set.size());
204 while (!product_size.empty()) {
206 const DiscreteVariable* del_var = product_size.pop();
207 del_vars.erase(del_var);
210 Set< const TABLE< GUM_SCALAR >* >& tables_to_combine =
211 tables_per_var[del_var];
215 if (tables_to_combine.size() == 0)
continue;
220 TABLE< GUM_SCALAR >* joint;
222 bool joint_to_delete =
false;
224 if (tables_to_combine.size() == 1) {
226 const_cast< TABLE< GUM_SCALAR >*
>(*(tables_to_combine.beginSafe()));
227 joint_to_delete =
false;
230 joint_to_delete =
true;
234 Set< const DiscreteVariable* > del_one_var;
236 del_one_var << del_var;
238 TABLE< GUM_SCALAR >* marginal =
__projection->project(*joint, del_one_var);
241 if (joint_to_delete)
delete joint;
249 for (
typename Set<
const TABLE< GUM_SCALAR >* >::const_iterator_safe iter =
250 tables_to_combine.beginSafe();
251 iter != tables_to_combine.endSafe();
253 const Sequence< const DiscreteVariable* >& table_vars =
254 (*iter)->variablesSequence();
256 for (
unsigned int i = 0; i < table_vars.size(); ++i) {
257 if (del_vars.contains(table_vars[i])) {
260 HashTable< const DiscreteVariable*, unsigned int >&
261 table_vars_of_var_i = tables_vars_per_var[table_vars[i]];
262 float div_size = 1.0f;
264 for (
unsigned int j = 0; j < table_vars.size(); ++j) {
265 unsigned int k = --table_vars_of_var_i[table_vars[j]];
268 div_size *= table_vars[j]->domainSize();
269 table_vars_of_var_i.erase(table_vars[j]);
273 tables_per_var[table_vars[i]].erase(*iter);
276 product_size.setPriority(
277 table_vars[i], product_size.priority(table_vars[i]) / div_size);
282 if (tmp_marginals.contains(*iter)) {
284 tmp_marginals.erase(*iter);
287 table_set.erase(*iter);
290 tables_per_var.erase(del_var);
293 const Sequence< const DiscreteVariable* >& marginal_vars =
294 marginal->variablesSequence();
296 for (
unsigned int i = 0; i < marginal_vars.size(); ++i) {
297 if (del_vars.contains(marginal_vars[i])) {
299 tables_per_var[marginal_vars[i]].insert(marginal);
302 HashTable< const DiscreteVariable*, unsigned int >& iter_vars =
303 tables_vars_per_var[marginal_vars[i]];
304 float mult_size = 1.0f;
306 for (
unsigned int j = 0; j < marginal_vars.size(); ++j) {
308 ++iter_vars[marginal_vars[j]];
309 }
catch (
const NotFound&) {
310 iter_vars.insert(marginal_vars[j], 1);
311 mult_size *= marginal_vars[j]->domainSize();
315 if (mult_size != 1) {
316 product_size.setPriority(marginal_vars[i],
317 product_size.priority(marginal_vars[i])
323 table_set.insert(marginal);
325 tmp_marginals.insert(marginal);
337 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
340 TABLE< GUM_SCALAR >* (*combine)(
const TABLE< GUM_SCALAR >&,
341 const TABLE< GUM_SCALAR >&)) {
346 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
347 INLINE TABLE< GUM_SCALAR >* (
349 const TABLE< GUM_SCALAR >&,
const TABLE< GUM_SCALAR >&) {
354 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
357 const MultiDimCombination< GUM_SCALAR, TABLE >& comb_class) {
363 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
366 TABLE< GUM_SCALAR >* (*proj)(
const TABLE< GUM_SCALAR >&,
367 const Set< const DiscreteVariable* >&)) {
372 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
373 INLINE TABLE< GUM_SCALAR >* (
375 const TABLE< GUM_SCALAR >&,
const Set< const DiscreteVariable* >&) {
380 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
383 const MultiDimProjection< GUM_SCALAR, TABLE >& proj_class) {
390 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
392 const Set<
const Sequence< const DiscreteVariable* >* >& table_set,
393 Set< const DiscreteVariable* > del_vars)
const {
409 Set< const DiscreteVariable* > all_vars;
411 for (
typename Set<
const Sequence< const DiscreteVariable* >* >::
412 const_iterator_safe iter = table_set.beginSafe();
413 iter != table_set.endSafe();
415 const Sequence< const DiscreteVariable* >& iter_vars = **iter;
418 iter_vars.beginSafe();
419 it != iter_vars.endSafe();
421 all_vars.insert(*it);
425 nb_vars = all_vars.size();
429 HashTable<
const DiscreteVariable*,
430 Set< const Sequence< const DiscreteVariable* >* > >
431 tables_per_var(nb_vars);
437 HashTable<
const DiscreteVariable*,
438 HashTable< const DiscreteVariable*, unsigned int > >
439 tables_vars_per_var(nb_vars);
443 Set< const Sequence< const DiscreteVariable* >* > empty_set(
445 HashTable< const DiscreteVariable*, unsigned int > empty_hash(nb_vars);
448 del_vars.beginSafe();
449 iter != del_vars.endSafe();
451 tables_per_var.insert(*iter, empty_set);
452 tables_vars_per_var.insert(*iter, empty_hash);
456 for (
typename Set<
const Sequence< const DiscreteVariable* >* >::
457 const_iterator_safe iter = table_set.beginSafe();
458 iter != table_set.endSafe();
460 const Sequence< const DiscreteVariable* >& vars = **iter;
462 for (
unsigned int i = 0; i < vars.size(); ++i) {
463 if (del_vars.contains(vars[i])) {
465 tables_per_var[vars[i]].insert(*iter);
467 HashTable< const DiscreteVariable*, unsigned int >& iter_vars =
468 tables_vars_per_var[vars[i]];
470 for (
unsigned int j = 0; j < vars.size(); ++j) {
472 ++iter_vars[vars[j]];
473 }
catch (
const NotFound&) { iter_vars.insert(vars[j], 1); }
481 PriorityQueue< const DiscreteVariable*, float > product_size;
485 for (
typename HashTable<
const DiscreteVariable*,
486 HashTable< const DiscreteVariable*, unsigned int > >::
487 const_iterator_safe iter = tables_vars_per_var.beginSafe();
488 iter != tables_vars_per_var.endSafe();
491 const HashTable< const DiscreteVariable*, unsigned int >& vars = iter.val();
494 for (
typename HashTable<
const DiscreteVariable*,
495 unsigned int >::const_iterator_safe iter2 =
497 iter2 != vars.endSafe();
499 size *= iter2.key()->domainSize();
502 product_size.insert(iter.key(), size);
507 float nb_operations = 0;
511 Set< const Sequence< const DiscreteVariable* >* > tmp_marginals(
517 while (!product_size.empty()) {
519 const DiscreteVariable* del_var = product_size.pop();
520 del_vars.erase(del_var);
523 Set< const Sequence< const DiscreteVariable* >* >& tables_to_combine =
524 tables_per_var[del_var];
528 if (tables_to_combine.size() == 0)
continue;
533 Sequence< const DiscreteVariable* >* joint;
535 bool joint_to_delete =
false;
537 if (tables_to_combine.size() == 1) {
538 joint =
const_cast< Sequence< const DiscreteVariable* >*
>(
539 *(tables_to_combine.beginSafe()));
540 joint_to_delete =
false;
543 joint =
new Sequence< const DiscreteVariable* >;
545 for (
typename Set<
const Sequence< const DiscreteVariable* >* >::
546 const_iterator_safe iter = tables_to_combine.beginSafe();
547 iter != tables_to_combine.endSafe();
549 const Sequence< const DiscreteVariable* >& vars = **iter;
552 iter2 = vars.beginSafe();
553 iter2 != vars.endSafe();
555 if (!joint->exists(*iter2)) { joint->insert(*iter2); }
559 joint_to_delete =
true;
562 nb_operations +=
__combination->nbOperations(tables_to_combine);
566 Set< const DiscreteVariable* > del_one_var;
568 del_one_var << del_var;
570 nb_operations +=
__projection->nbOperations(*joint, del_one_var);
573 Sequence< const DiscreteVariable* >* marginal;
575 if (joint_to_delete) {
578 marginal =
new Sequence< const DiscreteVariable* >(*joint);
581 marginal->erase(del_var);
589 for (
typename Set<
const Sequence< const DiscreteVariable* >* >::
590 const_iterator_safe iter = tables_to_combine.beginSafe();
591 iter != tables_to_combine.endSafe();
593 const Sequence< const DiscreteVariable* >& table_vars = **iter;
595 for (
unsigned int i = 0; i < table_vars.size(); ++i) {
596 if (del_vars.contains(table_vars[i])) {
599 HashTable< const DiscreteVariable*, unsigned int >&
600 table_vars_of_var_i = tables_vars_per_var[table_vars[i]];
601 float div_size = 1.0f;
603 for (
unsigned int j = 0; j < table_vars.size(); ++j) {
604 unsigned int k = --table_vars_of_var_i[table_vars[j]];
607 div_size *= table_vars[j]->domainSize();
608 table_vars_of_var_i.erase(table_vars[j]);
612 tables_per_var[table_vars[i]].erase(*iter);
615 product_size.setPriority(
616 table_vars[i], product_size.priority(table_vars[i]) / div_size);
621 if (tmp_marginals.contains(*iter)) {
623 tmp_marginals.erase(*iter);
627 tables_per_var.erase(del_var);
631 for (
unsigned int i = 0; i < marginal->size(); ++i) {
632 const DiscreteVariable* var_i = marginal->atPos(i);
634 if (del_vars.contains(var_i)) {
636 tables_per_var[var_i].insert(marginal);
639 HashTable< const DiscreteVariable*, unsigned int >& iter_vars =
640 tables_vars_per_var[var_i];
641 float mult_size = 1.0f;
643 for (
unsigned int j = 0; j < marginal->size(); ++j) {
645 ++iter_vars[marginal->atPos(j)];
646 }
catch (
const NotFound&) {
647 iter_vars.insert(marginal->atPos(j), 1);
648 mult_size *= marginal->atPos(j)->domainSize();
652 if (mult_size != 1) {
653 product_size.setPriority(var_i,
654 product_size.priority(var_i) * mult_size);
659 tmp_marginals.insert(marginal);
664 for (
typename Set<
const Sequence< const DiscreteVariable* >* >::
665 const_iterator_safe iter = tmp_marginals.beginSafe();
666 iter != tmp_marginals.endSafe();
671 return nb_operations;
676 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
678 const Set<
const TABLE< GUM_SCALAR >* >&
set,
679 const Set< const DiscreteVariable* >& del_vars)
const {
681 Set< const Sequence< const DiscreteVariable* >* > var_set(
set.size());
683 for (
typename Set<
const TABLE< GUM_SCALAR >* >::const_iterator_safe iter =
685 iter !=
set.endSafe();
687 var_set << &((*iter)->variablesSequence());
695 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
696 std::pair< long, long >
698 const Set<
const Sequence< const DiscreteVariable* >* >& table_set,
699 Set< const DiscreteVariable* > del_vars)
const {
715 Set< const DiscreteVariable* > all_vars;
717 for (
typename Set<
const Sequence< const DiscreteVariable* >* >::
718 const_iterator_safe iter = table_set.beginSafe();
719 iter != table_set.endSafe();
721 const Sequence< const DiscreteVariable* >& iter_vars = **iter;
724 iter_vars.beginSafe();
725 it != iter_vars.endSafe();
727 all_vars.insert(*it);
731 nb_vars = all_vars.size();
735 HashTable<
const DiscreteVariable*,
736 Set< const Sequence< const DiscreteVariable* >* > >
737 tables_per_var(nb_vars);
743 HashTable<
const DiscreteVariable*,
744 HashTable< const DiscreteVariable*, unsigned int > >
745 tables_vars_per_var(nb_vars);
749 Set< const Sequence< const DiscreteVariable* >* > empty_set(
751 HashTable< const DiscreteVariable*, unsigned int > empty_hash(nb_vars);
754 del_vars.beginSafe();
755 iter != del_vars.endSafe();
757 tables_per_var.insert(*iter, empty_set);
758 tables_vars_per_var.insert(*iter, empty_hash);
762 for (
typename Set<
const Sequence< const DiscreteVariable* >* >::
763 const_iterator_safe iter = table_set.beginSafe();
764 iter != table_set.endSafe();
766 const Sequence< const DiscreteVariable* >& vars = **iter;
768 for (
unsigned int i = 0; i < vars.size(); ++i) {
769 if (del_vars.contains(vars[i])) {
771 tables_per_var[vars[i]].insert(*iter);
773 HashTable< const DiscreteVariable*, unsigned int >& iter_vars =
774 tables_vars_per_var[vars[i]];
776 for (
unsigned int j = 0; j < vars.size(); ++j) {
778 ++iter_vars[vars[j]];
779 }
catch (
const NotFound&) { iter_vars.insert(vars[j], 1); }
787 PriorityQueue< const DiscreteVariable*, float > product_size;
791 for (
typename HashTable<
const DiscreteVariable*,
792 HashTable< const DiscreteVariable*, unsigned int > >::
793 const_iterator_safe iter = tables_vars_per_var.beginSafe();
794 iter != tables_vars_per_var.endSafe();
797 const HashTable< const DiscreteVariable*, unsigned int >& vars = iter.val();
800 for (
typename HashTable<
const DiscreteVariable*,
801 unsigned int >::const_iterator_safe iter2 =
803 iter2 != vars.endSafe();
805 size *= iter2.key()->domainSize();
808 product_size.insert(iter.key(), size);
815 long current_memory = 0;
819 Set< const Sequence< const DiscreteVariable* >* > tmp_marginals(
825 while (!product_size.empty()) {
827 const DiscreteVariable* del_var = product_size.pop();
828 del_vars.erase(del_var);
831 Set< const Sequence< const DiscreteVariable* >* >& tables_to_combine =
832 tables_per_var[del_var];
836 if (tables_to_combine.size() == 0)
continue;
841 Sequence< const DiscreteVariable* >* joint;
843 bool joint_to_delete =
false;
845 if (tables_to_combine.size() == 1) {
846 joint =
const_cast< Sequence< const DiscreteVariable* >*
>(
847 *(tables_to_combine.beginSafe()));
848 joint_to_delete =
false;
851 joint =
new Sequence< const DiscreteVariable* >;
853 for (
typename Set<
const Sequence< const DiscreteVariable* >* >::
854 const_iterator_safe iter = tables_to_combine.beginSafe();
855 iter != tables_to_combine.endSafe();
857 const Sequence< const DiscreteVariable* >& vars = **iter;
860 iter2 = vars.beginSafe();
861 iter2 != vars.endSafe();
863 if (!joint->exists(*iter2)) { joint->insert(*iter2); }
867 joint_to_delete =
true;
870 std::pair< long, long > comb_memory =
873 if ((std::numeric_limits< long >::max() - current_memory
875 || (std::numeric_limits< long >::max() - current_memory
876 < comb_memory.second)) {
877 GUM_ERROR(OutOfBounds,
"memory usage out of long int range");
880 if (current_memory + comb_memory.first > max_memory) {
881 max_memory = current_memory + comb_memory.first;
884 current_memory += comb_memory.second;
888 Set< const DiscreteVariable* > del_one_var;
890 del_one_var << del_var;
892 std::pair< long, long > comb_memory =
895 if ((std::numeric_limits< long >::max() - current_memory < comb_memory.first)
896 || (std::numeric_limits< long >::max() - current_memory
897 < comb_memory.second)) {
898 GUM_ERROR(OutOfBounds,
"memory usage out of long int range");
901 if (current_memory + comb_memory.first > max_memory) {
902 max_memory = current_memory + comb_memory.first;
905 current_memory += comb_memory.second;
908 Sequence< const DiscreteVariable* >* marginal;
910 if (joint_to_delete) {
913 marginal =
new Sequence< const DiscreteVariable* >(*joint);
916 marginal->erase(del_var);
924 for (
typename Set<
const Sequence< const DiscreteVariable* >* >::
925 const_iterator_safe iter = tables_to_combine.beginSafe();
926 iter != tables_to_combine.endSafe();
928 const Sequence< const DiscreteVariable* >& table_vars = **iter;
930 for (
unsigned int i = 0; i < table_vars.size(); ++i) {
931 if (del_vars.contains(table_vars[i])) {
934 HashTable< const DiscreteVariable*, unsigned int >&
935 table_vars_of_var_i = tables_vars_per_var[table_vars[i]];
936 float div_size = 1.0f;
938 for (
unsigned int j = 0; j < table_vars.size(); ++j) {
939 unsigned int k = --table_vars_of_var_i[table_vars[j]];
942 div_size *= table_vars[j]->domainSize();
943 table_vars_of_var_i.erase(table_vars[j]);
947 tables_per_var[table_vars[i]].erase(*iter);
950 product_size.setPriority(
951 table_vars[i], product_size.priority(table_vars[i]) / div_size);
956 if (tmp_marginals.contains(*iter)) {
958 const Sequence< const DiscreteVariable* >& del = **iter;
961 iter_del = del.beginSafe();
962 iter_del != del.endSafe();
964 del_size *= (*iter_del)->domainSize();
967 current_memory -= long(del_size);
970 tmp_marginals.erase(*iter);
974 tables_per_var.erase(del_var);
978 for (
unsigned int i = 0; i < marginal->size(); ++i) {
979 const DiscreteVariable* var_i = marginal->atPos(i);
981 if (del_vars.contains(var_i)) {
983 tables_per_var[var_i].insert(marginal);
986 HashTable< const DiscreteVariable*, unsigned int >& iter_vars =
987 tables_vars_per_var[var_i];
988 float mult_size = 1.0f;
990 for (
unsigned int j = 0; j < marginal->size(); ++j) {
992 ++iter_vars[marginal->atPos(j)];
993 }
catch (
const NotFound&) {
994 iter_vars.insert(marginal->atPos(j), 1);
995 mult_size *= marginal->atPos(j)->domainSize();
999 if (mult_size != 1) {
1000 product_size.setPriority(var_i,
1001 product_size.priority(var_i) * mult_size);
1006 tmp_marginals.insert(marginal);
1010 for (
typename Set<
const Sequence< const DiscreteVariable* >* >::
1011 const_iterator_safe iter = tmp_marginals.beginSafe();
1012 iter != tmp_marginals.endSafe();
1017 return std::pair< long, long >(max_memory, current_memory);
1022 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
1023 std::pair< long, long >
1025 const Set<
const TABLE< GUM_SCALAR >* >&
set,
1026 const Set< const DiscreteVariable* >& del_vars)
const {
1028 Set< const Sequence< const DiscreteVariable* >* > var_set(
set.size());
1030 for (
typename Set<
const TABLE< GUM_SCALAR >* >::const_iterator_safe iter =
1032 iter !=
set.endSafe();
1034 var_set << &((*iter)->variablesSequence());
virtual ~MultiDimCombineAndProjectDefault()
Destructor.
virtual void setCombineFunction(TABLE< GUM_SCALAR > *(*combine)(const TABLE< GUM_SCALAR > &, const TABLE< GUM_SCALAR > &))
changes the function used for combining two TABLES
gum is the global namespace for all aGrUM entities
MultiDimProjection< GUM_SCALAR, TABLE > * __projection
the class used for the projections
SetIteratorSafe< Key > const_iterator_safe
Types for STL compliance.
virtual float nbOperations(const Set< const TABLE< GUM_SCALAR > * > &set, const Set< const DiscreteVariable * > &del_vars) const
returns a rough estimate of the number of operations that will be performed to compute the combinatio...
virtual TABLE< GUM_SCALAR > *(*)(const TABLE< GUM_SCALAR > &, const TABLE< GUM_SCALAR > &) combineFunction()
Returns the current combination function.
virtual void setProjectionClass(const MultiDimProjection< GUM_SCALAR, TABLE > &proj_class)
Changes the class that performs the projections.
virtual TABLE< GUM_SCALAR > *(*)(const TABLE< GUM_SCALAR > &, const Set< const DiscreteVariable *> &) projectFunction()
returns the current projection function
virtual void setCombinationClass(const MultiDimCombination< GUM_SCALAR, TABLE > &comb_class)
changes the class that performs the combinations
MultiDimCombination< GUM_SCALAR, TABLE > * __combination
the class used for the combinations
MultiDimCombineAndProject()
default constructor
MultiDimCombineAndProjectDefault(TABLE< GUM_SCALAR > *(*combine)(const TABLE< GUM_SCALAR > &, const TABLE< GUM_SCALAR > &), TABLE< GUM_SCALAR > *(*project)(const TABLE< GUM_SCALAR > &, const Set< const DiscreteVariable * > &))
Default constructor.
virtual MultiDimCombineAndProjectDefault< GUM_SCALAR, TABLE > * newFactory() const
virtual constructor
std::size_t Size
In aGrUM, hashed values are unsigned long int.
virtual std::pair< long, long > memoryUsage(const Set< const TABLE< GUM_SCALAR > * > &set, const Set< const DiscreteVariable * > &del_vars) const
returns the memory consumption used during the combinations and projections
#define GUM_ERROR(type, msg)
virtual void setProjectFunction(TABLE< GUM_SCALAR > *(*proj)(const TABLE< GUM_SCALAR > &, const Set< const DiscreteVariable * > &))
Changes the function used for projecting TABLES.
SequenceIteratorSafe< Key > const_iterator_safe
Types for STL compliance.
virtual Set< const TABLE< GUM_SCALAR > *> combineAndProject(Set< const TABLE< GUM_SCALAR > * > set, Set< const DiscreteVariable * > del_vars)
creates and returns the result of the projection over the variables not in del_vars of the combinatio...