source: src/Graph/BoostGraphCreator.hpp

Candidate_v1.6.1
Last change on this file was f5ea10, checked in by Frederik Heber <frederik.heber@…>, 7 years ago

Added Graph6Reader, extended BoostGraphCreator, added ChemicalSpaceEvaluatorAction.

  • added visible generateAllInducedSubgraphs to Extractors.
  • TESTS: due to new option "graph6" containing a digit we needed to modify moltest_check.py to also scan for digits and not just letters.
  • DOCU: Added evaluate-chemical-space to userguide.
  • Property mode set to 100644
File size: 6.2 KB
Line 
1/*
2 * BoostGraphCreator.hpp
3 *
4 * Created on: May 17, 2017
5 * Author: heber
6 */
7
8
9#ifndef GRAPH_BOOSTGRAPHCREATOR_HPP_
10#define GRAPH_BOOSTGRAPHCREATOR_HPP_
11
12// include config.h
13#ifdef HAVE_CONFIG_H
14#include <config.h>
15#endif
16
17#include <map>
18#include <vector>
19
20#include <boost/function.hpp>
21#include <boost/graph/adjacency_list.hpp>
22
23#include "types.hpp"
24
25class atom;
26class bond;
27class molecule;
28
29class BoostGraphCreatorTest;
30class BreadthFirstSearchGathererTest;
31
32/** This is a helper class that contains functions to create a boost::graph
33 * from the present bond graph of molecules.
34 */
35struct BoostGraphCreator
36{
37 //!> grant unit test access to private parts
38 friend class BoostGraphCreatorTest;
39 //!> grant unit test access to private parts that use BoostGraphCreator's internal graph
40 friend class BreadthFirstSearchGathererTest;
41
42public:
43
44 //!> typedef for an undirected graph using boost::graph
45 typedef boost::adjacency_list < boost::vecS, boost::vecS, boost::undirectedS,
46 boost::property<boost::vertex_name_t, atomId_t>,
47 boost::property<boost::vertex_color_t, boost::default_color_type> /* needed for limited-depth DFS,
48 otherwise the property_map gets full size of graph */
49 > UndirectedGraph;
50
51 //!> typedef for a map of graph node indices
52 typedef boost::property_map < UndirectedGraph, boost::vertex_index_t >::type index_map_t;
53 typedef boost::property_map < UndirectedGraph, boost::vertex_index_t >::const_type const_index_map_t;
54 //!> typedef for a map of graph node indices
55 typedef boost::property_map < UndirectedGraph, boost::vertex_name_t >::type name_map_t;
56 typedef boost::property_map < UndirectedGraph, boost::vertex_name_t >::const_type const_name_map_t;
57 //!> typedef for the predicate to evaluate for adding the current edge or not
58 typedef boost::function<bool (const bond &)> predicate_t;
59 //!> typedef for a Vertex
60 typedef boost::graph_traits<UndirectedGraph>::vertex_descriptor Vertex;
61 //!> typedef for vertex iterator
62 typedef boost::graph_traits<UndirectedGraph>::vertex_iterator vertex_iter;
63 //!> typedef for a Edge
64 typedef boost::graph_traits<UndirectedGraph>::edge_descriptor Edge;
65 //!> typedef for edge iterator
66 typedef boost::graph_traits<UndirectedGraph>::edge_iterator edge_iter;
67
68 //!> typedef for a node id
69 typedef size_t nodeId_t;
70 //!> typedef for map converting between node id in graph and the associated atomic id
71 typedef std::map<atomId_t, nodeId_t> atomids_nodeids_t;
72
73 /** Creates the boost::graph using all atoms and bonds in the given \a _mol.
74 *
75 * \param _mol molecule whose bond graph to construct
76 * \param _pred predicate to evaluate on adding each edge/bond
77 */
78 void createFromMolecule(
79 const molecule &_mol,
80 const predicate_t &_pred);
81
82 /** Creates the boost::graph using all atoms and bonds in the given vector
83 * of \a _atoms
84 *
85 * \param _atoms vector of _atoms whose bond graph to construct
86 * \param _pred predicate to evaluate on adding each edge/bond
87 */
88 void createFromAtoms(
89 const std::vector<atom *> &_atoms,
90 const predicate_t &_pred);
91
92 /** Creates the boost::graph from the defining graph6 string where the atom
93 * nodes map is simply the identity.
94 *
95 * \param _graph_string graph6 string defining the graph
96 */
97 void createFromGraph6String(
98 const std::string &_graph_string);
99
100 /** Getter for the created graph.
101 *
102 * \return graph
103 */
104 UndirectedGraph get() const
105 { return graph; }
106
107 /** Getter for the index map of the created graph.
108 *
109 * \return indexmap
110 */
111 index_map_t getIndexMap() const {
112 return boost::get(boost::vertex_index, graph);
113 }
114
115 /** Return the number of vertices contained in the created graph.
116 *
117 * \return number of vertices
118 */
119 size_t getNumVertices() const {
120 return boost::num_vertices(graph);
121 }
122
123 /** Return the number of edges contained in the created graph.
124 *
125 * \return number of edges
126 */
127 size_t getNumEdges() const {
128 return boost::num_edges(graph);
129 }
130
131 /** Returns the node id to a given atom id \a _atomid.
132 *
133 * \param _atomid atom id
134 * \return node id
135 */
136 nodeId_t getNodeId(const atomId_t &_atomid) const;
137
138 /** General purpose function that contains the internal logic of walking the
139 * bonds of a set of atoms given by \a _begin and \a _end iterators and
140 * adding its edges to a graph based on the evaluation of a given predicate
141 * \a _pred.
142 *
143 * \note We need \a _no_nodes because molecule::iterator does not work with
144 * std::distance.
145 *
146 * \param _begin begin iterator
147 * \param _end end iterator
148 * \param _no_nodes number of nodes
149 * \param _pred predicate
150 */
151 template <typename iterator>
152 void createFromRange(
153 const iterator &_begin,
154 const iterator &_end,
155 const size_t &_no_nodes,
156 const predicate_t &_pred
157 );
158
159 /** Finds a given edge by its two atomic indices.
160 *
161 * \param _firstid first atomic id of edge
162 * \param _secondid second atomic id of edge
163 * \return edge descriptor in graph or empty descriptor
164 */
165 Edge findEdge(const atomId_t &_firstid, const atomId_t &_secondid);
166
167 /** Allows to remove a present edge in the graph.
168 *
169 * \param _firstid first atomic id of edge
170 * \param _secondid second atomic id of edge
171 * \return true - edge found and removed, false - else
172 */
173 bool removeEdge(const atomId_t &_firstid, const atomId_t &_secondid);
174
175 /** Allows to remove a present edge in the graph.
176 *
177 * \param _bondids pair of bond ids
178 * \return true - edge found and removed, false - else
179 */
180 bool removeEdge(const std::pair<atomId_t, atomId_t> &_bondids)
181 { return removeEdge(_bondids.first, _bondids.second); }
182
183 /** Adds an edge to the graph if not already present.
184 *
185 * \param _firstid first atomic id of edge
186 * \param _secondid second atomic id of edge
187 * \return true - edge not found thus added, false - else
188 */
189 bool addEdge(const atomId_t &_firstid, const atomId_t &_secondid);
190
191private:
192 //!> internal graph that is created by creator functions
193 UndirectedGraph graph;
194 //!> external property map for all the atomic ids of each graph node
195 atomids_nodeids_t atomids_nodeids;
196};
197
198#include "BoostGraphCreator_impl.hpp"
199
200
201#endif /* GRAPH_BOOSTGRAPHCREATOR_HPP_ */
Note: See TracBrowser for help on using the repository browser.