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