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
>
48
MultiDimProjection
<
GUM_SCALAR
,
TABLE
>::
MultiDimProjection
(
49
const
MultiDimProjection
<
GUM_SCALAR
,
TABLE
>&
from
) :
50
proj_
(
from
.
proj_
) {
51
// for debugging purposes
52
GUM_CONS_CPY
(
MultiDimProjection
);
53
}
54
55
// destructor
56
template
<
typename
GUM_SCALAR
,
template
<
typename
>
class
TABLE
>
57
MultiDimProjection
<
GUM_SCALAR
,
TABLE
>::~
MultiDimProjection
() {
58
// for debugging purposes
59
GUM_DESTRUCTOR
(
MultiDimProjection
);
60
}
61
62
// virtual constructor
63
template
<
typename
GUM_SCALAR
,
template
<
typename
>
class
TABLE
>
64
MultiDimProjection
<
GUM_SCALAR
,
TABLE
>*
65
MultiDimProjection
<
GUM_SCALAR
,
TABLE
>::
newFactory
()
const
{
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
>
71
INLINE
TABLE
<
GUM_SCALAR
>*
MultiDimProjection
<
GUM_SCALAR
,
TABLE
>::
project
(
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
>
79
INLINE
void
MultiDimProjection
<
GUM_SCALAR
,
TABLE
>::
project
(
80
TABLE
<
GUM_SCALAR
>&
container
,
81
const
TABLE
<
GUM_SCALAR
>&
table
,
82
const
Set
<
const
TABLE
<
GUM_SCALAR
>* >&
del_vars
) {
83
TABLE
<
GUM_SCALAR
>*
res
=
project
(
table
,
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
>
90
void
MultiDimProjection
<
GUM_SCALAR
,
TABLE
>::
setProjectFunction
(
TABLE
<
GUM_SCALAR
>* (
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
>* (*
MultiDimProjection
<
GUM_SCALAR
,
TABLE
>::
projectFunction
())(
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
>
106
INLINE
float
MultiDimProjection
<
GUM_SCALAR
,
TABLE
>::
nbOperations
(
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
>
115
float
MultiDimProjection
<
GUM_SCALAR
,
TABLE
>::
nbOperations
(
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
>
131
std
::
pair
<
long
,
long
>
MultiDimProjection
<
GUM_SCALAR
,
TABLE
>::
memoryUsage
(
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
>
153
INLINE
std
::
pair
<
long
,
long
>
MultiDimProjection
<
GUM_SCALAR
,
TABLE
>::
memoryUsage
(
154
const
TABLE
<
GUM_SCALAR
>&
table
,
155
const
Set
<
const
DiscreteVariable
* >&
del_vars
)
const
{
156
return
memoryUsage
(
table
.
variablesSequence
(),
del_vars
);
157
}
158
159
}
/* namespace gum */
160
161
#
endif
/* DOXYGEN_SHOULD_SKIP_THIS */
gum::Set::emplace
INLINE void emplace(Args &&... args)
Definition:
set_tpl.h:643