home
about
news
download
doc
source
systems
tests
bugs
contact
IMP Reference Guide
2.5.0
The Integrative Modeling Platform
IMP Manual
Reference Guide
Modules
Classes
Examples
include
IMP
graph_macros.h
Go to the documentation of this file.
1
/**
2
* \file IMP/graph_macros.h
3
* \brief Various general useful macros for IMP.
4
*
5
* Copyright 2007-2015 IMP Inventors. All rights reserved.
6
*
7
*/
8
9
#ifndef IMPKERNEL_GRAPH_MACROS_H
10
#define IMPKERNEL_GRAPH_MACROS_H
11
#include <IMP/kernel_config.h>
12
#include <boost/graph/adjacency_list.hpp>
13
#include "
file.h
"
14
#include "internal/base_graph_utility.h"
15
#include <boost/unordered_map.hpp>
16
#include <boost/version.hpp>
17
18
#if defined(IMP_DOXYGEN)
19
//! Define a graph object in \imp
20
/** The docs for the graph should appear before the macro
21
invocation. Directionality should be one of
22
- \c bidirectional
23
- \c directed
24
- \c undirected
25
26
ShowVertex should take the VertexData as a variable named `vertex` and write
27
to a stream `out`.
28
*/
29
#define IMP_GRAPH(Name, directionality, VertexData, EdgeData, ShowVertex) \
30
/** See \ref graphs "Graphs in IMP" for more information.*/
\
31
typedef boost::graph Name; \
32
typedef Name::VertexNameMap Name##ConstVertexName; \
33
typedef Name::EdgeNameMap Name##ConstEdgeName; \
34
typedef boost::graph_traits<Name> Name##Traits; \
35
typedef Name::vertex_descriptor Name##Vertex; \
36
typedef Name::edge_descriptor Name##Edge; \
37
class Name##VertexIndex {}; \
38
inline void show_as_graphviz(const Name& name, TextOutput out); \
39
Name##VertexIndex get_vertex_index(const Name& g)
40
41
#elif defined(SWIG)
42
#if defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && \
43
BOOST_VERSION <= 104800
44
#define IMP_GRAPH(Name, directionality, VertexData, EdgeData, ShowVertex) \
45
class Name; \
46
inline void show_as_graphviz(const Name& name, TextOutput out); \
47
class Name##VertexIndex {}
48
49
#else // GCC VERSION
50
#define IMP_GRAPH(Name, directionality, VertexData, EdgeData, ShowVertex) \
51
class Name; \
52
class Name##VertexIndex {}; \
53
inline void show_as_graphviz(const Name& name, TextOutput out); \
54
inline Name##VertexIndex get_vertex_index(const Name& g)
55
#endif // GCC VERSION
56
57
#else // swig and doxygen
58
59
// Some combinations of gcc/boost fail to compile Python wrappers for
60
// get_vertex_index ("no match for 'operator=' error); fall back to
61
// std::map in this case
62
#if defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ == 7 && \
63
BOOST_VERSION == 104800
64
#define IMP_GRAPH_MAP_TYPE std::map
65
#else
66
#define IMP_GRAPH_MAP_TYPE boost::unordered_map
67
#endif
68
69
#define IMP_GRAPH(Name, directionality, VertexData, EdgeData, ShowVertex) \
70
typedef boost::adjacency_list< \
71
boost::vecS, boost::vecS, boost::directionality##S, \
72
boost::property<boost::vertex_name_t, VertexData>, \
73
boost::property<boost::edge_name_t, EdgeData> > Name; \
74
typedef boost::property_map<Name, boost::vertex_name_t>::const_type \
75
Name##ConstVertexName; \
76
typedef boost::property_map<Name, boost::edge_name_t>::const_type \
77
Name##ConstEdgeName; \
78
typedef boost::graph_traits<Name> Name##Traits; \
79
typedef Name##Traits::vertex_descriptor Name##Vertex; \
80
typedef Name##Traits::edge_descriptor Name##Edge; \
81
typedef IMP_GRAPH_MAP_TYPE<VertexData, Name##Vertex> Name##VertexIndex; \
82
inline Name##VertexIndex get_vertex_index(const Name& g) { \
83
return IMP::internal::get_graph_vertex_index< \
84
Name, VertexData, Name##Vertex, Name##Traits>(g); \
85
} \
86
struct Show##Name##Vertex { \
87
void operator()(VertexData vertex, TextOutput out) const { \
88
ShowVertex; \
89
} \
90
}; \
91
inline void show_as_graphviz(const Name& graph, TextOutput out) { \
92
IMP::internal::show_as_graphviz(graph, Show##Name##Vertex(), out); \
93
} \
94
typedef boost::property_map<Name, boost::edge_name_t>::type Name##EdgeName; \
95
typedef boost::property_map<Name, boost::vertex_name_t>::type Name##VertexName
96
#endif // swig and doxygen
97
98
#if defined(IMP_DOXYGEN) || defined(SWIG)
99
//! Define a graph object in \imp
100
/** See IMP_GRAPH() for more info. Edges have a floating point weight.
101
*/
102
#define IMP_WEIGHTED_GRAPH(Name, directionality, VertexData, ShowVertex) \
103
/** See \ref graphs "Graphs" for more information.*/
\
104
IMP_GRAPH(Name, directionality, VertexData, double, ShowVertex)
105
106
#elif defined(SWIG)
107
#define IMP_WEIGHTED_GRAPH(Name, directionality, VertexData, ShowVertex) \
108
class Name
109
#else
110
#define IMP_WEIGHTED_GRAPH(Name, directionality, VertexData, ShowVertex) \
111
typedef boost::adjacency_list< \
112
boost::vecS, boost::vecS, boost::directionality##S, \
113
boost::property<boost::vertex_name_t, VertexData>, \
114
boost::property<boost::edge_weight_t, double> > Name; \
115
typedef boost::property_map<Name, boost::vertex_name_t>::const_type \
116
Name##ConstVertexName; \
117
typedef boost::property_map<Name, boost::edge_weight_t>::const_type \
118
Name##ConstEdgeWeight; \
119
typedef boost::graph_traits<Name> Name##Traits; \
120
typedef Name##Traits::vertex_descriptor Name##Vertex; \
121
typedef Name##Traits::edge_descriptor Name##Edge; \
122
typedef boost::unordered_map<VertexData, Name##Vertex> Name##VertexIndex; \
123
inline Name##VertexIndex get_vertex_index(const Name& g) { \
124
return IMP::internal::get_graph_vertex_index< \
125
Name, VertexData, Name##Vertex, Name##Traits>(g); \
126
} \
127
struct Show##Name##Vertex { \
128
void operator()(VertexData vertex, TextOutput out) const { \
129
ShowVertex; \
130
} \
131
}; \
132
inline void show_as_graphviz(const Name& graph, TextOutput out) { \
133
IMP::internal::show_as_graphviz(graph, Show##Name##Vertex(), out); \
134
} \
135
typedef boost::property_map<Name, boost::edge_weight_t>::type \
136
Name##EdgeWeight; \
137
typedef boost::property_map<Name, boost::vertex_name_t>::type Name##VertexName
138
#endif
139
140
#endif
/* IMPKERNEL_GRAPH_MACROS_H */
file.h
Handling of file input/output.