aGrUM
0.20.3
a C++ library for (probabilistic) graphical models
statesCounter.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
#
include
<
agrum
/
FMDP
/
simulation
/
statesCounter
.
h
>
23
24
25
namespace
gum
{
26
27
28
// =================================================================================================
29
//
30
// =================================================================================================
31
StatesCounter
::
StatesCounter
() :
_counter_
(
MultiDimFunctionGraph
<
Size
>::
getTreeInstance
()) {
32
GUM_CONSTRUCTOR
(
StatesCounter
);
33
}
34
35
36
// =================================================================================================
37
//
38
// =================================================================================================
39
StatesCounter
::~
StatesCounter
() {
40
delete
_counter_
;
41
GUM_DESTRUCTOR
(
StatesCounter
);
42
}
43
44
45
// =================================================================================================
46
//
47
// =================================================================================================
48
void
StatesCounter
::
reset
(
const
Instantiation
&
initialState
) {
49
_counter_
->
clear
();
50
for
(
SequenceIteratorSafe
<
const
DiscreteVariable
* >
varIter
51
=
initialState
.
variablesSequence
().
beginSafe
();
52
varIter
!=
initialState
.
variablesSequence
().
endSafe
();
53
++
varIter
)
54
_counter_
->
add
(**
varIter
);
55
56
_counter_
->
manager
()->
setRootNode
(
_counter_
->
manager
()->
addTerminalNode
(0));
57
58
_incState_
(
initialState
, 0, 0, 0);
59
}
60
61
62
// =================================================================================================
63
//
64
// =================================================================================================
65
void
StatesCounter
::
incState
(
const
Instantiation
&
state
) {
66
Idx
nbVisits
=
_counter_
->
get
(
state
);
67
68
NodeId
parId
=
_counter_
->
root
();
69
Idx
parModa
=
state
.
valFromPtr
(
_counter_
->
node
(
parId
)->
nodeVar
());
70
while
(!
_counter_
->
isTerminalNode
(
_counter_
->
node
(
parId
)->
son
(
parModa
))) {
71
parId
=
_counter_
->
node
(
parId
)->
son
(
parModa
);
72
parModa
=
state
.
valFromPtr
(
_counter_
->
node
(
parId
)->
nodeVar
());
73
}
74
_incState_
(
state
,
parId
,
parModa
,
nbVisits
);
75
}
76
77
78
// =================================================================================================
79
//
80
// =================================================================================================
81
void
StatesCounter
::
_incState_
(
const
Instantiation
&
state
,
82
NodeId
parentId
,
83
Idx
parentModa
,
84
Size
nbVisits
) {
85
Idx
varIter
= 0;
86
if
(
parentId
)
varIter
=
state
.
variablesSequence
().
pos
(
_counter_
->
node
(
parentId
)->
nodeVar
()) + 1;
87
88
89
for
(;
varIter
<
state
.
variablesSequence
().
size
(); ++
varIter
) {
90
const
DiscreteVariable
*
curVar
=
state
.
variablesSequence
().
atPos
(
varIter
);
91
NodeId
varId
=
_counter_
->
manager
()->
addInternalNode
(
curVar
);
92
if
(
parentId
)
93
_counter_
->
manager
()->
setSon
(
parentId
,
parentModa
,
varId
);
94
else
95
_counter_
->
manager
()->
setRootNode
(
varId
);
96
for
(
Idx
moda
= 0;
moda
<
curVar
->
domainSize
(); ++
moda
) {
97
if
(
moda
==
state
.
valFromPtr
(
curVar
))
98
parentModa
=
moda
;
99
else
100
_counter_
->
manager
()->
setSon
(
varId
,
moda
,
_counter_
->
terminalNodeId
(
nbVisits
));
101
}
102
parentId
=
varId
;
103
}
104
_counter_
->
manager
()->
setSon
(
parentId
,
105
parentModa
,
106
_counter_
->
manager
()->
addTerminalNode
(
nbVisits
+ 1));
107
}
108
}
// End of namespace gum
gum::Set::emplace
INLINE void emplace(Args &&... args)
Definition:
set_tpl.h:643