28 #ifndef GUM_INCREMENTAL_TRIANGULATION_H 29 #define GUM_INCREMENTAL_TRIANGULATION_H 35 #include <agrum/tools/graphs/algorithms/triangulations/unconstrainedTriangulation.h> 36 #include <agrum/tools/graphs/cliqueGraph.h> 37 #include <agrum/tools/graphs/graphElements.h> 39 #ifndef DOXYGEN_SHOULD_SKIP_THIS 41 class IncrementalTriangulationTestSuite;
50 class IncrementalTriangulation:
public Triangulation {
62 IncrementalTriangulation(
const UnconstrainedTriangulation& triang_algo,
63 const UndiGraph* theGraph,
64 const NodeProperty< Size >* modal);
67 IncrementalTriangulation(
const UnconstrainedTriangulation& triangAlgo);
70 IncrementalTriangulation(
const IncrementalTriangulation& from);
73 ~IncrementalTriangulation();
84 void updateTriangulation();
87 void addNode(
const NodeId node, Size modal);
91 void eraseNode(
const NodeId node);
95 void addEdge(
const NodeId X,
const NodeId Y);
99 void eraseEdge(
const Edge& edge);
102 const EdgeSet& fillIns() {
103 GUM_ERROR(OperationNotAllowed,
"Not implemented yet");
107 const std::vector< NodeId >& eliminationOrder();
111 Idx eliminationOrder(
const NodeId);
114 const UndiGraph& triangulatedGraph() {
115 GUM_ERROR(OperationNotAllowed,
"Not implemented yet");
119 const UndiGraph& graph()
const;
122 const CliqueGraph& eliminationTree() {
123 GUM_ERROR(OperationNotAllowed,
"Not implemented yet");
127 const CliqueGraph& junctionTree();
131 NodeId createdJunctionTreeClique(
const NodeId id);
135 const NodeProperty< NodeId >& createdJunctionTreeCliques();
138 const CliqueGraph& maxPrimeSubgraphTree();
142 NodeId createdMaxPrimeSubgraph(
const NodeId id);
148 void setGraph(
const UndiGraph* theGraph,
149 const NodeProperty< Size >* domain_sizes);
152 const UnconstrainedTriangulation& triangulationAlgo()
const;
163 IncrementalTriangulation& operator=(
const IncrementalTriangulation& from);
166 virtual IncrementalTriangulation* newFactory()
const final;
169 virtual IncrementalTriangulation* copyFactory()
const final;
179 NodeProperty< Size > domain_sizes__;
182 CliqueGraph junction_tree__;
188 NodeProperty< List< NodeId > > mps_of_node__;
191 NodeProperty< std::vector< NodeId > > cliques_of_mps__;
194 NodeProperty< NodeId > mps_of_clique__;
197 NodeProperty<
bool > mps_affected__;
200 UnconstrainedTriangulation* triangulation__;
203 bool require_update__{
false};
206 bool require_elimination_order__{
false};
209 std::vector< NodeId > elimination_order__;
212 NodeProperty< Idx > reverse_elimination_order__;
215 bool require_created_JT_cliques__{
false};
218 NodeProperty< NodeId > created_JT_cliques__;
221 void markAffectedMPSsByRemoveLink__(
const NodeId My,
226 int markAffectedMPSsByAddLink__(
const NodeId My,
232 void performRemoveNode__(
const NodeId node,
const NodeId My,
const NodeId Mz);
235 void performAddNode__(
const NodeId node);
238 void setUpConnectedTriangulation__(
242 std::vector< Edge >& notAffectedneighborClique,
243 HashTable< NodeId,
bool >& cliques_affected);
246 void computeMaxPrimeMergings__(
249 std::vector< std::pair< NodeId, NodeId > >& merged_cliques,
250 NodeProperty<
bool >& mark,
251 const NodeSet& new_nodes_in_junction_tree)
const;
254 void updateJunctionTree__(NodeProperty<
bool >& all_cliques_affected,
255 NodeSet& new_nodes_in_junction_tree);
258 void updateMaxPrimeSubgraph__(NodeProperty<
bool >& cliques_affected,
259 const NodeSet& new_nodes_in_junction_tree);
262 void collectEliminationOrder__(
const NodeId node,
264 NodeProperty<
bool >& examined,
268 void collectJTCliques__(
const NodeId clique,
270 NodeProperty<
bool >& examined);
276 friend class gum_tests::IncrementalTriangulationTestSuite;
281 #ifndef GUM_NO_INLINE 282 # include <agrum/tools/graphs/algorithms/triangulations/incrementalTriangulation_inl.h>