aGrUM
0.20.2
a C++ library for (probabilistic) graphical models
variableselector.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 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
(
46
0.0,
47
new
Set
<
const
DiscreteVariable
* >(
remainingVars__
));
48
49
for
(
auto
varIter
=
remainingVars__
.
cbeginSafe
();
50
varIter
!=
remainingVars__
.
cendSafe
();
51
++
varIter
) {
52
remainingVarsScore__
.
insert
(*
varIter
, 0.0);
53
remainingVarsOtherScore__
.
insert
(*
varIter
, 0.0);
54
}
55
}
56
57
// ###################################################################
58
// Default constructor
59
// ###################################################################
60
VariableSelector
::~
VariableSelector
() {
GUM_DESTRUCTOR
(
VariableSelector
); }
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
();
98
++
varIter
) {
99
if
(
bestVar
==
nullptr
100
||
remainingVarsOtherScore__
[
bestVar
]
101
<
remainingVarsOtherScore__
[*
varIter
]
102
|| (
remainingVarsOtherScore__
[
bestVar
]
103
==
remainingVarsOtherScore__
[*
varIter
]
104
&&
bestVar
->
domainSize
() < (*
varIter
)->
domainSize
()))
105
bestVar
= *
varIter
;
106
}
107
removeVar__
(
bestVar
);
108
remainingVars__
>>
bestVar
;
109
return
bestVar
;
110
}
111
112
113
// ###################################################################
114
// Select the most relevant variable
115
// ###################################################################
116
void
VariableSelector
::
addVar__
(
const
DiscreteVariable
*
var
) {
117
double
varScore
=
remainingVarsScore__
[
var
];
118
119
if
(!
remainingVarsByScore__
.
exists
(
varScore
)) {
120
remainingVarsByScore__
.
insert
(
varScore
,
121
new
Set
<
const
DiscreteVariable
* >());
122
remainingScores__
.
insert
(
varScore
,
varScore
);
123
}
124
remainingVarsByScore__
[
varScore
]->
insert
(
var
);
125
}
126
127
128
// ###################################################################
129
// Select the most relevant variable
130
// ###################################################################
131
void
VariableSelector
::
removeVar__
(
const
DiscreteVariable
*
var
) {
132
double
varScore
=
remainingVarsScore__
[
var
];
133
Set
<
const
DiscreteVariable
* >*
varSet
=
remainingVarsByScore__
[
varScore
];
134
*
varSet
>>
var
;
135
if
(
varSet
->
empty
()) {
136
remainingScores__
.
erase
(
varScore
);
137
remainingVarsByScore__
.
erase
(
varScore
);
138
delete
varSet
;
139
}
140
}
141
}
// namespace gum
gum::Set::emplace
INLINE void emplace(Args &&... args)
Definition:
set_tpl.h:669