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
>
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
>* (
98
*
MultiDimProjection
<
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
>
107
INLINE
float
MultiDimProjection
<
GUM_SCALAR
,
TABLE
>::
nbOperations
(
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
>
116
float
MultiDimProjection
<
GUM_SCALAR
,
TABLE
>::
nbOperations
(
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
>
132
std
::
pair
<
long
,
long
>
MultiDimProjection
<
GUM_SCALAR
,
TABLE
>::
memoryUsage
(
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
>
154
INLINE
std
::
pair
<
long
,
long
>
MultiDimProjection
<
GUM_SCALAR
,
TABLE
>::
memoryUsage
(
155
const
TABLE
<
GUM_SCALAR
>&
table
,
156
const
Set
<
const
DiscreteVariable
* >&
del_vars
)
const
{
157
return
memoryUsage
(
table
.
variablesSequence
(),
del_vars
);
158
}
159
160
}
/* namespace gum */
161
162
#
endif
/* DOXYGEN_SHOULD_SKIP_THIS */
gum::Set::emplace
INLINE void emplace(Args &&... args)
Definition:
set_tpl.h:643