|
1 // -*- c++ -*- |
|
2 #ifndef HUGO_NET_GRAPH_H |
|
3 #define HUGO_NET_GRAPH_H |
|
4 |
|
5 ///\file |
|
6 ///\brief Declaration of EdgePathGraph. |
|
7 |
|
8 #include <hugo/invalid.h> |
|
9 #include <hugo/maps.h> |
|
10 |
|
11 /// The namespace of HugoLib |
|
12 namespace hugo { |
|
13 |
|
14 // @defgroup empty_graph The EdgePathGraph class |
|
15 // @{ |
|
16 |
|
17 /// A graph class in that a simple edge can represent a path. |
|
18 |
|
19 /// This class provides all the common features of a graph structure |
|
20 /// that represents a network. You can handle with it layers. This |
|
21 /// means that an edge in one layer can be a complete path in a nother |
|
22 /// layer. |
|
23 |
|
24 template <typename P, class Gact, class Gsub> |
|
25 class EdgePathGraph |
|
26 { |
|
27 |
|
28 public: |
|
29 |
|
30 /// The actual layer |
|
31 Gact actuallayer; |
|
32 |
|
33 |
|
34 /// The layer on which the edges in this layer can represent paths. |
|
35 Gsub * sublayer; |
|
36 |
|
37 |
|
38 /// Map of nodes that represent the nodes of this layer in the sublayer |
|
39 typename Gact::template NodeMap<typename Gsub::Node *> projection; |
|
40 |
|
41 |
|
42 /// Map of routes that are represented by some edges in this layer |
|
43 typename Gact::template EdgeMap<P *> edgepath; |
|
44 |
|
45 |
|
46 /// Defalult constructor. |
|
47 /// We don't need any extra lines, because the actuallayer |
|
48 /// variable has run its constructor, when we have created this class |
|
49 /// So only the two maps has to be initialised here. |
|
50 EdgePathGraph() : projection(actuallayer), edgepath(actuallayer) |
|
51 { |
|
52 } |
|
53 |
|
54 |
|
55 ///Copy consructor. |
|
56 EdgePathGraph(const EdgePathGraph<P, Gact, Gsub> & EPG ) : actuallayer(EPG.actuallayer) , edgepath(actuallayer), projection(actuallayer) |
|
57 { |
|
58 } |
|
59 |
|
60 |
|
61 /// Map adder |
|
62 |
|
63 /// This function gets two edgemaps. One belongs to the actual layer and the |
|
64 /// other belongs to the sublayer. |
|
65 /// The function iterates through all of the edges in the edgemap belonging to the actual layer. |
|
66 /// It gets the value that belongs to the actual edge, and adds it to the value of each edge in the |
|
67 /// path represented by itself in the edgemap that belongs to the sublayer. |
|
68 |
|
69 template <typename T1, typename T2> void addMap (typename Gact::EdgeMap<T1> & actmap, typename Gsub::EdgeMap<T2> & submap) |
|
70 { |
|
71 for(EdgeIt e(actuallayer);actuallayer.valid(e);actuallayer.next(e)) |
|
72 { |
|
73 typedef typename P::EdgeIt PEdgeIt; |
|
74 PEdgeIt f; |
|
75 |
|
76 //dep//cout << "Edge " << id(tail(e)) << " - " << id(head(e)) << " in actual layer is"; |
|
77 T1 incr=actmap[e]; |
|
78 //cout << incr << endl; |
|
79 |
|
80 if(edgepath[e]) |
|
81 { |
|
82 //dep//cout << endl << "Path"; |
|
83 for(edgepath[e]->first(f); edgepath[e]->valid(f); edgepath[e]->next(f)) |
|
84 { |
|
85 //dep//cout << " " << sublayer->id(sublayer->tail(f)) << "-" << sublayer->id(sublayer->head(f)); |
|
86 submap[f]+=incr; |
|
87 } |
|
88 //dep////cout << EPGr2.id(EPGr2.head(f)) << endl; |
|
89 //dep//cout << endl; |
|
90 } |
|
91 else |
|
92 { |
|
93 //dep//cout << " itself." <<endl; |
|
94 } |
|
95 } |
|
96 |
|
97 }; |
|
98 |
|
99 |
|
100 /// Describe |
|
101 /// This function walks thorugh the edges of the actual layer |
|
102 /// and displays the path represented by the actual edge. |
|
103 void describe () |
|
104 { |
|
105 for(EdgeIt e(actuallayer);actuallayer.valid(e);actuallayer.next(e)) |
|
106 { |
|
107 typedef typename P::EdgeIt PEdgeIt; |
|
108 PEdgeIt f; |
|
109 |
|
110 cout << "Edge " << id(tail(e)) << " - " << id(head(e)) << " in actual layer is"; |
|
111 if(edgepath[e]) |
|
112 { |
|
113 cout << endl << "Path"; |
|
114 for(edgepath[e]->first(f); edgepath[e]->valid(f); edgepath[e]->next(f)) |
|
115 { |
|
116 cout << " " << sublayer->id(sublayer->tail(f)) << "-" << sublayer->id(sublayer->head(f)); |
|
117 } |
|
118 //cout << EPGr2.id(EPGr2.head(f)) << endl; |
|
119 cout << endl; |
|
120 } |
|
121 else |
|
122 { |
|
123 cout << " itself." <<endl; |
|
124 } |
|
125 } |
|
126 |
|
127 }; |
|
128 |
|
129 |
|
130 |
|
131 |
|
132 /// The base type of the node iterators. |
|
133 |
|
134 /// This is the base type of each node iterators, |
|
135 /// thus each kind of node iterator will convert to this. |
|
136 /// The Node type of the EdgePathGraph is the Node type of the actual layer. |
|
137 typedef typename Gact::Node Node; |
|
138 |
|
139 |
|
140 /// This iterator goes through each node. |
|
141 |
|
142 /// Its usage is quite simple, for example you can count the number |
|
143 /// of nodes in graph \c G of type \c Graph like this: |
|
144 /// \code |
|
145 ///int count=0; |
|
146 ///for(Graph::NodeIt n(G);G.valid(n);G.next(n)) count++; |
|
147 /// \endcode |
|
148 /// The NodeIt type of the EdgePathGraph is the NodeIt type of the actual layer. |
|
149 typedef typename Gact::NodeIt NodeIt; |
|
150 |
|
151 |
|
152 /// The base type of the edge iterators. |
|
153 /// The Edge type of the EdgePathGraph is the Edge type of the actual layer. |
|
154 typedef typename Gact::Edge Edge; |
|
155 |
|
156 |
|
157 /// This iterator goes trough the outgoing edges of a node. |
|
158 |
|
159 /// This iterator goes trough the \e outgoing edges of a certain node |
|
160 /// of a graph. |
|
161 /// Its usage is quite simple, for example you can count the number |
|
162 /// of outgoing edges of a node \c n |
|
163 /// in graph \c G of type \c Graph as follows. |
|
164 /// \code |
|
165 ///int count=0; |
|
166 ///for(Graph::OutEdgeIt e(G,n);G.valid(e);G.next(e)) count++; |
|
167 /// \endcode |
|
168 /// The OutEdgeIt type of the EdgePathGraph is the OutEdgeIt type of the actual layer. |
|
169 typedef typename Gact::OutEdgeIt OutEdgeIt; |
|
170 |
|
171 |
|
172 /// This iterator goes trough the incoming edges of a node. |
|
173 |
|
174 /// This iterator goes trough the \e incoming edges of a certain node |
|
175 /// of a graph. |
|
176 /// Its usage is quite simple, for example you can count the number |
|
177 /// of outgoing edges of a node \c n |
|
178 /// in graph \c G of type \c Graph as follows. |
|
179 /// \code |
|
180 ///int count=0; |
|
181 ///for(Graph::InEdgeIt e(G,n);G.valid(e);G.next(e)) count++; |
|
182 /// \endcode |
|
183 /// The InEdgeIt type of the EdgePathGraph is the InEdgeIt type of the actual layer. |
|
184 typedef typename Gact::InEdgeIt InEdgeIt; |
|
185 |
|
186 |
|
187 /// This iterator goes through each edge. |
|
188 |
|
189 /// This iterator goes through each edge of a graph. |
|
190 /// Its usage is quite simple, for example you can count the number |
|
191 /// of edges in a graph \c G of type \c Graph as follows: |
|
192 /// \code |
|
193 ///int count=0; |
|
194 ///for(Graph::EdgeIt e(G);G.valid(e);G.next(e)) count++; |
|
195 /// \endcode |
|
196 /// The EdgeIt type of the EdgePathGraph is the EdgeIt type of the actual layer. |
|
197 typedef typename Gact::EdgeIt EdgeIt; |
|
198 |
|
199 |
|
200 /// First node of the graph. |
|
201 |
|
202 /// \retval i the first node. |
|
203 /// \return the first node. |
|
204 typename Gact::NodeIt &first(typename Gact::NodeIt &i) const { return actuallayer.first(i);} |
|
205 |
|
206 |
|
207 /// The first incoming edge. |
|
208 typename Gact::InEdgeIt &first(typename Gact::InEdgeIt &i, typename Gact::Node) const { return actuallayer.first(i);} |
|
209 |
|
210 |
|
211 /// The first outgoing edge. |
|
212 typename Gact::OutEdgeIt &first(typename Gact::OutEdgeIt &i, typename Gact::Node) const { return actuallayer.first(i);} |
|
213 |
|
214 |
|
215 // SymEdgeIt &first(SymEdgeIt &, Node) const { return i;} |
|
216 /// The first edge of the Graph. |
|
217 typename Gact::EdgeIt &first(typename Gact::EdgeIt &i) const { return actuallayer.first(i);} |
|
218 |
|
219 |
|
220 // Node getNext(Node) const {} |
|
221 // InEdgeIt getNext(InEdgeIt) const {} |
|
222 // OutEdgeIt getNext(OutEdgeIt) const {} |
|
223 // //SymEdgeIt getNext(SymEdgeIt) const {} |
|
224 // EdgeIt getNext(EdgeIt) const {} |
|
225 |
|
226 |
|
227 /// Go to the next node. |
|
228 typename Gact::NodeIt &next(typename Gact::NodeIt &i) const { return actuallayer.next(i);} |
|
229 /// Go to the next incoming edge. |
|
230 typename Gact::InEdgeIt &next(typename Gact::InEdgeIt &i) const { return actuallayer.next(i);} |
|
231 /// Go to the next outgoing edge. |
|
232 typename Gact::OutEdgeIt &next(typename Gact::OutEdgeIt &i) const { return actuallayer.next(i);} |
|
233 //SymEdgeIt &next(SymEdgeIt &) const {} |
|
234 /// Go to the next edge. |
|
235 typename Gact::EdgeIt &next(typename Gact::EdgeIt &i) const { return actuallayer.next(i);} |
|
236 |
|
237 ///Gives back the head node of an edge. |
|
238 typename Gact::Node head(typename Gact::Edge edge) const { return actuallayer.head(edge); } |
|
239 ///Gives back the tail node of an edge. |
|
240 typename Gact::Node tail(typename Gact::Edge edge) const { return actuallayer.tail(edge); } |
|
241 |
|
242 // Node aNode(InEdgeIt) const {} |
|
243 // Node aNode(OutEdgeIt) const {} |
|
244 // Node aNode(SymEdgeIt) const {} |
|
245 |
|
246 // Node bNode(InEdgeIt) const {} |
|
247 // Node bNode(OutEdgeIt) const {} |
|
248 // Node bNode(SymEdgeIt) const {} |
|
249 |
|
250 /// Checks if a node iterator is valid |
|
251 |
|
252 ///\todo Maybe, it would be better if iterator converted to |
|
253 ///bool directly, as Jacint prefers. |
|
254 bool valid(const typename Gact::Node& node) const { return actuallayer.valid(node);} |
|
255 /// Checks if an edge iterator is valid |
|
256 |
|
257 ///\todo Maybe, it would be better if iterator converted to |
|
258 ///bool directly, as Jacint prefers. |
|
259 bool valid(const typename Gact::Edge& edge) const { return actuallayer.valid(edge);} |
|
260 |
|
261 ///Gives back the \e id of a node. |
|
262 |
|
263 ///\warning Not all graph structures provide this feature. |
|
264 /// |
|
265 int id(const typename Gact::Node & node) const { return actuallayer.id(node);} |
|
266 ///Gives back the \e id of an edge. |
|
267 |
|
268 ///\warning Not all graph structures provide this feature. |
|
269 /// |
|
270 int id(const typename Gact::Edge & edge) const { return actuallayer.id(edge);} |
|
271 |
|
272 //void setInvalid(Node &) const {}; |
|
273 //void setInvalid(Edge &) const {}; |
|
274 |
|
275 ///Add a new node to the graph. |
|
276 |
|
277 /// \return the new node. |
|
278 /// |
|
279 typename Gact::Node addNode() { return actuallayer.addNode();} |
|
280 ///Add a new edge to the graph. |
|
281 |
|
282 ///Add a new edge to the graph with tail node \c tail |
|
283 ///and head node \c head. |
|
284 ///\return the new edge. |
|
285 typename Gact::Edge addEdge(typename Gact::Node node1, typename Gact::Node node2) { return actuallayer.addEdge(node1, node2);} |
|
286 |
|
287 /// Resets the graph. |
|
288 |
|
289 /// This function deletes all edges and nodes of the graph. |
|
290 /// It also frees the memory allocated to store them. |
|
291 void clear() {actuallayer.clear();} |
|
292 |
|
293 int nodeNum() const { return actuallayer.nodeNum();} |
|
294 int edgeNum() const { return actuallayer.edgeNum();} |
|
295 |
|
296 ///Read/write/reference map of the nodes to type \c T. |
|
297 |
|
298 ///Read/write/reference map of the nodes to type \c T. |
|
299 /// \sa MemoryMapSkeleton |
|
300 /// \todo We may need copy constructor |
|
301 /// \todo We may need conversion from other nodetype |
|
302 /// \todo We may need operator= |
|
303 /// \warning Making maps that can handle bool type (NodeMap<bool>) |
|
304 /// needs extra attention! |
|
305 |
|
306 template<class T> class NodeMap |
|
307 { |
|
308 public: |
|
309 typedef T ValueType; |
|
310 typedef Node KeyType; |
|
311 |
|
312 NodeMap(const EdgePathGraph &) {} |
|
313 NodeMap(const EdgePathGraph &, T) {} |
|
314 |
|
315 template<typename TT> NodeMap(const NodeMap<TT> &) {} |
|
316 |
|
317 /// Sets the value of a node. |
|
318 |
|
319 /// Sets the value associated with node \c i to the value \c t. |
|
320 /// |
|
321 void set(Node, T) {} |
|
322 // Gets the value of a node. |
|
323 //T get(Node i) const {return *(T*)0;} //FIXME: Is it necessary? |
|
324 T &operator[](Node) {return *(T*)0;} |
|
325 const T &operator[](Node) const {return *(T*)0;} |
|
326 |
|
327 /// Updates the map if the graph has been changed |
|
328 |
|
329 /// \todo Do we need this? |
|
330 /// |
|
331 void update() {} |
|
332 void update(T a) {} //FIXME: Is it necessary |
|
333 }; |
|
334 |
|
335 ///Read/write/reference map of the edges to type \c T. |
|
336 |
|
337 ///Read/write/reference map of the edges to type \c T. |
|
338 ///It behaves exactly in the same way as \ref NodeMap. |
|
339 /// \sa NodeMap |
|
340 /// \sa MemoryMapSkeleton |
|
341 /// \todo We may need copy constructor |
|
342 /// \todo We may need conversion from other edgetype |
|
343 /// \todo We may need operator= |
|
344 template<class T> class EdgeMap |
|
345 { |
|
346 public: |
|
347 typedef T ValueType; |
|
348 typedef Edge KeyType; |
|
349 |
|
350 EdgeMap(const EdgePathGraph &) {} |
|
351 EdgeMap(const EdgePathGraph &, T ) {} |
|
352 |
|
353 ///\todo It can copy between different types. |
|
354 /// |
|
355 template<typename TT> EdgeMap(const EdgeMap<TT> &) {} |
|
356 |
|
357 void set(Edge, T) {} |
|
358 //T get(Edge) const {return *(T*)0;} |
|
359 T &operator[](Edge) {return *(T*)0;} |
|
360 const T &operator[](Edge) const {return *(T*)0;} |
|
361 |
|
362 void update() {} |
|
363 void update(T a) {} //FIXME: Is it necessary |
|
364 }; |
|
365 }; |
|
366 |
|
367 /// An empty eraseable graph class. |
|
368 |
|
369 /// This class provides all the common features of an \e eraseable graph |
|
370 /// structure, |
|
371 /// however completely without implementations and real data structures |
|
372 /// behind the interface. |
|
373 /// All graph algorithms should compile with this class, but it will not |
|
374 /// run properly, of course. |
|
375 /// |
|
376 /// \todo This blabla could be replaced by a sepatate description about |
|
377 /// Skeletons. |
|
378 /// |
|
379 /// It can be used for checking the interface compatibility, |
|
380 /// or it can serve as a skeleton of a new graph structure. |
|
381 /// |
|
382 /// Also, you will find here the full documentation of a certain graph |
|
383 /// feature, the documentation of a real graph imlementation |
|
384 /// like @ref ListGraph or |
|
385 /// @ref SmartGraph will just refer to this structure. |
|
386 template <typename P, typename Gact, typename Gsub> |
|
387 class EraseableEdgePathGraph : public EdgePathGraph<P, Gact, Gsub> |
|
388 { |
|
389 public: |
|
390 /// Deletes a node. |
|
391 void erase(typename Gact::Node n) {actuallayer.erase(n);} |
|
392 /// Deletes an edge. |
|
393 void erase(typename Gact::Edge e) {actuallayer.erase(e);} |
|
394 |
|
395 /// Defalult constructor. |
|
396 EraseableEdgePathGraph() {} |
|
397 ///Copy consructor. |
|
398 EraseableEdgePathGraph(const EdgePathGraph<P, Gact, Gsub> &EPG) {} |
|
399 }; |
|
400 |
|
401 |
|
402 // @} |
|
403 |
|
404 } //namespace hugo |
|
405 |
|
406 |
|
407 #endif // HUGO_SKELETON_GRAPH_H |