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