aGrUM
0.20.2
a C++ library for (probabilistic) graphical models
partialOrderedEliminationSequenceStrategy.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
/** @file
23
* @brief Base class for all elimination sequence algorithm that impose a given
24
* partial ordering on the nodes elimination sequence, that is, the set of all
25
* the nodes is divided into several subsets. Within each subset, any ordering
26
* can be chosen. But all the nodes of the first subset must be eliminated
27
* before the nodes of the second, which must be eliminated before those of the
28
* third subset, and so on.
29
*
30
* @author Christophe GONZALES(@AMU) and Pierre-Henri WUILLEMIN(@LIP6)
31
*/
32
33
#
include
<
agrum
/
tools
/
graphs
/
algorithms
/
triangulations
/
eliminationStrategies
/
partialOrderedEliminationSequenceStrategy
.
h
>
34
35
#
ifdef
GUM_NO_INLINE
36
#
include
<
agrum
/
tools
/
graphs
/
algorithms
/
triangulations
/
eliminationStrategies
/
partialOrderedEliminationSequenceStrategy_inl
.
h
>
37
#
endif
// GUM_NOINLINE
38
39
namespace
gum
{
40
41
/// default constructor
42
PartialOrderedEliminationSequenceStrategy
::
43
PartialOrderedEliminationSequenceStrategy
() {
44
// for debugging purposes
45
GUM_CONSTRUCTOR
(
PartialOrderedEliminationSequenceStrategy
);
46
}
47
48
/// constructor for an a priori non empty graph
49
PartialOrderedEliminationSequenceStrategy
::
50
PartialOrderedEliminationSequenceStrategy
(
51
UndiGraph
*
graph
,
52
const
NodeProperty
<
Size
>*
dom_sizes
,
53
const
List
<
NodeSet
>*
subsets
) {
54
setGraph
(
graph
,
dom_sizes
);
55
setPartialOrder
(
subsets
);
56
57
// for debugging purposes
58
GUM_CONSTRUCTOR
(
PartialOrderedEliminationSequenceStrategy
);
59
}
60
61
/// copy constructor
62
PartialOrderedEliminationSequenceStrategy
::
63
PartialOrderedEliminationSequenceStrategy
(
64
const
PartialOrderedEliminationSequenceStrategy
&
from
) :
65
EliminationSequenceStrategy
(
from
),
66
subsets_
(
from
.
subsets_
),
subset_iter_
(
from
.
subset_iter_
),
67
nodeset_
(
from
.
nodeset_
),
partial_order_needed_
(
from
.
partial_order_needed_
) {
68
// for debugging purposes
69
GUM_CONS_CPY
(
PartialOrderedEliminationSequenceStrategy
);
70
}
71
72
/// move constructor
73
PartialOrderedEliminationSequenceStrategy
::
74
PartialOrderedEliminationSequenceStrategy
(
75
PartialOrderedEliminationSequenceStrategy
&&
from
) :
76
EliminationSequenceStrategy
(
std
::
move
(
from
)),
77
subsets_
(
from
.
subsets_
),
subset_iter_
(
from
.
subset_iter_
),
78
nodeset_
(
std
::
move
(
from
.
nodeset_
)),
79
partial_order_needed_
(
from
.
partial_order_needed_
) {
80
from
.
partial_order_needed_
=
true
;
81
82
// for debugging purposes
83
GUM_CONS_MOV
(
PartialOrderedEliminationSequenceStrategy
);
84
}
85
86
/// destructor
87
PartialOrderedEliminationSequenceStrategy
::
88
~
PartialOrderedEliminationSequenceStrategy
() {
89
// for debugging purposes
90
GUM_DESTRUCTOR
(
PartialOrderedEliminationSequenceStrategy
);
91
}
92
93
/// sets a new graph to be triangulated
94
bool
PartialOrderedEliminationSequenceStrategy
::
setGraph
(
95
UndiGraph
*
graph
,
96
const
NodeProperty
<
Size
>*
domain_sizes
) {
97
if
(
EliminationSequenceStrategy
::
setGraph
(
graph
,
domain_sizes
)) {
98
setPartialOrder
(
subsets_
);
99
return
true
;
100
}
101
return
false
;
102
}
103
104
/// indicate whether a partial ordering is compatible with the current graph
105
bool
PartialOrderedEliminationSequenceStrategy
::
isPartialOrderNeeded_
(
106
const
List
<
NodeSet
>*
subsets
)
const
{
107
if
((
graph_
==
nullptr
) || (
subsets
==
nullptr
))
return
true
;
108
109
// determine the set of nodes in the subsets that belong to the graph
110
NodeSet
nodes_found
(
graph_
->
size
() / 2);
111
for
(
const
auto
&
nodes
: *
subsets
) {
112
for
(
const
auto
node
:
nodes
) {
113
if
(
graph_
->
existsNode
(
node
)) {
nodes_found
.
insert
(
node
); }
114
}
115
}
116
117
// check that the size of nodes_found is equal to that of the graph
118
return
nodes_found
.
size
() !=
graph_
->
size
();
119
}
120
121
/// sets a new partial order
122
bool
PartialOrderedEliminationSequenceStrategy
::
setPartialOrder
(
123
const
List
<
NodeSet
>*
subsets
) {
124
// check that the partial order contains all the nodes of the graph
125
partial_order_needed_
=
isPartialOrderNeeded_
(
subsets
);
126
127
if
(!
partial_order_needed_
) {
128
subsets_
=
subsets
;
129
130
// initialize properly the set of nodes that can be currently eliminated:
131
// find the first subset that contains some node(s) of the graph
132
nodeset_
.
clear
();
133
for
(
subset_iter_
=
subsets_
->
cbegin
();
subset_iter_
!=
subsets_
->
cend
();
134
++
subset_iter_
) {
135
for
(
const
auto
node
: *
subset_iter_
) {
136
if
(
graph_
->
existsNode
(
node
)) {
nodeset_
.
insert
(
node
); }
137
}
138
if
(!
nodeset_
.
empty
())
return
true
;
139
}
140
}
141
142
return
false
;
143
}
144
145
/// clears the sequence (to prepare, for instance, a new elimination sequence)
146
void
PartialOrderedEliminationSequenceStrategy
::
clear
() {
147
EliminationSequenceStrategy
::
clear
();
148
subsets_
=
nullptr
;
149
nodeset_
.
clear
();
150
partial_order_needed_
=
true
;
151
}
152
153
}
/* namespace gum */
gum::Set::emplace
INLINE void emplace(Args &&... args)
Definition:
set_tpl.h:669