src/work/peter/edgepathgraph.h
author deba
Wed, 08 Sep 2004 12:06:45 +0000 (2004-09-08)
changeset 822 88226d9fe821
child 826 056fbb112b30
permissions -rw-r--r--
The MapFactories have been removed from the code because
if we use macros then they increases only the complexity.

The pair iterators of the maps are separeted from the maps.

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