aGrUM 2.3.2
a C++ library for (probabilistic) graphical models
gum::EliminationSequenceStrategy Class Referenceabstract

The base class for all elimination sequence algorithms used by triangulation algorithms. More...

#include <eliminationSequenceStrategy.h>

Inheritance diagram for gum::EliminationSequenceStrategy:
Collaboration diagram for gum::EliminationSequenceStrategy:

Public Member Functions

Accessors / Modifiers
virtual bool setGraph (UndiGraph *graph, const NodeProperty< Size > *dom_sizes)
 sets a new graph to be triangulated
virtual NodeId nextNodeToEliminate ()=0
 returns the new node to be eliminated within the triangulation algorithm
virtual void askFillIns (bool do_it)=0
 if the elimination sequence is able to compute fill-ins, we indicate whether we want this feature to be activated
virtual bool providesFillIns () const =0
 indicates whether the fill-ins generated by the eliminated nodes, if needed, will be computed by the elimination sequence, or need be computed by the triangulation itself.
virtual bool providesGraphUpdate () const =0
 indicates whether the elimination sequence updates by itself the graph after a node has been eliminated
virtual void eliminationUpdate (const NodeId node)
 performs all the graph/fill-ins updates provided (if any)
virtual const EdgeSetfillIns ()
 in case fill-ins are provided, this function returns the fill-ins due to all the nodes eliminated so far
virtual void clear ()
 clears the sequence (to prepare, for instance, a new elimination sequence)
UndiGraphgraph () const noexcept
 returns the current graph
const NodeProperty< Size > * domainSizes () const noexcept
 returns the current domain sizes

Protected Attributes

UndiGraphgraph_ {nullptr}
 the graph to be triangulated
const NodeProperty< Size > * domain_sizes_ {nullptr}
 the domain sizes of the variables/nodes
NodeProperty< doublelog_domain_sizes_
 the log of the domain sizes of the variables/nodes

Static Private Member Functions

static const EdgeSet_empty_fill_ins_ ()
 an empty fill-ins set used by default

Constructors / Destructors

virtual ~EliminationSequenceStrategy ()
 destructor
virtual EliminationSequenceStrategynewFactory () const =0
 creates a new elimination sequence of the same type as the current object, but this sequence contains only an empty graph
virtual EliminationSequenceStrategycopyFactory () const =0
 virtual copy constructor
 EliminationSequenceStrategy ()
 default constructor
 EliminationSequenceStrategy (UndiGraph *graph, const NodeProperty< Size > *domain_sizes)
 constructor for a (tensorly) non empty graph
 EliminationSequenceStrategy (const EliminationSequenceStrategy &from)
 copy constructor
 EliminationSequenceStrategy (EliminationSequenceStrategy &&from)
 move constructor

Detailed Description

The base class for all elimination sequence algorithms used by triangulation algorithms.

Definition at line 68 of file eliminationSequenceStrategy.h.

Constructor & Destructor Documentation

◆ ~EliminationSequenceStrategy()

gum::EliminationSequenceStrategy::~EliminationSequenceStrategy ( )
virtual

destructor

Definition at line 107 of file eliminationSequenceStrategy.cpp.

107 {
108 GUM_DESTRUCTOR(EliminationSequenceStrategy);
109 }

References EliminationSequenceStrategy().

Here is the call graph for this function:

◆ EliminationSequenceStrategy() [1/4]

◆ EliminationSequenceStrategy() [2/4]

gum::EliminationSequenceStrategy::EliminationSequenceStrategy ( UndiGraph * graph,
const NodeProperty< Size > * domain_sizes )
protected

constructor for a (tensorly) non empty graph

Definition at line 83 of file eliminationSequenceStrategy.cpp.

85 {
87
88 GUM_CONSTRUCTOR(EliminationSequenceStrategy);
89 }
virtual bool setGraph(UndiGraph *graph, const NodeProperty< Size > *dom_sizes)
sets a new graph to be triangulated
UndiGraph * graph() const noexcept
returns the current graph

References EliminationSequenceStrategy(), graph(), and setGraph().

Here is the call graph for this function:

◆ EliminationSequenceStrategy() [3/4]

gum::EliminationSequenceStrategy::EliminationSequenceStrategy ( const EliminationSequenceStrategy & from)
protected

copy constructor

Definition at line 92 of file eliminationSequenceStrategy.cpp.

93 :
94 graph_(from.graph_), domain_sizes_(from.domain_sizes_),
95 log_domain_sizes_(from.log_domain_sizes_) {
96 GUM_CONS_CPY(EliminationSequenceStrategy);
97 }
NodeProperty< double > log_domain_sizes_
the log of the domain sizes of the variables/nodes
const NodeProperty< Size > * domain_sizes_
the domain sizes of the variables/nodes
UndiGraph * graph_
the graph to be triangulated

References EliminationSequenceStrategy(), domain_sizes_, graph_, and log_domain_sizes_.

Here is the call graph for this function:

◆ EliminationSequenceStrategy() [4/4]

gum::EliminationSequenceStrategy::EliminationSequenceStrategy ( EliminationSequenceStrategy && from)
protected

move constructor

Definition at line 100 of file eliminationSequenceStrategy.cpp.

100 :
101 graph_(from.graph_), domain_sizes_(from.domain_sizes_),
102 log_domain_sizes_(std::move(from.log_domain_sizes_)) {
103 GUM_CONS_MOV(EliminationSequenceStrategy);
104 }

References EliminationSequenceStrategy(), domain_sizes_, graph_, and log_domain_sizes_.

Here is the call graph for this function:

Member Function Documentation

◆ _empty_fill_ins_()

const EdgeSet & gum::EliminationSequenceStrategy::_empty_fill_ins_ ( )
staticprivate

an empty fill-ins set used by default

Definition at line 60 of file eliminationSequenceStrategy.cpp.

60 {
61#ifdef GUM_DEBUG_MODE
62 static bool first_use = true;
63 if (first_use) {
64 first_use = false;
65 __debug__::_dec_creation_("Set", " __empty_edge_set", 0, "static variable correction", 0);
66 __debug__::_dec_creation_("HashTable",
67 " __empty_edge_set",
68 0,
69 "static variable correction",
70 0);
71 }
72#endif
73 static EdgeSet empty_fill_ins;
74 return empty_fill_ins;
75 }
Set< Edge > EdgeSet
Some typdefs and define for shortcuts ...

Referenced by fillIns().

Here is the caller graph for this function:

◆ askFillIns()

virtual void gum::EliminationSequenceStrategy::askFillIns ( bool do_it)
pure virtual

if the elimination sequence is able to compute fill-ins, we indicate whether we want this feature to be activated

Parameters
do_itwhen true and the elimination sequence has the ability to compute fill-ins, the elimination sequence will actually compute them (for the triangulation to use them), else they will not be available.

Implemented in gum::DefaultEliminationSequenceStrategy, gum::DefaultPartialOrderedEliminationSequenceStrategy, and gum::OrderedEliminationSequenceStrategy.

◆ clear()

void gum::EliminationSequenceStrategy::clear ( )
virtual

clears the sequence (to prepare, for instance, a new elimination sequence)

Reimplemented in gum::DefaultEliminationSequenceStrategy, gum::DefaultPartialOrderedEliminationSequenceStrategy, gum::OrderedEliminationSequenceStrategy, and gum::PartialOrderedEliminationSequenceStrategy.

Definition at line 119 of file eliminationSequenceStrategy.cpp.

119 {
120 graph_ = nullptr;
121 domain_sizes_ = nullptr;
122 log_domain_sizes_.clear();
123 }

References domain_sizes_, graph_, and log_domain_sizes_.

Referenced by gum::DefaultEliminationSequenceStrategy::clear(), gum::OrderedEliminationSequenceStrategy::clear(), gum::PartialOrderedEliminationSequenceStrategy::clear(), and setGraph().

Here is the caller graph for this function:

◆ copyFactory()

virtual EliminationSequenceStrategy * gum::EliminationSequenceStrategy::copyFactory ( ) const
pure virtual

virtual copy constructor

Returns
a full clone of the current object

Implemented in gum::DefaultEliminationSequenceStrategy, gum::DefaultPartialOrderedEliminationSequenceStrategy, gum::OrderedEliminationSequenceStrategy, gum::PartialOrderedEliminationSequenceStrategy, and gum::UnconstrainedEliminationSequenceStrategy.

References EliminationSequenceStrategy(), and graph().

Referenced by gum::StaticTriangulation::StaticTriangulation().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ domainSizes()

INLINE const NodeProperty< Size > * gum::EliminationSequenceStrategy::domainSizes ( ) const
noexcept

returns the current domain sizes

Definition at line 59 of file eliminationSequenceStrategy_inl.h.

59 {
60 return domain_sizes_;
61 }

References domain_sizes_.

Referenced by providesGraphUpdate().

Here is the caller graph for this function:

◆ eliminationUpdate()

void gum::EliminationSequenceStrategy::eliminationUpdate ( const NodeId node)
virtual

performs all the graph/fill-ins updates provided (if any)

Parameters
nodethe node the elimination of which requires the graph update

Reimplemented in gum::DefaultEliminationSequenceStrategy, gum::DefaultPartialOrderedEliminationSequenceStrategy, and gum::OrderedEliminationSequenceStrategy.

Definition at line 112 of file eliminationSequenceStrategy.cpp.

112{}

◆ fillIns()

const EdgeSet & gum::EliminationSequenceStrategy::fillIns ( )
virtual

in case fill-ins are provided, this function returns the fill-ins due to all the nodes eliminated so far

Reimplemented in gum::DefaultEliminationSequenceStrategy, gum::DefaultPartialOrderedEliminationSequenceStrategy, and gum::OrderedEliminationSequenceStrategy.

Definition at line 116 of file eliminationSequenceStrategy.cpp.

116{ return _empty_fill_ins_(); }
static const EdgeSet & _empty_fill_ins_()
an empty fill-ins set used by default

References _empty_fill_ins_().

Referenced by gum::DefaultEliminationSequenceStrategy::fillIns(), gum::DefaultPartialOrderedEliminationSequenceStrategy::fillIns(), and gum::OrderedEliminationSequenceStrategy::fillIns().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ graph()

◆ newFactory()

virtual EliminationSequenceStrategy * gum::EliminationSequenceStrategy::newFactory ( ) const
pure virtual

creates a new elimination sequence of the same type as the current object, but this sequence contains only an empty graph

Warning
you must deallocate by yourself the object returned
Returns
an empty clone of the current object with the same type

Implemented in gum::DefaultEliminationSequenceStrategy, gum::DefaultPartialOrderedEliminationSequenceStrategy, gum::OrderedEliminationSequenceStrategy, gum::PartialOrderedEliminationSequenceStrategy, and gum::UnconstrainedEliminationSequenceStrategy.

References EliminationSequenceStrategy().

Here is the call graph for this function:

◆ nextNodeToEliminate()

virtual NodeId gum::EliminationSequenceStrategy::nextNodeToEliminate ( )
pure virtual

returns the new node to be eliminated within the triangulation algorithm

Exceptions
NotFoundexception is thrown if there is no more node to eliminate in the graph

Implemented in gum::DefaultEliminationSequenceStrategy, gum::DefaultPartialOrderedEliminationSequenceStrategy, and gum::OrderedEliminationSequenceStrategy.

◆ providesFillIns()

virtual bool gum::EliminationSequenceStrategy::providesFillIns ( ) const
pure virtual

indicates whether the fill-ins generated by the eliminated nodes, if needed, will be computed by the elimination sequence, or need be computed by the triangulation itself.

An elimination sequence provides fill-ins to its triangulation if and only if it has the ability to compute them and it has been asked to do so (by method askFillIns)

Implemented in gum::DefaultEliminationSequenceStrategy, gum::DefaultPartialOrderedEliminationSequenceStrategy, and gum::OrderedEliminationSequenceStrategy.

◆ providesGraphUpdate()

virtual bool gum::EliminationSequenceStrategy::providesGraphUpdate ( ) const
pure virtual

indicates whether the elimination sequence updates by itself the graph after a node has been eliminated

Some algorithms have more informations than the triangulation algorithm to update the graph after a node has been eliminated. They can thus exploit these informations to update the graph faster than the triangulation itself. Hence the latter should delegate this operation to the elimination sequence. This is the case, for instance, for the defaultEliminationSequenceStrategy, which uses a SimplicialSet that knows that some eliminated nodes do not require any fill-in.

Implemented in gum::DefaultEliminationSequenceStrategy, gum::DefaultPartialOrderedEliminationSequenceStrategy, and gum::OrderedEliminationSequenceStrategy.

References domainSizes().

Here is the call graph for this function:

◆ setGraph()

bool gum::EliminationSequenceStrategy::setGraph ( UndiGraph * graph,
const NodeProperty< Size > * dom_sizes )
virtual

sets a new graph to be triangulated

The elimination sequence algorithms reinitializes its data to start a new triangulation with graph Graph

Parameters
graphthe new graph to be triangulated
dom_sizesthe domain sizes of the variables/nodes
Returns
true if the data structures were modified (if the graph or the domain sizes did not change, then there is no need to update the data structures).
Warning
Note that we allow dom_sizes to be defined over nodes/variables that do not belong to graph. These sizes will simply be ignored. However, it is compulsory that all the nodes of graph belong to dom_sizes
the graph can be altered during the triangulation.
note that, by aGrUM's rule, the graph and the domain sizes are not copied but only referenced by the elimination sequence algorithm.

Reimplemented in gum::DefaultEliminationSequenceStrategy, gum::DefaultPartialOrderedEliminationSequenceStrategy, gum::OrderedEliminationSequenceStrategy, and gum::PartialOrderedEliminationSequenceStrategy.

Definition at line 126 of file eliminationSequenceStrategy.cpp.

127 {
128 // check that both the graph and the domain sizes are different from nullptr
129 // or else that both are equal to nullptr
130 if (((graph != nullptr) && (dom_sizes == nullptr))
131 || ((graph == nullptr) && (dom_sizes != nullptr))) {
132 GUM_ERROR(GraphError,
133 "EliminationSequenceStrategy: one of the graph or the set of "
134 "domain sizes is a null pointer.");
135 }
136
137 // check that each node has a domain size
138 if (graph != nullptr) {
139 for (const auto node: *graph)
140 if (!dom_sizes->exists(node))
141 GUM_ERROR(GraphError,
142 "EliminationSequenceStrategy needs a domain size "
143 "for every node in the graph.");
144 }
145
146 // avoid empty modifications
147 if ((graph != graph_) || (dom_sizes != domain_sizes_)) {
148 // remove, if any, the current graph
149 clear();
150
151 // assign a new graph
152 graph_ = graph;
153 domain_sizes_ = dom_sizes;
154
155 if (graph_ != nullptr) {
156 // compute the log of the modalities
157 log_domain_sizes_.resize(graph_->sizeNodes() / 2);
158
159 for (const auto node: *graph_)
160 log_domain_sizes_.insert(node, std::log((*domain_sizes_)[node]));
161 }
162
163 return true;
164 }
165
166 return false;
167 }
virtual void clear()
clears the sequence (to prepare, for instance, a new elimination sequence)
#define GUM_ERROR(type, msg)
Definition exceptions.h:72

References clear(), domain_sizes_, gum::HashTable< Key, Val >::exists(), graph(), graph_, GUM_ERROR, and log_domain_sizes_.

Referenced by EliminationSequenceStrategy(), gum::DefaultEliminationSequenceStrategy::setGraph(), gum::OrderedEliminationSequenceStrategy::setGraph(), and gum::PartialOrderedEliminationSequenceStrategy::setGraph().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ domain_sizes_

const NodeProperty< Size >* gum::EliminationSequenceStrategy::domain_sizes_ {nullptr}
protected

the domain sizes of the variables/nodes

Definition at line 177 of file eliminationSequenceStrategy.h.

177{nullptr};

Referenced by EliminationSequenceStrategy(), EliminationSequenceStrategy(), clear(), domainSizes(), and setGraph().

◆ graph_

◆ log_domain_sizes_


The documentation for this class was generated from the following files: