30 #ifndef DOXYGEN_SHOULD_SKIP_THIS 41 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
44 TABLE< GUM_SCALAR >* (*combine)(
const TABLE< GUM_SCALAR >&,
45 const TABLE< GUM_SCALAR >&),
46 TABLE< GUM_SCALAR >* (*project)(
const TABLE< GUM_SCALAR >&,
47 const Set< const DiscreteVariable* >&)) :
48 MultiDimCombineAndProject< GUM_SCALAR, TABLE >(),
49 __combination(new MultiDimCombinationDefault< GUM_SCALAR, TABLE >(combine)),
50 __projection(new MultiDimProjection< GUM_SCALAR, TABLE >(project)) {
56 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
59 const MultiDimCombineAndProjectDefault< GUM_SCALAR, TABLE >& from) :
68 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
78 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
79 MultiDimCombineAndProjectDefault< GUM_SCALAR, TABLE >*
81 return new MultiDimCombineAndProjectDefault< GUM_SCALAR, TABLE >(*this);
85 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
86 Set< const TABLE< GUM_SCALAR >* >
88 Set<
const TABLE< GUM_SCALAR >* > table_set,
89 Set< const DiscreteVariable* > del_vars) {
103 Set< const DiscreteVariable* > all_vars;
105 for (
typename Set<
const TABLE< GUM_SCALAR >* >::const_iterator_safe iter =
106 table_set.beginSafe();
107 iter != table_set.endSafe();
109 const Sequence< const DiscreteVariable* >& iter_vars =
110 (*iter)->variablesSequence();
113 iter_vars.beginSafe();
114 it != iter_vars.endSafe();
116 all_vars.insert(*it);
120 nb_vars = all_vars.size();
124 HashTable< const DiscreteVariable*, Set< const TABLE< GUM_SCALAR >* > >
125 tables_per_var(nb_vars);
131 HashTable<
const DiscreteVariable*,
132 HashTable< const DiscreteVariable*, unsigned int > >
133 tables_vars_per_var(nb_vars);
137 Set< const TABLE< GUM_SCALAR >* > empty_set(table_set.size());
138 HashTable< const DiscreteVariable*, unsigned int > empty_hash(nb_vars);
141 del_vars.beginSafe();
142 iter != del_vars.endSafe();
144 tables_per_var.insert(*iter, empty_set);
145 tables_vars_per_var.insert(*iter, empty_hash);
149 for (
typename Set<
const TABLE< GUM_SCALAR >* >::const_iterator_safe iter =
150 table_set.beginSafe();
151 iter != table_set.endSafe();
153 const Sequence< const DiscreteVariable* >& vars =
154 (*iter)->variablesSequence();
156 for (
unsigned int i = 0; i < vars.size(); ++i) {
157 if (del_vars.contains(vars[i])) {
159 tables_per_var[vars[i]].insert(*iter);
161 HashTable< const DiscreteVariable*, unsigned int >& iter_vars =
162 tables_vars_per_var[vars[i]];
164 for (
unsigned int j = 0; j < vars.size(); ++j) {
166 ++iter_vars[vars[j]];
167 }
catch (
const NotFound&) { iter_vars.insert(vars[j], 1); }
175 PriorityQueue< const DiscreteVariable*, float > product_size;
179 for (
typename HashTable<
const DiscreteVariable*,
180 HashTable< const DiscreteVariable*, unsigned int > >::
181 const_iterator_safe iter = tables_vars_per_var.beginSafe();
182 iter != tables_vars_per_var.endSafe();
185 const HashTable< const DiscreteVariable*, unsigned int >& vars = iter.val();
188 for (
typename HashTable<
const DiscreteVariable*,
189 unsigned int >::const_iterator_safe iter2 =
191 iter2 != vars.endSafe();
193 size *= iter2.key()->domainSize();
196 product_size.insert(iter.key(), size);
202 Set< const TABLE< GUM_SCALAR >* > tmp_marginals(table_set.size());
207 while (!product_size.empty()) {
209 const DiscreteVariable* del_var = product_size.pop();
210 del_vars.erase(del_var);
213 Set< const TABLE< GUM_SCALAR >* >& tables_to_combine =
214 tables_per_var[del_var];
218 if (tables_to_combine.size() == 0)
continue;
223 TABLE< GUM_SCALAR >* joint;
225 bool joint_to_delete =
false;
227 if (tables_to_combine.size() == 1) {
229 const_cast< TABLE< GUM_SCALAR >*
>(*(tables_to_combine.beginSafe()));
230 joint_to_delete =
false;
233 joint_to_delete =
true;
237 Set< const DiscreteVariable* > del_one_var;
239 del_one_var << del_var;
241 TABLE< GUM_SCALAR >* marginal =
__projection->project(*joint, del_one_var);
244 if (joint_to_delete)
delete joint;
252 for (
typename Set<
const TABLE< GUM_SCALAR >* >::const_iterator_safe iter =
253 tables_to_combine.beginSafe();
254 iter != tables_to_combine.endSafe();
256 const Sequence< const DiscreteVariable* >& table_vars =
257 (*iter)->variablesSequence();
259 for (
unsigned int i = 0; i < table_vars.size(); ++i) {
260 if (del_vars.contains(table_vars[i])) {
263 HashTable< const DiscreteVariable*, unsigned int >&
264 table_vars_of_var_i = tables_vars_per_var[table_vars[i]];
265 float div_size = 1.0f;
267 for (
unsigned int j = 0; j < table_vars.size(); ++j) {
268 unsigned int k = --table_vars_of_var_i[table_vars[j]];
271 div_size *= table_vars[j]->domainSize();
272 table_vars_of_var_i.erase(table_vars[j]);
276 tables_per_var[table_vars[i]].erase(*iter);
279 product_size.setPriority(
280 table_vars[i], product_size.priority(table_vars[i]) / div_size);
285 if (tmp_marginals.contains(*iter)) {
287 tmp_marginals.erase(*iter);
290 table_set.erase(*iter);
293 tables_per_var.erase(del_var);
296 const Sequence< const DiscreteVariable* >& marginal_vars =
297 marginal->variablesSequence();
299 for (
unsigned int i = 0; i < marginal_vars.size(); ++i) {
300 if (del_vars.contains(marginal_vars[i])) {
302 tables_per_var[marginal_vars[i]].insert(marginal);
305 HashTable< const DiscreteVariable*, unsigned int >& iter_vars =
306 tables_vars_per_var[marginal_vars[i]];
307 float mult_size = 1.0f;
309 for (
unsigned int j = 0; j < marginal_vars.size(); ++j) {
311 ++iter_vars[marginal_vars[j]];
312 }
catch (
const NotFound&) {
313 iter_vars.insert(marginal_vars[j], 1);
314 mult_size *= marginal_vars[j]->domainSize();
318 if (mult_size != 1) {
319 product_size.setPriority(marginal_vars[i],
320 product_size.priority(marginal_vars[i])
326 table_set.insert(marginal);
328 tmp_marginals.insert(marginal);
340 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
343 TABLE< GUM_SCALAR >* (*combine)(
const TABLE< GUM_SCALAR >&,
344 const TABLE< GUM_SCALAR >&)) {
349 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
350 INLINE TABLE< GUM_SCALAR >* (
352 const TABLE< GUM_SCALAR >&,
const TABLE< GUM_SCALAR >&) {
357 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
360 const MultiDimCombination< GUM_SCALAR, TABLE >& comb_class) {
366 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
369 TABLE< GUM_SCALAR >* (*proj)(
const TABLE< GUM_SCALAR >&,
370 const Set< const DiscreteVariable* >&)) {
375 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
376 INLINE TABLE< GUM_SCALAR >* (
378 const TABLE< GUM_SCALAR >&,
const Set< const DiscreteVariable* >&) {
383 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
386 const MultiDimProjection< GUM_SCALAR, TABLE >& proj_class) {
393 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
395 const Set<
const Sequence< const DiscreteVariable* >* >& table_set,
396 Set< const DiscreteVariable* > del_vars)
const {
412 Set< const DiscreteVariable* > all_vars;
414 for (
typename Set<
const Sequence< const DiscreteVariable* >* >::
415 const_iterator_safe iter = table_set.beginSafe();
416 iter != table_set.endSafe();
418 const Sequence< const DiscreteVariable* >& iter_vars = **iter;
421 iter_vars.beginSafe();
422 it != iter_vars.endSafe();
424 all_vars.insert(*it);
428 nb_vars = all_vars.size();
432 HashTable<
const DiscreteVariable*,
433 Set< const Sequence< const DiscreteVariable* >* > >
434 tables_per_var(nb_vars);
440 HashTable<
const DiscreteVariable*,
441 HashTable< const DiscreteVariable*, unsigned int > >
442 tables_vars_per_var(nb_vars);
446 Set< const Sequence< const DiscreteVariable* >* > empty_set(
448 HashTable< const DiscreteVariable*, unsigned int > empty_hash(nb_vars);
451 del_vars.beginSafe();
452 iter != del_vars.endSafe();
454 tables_per_var.insert(*iter, empty_set);
455 tables_vars_per_var.insert(*iter, empty_hash);
459 for (
typename Set<
const Sequence< const DiscreteVariable* >* >::
460 const_iterator_safe iter = table_set.beginSafe();
461 iter != table_set.endSafe();
463 const Sequence< const DiscreteVariable* >& vars = **iter;
465 for (
unsigned int i = 0; i < vars.size(); ++i) {
466 if (del_vars.contains(vars[i])) {
468 tables_per_var[vars[i]].insert(*iter);
470 HashTable< const DiscreteVariable*, unsigned int >& iter_vars =
471 tables_vars_per_var[vars[i]];
473 for (
unsigned int j = 0; j < vars.size(); ++j) {
475 ++iter_vars[vars[j]];
476 }
catch (
const NotFound&) { iter_vars.insert(vars[j], 1); }
484 PriorityQueue< const DiscreteVariable*, float > product_size;
488 for (
typename HashTable<
const DiscreteVariable*,
489 HashTable< const DiscreteVariable*, unsigned int > >::
490 const_iterator_safe iter = tables_vars_per_var.beginSafe();
491 iter != tables_vars_per_var.endSafe();
494 const HashTable< const DiscreteVariable*, unsigned int >& vars = iter.val();
497 for (
typename HashTable<
const DiscreteVariable*,
498 unsigned int >::const_iterator_safe iter2 =
500 iter2 != vars.endSafe();
502 size *= iter2.key()->domainSize();
505 product_size.insert(iter.key(), size);
510 float nb_operations = 0;
514 Set< const Sequence< const DiscreteVariable* >* > tmp_marginals(
520 while (!product_size.empty()) {
522 const DiscreteVariable* del_var = product_size.pop();
523 del_vars.erase(del_var);
526 Set< const Sequence< const DiscreteVariable* >* >& tables_to_combine =
527 tables_per_var[del_var];
531 if (tables_to_combine.size() == 0)
continue;
536 Sequence< const DiscreteVariable* >* joint;
538 bool joint_to_delete =
false;
540 if (tables_to_combine.size() == 1) {
541 joint =
const_cast< Sequence< const DiscreteVariable* >*
>(
542 *(tables_to_combine.beginSafe()));
543 joint_to_delete =
false;
546 joint =
new Sequence< const DiscreteVariable* >;
548 for (
typename Set<
const Sequence< const DiscreteVariable* >* >::
549 const_iterator_safe iter = tables_to_combine.beginSafe();
550 iter != tables_to_combine.endSafe();
552 const Sequence< const DiscreteVariable* >& vars = **iter;
555 iter2 = vars.beginSafe();
556 iter2 != vars.endSafe();
558 if (!joint->exists(*iter2)) { joint->insert(*iter2); }
562 joint_to_delete =
true;
565 nb_operations +=
__combination->nbOperations(tables_to_combine);
569 Set< const DiscreteVariable* > del_one_var;
571 del_one_var << del_var;
573 nb_operations +=
__projection->nbOperations(*joint, del_one_var);
576 Sequence< const DiscreteVariable* >* marginal;
578 if (joint_to_delete) {
581 marginal =
new Sequence< const DiscreteVariable* >(*joint);
584 marginal->erase(del_var);
592 for (
typename Set<
const Sequence< const DiscreteVariable* >* >::
593 const_iterator_safe iter = tables_to_combine.beginSafe();
594 iter != tables_to_combine.endSafe();
596 const Sequence< const DiscreteVariable* >& table_vars = **iter;
598 for (
unsigned int i = 0; i < table_vars.size(); ++i) {
599 if (del_vars.contains(table_vars[i])) {
602 HashTable< const DiscreteVariable*, unsigned int >&
603 table_vars_of_var_i = tables_vars_per_var[table_vars[i]];
604 float div_size = 1.0f;
606 for (
unsigned int j = 0; j < table_vars.size(); ++j) {
607 unsigned int k = --table_vars_of_var_i[table_vars[j]];
610 div_size *= table_vars[j]->domainSize();
611 table_vars_of_var_i.erase(table_vars[j]);
615 tables_per_var[table_vars[i]].erase(*iter);
618 product_size.setPriority(
619 table_vars[i], product_size.priority(table_vars[i]) / div_size);
624 if (tmp_marginals.contains(*iter)) {
626 tmp_marginals.erase(*iter);
630 tables_per_var.erase(del_var);
634 for (
unsigned int i = 0; i < marginal->size(); ++i) {
635 const DiscreteVariable* var_i = marginal->atPos(i);
637 if (del_vars.contains(var_i)) {
639 tables_per_var[var_i].insert(marginal);
642 HashTable< const DiscreteVariable*, unsigned int >& iter_vars =
643 tables_vars_per_var[var_i];
644 float mult_size = 1.0f;
646 for (
unsigned int j = 0; j < marginal->size(); ++j) {
648 ++iter_vars[marginal->atPos(j)];
649 }
catch (
const NotFound&) {
650 iter_vars.insert(marginal->atPos(j), 1);
651 mult_size *= marginal->atPos(j)->domainSize();
655 if (mult_size != 1) {
656 product_size.setPriority(var_i,
657 product_size.priority(var_i) * mult_size);
662 tmp_marginals.insert(marginal);
667 for (
typename Set<
const Sequence< const DiscreteVariable* >* >::
668 const_iterator_safe iter = tmp_marginals.beginSafe();
669 iter != tmp_marginals.endSafe();
674 return nb_operations;
679 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
681 const Set<
const TABLE< GUM_SCALAR >* >&
set,
682 const Set< const DiscreteVariable* >& del_vars)
const {
684 Set< const Sequence< const DiscreteVariable* >* > var_set(
set.size());
686 for (
typename Set<
const TABLE< GUM_SCALAR >* >::const_iterator_safe iter =
688 iter !=
set.endSafe();
690 var_set << &((*iter)->variablesSequence());
698 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
699 std::pair< long, long >
701 const Set<
const Sequence< const DiscreteVariable* >* >& table_set,
702 Set< const DiscreteVariable* > del_vars)
const {
718 Set< const DiscreteVariable* > all_vars;
720 for (
typename Set<
const Sequence< const DiscreteVariable* >* >::
721 const_iterator_safe iter = table_set.beginSafe();
722 iter != table_set.endSafe();
724 const Sequence< const DiscreteVariable* >& iter_vars = **iter;
727 iter_vars.beginSafe();
728 it != iter_vars.endSafe();
730 all_vars.insert(*it);
734 nb_vars = all_vars.size();
738 HashTable<
const DiscreteVariable*,
739 Set< const Sequence< const DiscreteVariable* >* > >
740 tables_per_var(nb_vars);
746 HashTable<
const DiscreteVariable*,
747 HashTable< const DiscreteVariable*, unsigned int > >
748 tables_vars_per_var(nb_vars);
752 Set< const Sequence< const DiscreteVariable* >* > empty_set(
754 HashTable< const DiscreteVariable*, unsigned int > empty_hash(nb_vars);
757 del_vars.beginSafe();
758 iter != del_vars.endSafe();
760 tables_per_var.insert(*iter, empty_set);
761 tables_vars_per_var.insert(*iter, empty_hash);
765 for (
typename Set<
const Sequence< const DiscreteVariable* >* >::
766 const_iterator_safe iter = table_set.beginSafe();
767 iter != table_set.endSafe();
769 const Sequence< const DiscreteVariable* >& vars = **iter;
771 for (
unsigned int i = 0; i < vars.size(); ++i) {
772 if (del_vars.contains(vars[i])) {
774 tables_per_var[vars[i]].insert(*iter);
776 HashTable< const DiscreteVariable*, unsigned int >& iter_vars =
777 tables_vars_per_var[vars[i]];
779 for (
unsigned int j = 0; j < vars.size(); ++j) {
781 ++iter_vars[vars[j]];
782 }
catch (
const NotFound&) { iter_vars.insert(vars[j], 1); }
790 PriorityQueue< const DiscreteVariable*, float > product_size;
794 for (
typename HashTable<
const DiscreteVariable*,
795 HashTable< const DiscreteVariable*, unsigned int > >::
796 const_iterator_safe iter = tables_vars_per_var.beginSafe();
797 iter != tables_vars_per_var.endSafe();
800 const HashTable< const DiscreteVariable*, unsigned int >& vars = iter.val();
803 for (
typename HashTable<
const DiscreteVariable*,
804 unsigned int >::const_iterator_safe iter2 =
806 iter2 != vars.endSafe();
808 size *= iter2.key()->domainSize();
811 product_size.insert(iter.key(), size);
818 long current_memory = 0;
822 Set< const Sequence< const DiscreteVariable* >* > tmp_marginals(
828 while (!product_size.empty()) {
830 const DiscreteVariable* del_var = product_size.pop();
831 del_vars.erase(del_var);
834 Set< const Sequence< const DiscreteVariable* >* >& tables_to_combine =
835 tables_per_var[del_var];
839 if (tables_to_combine.size() == 0)
continue;
844 Sequence< const DiscreteVariable* >* joint;
846 bool joint_to_delete =
false;
848 if (tables_to_combine.size() == 1) {
849 joint =
const_cast< Sequence< const DiscreteVariable* >*
>(
850 *(tables_to_combine.beginSafe()));
851 joint_to_delete =
false;
854 joint =
new Sequence< const DiscreteVariable* >;
856 for (
typename Set<
const Sequence< const DiscreteVariable* >* >::
857 const_iterator_safe iter = tables_to_combine.beginSafe();
858 iter != tables_to_combine.endSafe();
860 const Sequence< const DiscreteVariable* >& vars = **iter;
863 iter2 = vars.beginSafe();
864 iter2 != vars.endSafe();
866 if (!joint->exists(*iter2)) { joint->insert(*iter2); }
870 joint_to_delete =
true;
873 std::pair< long, long > comb_memory =
876 if ((std::numeric_limits< long >::max() - current_memory
878 || (std::numeric_limits< long >::max() - current_memory
879 < comb_memory.second)) {
880 GUM_ERROR(OutOfBounds,
"memory usage out of long int range");
883 if (current_memory + comb_memory.first > max_memory) {
884 max_memory = current_memory + comb_memory.first;
887 current_memory += comb_memory.second;
891 Set< const DiscreteVariable* > del_one_var;
893 del_one_var << del_var;
895 std::pair< long, long > comb_memory =
898 if ((std::numeric_limits< long >::max() - current_memory < comb_memory.first)
899 || (std::numeric_limits< long >::max() - current_memory
900 < comb_memory.second)) {
901 GUM_ERROR(OutOfBounds,
"memory usage out of long int range");
904 if (current_memory + comb_memory.first > max_memory) {
905 max_memory = current_memory + comb_memory.first;
908 current_memory += comb_memory.second;
911 Sequence< const DiscreteVariable* >* marginal;
913 if (joint_to_delete) {
916 marginal =
new Sequence< const DiscreteVariable* >(*joint);
919 marginal->erase(del_var);
927 for (
typename Set<
const Sequence< const DiscreteVariable* >* >::
928 const_iterator_safe iter = tables_to_combine.beginSafe();
929 iter != tables_to_combine.endSafe();
931 const Sequence< const DiscreteVariable* >& table_vars = **iter;
933 for (
unsigned int i = 0; i < table_vars.size(); ++i) {
934 if (del_vars.contains(table_vars[i])) {
937 HashTable< const DiscreteVariable*, unsigned int >&
938 table_vars_of_var_i = tables_vars_per_var[table_vars[i]];
939 float div_size = 1.0f;
941 for (
unsigned int j = 0; j < table_vars.size(); ++j) {
942 unsigned int k = --table_vars_of_var_i[table_vars[j]];
945 div_size *= table_vars[j]->domainSize();
946 table_vars_of_var_i.erase(table_vars[j]);
950 tables_per_var[table_vars[i]].erase(*iter);
953 product_size.setPriority(
954 table_vars[i], product_size.priority(table_vars[i]) / div_size);
959 if (tmp_marginals.contains(*iter)) {
961 const Sequence< const DiscreteVariable* >& del = **iter;
964 iter_del = del.beginSafe();
965 iter_del != del.endSafe();
967 del_size *= (*iter_del)->domainSize();
970 current_memory -= long(del_size);
973 tmp_marginals.erase(*iter);
977 tables_per_var.erase(del_var);
981 for (
unsigned int i = 0; i < marginal->size(); ++i) {
982 const DiscreteVariable* var_i = marginal->atPos(i);
984 if (del_vars.contains(var_i)) {
986 tables_per_var[var_i].insert(marginal);
989 HashTable< const DiscreteVariable*, unsigned int >& iter_vars =
990 tables_vars_per_var[var_i];
991 float mult_size = 1.0f;
993 for (
unsigned int j = 0; j < marginal->size(); ++j) {
995 ++iter_vars[marginal->atPos(j)];
996 }
catch (
const NotFound&) {
997 iter_vars.insert(marginal->atPos(j), 1);
998 mult_size *= marginal->atPos(j)->domainSize();
1002 if (mult_size != 1) {
1003 product_size.setPriority(var_i,
1004 product_size.priority(var_i) * mult_size);
1009 tmp_marginals.insert(marginal);
1013 for (
typename Set<
const Sequence< const DiscreteVariable* >* >::
1014 const_iterator_safe iter = tmp_marginals.beginSafe();
1015 iter != tmp_marginals.endSafe();
1020 return std::pair< long, long >(max_memory, current_memory);
1025 template <
typename GUM_SCALAR,
template <
typename >
class TABLE >
1026 std::pair< long, long >
1028 const Set<
const TABLE< GUM_SCALAR >* >&
set,
1029 const Set< const DiscreteVariable* >& del_vars)
const {
1031 Set< const Sequence< const DiscreteVariable* >* > var_set(
set.size());
1033 for (
typename Set<
const TABLE< GUM_SCALAR >* >::const_iterator_safe iter =
1035 iter !=
set.endSafe();
1037 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
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
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...
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
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...