Branch data Line data Source code
1 : : #ifndef MESHKIT_MKGRAPH_HPP
2 : : #define MESHKIT_MKGRAPH_HPP
3 : :
4 : : /** \file MKGraph.hpp
5 : : */
6 : : #include "lemon/list_graph.h"
7 : : #include "lemon/bfs.h"
8 : :
9 : : namespace MeshKit {
10 : :
11 : : class MeshOp;
12 : : class GraphNode;
13 : :
14 : : /** \class MKGraph MKGraph.hpp "meshkit/MKGraph.hpp"
15 : : * \brief Class encapsulating manipulations of the meshing operation graph
16 : : *
17 : : * Mesh generation can be phrased as a graph of operations, where each node in the graph is a
18 : : * distinct operation (some of them generating mesh, others just operating on mesh) and each arc
19 : : * a dependency between one operation and another. The graph in MeshKit has single root and leaf
20 : : * node, just as a convenience for starting up forward and reverse traversals of the graph.
21 : : * This class also defines the typedefs used for certain graph data structures like nodes and arcs.
22 : : */
23 : :
24 : : class MKGraph
25 : : {
26 : : public:
27 : :
28 : : /** \brief Bare constructor
29 : : */
30 : : MKGraph();
31 : :
32 : : //! virtual destructor
33 : : virtual ~MKGraph();
34 : :
35 : : //! clear GraphNode's/MeshOp's in graph
36 : : void clear_graph();
37 : :
38 : : //! print the graph
39 : : void print_graph(const char * filename = NULL);
40 : :
41 : : //! print the bfs graph
42 : : void print_bfs_graph();
43 : :
44 : : //! Get the graph
45 : : lemon::ListDigraph &get_graph();
46 : :
47 : : //! Get the (const) graph
48 : : const lemon::ListDigraph &get_graph() const;
49 : :
50 : : //! Get root node
51 : : GraphNode *root_node() const;
52 : :
53 : : //! Get leaf node
54 : : GraphNode *leaf_node() const;
55 : :
56 : : //! Get access to the node map
57 : : lemon::ListDigraph::NodeMap<GraphNode*> &node_map();
58 : :
59 : : //! Get access to the (const) node map
60 : : const lemon::ListDigraph::NodeMap<GraphNode*> &node_map() const;
61 : :
62 : : //! Get the MeshOp corresponding to a graph node
63 : : MeshOp *get_meshop(lemon::ListDigraph::Node node) const;
64 : :
65 : : //! Get the GraphNode corresponding to a graph node
66 : : GraphNode *get_node(lemon::ListDigraph::Node node) const;
67 : :
68 : : //! Get the GraphNode corresponding to the source node of this arc
69 : : GraphNode *source(lemon::ListDigraph::Arc arc) const;
70 : :
71 : : //! Get the GraphNode corresponding to the target node of this arc
72 : : GraphNode *target(lemon::ListDigraph::Arc arc) const;
73 : :
74 : : /** \brief Get the GraphNode at the other end of an arc from that specified
75 : : *
76 : : * \param arc The graph arc being queried
77 : : * \param node The other node
78 : : * \return The node on the other end of the specified arc
79 : : */
80 : : GraphNode *other_node(lemon::ListDigraph::Arc arc, GraphNode *node) const;
81 : :
82 : : /** \brief Find an existing GraphNode in the graph, starting from the root
83 : : * \param op_name GraphNode name being requested
84 : : * \return Pointer to GraphNode found, NULL if not found
85 : : */
86 : : GraphNode *find_node(std::string op_name) const;
87 : :
88 : : /** \brief Find an existing MeshOp in the graph, starting from the root
89 : : * \param op_name GraphNode name being requested
90 : : * \return Pointer to MeshOp found, NULL if not found
91 : : */
92 : : MeshOp *find_meshop(std::string op_name) const;
93 : :
94 : : /** \brief Insert a node in the graph just before the specified node
95 : : * \param inserted Node being inserted
96 : : * \param before Node before which new node is inserted
97 : : * \param after Node after which new node is inserted (default: NULL)
98 : : */
99 : : void insert_node(GraphNode *inserted, GraphNode *before, GraphNode *after= NULL);
100 : :
101 : : /** \brief add a graph edge from one node to another
102 : : * \param source Source node
103 : : * \param target Target node
104 : : */
105 : : void add_arc(GraphNode *source, GraphNode *target);
106 : :
107 : : /** \brief setup of the graph
108 : : * \param reset : if true (default), force setup of the whole graph
109 : : * if false, setup only newly added nodes, that were not setup yet
110 : : */
111 : : virtual void setup(bool reset = true);
112 : :
113 : : //! Run execute on the graph
114 : : virtual void execute();
115 : :
116 : : //! Run both setup and execute on the graph
117 : : virtual void setup_and_execute();
118 : :
119 : : // run execute on all nodes before this node (it may be a second run)
120 : : virtual void execute_before(GraphNode * upto);
121 : :
122 : : protected:
123 : : //! The GraphNode graph
124 : : lemon::ListDigraph mkGraph;
125 : :
126 : : //! Root and leaf nodes of graph
127 : : GraphNode *rootNode, *leafNode;
128 : :
129 : : //! Map from graph nodes to GraphNodes
130 : : lemon::ListDigraph::NodeMap<GraphNode*> nodeMap;
131 : :
132 : : private:
133 : :
134 : : /** \brief Copy constructor, not implemented
135 : : *
136 : : * Lemon does not allow copy construction of graphs, so disallow it in MK too
137 : : */
138 : : MKGraph(const MKGraph &);
139 : :
140 : : };
141 : :
142 : : //! Get (const) graph
143 : : inline const lemon::ListDigraph &MKGraph::get_graph() const
144 : : {
145 : : return mkGraph;
146 : : }
147 : :
148 : : //! Get graph
149 : 1777 : inline lemon::ListDigraph &MKGraph::get_graph()
150 : : {
151 : 1777 : return mkGraph;
152 : : }
153 : :
154 : : //! Get root node
155 : 519 : inline GraphNode *MKGraph::root_node() const
156 : : {
157 : 519 : return rootNode;
158 : : }
159 : :
160 : : //! Get leaf node
161 : 382 : inline GraphNode *MKGraph::leaf_node() const
162 : : {
163 : 382 : return leafNode;
164 : : }
165 : :
166 : : //! Get access to the node map
167 : : inline const lemon::ListDigraph::NodeMap<GraphNode*> &MKGraph::node_map() const
168 : : {
169 : : return nodeMap;
170 : : }
171 : :
172 : : //! Get access to the node map
173 : 404 : inline lemon::ListDigraph::NodeMap<GraphNode*> &MKGraph::node_map()
174 : : {
175 : 404 : return nodeMap;
176 : : }
177 : :
178 : : //! Get the GraphNode corresponding to a graph node
179 : 1 : inline GraphNode *MKGraph::get_node(lemon::ListDigraph::Node node) const
180 : : {
181 : 1 : return nodeMap[node];
182 : : }
183 : :
184 : 0 : inline GraphNode *MKGraph::source(lemon::ListDigraph::Arc arc) const
185 : : {
186 [ # # ]: 0 : return nodeMap[mkGraph.source(arc)];
187 : : }
188 : :
189 : 0 : inline GraphNode *MKGraph::target(lemon::ListDigraph::Arc arc) const
190 : : {
191 [ # # ]: 0 : return nodeMap[mkGraph.target(arc)];
192 : : }
193 : :
194 : : //! Run both setup and execute on the graph
195 : 47 : inline void MKGraph::setup_and_execute()
196 : : {
197 : 47 : setup();
198 : :
199 : 47 : execute();
200 : 47 : }
201 : :
202 : : } // namespace MeshKit
203 : :
204 : : #endif
205 : :
206 : :
|