aGrUM  0.16.0
multiDimProjection_tpl.h
Go to the documentation of this file.
1 
31 #ifndef DOXYGEN_SHOULD_SKIP_THIS
32 
33 # include <agrum/agrum.h>
34 # include <limits>
35 
36 namespace gum {
37 
38  // constructor
39  template < typename GUM_SCALAR, template < typename > class TABLE >
41  TABLE< GUM_SCALAR >* (*proj)(const TABLE< GUM_SCALAR >&,
42  const Set< const DiscreteVariable* >&)) :
43  _proj(proj) {
44  // for debugging purposes
45  GUM_CONSTRUCTOR(MultiDimProjection);
46  }
47 
48  // copy constructor
49  template < typename GUM_SCALAR, template < typename > class TABLE >
51  const MultiDimProjection< GUM_SCALAR, TABLE >& from) :
52  _proj(from._proj) {
53  // for debugging purposes
54  GUM_CONS_CPY(MultiDimProjection);
55  }
56 
57  // destructor
58  template < typename GUM_SCALAR, template < typename > class TABLE >
60  // for debugging purposes
61  GUM_DESTRUCTOR(MultiDimProjection);
62  }
63 
64  // virtual constructor
65  template < typename GUM_SCALAR, template < typename > class TABLE >
66  MultiDimProjection< GUM_SCALAR, TABLE >*
68  return new MultiDimProjection< GUM_SCALAR, TABLE >(*this);
69  }
70 
71  // creates and returns the projection of the table over a subset of its vars
72  template < typename GUM_SCALAR, template < typename > class TABLE >
73  INLINE TABLE< GUM_SCALAR >* MultiDimProjection< GUM_SCALAR, TABLE >::project(
74  const TABLE< GUM_SCALAR >& table,
75  const Set< const DiscreteVariable* >& del_vars) {
76  return _proj(table, del_vars);
77  }
78 
79  // creates and returns the projection of the table over a subset of its vars
80  template < typename GUM_SCALAR, template < typename > class TABLE >
82  TABLE< GUM_SCALAR >& container,
83  const TABLE< GUM_SCALAR >& table,
84  const Set< const TABLE< GUM_SCALAR >* >& del_vars) {
85  TABLE< GUM_SCALAR >* res = project(table, del_vars);
86  container = *res;
87  delete res;
88  }
89 
90  // changes the function used for projecting TABLES
91  template < typename GUM_SCALAR, template < typename > class TABLE >
93  TABLE< GUM_SCALAR >* (*proj)(const TABLE< GUM_SCALAR >&,
94  const Set< const DiscreteVariable* >&)) {
95  _proj = proj;
96  }
97 
98  // returns the projection function currently used by the projector
99  template < typename GUM_SCALAR, template < typename > class TABLE >
100  INLINE TABLE< GUM_SCALAR >* (
102  const TABLE< GUM_SCALAR >&, const Set< const DiscreteVariable* >&) {
103  return _proj;
104  }
105 
108  template < typename GUM_SCALAR, template < typename > class TABLE >
110  const TABLE< GUM_SCALAR >& table,
111  const Set< const DiscreteVariable* >& del_vars) const {
112  return float(table.domainSize());
113  }
114 
117  template < typename GUM_SCALAR, template < typename > class TABLE >
119  const Sequence< const DiscreteVariable* >& vars,
120  const Set< const DiscreteVariable* >& del_vars) const {
121  float res = 1.0f;
122 
124  vars.beginSafe();
125  iter != vars.endSafe();
126  ++iter) {
127  res *= (*iter)->domainSize();
128  }
129 
130  return res;
131  }
132 
133  // returns the memory consumption used during the projection
134  template < typename GUM_SCALAR, template < typename > class TABLE >
136  const Sequence< const DiscreteVariable* >& vars,
137  const Set< const DiscreteVariable* >& del_vars) const {
138  long res = 1;
139 
141  vars.beginSafe();
142  iter != vars.endSafe();
143  ++iter) {
144  if (!del_vars.contains(*iter)) {
145  if (std::numeric_limits< long >::max() / (long)(*iter)->domainSize()
146  < res) {
147  GUM_ERROR(OutOfBounds, "memory usage out of long int range");
148  }
149 
150  res *= long((*iter)->domainSize());
151  }
152  }
153 
154  return std::pair< long, long >(res, res);
155  }
156 
157  // returns the memory consumption used during the projection
158  template < typename GUM_SCALAR, template < typename > class TABLE >
159  INLINE std::pair< long, long >
161  const TABLE< GUM_SCALAR >& table,
162  const Set< const DiscreteVariable* >& del_vars) const {
163  return memoryUsage(table.variablesSequence(), del_vars);
164  }
165 
166 } /* namespace gum */
167 
168 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
TABLE< GUM_SCALAR > *(*)(const TABLE< GUM_SCALAR > &, const Set< const DiscreteVariable *> &) projectFunction()
Returns the projection function currently used by the projector.
MultiDimProjection(TABLE< GUM_SCALAR > *(*proj)(const TABLE< GUM_SCALAR > &, const Set< const DiscreteVariable * > &))
Default constructor.
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
Definition: agrum.h:25
std::pair< long, long > memoryUsage(const TABLE< GUM_SCALAR > &table, const Set< const DiscreteVariable * > &del_vars) const
Returns the memory consumption used during the projection.
virtual MultiDimProjection< GUM_SCALAR, TABLE > * newFactory() const
virtual constructor
TABLE< GUM_SCALAR > *(* _proj)(const TABLE< GUM_SCALAR > &, const Set< const DiscreteVariable * > &)
The projection function actually used.
virtual ~MultiDimProjection()
Destructor.
float nbOperations(const TABLE< GUM_SCALAR > &table, const Set< const DiscreteVariable * > &del_vars) const
returns a rough estimate of the number of operations that will be performed to compute the projection...
#define GUM_ERROR(type, msg)
Definition: exceptions.h:55
void setProjectFunction(TABLE< GUM_SCALAR > *(*proj)(const TABLE< GUM_SCALAR > &, const Set< const DiscreteVariable * > &))
Changes the function used for projecting TABLES.
TABLE< GUM_SCALAR > * project(const TABLE< GUM_SCALAR > &table, const Set< const DiscreteVariable * > &del_vars)
Creates and returns the projection of the table over a subset of its vars.
SequenceIteratorSafe< Key > const_iterator_safe
Types for STL compliance.
Definition: sequence.h:1038