LCOV - code coverage report
Current view: top level - core/meshkit - MKGraph.hpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 14 18 77.8 %
Date: 2020-07-01 15:24:36 Functions: 6 8 75.0 %
Branches: 0 4 0.0 %

           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                 :            :   

Generated by: LCOV version 1.11