aGrUM
0.20.3
a C++ library for (probabilistic) graphical models
variableselector.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 Template implémentations of the NodeDatabase class.
25
*
26
* @author Jean-Christophe MAGNAN
27
*/
28
// =========================================================================
29
#
include
<
agrum
/
FMDP
/
learning
/
datastructure
/
variableselector
.
h
>
30
// =========================================================================
31
32
namespace
gum
{
33
34
// ==========================================================================
35
// Constructor & destructor.
36
// ==========================================================================
37
38
// ###################################################################
39
// Default constructor
40
// ###################################################################
41
VariableSelector
::
VariableSelector
(
Set
<
const
DiscreteVariable
* >&
startingSet
) :
42
_remainingVars_
(
startingSet
) {
43
GUM_CONSTRUCTOR
(
VariableSelector
);
44
_remainingScores_
.
insert
(0.0, 0.0);
45
_remainingVarsByScore_
.
insert
(0.0,
new
Set
<
const
DiscreteVariable
* >(
_remainingVars_
));
46
47
for
(
auto
varIter
=
_remainingVars_
.
cbeginSafe
();
varIter
!=
_remainingVars_
.
cendSafe
();
48
++
varIter
) {
49
_remainingVarsScore_
.
insert
(*
varIter
, 0.0);
50
_remainingVarsOtherScore_
.
insert
(*
varIter
, 0.0);
51
}
52
}
53
54
// ###################################################################
55
// Default constructor
56
// ###################################################################
57
VariableSelector
::~
VariableSelector
() {
58
GUM_DESTRUCTOR
(
VariableSelector
);
59
;
60
}
61
62
63
// ###################################################################
64
//
65
// ###################################################################
66
void
VariableSelector
::
updateScore
(
const
DiscreteVariable
*
var
,
67
double
score
,
68
double
secondaryscore
) {
69
_removeVar_
(
var
);
70
_remainingVarsScore_
[
var
] +=
score
;
71
_addVar_
(
var
);
72
_remainingVarsOtherScore_
[
var
] +=
secondaryscore
;
73
}
74
75
76
// ###################################################################
77
//
78
// ###################################################################
79
void
VariableSelector
::
downdateScore
(
const
DiscreteVariable
*
var
,
80
double
score
,
81
double
secondaryscore
) {
82
_removeVar_
(
var
);
83
_remainingVarsScore_
[
var
] -=
score
;
84
_addVar_
(
var
);
85
_remainingVarsOtherScore_
[
var
] -=
secondaryscore
;
86
}
87
88
89
// ###################################################################
90
// Select the most relevant variable
91
// ###################################################################
92
const
DiscreteVariable
*
VariableSelector
::
select
() {
93
double
bestScore
=
_remainingScores_
.
top
();
94
Set
<
const
DiscreteVariable
* >*
bestSet
=
_remainingVarsByScore_
[
bestScore
];
95
const
DiscreteVariable
*
bestVar
=
nullptr
;
96
97
for
(
auto
varIter
=
bestSet
->
beginSafe
();
varIter
!=
bestSet
->
endSafe
(); ++
varIter
) {
98
if
(
bestVar
==
nullptr
99
||
_remainingVarsOtherScore_
[
bestVar
] <
_remainingVarsOtherScore_
[*
varIter
]
100
|| (
_remainingVarsOtherScore_
[
bestVar
] ==
_remainingVarsOtherScore_
[*
varIter
]
101
&&
bestVar
->
domainSize
() < (*
varIter
)->
domainSize
()))
102
bestVar
= *
varIter
;
103
}
104
_removeVar_
(
bestVar
);
105
_remainingVars_
>>
bestVar
;
106
return
bestVar
;
107
}
108
109
110
// ###################################################################
111
// Select the most relevant variable
112
// ###################################################################
113
void
VariableSelector
::
_addVar_
(
const
DiscreteVariable
*
var
) {
114
double
varScore
=
_remainingVarsScore_
[
var
];
115
116
if
(!
_remainingVarsByScore_
.
exists
(
varScore
)) {
117
_remainingVarsByScore_
.
insert
(
varScore
,
new
Set
<
const
DiscreteVariable
* >());
118
_remainingScores_
.
insert
(
varScore
,
varScore
);
119
}
120
_remainingVarsByScore_
[
varScore
]->
insert
(
var
);
121
}
122
123
124
// ###################################################################
125
// Select the most relevant variable
126
// ###################################################################
127
void
VariableSelector
::
_removeVar_
(
const
DiscreteVariable
*
var
) {
128
double
varScore
=
_remainingVarsScore_
[
var
];
129
Set
<
const
DiscreteVariable
* >*
varSet
=
_remainingVarsByScore_
[
varScore
];
130
*
varSet
>>
var
;
131
if
(
varSet
->
empty
()) {
132
_remainingScores_
.
erase
(
varScore
);
133
_remainingVarsByScore_
.
erase
(
varScore
);
134
delete
varSet
;
135
}
136
}
137
}
// namespace gum
gum::Set::emplace
INLINE void emplace(Args &&... args)
Definition:
set_tpl.h:643