aGrUM
0.20.2
a C++ library for (probabilistic) graphical models
internalNode.cpp
Go to the documentation of this file.
1
/**
2
*
3
* Copyright 2005-2020 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
70
=
static_cast
<
NodeId
* >(
ALLOCATE
(
sizeof
(
NodeId
) *
v
->
domainSize
()));
71
for
(
gum
::
Idx
i
= 0;
i
<
v
->
domainSize
(); ++
i
)
72
sons
[
i
] = 0;
73
return
sons
;
74
}
75
76
// ============================================================================
77
// Deallocates a NodeSons table
78
// ============================================================================
79
void
InternalNode
::
deallocateNodeSons
(
const
DiscreteVariable
*
v
,
NodeId
*
s
) {
80
DEALLOCATE
(
s
,
sizeof
(
NodeId
) *
v
->
domainSize
());
81
}
82
83
// ============================================================================
84
// Node handlers
85
// ============================================================================
86
void
InternalNode
::
setNode
(
const
DiscreteVariable
*
v
,
NodeId
*
sons
) {
87
if
(
nodeVar__
!=
nullptr
)
deallocateNodeSons
(
nodeVar__
,
nodeSons__
);
88
nodeVar__
=
v
;
89
nodeSons__
=
sons
;
90
}
91
92
// ============================================================================
93
// Var handlers
94
// ============================================================================
95
void
InternalNode
::
setNodeVar
(
const
DiscreteVariable
*
v
) {
96
if
(
nodeVar__
!=
nullptr
)
deallocateNodeSons
(
nodeVar__
,
nodeSons__
);
97
setNodeVar__
(
v
);
98
}
99
100
void
InternalNode
::
setNodeVar__
(
const
DiscreteVariable
*
v
) {
101
nodeVar__
=
v
;
102
nodeSons__
=
allocateNodeSons
(
v
);
103
}
104
105
// ============================================================================
106
// Parent handlers
107
// ============================================================================
108
void
InternalNode
::
addParent
(
NodeId
parent
,
Idx
modality
) {
109
nodeParents__
.
addLink
(
Parent
(
parent
,
modality
));
110
}
111
112
void
InternalNode
::
removeParent
(
NodeId
parent
,
Idx
modality
) {
113
nodeParents__
.
searchAndRemoveLink
(
Parent
(
parent
,
modality
));
114
}
115
116
}
// namespace gum
117
118
#
ifdef
GUM_NO_INLINE
119
#
include
<
agrum
/
tools
/
multidim
/
utils
/
FunctionGraphUtilities
/
internalNode_inl
.
h
>
120
#
endif
/* GUM_NO_INLINE */
gum::Set::emplace
INLINE void emplace(Args &&... args)
Definition:
set_tpl.h:669
DEALLOCATE
#define DEALLOCATE(x, y)
Definition:
internalNode.cpp:34
ALLOCATE
#define ALLOCATE(x)
Definition:
internalNode.cpp:33