aGrUM
0.20.3
a C++ library for (probabilistic) graphical models
internalNode.cpp
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 Methods of the MultiDimFunctionGraph InternalNode class.
25
*
26
* @author Pierre-Henri WUILLEMIN(@LIP6) & Christophe GONZALES(@AMU)
27
* @author Pierre-Henri WUILLEMIN(@LIP6) and Jean-Christophe MAGNAN and Christophe
28
* GONZALES(@AMU)
29
*/
30
31
#
include
<
agrum
/
tools
/
multidim
/
utils
/
FunctionGraphUtilities
/
internalNode
.
h
>
32
33
#
define
ALLOCATE
(
x
)
SmallObjectAllocator
::
instance
(
)
.
allocate
(
x
)
34
#
define
DEALLOCATE
(
x
,
y
)
SmallObjectAllocator
::
instance
(
)
.
deallocate
(
x
,
y
)
35
36
namespace
gum
{
37
38
// ============================================================================
39
// Constructors
40
// ============================================================================
41
InternalNode
::
InternalNode
() {
42
GUM_CONSTRUCTOR
(
InternalNode
);
43
_nodeVar_
=
nullptr
;
44
}
45
46
InternalNode
::
InternalNode
(
const
DiscreteVariable
*
v
) {
47
GUM_CONSTRUCTOR
(
InternalNode
);
48
_setNodeVar_
(
v
);
49
}
50
51
InternalNode
::
InternalNode
(
const
DiscreteVariable
*
v
,
NodeId
*
sons
) {
52
GUM_CONSTRUCTOR
(
InternalNode
);
53
_nodeVar_
=
v
;
54
_nodeSons_
=
sons
;
55
}
56
57
// ============================================================================
58
// Destructors
59
// ============================================================================
60
InternalNode
::~
InternalNode
() {
61
GUM_DESTRUCTOR
(
InternalNode
);
62
if
(
_nodeVar_
!=
nullptr
)
deallocateNodeSons
(
_nodeVar_
,
_nodeSons_
);
63
}
64
65
// ============================================================================
66
// Allocates a table of nodeid of the size given in parameter
67
// ============================================================================
68
NodeId
*
InternalNode
::
allocateNodeSons
(
const
DiscreteVariable
*
v
) {
69
NodeId
*
sons
=
static_cast
<
NodeId
* >(
ALLOCATE
(
sizeof
(
NodeId
) *
v
->
domainSize
()));
70
for
(
gum
::
Idx
i
= 0;
i
<
v
->
domainSize
(); ++
i
)
71
sons
[
i
] = 0;
72
return
sons
;
73
}
74
75
// ============================================================================
76
// Deallocates a NodeSons table
77
// ============================================================================
78
void
InternalNode
::
deallocateNodeSons
(
const
DiscreteVariable
*
v
,
NodeId
*
s
) {
79
DEALLOCATE
(
s
,
sizeof
(
NodeId
) *
v
->
domainSize
());
80
}
81
82
// ============================================================================
83
// Node handlers
84
// ============================================================================
85
void
InternalNode
::
setNode
(
const
DiscreteVariable
*
v
,
NodeId
*
sons
) {
86
if
(
_nodeVar_
!=
nullptr
)
deallocateNodeSons
(
_nodeVar_
,
_nodeSons_
);
87
_nodeVar_
=
v
;
88
_nodeSons_
=
sons
;
89
}
90
91
// ============================================================================
92
// Var handlers
93
// ============================================================================
94
void
InternalNode
::
setNodeVar
(
const
DiscreteVariable
*
v
) {
95
if
(
_nodeVar_
!=
nullptr
)
deallocateNodeSons
(
_nodeVar_
,
_nodeSons_
);
96
_setNodeVar_
(
v
);
97
}
98
99
void
InternalNode
::
_setNodeVar_
(
const
DiscreteVariable
*
v
) {
100
_nodeVar_
=
v
;
101
_nodeSons_
=
allocateNodeSons
(
v
);
102
}
103
104
// ============================================================================
105
// Parent handlers
106
// ============================================================================
107
void
InternalNode
::
addParent
(
NodeId
parent
,
Idx
modality
) {
108
_nodeParents_
.
addLink
(
Parent
(
parent
,
modality
));
109
}
110
111
void
InternalNode
::
removeParent
(
NodeId
parent
,
Idx
modality
) {
112
_nodeParents_
.
searchAndRemoveLink
(
Parent
(
parent
,
modality
));
113
}
114
115
}
// namespace gum
116
117
#
ifdef
GUM_NO_INLINE
118
#
include
<
agrum
/
tools
/
multidim
/
utils
/
FunctionGraphUtilities
/
internalNode_inl
.
h
>
119
#
endif
/* GUM_NO_INLINE */
gum::Set::emplace
INLINE void emplace(Args &&... args)
Definition:
set_tpl.h:643
DEALLOCATE
#define DEALLOCATE(x, y)
Definition:
internalNode.cpp:34
ALLOCATE
#define ALLOCATE(x)
Definition:
internalNode.cpp:33