aGrUM  0.20.3
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 >
98  const TABLE< GUM_SCALAR >&,
99  const Set< const DiscreteVariable* >&) {
100  return proj_;
101  }
102 
103  /** @brief returns a rough estimate of the number of operations that will be
104  * performed to compute the projection */
105  template < typename GUM_SCALAR, template < typename > class TABLE >
107  const TABLE< GUM_SCALAR >& table,
108  const Set< const DiscreteVariable* >& del_vars) const {
109  return float(table.domainSize());
110  }
111 
112  /** @brief returns a rough estimate of the number of operations that will be
113  * performed to compute the projection */
114  template < typename GUM_SCALAR, template < typename > class TABLE >
116  const Sequence< const DiscreteVariable* >& vars,
117  const Set< const DiscreteVariable* >& del_vars) const {
118  float res = 1.0f;
119 
120  for (typename Sequence< const DiscreteVariable* >::const_iterator_safe iter = vars.beginSafe();
121  iter != vars.endSafe();
122  ++iter) {
123  res *= (*iter)->domainSize();
124  }
125 
126  return res;
127  }
128 
129  // returns the memory consumption used during the projection
130  template < typename GUM_SCALAR, template < typename > class TABLE >
132  const Sequence< const DiscreteVariable* >& vars,
133  const Set< const DiscreteVariable* >& del_vars) const {
134  long res = 1;
135 
136  for (typename Sequence< const DiscreteVariable* >::const_iterator_safe iter = vars.beginSafe();
137  iter != vars.endSafe();
138  ++iter) {
139  if (!del_vars.contains(*iter)) {
140  if (std::numeric_limits< long >::max() / (long)(*iter)->domainSize() < res) {
141  GUM_ERROR(OutOfBounds, "memory usage out of long int range")
142  }
143 
144  res *= long((*iter)->domainSize());
145  }
146  }
147 
148  return std::pair< long, long >(res, res);
149  }
150 
151  // returns the memory consumption used during the projection
152  template < typename GUM_SCALAR, template < typename > class TABLE >
154  const TABLE< GUM_SCALAR >& table,
155  const Set< const DiscreteVariable* >& del_vars) const {
157  }
158 
159 } /* namespace gum */
160 
161 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
INLINE void emplace(Args &&... args)
Definition: set_tpl.h:643