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() { GUM_ERROR(OperationNotAllowed,
"Not implemented yet") }
105 const std::vector< NodeId >& eliminationOrder();
109 Idx eliminationOrder(
const NodeId);
112 const UndiGraph& triangulatedGraph() { GUM_ERROR(OperationNotAllowed,
"Not implemented yet") }
115 const UndiGraph& graph()
const;
118 const CliqueGraph& eliminationTree() { GUM_ERROR(OperationNotAllowed,
"Not implemented yet") }
121 const CliqueGraph& junctionTree();
125 NodeId createdJunctionTreeClique(
const NodeId id);
129 const NodeProperty< NodeId >& createdJunctionTreeCliques();
132 const CliqueGraph& maxPrimeSubgraphTree();
136 NodeId createdMaxPrimeSubgraph(
const NodeId id);
142 void setGraph(
const UndiGraph* theGraph,
const NodeProperty< Size >* domain_sizes);
145 const UnconstrainedTriangulation& triangulationAlgo()
const;
156 IncrementalTriangulation& operator=(
const IncrementalTriangulation& from);
159 virtual IncrementalTriangulation* newFactory()
const final;
162 virtual IncrementalTriangulation* copyFactory()
const final;
172 NodeProperty< Size > _domain_sizes_;
175 CliqueGraph _junction_tree_;
181 NodeProperty< List< NodeId > > _mps_of_node_;
184 NodeProperty< std::vector< NodeId > > _cliques_of_mps_;
187 NodeProperty< NodeId > _mps_of_clique_;
190 NodeProperty<
bool > _mps_affected_;
193 UnconstrainedTriangulation* _triangulation_;
196 bool _require_update_{
false};
199 bool _require_elimination_order_{
false};
202 std::vector< NodeId > _elimination_order_;
205 NodeProperty< Idx > _reverse_elimination_order_;
208 bool _require_created_JT_cliques_{
false};
211 NodeProperty< NodeId > _created_JT_cliques_;
214 void _markAffectedMPSsByRemoveLink_(
const NodeId My,
const NodeId Mz,
const Edge& edge);
217 int _markAffectedMPSsByAddLink_(
const NodeId My,
223 void _performRemoveNode_(
const NodeId node,
const NodeId My,
const NodeId Mz);
226 void _performAddNode_(
const NodeId node);
229 void _setUpConnectedTriangulation_(NodeId Mx,
232 std::vector< Edge >& notAffectedneighborClique,
233 HashTable< NodeId,
bool >& cliques_affected);
236 void _computeMaxPrimeMergings_(
const NodeId node,
238 std::vector< std::pair< NodeId, NodeId > >& merged_cliques,
239 NodeProperty<
bool >& mark,
240 const NodeSet& new_nodes_in_junction_tree)
const;
243 void _updateJunctionTree_(NodeProperty<
bool >& all_cliques_affected,
244 NodeSet& new_nodes_in_junction_tree);
247 void _updateMaxPrimeSubgraph_(NodeProperty<
bool >& cliques_affected,
248 const NodeSet& new_nodes_in_junction_tree);
251 void _collectEliminationOrder_(
const NodeId node,
253 NodeProperty<
bool >& examined,
257 void _collectJTCliques_(
const NodeId clique,
const NodeId from, NodeProperty<
bool >& examined);
263 friend class gum_tests::IncrementalTriangulationTestSuite;
268 #ifndef GUM_NO_INLINE 269 # include <agrum/tools/graphs/algorithms/triangulations/incrementalTriangulation_inl.h>