aGrUM
3.2.0
a C++ library for (probabilistic) graphical models
Toggle main menu visibility
partialOrderedEliminationSequenceStrategy.cpp
Go to the documentation of this file.
1
/****************************************************************************
2
* This file is part of the aGrUM/pyAgrum library. *
3
* *
4
* Copyright (c) 2005-2026 by *
5
* - Pierre-Henri WUILLEMIN(_at_LIP6) *
6
* - Christophe GONZALES(_at_AMU) *
7
* *
8
* The aGrUM/pyAgrum library is free software; you can redistribute it *
9
* and/or modify it under the terms of either : *
10
* *
11
* - the GNU Lesser General Public License as published by *
12
* the Free Software Foundation, either version 3 of the License, *
13
* or (at your option) any later version, *
14
* - the MIT license (MIT), *
15
* - or both in dual license, as here. *
16
* *
17
* (see https://agrum.gitlab.io/articles/dual-licenses-lgplv3mit.html) *
18
* *
19
* This aGrUM/pyAgrum library is distributed in the hope that it will be *
20
* useful, but WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, *
21
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES MERCHANTABILITY or FITNESS *
22
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
23
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
24
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
25
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR *
26
* OTHER DEALINGS IN THE SOFTWARE. *
27
* *
28
* See LICENCES for more details. *
29
* *
30
* SPDX-FileCopyrightText: Copyright 2005-2026 *
31
* - Pierre-Henri WUILLEMIN(_at_LIP6) *
32
* - Christophe GONZALES(_at_AMU) *
33
* SPDX-License-Identifier: LGPL-3.0-or-later OR MIT *
34
* *
35
* Contact : info_at_agrum_dot_org *
36
* homepage : http://agrum.gitlab.io *
37
* gitlab : https://gitlab.com/agrumery/agrum *
38
* *
39
****************************************************************************/
40
41
52
53
#include <
agrum/base/graphs/algorithms/triangulations/eliminationStrategies/partialOrderedEliminationSequenceStrategy.h
>
54
55
#ifdef GUM_NO_INLINE
56
# include <
agrum/base/graphs/algorithms/triangulations/eliminationStrategies/partialOrderedEliminationSequenceStrategy_inl.h
>
57
#endif
// GU%_NO_INLINE
58
59
namespace
gum
{
60
62
PartialOrderedEliminationSequenceStrategy::PartialOrderedEliminationSequenceStrategy
() {
63
// for debugging purposes
64
GUM_CONSTRUCTOR(
PartialOrderedEliminationSequenceStrategy
);
65
}
66
68
PartialOrderedEliminationSequenceStrategy::PartialOrderedEliminationSequenceStrategy
(
69
UndiGraph
*
graph
,
70
const
NodeProperty< Size >
* dom_sizes,
71
const
List< NodeSet >
* subsets) {
72
setGraph
(
graph
, dom_sizes);
73
setPartialOrder
(subsets);
74
75
// for debugging purposes
76
GUM_CONSTRUCTOR(
PartialOrderedEliminationSequenceStrategy
);
77
}
78
80
PartialOrderedEliminationSequenceStrategy::PartialOrderedEliminationSequenceStrategy
(
81
const
PartialOrderedEliminationSequenceStrategy
& from) :
82
EliminationSequenceStrategy
(from),
subsets_
(from.
subsets_
),
subset_iter_
(from.
subset_iter_
),
83
nodeset_
(from.
nodeset_
),
partial_order_needed_
(from.
partial_order_needed_
) {
84
// for debugging purposes
85
GUM_CONS_CPY(
PartialOrderedEliminationSequenceStrategy
);
86
}
87
89
PartialOrderedEliminationSequenceStrategy::PartialOrderedEliminationSequenceStrategy
(
90
PartialOrderedEliminationSequenceStrategy
&& from) :
91
EliminationSequenceStrategy
(
std
::move(from)),
subsets_
(from.
subsets_
),
92
subset_iter_
(from.
subset_iter_
),
nodeset_
(
std
::move(from.
nodeset_
)),
93
partial_order_needed_
(from.
partial_order_needed_
) {
94
from.partial_order_needed_ =
true
;
95
96
// for debugging purposes
97
GUM_CONS_MOV(
PartialOrderedEliminationSequenceStrategy
);
98
}
99
101
PartialOrderedEliminationSequenceStrategy::~PartialOrderedEliminationSequenceStrategy
() {
102
// for debugging purposes
103
GUM_DESTRUCTOR(
PartialOrderedEliminationSequenceStrategy
);
104
}
105
107
bool
PartialOrderedEliminationSequenceStrategy::setGraph
(
108
UndiGraph
*
graph
,
109
const
NodeProperty< Size >
* domain_sizes) {
110
if
(
EliminationSequenceStrategy::setGraph
(
graph
, domain_sizes)) {
111
setPartialOrder
(
subsets_
);
112
return
true
;
113
}
114
return
false
;
115
}
116
118
bool
PartialOrderedEliminationSequenceStrategy::isPartialOrderNeeded_
(
119
const
List< NodeSet >
* subsets)
const
{
120
if
((
graph_
==
nullptr
) || (subsets ==
nullptr
))
return
true
;
121
122
// determine the set of nodes in the subsets that belong to the graph
123
NodeSet
nodes_found(
graph_
->
size
() / 2);
124
for
(
const
auto
& nodes: *subsets) {
125
for
(
const
auto
node: nodes) {
126
if
(
graph_
->
existsNode
(node)) { nodes_found.
insert
(node); }
127
}
128
}
129
130
// check that the size of nodes_found is equal to that of the graph
131
return
nodes_found.
size
() !=
graph_
->
size
();
132
}
133
135
bool
PartialOrderedEliminationSequenceStrategy::setPartialOrder
(
const
List< NodeSet >
* subsets) {
136
// check that the partial order contains all the nodes of the graph
137
partial_order_needed_
=
isPartialOrderNeeded_
(subsets);
138
139
if
(!
partial_order_needed_
) {
140
subsets_
= subsets;
141
142
// initialize properly the set of nodes that can be currently eliminated:
143
// find the first subset that contains some node(s) of the graph
144
nodeset_
.
clear
();
145
for
(
subset_iter_
=
subsets_
->cbegin();
subset_iter_
!=
subsets_
->cend(); ++
subset_iter_
) {
146
for
(
const
auto
node: *
subset_iter_
) {
147
if
(
graph_
->
existsNode
(node)) {
nodeset_
.
insert
(node); }
148
}
149
if
(!
nodeset_
.
empty
())
return
true
;
150
}
151
}
152
153
return
false
;
154
}
155
157
void
PartialOrderedEliminationSequenceStrategy::clear
() {
158
EliminationSequenceStrategy::clear
();
159
subsets_
=
nullptr
;
160
nodeset_
.
clear
();
161
partial_order_needed_
=
true
;
162
}
163
164
}
/* namespace gum */
gum::EliminationSequenceStrategy::setGraph
virtual bool setGraph(UndiGraph *graph, const NodeProperty< Size > *dom_sizes)
sets a new graph to be triangulated
Definition
eliminationSequenceStrategy.cpp:126
gum::EliminationSequenceStrategy::EliminationSequenceStrategy
EliminationSequenceStrategy()
default constructor
Definition
eliminationSequenceStrategy.cpp:78
gum::EliminationSequenceStrategy::graph_
UndiGraph * graph_
the graph to be triangulated
Definition
eliminationSequenceStrategy.h:174
gum::EliminationSequenceStrategy::clear
virtual void clear()
clears the sequence (to prepare, for instance, a new elimination sequence)
Definition
eliminationSequenceStrategy.cpp:119
gum::EliminationSequenceStrategy::graph
UndiGraph * graph() const noexcept
returns the current graph
Definition
eliminationSequenceStrategy_inl.h:59
gum::List
Generic doubly linked lists.
Definition
list.h:378
gum::NodeGraphPart::size
Size size() const
alias for sizeNodes
Definition
nodeGraphPart_inl.h:299
gum::NodeGraphPart::existsNode
bool existsNode(const NodeId id) const
returns true iff the NodeGraphPart contains the given nodeId
Definition
nodeGraphPart_inl.h:301
gum::PartialOrderedEliminationSequenceStrategy::isPartialOrderNeeded_
bool isPartialOrderNeeded_(const List< NodeSet > *subsets) const
indicate whether a partial ordering is compatible with the current graph
Definition
partialOrderedEliminationSequenceStrategy.cpp:118
gum::PartialOrderedEliminationSequenceStrategy::partial_order_needed_
bool partial_order_needed_
indicate whether a new partial ordering is necessary for the elimination
Definition
partialOrderedEliminationSequenceStrategy.h:155
gum::PartialOrderedEliminationSequenceStrategy::subsets_
const List< NodeSet > * subsets_
the subsets constituting the partial ordering
Definition
partialOrderedEliminationSequenceStrategy.h:146
gum::PartialOrderedEliminationSequenceStrategy::setGraph
bool setGraph(UndiGraph *graph, const NodeProperty< Size > *dom_sizes) override
sets a new graph to be triangulated
Definition
partialOrderedEliminationSequenceStrategy.cpp:107
gum::PartialOrderedEliminationSequenceStrategy::~PartialOrderedEliminationSequenceStrategy
~PartialOrderedEliminationSequenceStrategy() override
destructor
Definition
partialOrderedEliminationSequenceStrategy.cpp:101
gum::PartialOrderedEliminationSequenceStrategy::clear
void clear() override
clears the sequence (to prepare, for instance, a new elimination sequence)
Definition
partialOrderedEliminationSequenceStrategy.cpp:157
gum::PartialOrderedEliminationSequenceStrategy::subset_iter_
List< NodeSet >::const_iterator subset_iter_
the iterator indicating which is the current subset on which we work
Definition
partialOrderedEliminationSequenceStrategy.h:149
gum::PartialOrderedEliminationSequenceStrategy::PartialOrderedEliminationSequenceStrategy
PartialOrderedEliminationSequenceStrategy()
default constructor (uses an empty graph)
Definition
partialOrderedEliminationSequenceStrategy.cpp:62
gum::PartialOrderedEliminationSequenceStrategy::setPartialOrder
virtual bool setPartialOrder(const List< NodeSet > *subsets)
sets a new partial ordering constraint on the elimination sequence
Definition
partialOrderedEliminationSequenceStrategy.cpp:135
gum::PartialOrderedEliminationSequenceStrategy::nodeset_
NodeSet nodeset_
the nodes which can be currently eliminated
Definition
partialOrderedEliminationSequenceStrategy.h:152
gum::Set::clear
void clear()
Removes all the elements, if any, from the set.
Definition
set_tpl.h:315
gum::Set::empty
bool empty() const noexcept
Indicates whether the set is the empty set.
Definition
set_tpl.h:613
gum::Set::insert
void insert(const Key &k)
Inserts a new element into the set.
Definition
set_tpl.h:510
gum::Set::size
Size size() const noexcept
Returns the number of elements in the set.
Definition
set_tpl.h:607
gum::UndiGraph
Base class for undirected graphs.
Definition
undiGraph.h:130
gum::NodeProperty
HashTable< NodeId, VAL > NodeProperty
Property on graph elements.
Definition
graphElements.h:407
gum::NodeSet
Set< NodeId > NodeSet
Some typdefs and define for shortcuts ...
Definition
graphElements.h:392
gum
gum is the global namespace for all aGrUM entities
Definition
agrum.h:46
std
STL namespace.
partialOrderedEliminationSequenceStrategy.h
Base class for all elimination sequence algorithm that impose a given partial ordering on the nodes e...
partialOrderedEliminationSequenceStrategy_inl.h
Base class for all elimination sequence algorithm that impose a given partial ordering on the nodes e...
aGrUM
3.2.0
© PHW&CG&others - 2022
DoXyGeN 1.18.0