aGrUM  0.21.0
a C++ library for (probabilistic) graphical models
multiDimProjection_tpl.h
Go to the documentation of this file.
1 /**
2  *
3  * Copyright (c) 2005-2021 by Pierre-Henri WUILLEMIN(@LIP6) & Christophe GONZALES(@AMU)
4  * info_at_agrum_dot_org
5  *
6  * This library is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this library. If not, see <http://www.gnu.org/licenses/>.
18  *
19  */
20 
21 
22 /**
23  * @file
24  * @brief A generic interface to project efficiently a MultiDim table over a
25  * subset of its variables
26  *
27  * @author Christophe GONZALES(@AMU) and Pierre-Henri WUILLEMIN(@LIP6)
28  */
29 
30 #ifndef DOXYGEN_SHOULD_SKIP_THIS
31 
32 # include <agrum/agrum.h>
33 # include <limits>
34 
35 namespace gum {
36 
37  // constructor
38  template < typename GUM_SCALAR, template < typename > class TABLE >
39  MultiDimProjection< GUM_SCALAR, TABLE >::MultiDimProjection(TABLE< GUM_SCALAR >* (
40  *proj)(const TABLE< GUM_SCALAR >&, const Set< const DiscreteVariable* >&)) :
41  proj_(proj) {
42  // for debugging purposes
43  GUM_CONSTRUCTOR(MultiDimProjection);
44  }
45 
46  // copy constructor
47  template < typename GUM_SCALAR, template < typename > class TABLE >
50  proj_(from.proj_) {
51  // for debugging purposes
53  }
54 
55  // destructor
56  template < typename GUM_SCALAR, template < typename > class TABLE >
58  // for debugging purposes
60  }
61 
62  // virtual constructor
63  template < typename GUM_SCALAR, template < typename > class TABLE >
66  return new MultiDimProjection< GUM_SCALAR, TABLE >(*this);
67  }
68 
69  // creates and returns the projection of the table over a subset of its vars
70  template < typename GUM_SCALAR, template < typename > class TABLE >
72  const TABLE< GUM_SCALAR >& table,
73  const Set< const DiscreteVariable* >& del_vars) {
74  return proj_(table, del_vars);
75  }
76 
77  // creates and returns the projection of the table over a subset of its vars
78  template < typename GUM_SCALAR, template < typename > class TABLE >
81  const TABLE< GUM_SCALAR >& table,
82  const Set< const TABLE< GUM_SCALAR >* >& del_vars) {
84  container = std::move(*res);
85  delete res;
86  }
87 
88  // changes the function used for projecting TABLES
89  template < typename GUM_SCALAR, template < typename > class TABLE >
91  *proj)(const TABLE< GUM_SCALAR >&, const Set< const DiscreteVariable* >&)) {
92  proj_ = proj;
93  }
94 
95  // returns the projection function currently used by the projector
96  template < typename GUM_SCALAR, template < typename > class TABLE >
97  INLINE TABLE< GUM_SCALAR >* (
99  TABLE >::projectFunction())(const TABLE< GUM_SCALAR >&,
100  const Set< const DiscreteVariable* >&) {
101  return proj_;
102  }
103 
104  /** @brief returns a rough estimate of the number of operations that will be
105  * performed to compute the projection */
106  template < typename GUM_SCALAR, template < typename > class TABLE >
108  const TABLE< GUM_SCALAR >& table,
109  const Set< const DiscreteVariable* >& del_vars) const {
110  return float(table.domainSize());
111  }
112 
113  /** @brief returns a rough estimate of the number of operations that will be
114  * performed to compute the projection */
115  template < typename GUM_SCALAR, template < typename > class TABLE >
117  const Sequence< const DiscreteVariable* >& vars,
118  const Set< const DiscreteVariable* >& del_vars) const {
119  float res = 1.0f;
120 
121  for (typename Sequence< const DiscreteVariable* >::const_iterator_safe iter = vars.beginSafe();
122  iter != vars.endSafe();
123  ++iter) {
124  res *= (*iter)->domainSize();
125  }
126 
127  return res;
128  }
129 
130  // returns the memory consumption used during the projection
131  template < typename GUM_SCALAR, template < typename > class TABLE >
133  const Sequence< const DiscreteVariable* >& vars,
134  const Set< const DiscreteVariable* >& del_vars) const {
135  long res = 1;
136 
137  for (typename Sequence< const DiscreteVariable* >::const_iterator_safe iter = vars.beginSafe();
138  iter != vars.endSafe();
139  ++iter) {
140  if (!del_vars.contains(*iter)) {
141  if (std::numeric_limits< long >::max() / (long)(*iter)->domainSize() < res) {
142  GUM_ERROR(OutOfBounds, "memory usage out of long int range")
143  }
144 
145  res *= long((*iter)->domainSize());
146  }
147  }
148 
149  return std::pair< long, long >(res, res);
150  }
151 
152  // returns the memory consumption used during the projection
153  template < typename GUM_SCALAR, template < typename > class TABLE >
155  const TABLE< GUM_SCALAR >& table,
156  const Set< const DiscreteVariable* >& del_vars) const {
158  }
159 
160 } /* namespace gum */
161 
162 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
INLINE void emplace(Args &&... args)
Definition: set_tpl.h:643