lemon/bpugraph_adaptor.h
author deba
Mon, 03 Apr 2006 16:03:37 +0000
changeset 2032 18c08f9129e4
child 2040 c7bd55c0d820
permissions -rw-r--r--
Writeable extension of some maps
     1 /* -*- C++ -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library
     4  *
     5  * Copyright (C) 2003-2006
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     9  * Permission to use, modify and distribute this software is granted
    10  * provided that this copyright notice appears in all copies. For
    11  * precise terms see the accompanying LICENSE file.
    12  *
    13  * This software is provided "AS IS" with no warranty of any kind,
    14  * express or implied, and with no claim as to its suitability for any
    15  * purpose.
    16  *
    17  */
    18 
    19 #ifndef LEMON_BPUGRAPH_ADAPTOR_H
    20 #define LEMON_BPUGRAPH_ADAPTOR_H
    21 
    22 #include <lemon/bits/invalid.h>
    23 #include <lemon/maps.h>
    24 
    25 #include <lemon/bits/graph_adaptor_extender.h>
    26 
    27 #include <lemon/bits/traits.h>
    28 
    29 #include <iostream>
    30 
    31 ///\ingroup graph_adaptors
    32 ///\file
    33 ///\brief Several graph adaptors.
    34 ///
    35 ///This file contains several useful bpugraph adaptor functions.
    36 ///
    37 ///\author Balazs Dezso
    38 
    39 namespace lemon {
    40 
    41   /// \ingroup graph_adaptors
    42   ///
    43   /// \brief Base type for the Bipartite Undirected Graph Adaptors
    44   ///
    45   /// This is the base type for most of LEMON bpugraph adaptors. 
    46   /// This class implements a trivial graph adaptor i.e. it only wraps the 
    47   /// functions and types of the graph. The purpose of this class is to 
    48   /// make easier implementing graph adaptors. E.g. if an adaptor is 
    49   /// considered which differs from the wrapped graph only in some of its 
    50   /// functions or types, then it can be derived from BpUGraphAdaptor, and 
    51   /// only the differences should be implemented.
    52   ///
    53   /// \author Balazs Dezso 
    54   template<typename _BpUGraph>
    55   class BpUGraphAdaptorBase {
    56   public:
    57     typedef _BpUGraph Graph;
    58     typedef Graph ParentGraph;
    59 
    60   protected:
    61     Graph* graph;
    62 
    63     BpUGraphAdaptorBase() : graph(0) {}
    64 
    65     void setGraph(Graph& _graph) { graph = &_graph; }
    66 
    67     Graph& getGraph() { return *graph; }
    68     const Graph& getGraph() const { return *graph; }
    69 
    70   public:
    71 
    72     BpUGraphAdaptorBase(Graph& _graph) : graph(&_graph) {}
    73  
    74     typedef typename Graph::Node Node;
    75     typedef typename Graph::ANode ANode;
    76     typedef typename Graph::BNode BNode;
    77     typedef typename Graph::Edge Edge;
    78     typedef typename Graph::UEdge UEdge;
    79    
    80     void first(Node& i) const { graph->first(i); }
    81     void firstANode(Node& i) const { graph->firstANode(i); }
    82     void firstBNode(Node& i) const { graph->firstBNode(i); }
    83     void first(Edge& i) const { graph->first(i); }
    84     void first(UEdge& i) const { graph->first(i); }
    85     void firstIn(Edge& i, const Node& n) const { graph->firstIn(i, n); }
    86     void firstOut(Edge& i, const Node& n ) const { graph->firstOut(i, n); }
    87     void firstInc(UEdge &i, bool &d, const Node &n) const {
    88       graph->firstInc(i, d, n);
    89     }
    90 
    91     void next(Node& i) const { graph->next(i); }
    92     void nextANode(Node& i) const { graph->nextANode(i); }
    93     void nextBNode(Node& i) const { graph->nextBNode(i); }
    94     void next(Edge& i) const { graph->next(i); }
    95     void next(UEdge& i) const { graph->next(i); }
    96     void nextIn(Edge& i) const { graph->nextIn(i); }
    97     void nextOut(Edge& i) const { graph->nextOut(i); }
    98     void nextInc(UEdge &i, bool &d) const { graph->nextInc(i, d); }
    99 
   100     Node source(const UEdge& e) const { return graph->source(e); }
   101     Node target(const UEdge& e) const { return graph->target(e); }
   102 
   103     Node source(const Edge& e) const { return graph->source(e); }
   104     Node target(const Edge& e) const { return graph->target(e); }
   105 
   106     typedef NodeNumTagIndicator<Graph> NodeNumTag;
   107     int nodeNum() const { return graph->nodeNum(); }
   108     int aNodeNum() const { return graph->aNodeNum(); }
   109     int bNodeNum() const { return graph->bNodeNum(); }
   110     
   111     typedef EdgeNumTagIndicator<Graph> EdgeNumTag;
   112     int edgeNum() const { return graph->edgeNum(); }
   113     int uEdgeNum() const { return graph->uEdgeNum(); }
   114 
   115     typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
   116     Edge findEdge(const Node& source, const Node& target, 
   117 		  const Edge& prev = INVALID) {
   118       return graph->findEdge(source, target, prev);
   119     }
   120     UEdge findUEdge(const Node& source, const Node& target, 
   121                     const UEdge& prev = INVALID) {
   122       return graph->findUEdge(source, target, prev);
   123     }
   124   
   125     Node addNode() const { return graph->addNode(); }
   126     UEdge addEdge(const Node& source, const Node& target) const { 
   127       return graph->addEdge(source, target); 
   128     }
   129 
   130     void erase(const Node& i) const { graph->erase(i); }
   131     void erase(const UEdge& i) const { graph->erase(i); }
   132   
   133     void clear() const { graph->clear(); }
   134 
   135     bool direction(const Edge& e) const { return graph->direction(e); }
   136     Edge direct(const UEdge& e, bool d) const { return graph->direct(e, d); }
   137     
   138     int id(const Node& v) const { return graph->id(v); }
   139     int id(const ANode& v) const { return graph->id(v); }
   140     int id(const BNode& v) const { return graph->id(v); }
   141     int id(const Edge& e) const { return graph->id(e); }
   142     int id(const UEdge& e) const { return graph->id(e); }
   143 
   144     Node fromNodeId(int id) const { return graph->fromNodeId(id); }
   145     ANode fromANodeId(int id) const { return graph->fromANodeId(id); }
   146     BNode fromBNodeId(int id) const { return graph->fromBNodeId(id); }
   147     Edge fromEdgeId(int id) const { return graph->fromEdgeId(id); }
   148     UEdge fromUEdgeId(int id) const { return graph->fromUEdgeId(id); }
   149 
   150     int maxNodeId() const { return graph->maxNodeId(); }
   151     int maxANodeId() const { return graph->maxANodeId(); }
   152     int maxBNodeId() const { return graph->maxBNodeId(); }
   153     int maxEdgeId() const { return graph->maxEdgeId(); }
   154     int maxUEdgeId() const { return graph->maxEdgeId(); }
   155 
   156     typedef typename ItemSetTraits<Graph, Node>::ItemNotifier NodeNotifier;
   157     NodeNotifier& getNotifier(Node) const {
   158       return graph->getNotifier(Node()); 
   159     } 
   160 
   161     typedef typename ItemSetTraits<Graph, ANode>::ItemNotifier ANodeNotifier;
   162     ANodeNotifier& getNotifier(ANode) const {
   163       return graph->getNotifier(ANode());
   164     } 
   165 
   166     typedef typename ItemSetTraits<Graph, BNode>::ItemNotifier BNodeNotifier;
   167     BNodeNotifier& getNotifier(BNode) const {
   168       return graph->getNotifier(BNode());
   169     } 
   170 
   171     typedef typename ItemSetTraits<Graph, Edge>::ItemNotifier EdgeNotifier;
   172     EdgeNotifier& getNotifier(Edge) const {
   173       return graph->getNotifier(Edge());
   174     } 
   175 
   176     typedef typename ItemSetTraits<Graph, UEdge>::ItemNotifier UEdgeNotifier;
   177     UEdgeNotifier& getNotifier(UEdge) const {
   178       return graph->getNotifier(UEdge());
   179     } 
   180 
   181     template <typename _Value>
   182     class NodeMap : public Graph::template NodeMap<_Value> {
   183     public:
   184       typedef typename Graph::template NodeMap<_Value> Parent;
   185       explicit NodeMap(const BpUGraphAdaptorBase<Graph>& ga) 
   186 	: Parent(*ga.graph) {}
   187       NodeMap(const BpUGraphAdaptorBase<Graph>& ga, const _Value& value)
   188 	: Parent(*ga.graph, value) {}
   189 
   190       NodeMap& operator=(const NodeMap& cmap) {
   191 	return operator=<NodeMap>(cmap);
   192       }
   193 
   194       template <typename CMap>
   195       NodeMap& operator=(const CMap& cmap) {
   196         Parent::operator=(cmap);
   197 	return *this;
   198       }
   199     };
   200 
   201     template <typename _Value>
   202     class ANodeMap : public Graph::template ANodeMap<_Value> {
   203     public:
   204       typedef typename Graph::template ANodeMap<_Value> Parent;
   205       explicit ANodeMap(const BpUGraphAdaptorBase& ga) 
   206 	: Parent(*ga.graph) {}
   207       ANodeMap(const BpUGraphAdaptorBase& ga, const _Value& value)
   208 	: Parent(*ga.graph, value) {}
   209 
   210       ANodeMap& operator=(const ANodeMap& cmap) {
   211 	return operator=<ANodeMap>(cmap);
   212       }
   213 
   214       template <typename CMap>
   215       ANodeMap& operator=(const CMap& cmap) {
   216         Parent::operator=(cmap);
   217 	return *this;
   218       }
   219     };
   220 
   221     template <typename _Value>
   222     class BNodeMap : public Graph::template BNodeMap<_Value> {
   223     public:
   224       typedef typename Graph::template BNodeMap<_Value> Parent;
   225       explicit BNodeMap(const BpUGraphAdaptorBase<Graph>& ga) 
   226 	: Parent(*ga.graph) {}
   227       BNodeMap(const BpUGraphAdaptorBase<Graph>& ga, const _Value& value)
   228 	: Parent(*ga.graph, value) {}
   229 
   230       BNodeMap& operator=(const BNodeMap& cmap) {
   231 	return operator=<BNodeMap>(cmap);
   232       }
   233 
   234       template <typename CMap>
   235       BNodeMap& operator=(const CMap& cmap) {
   236         Parent::operator=(cmap);
   237 	return *this;
   238       }
   239     };
   240 
   241     template <typename _Value>
   242     class EdgeMap : public Graph::template EdgeMap<_Value> {
   243     public:
   244       typedef typename Graph::template EdgeMap<_Value> Parent;
   245       explicit EdgeMap(const BpUGraphAdaptorBase<Graph>& ga) 
   246 	: Parent(*ga.graph) {}
   247       EdgeMap(const BpUGraphAdaptorBase<Graph>& ga, const _Value& value)
   248 	: Parent(*ga.graph, value) {}
   249 
   250       EdgeMap& operator=(const EdgeMap& cmap) {
   251 	return operator=<EdgeMap>(cmap);
   252       }
   253 
   254       template <typename CMap>
   255       EdgeMap& operator=(const CMap& cmap) {
   256         Parent::operator=(cmap);
   257 	return *this;
   258       }
   259     };
   260 
   261     template <typename _Value>
   262     class UEdgeMap : public Graph::template UEdgeMap<_Value> {
   263     public:
   264       typedef typename Graph::template UEdgeMap<_Value> Parent;
   265       explicit UEdgeMap(const BpUGraphAdaptorBase<Graph>& ga) 
   266 	: Parent(*ga.graph) {}
   267       UEdgeMap(const BpUGraphAdaptorBase<Graph>& ga, const _Value& value)
   268 	: Parent(*ga.graph, value) {}
   269 
   270       UEdgeMap& operator=(const UEdgeMap& cmap) {
   271 	return operator=<UEdgeMap>(cmap);
   272       }
   273 
   274       template <typename CMap>
   275       UEdgeMap& operator=(const CMap& cmap) {
   276         Parent::operator=(cmap);
   277 	return *this;
   278       }
   279     };
   280 
   281   };
   282 
   283   /// \ingroup graph_adaptors
   284   template <typename _BpUGraph>
   285   class BpUGraphAdaptor 
   286     : public BpUGraphAdaptorExtender< BpUGraphAdaptorBase<_BpUGraph> > { 
   287   public:
   288     typedef _BpUGraph Graph;
   289     typedef BpUGraphAdaptorExtender<BpUGraphAdaptorBase<_BpUGraph> > Parent;
   290   protected:
   291     BpUGraphAdaptor() : Parent() {}
   292 
   293   public:
   294     explicit BpUGraphAdaptor(Graph& _graph) { setGraph(_graph); }
   295   };
   296 
   297   template <typename _BpUGraph>
   298   class SwapBpUGraphAdaptorBase : public BpUGraphAdaptorBase<_BpUGraph> {
   299   public:
   300     
   301     typedef _BpUGraph Graph;
   302     typedef BpUGraphAdaptorBase<_BpUGraph> Parent;
   303 
   304   protected:
   305     
   306     SwapBpUGraphAdaptorBase() {}
   307 
   308   public:
   309 
   310     typedef typename Parent::Node Node;
   311     typedef typename Parent::BNode ANode;
   312     typedef typename Parent::ANode BNode;
   313 
   314     void firstANode(Node& i) const { Parent::firstBNode(i); }
   315     void firstBNode(Node& i) const { Parent::firstANode(i); }
   316 
   317     void nextANode(Node& i) const { Parent::nextBNode(i); }
   318     void nextBNode(Node& i) const { Parent::nextANode(i); }
   319 
   320     int id(const ANode& v) const { return Parent::id(v); }
   321     int id(const BNode& v) const { return Parent::id(v); }
   322 
   323     ANode fromANodeId(int id) const { return Parent::fromBNodeId(id); }
   324     BNode fromBNodeId(int id) const { return Parent::fromANodeId(id); }
   325 
   326     int maxANodeId() const { return Parent::maxBNodeId(); }
   327     int maxBNodeId() const { return Parent::maxANodeId(); }
   328 
   329     int aNodeNum() const { return Parent::bNodeNum(); }
   330     int bNodeNum() const { return Parent::aNodeNum(); }
   331 
   332     typedef typename Parent::BNodeNotifier ANodeNotifier;
   333     ANodeNotifier& getNotifier(ANode) const {
   334       return Parent::getNotifier(typename Parent::BNode());
   335     } 
   336 
   337     typedef typename Parent::ANodeNotifier BNodeNotifier;
   338     BNodeNotifier& getNotifier(BNode) const {
   339       return Parent::getNotifier(typename Parent::ANode());
   340     } 
   341 
   342     template <typename _Value>
   343     class ANodeMap : public Graph::template BNodeMap<_Value> {
   344     public:
   345       typedef typename Graph::template BNodeMap<_Value> Parent;
   346       explicit ANodeMap(const SwapBpUGraphAdaptorBase& ga) 
   347 	: Parent(*ga.graph) {}
   348       ANodeMap(const SwapBpUGraphAdaptorBase& ga, const _Value& value)
   349 	: Parent(*ga.graph, value) {}
   350 
   351       ANodeMap& operator=(const ANodeMap& cmap) {
   352 	return operator=<ANodeMap>(cmap);
   353       }
   354 
   355       template <typename CMap>
   356       ANodeMap& operator=(const CMap& cmap) {
   357         Parent::operator=(cmap);
   358 	return *this;
   359       }
   360     };
   361 
   362     template <typename _Value>
   363     class BNodeMap : public Graph::template ANodeMap<_Value> {
   364     public:
   365       typedef typename Graph::template ANodeMap<_Value> Parent;
   366       explicit BNodeMap(const SwapBpUGraphAdaptorBase<Graph>& ga) 
   367 	: Parent(*ga.graph) {}
   368       BNodeMap(const SwapBpUGraphAdaptorBase<Graph>& ga, const _Value& value)
   369 	: Parent(*ga.graph, value) {}
   370 
   371       BNodeMap& operator=(const BNodeMap& cmap) {
   372 	return operator=<BNodeMap>(cmap);
   373       }
   374 
   375       template <typename CMap>
   376       BNodeMap& operator=(const CMap& cmap) {
   377         Parent::operator=(cmap);
   378 	return *this;
   379       }
   380     };
   381     
   382   };
   383 
   384   /// \ingroup graph_adaptors
   385   ///
   386   /// \brief Bipartite graph adaptor which swaps the two nodeset.
   387   ///
   388   /// Bipartite graph adaptor which swaps the two nodeset. The adaptor's
   389   /// a-nodeset will be the original graph's b-nodeset and the adaptor's
   390   /// b-nodeset will be the original graph's a-nodeset. 
   391   template <typename _BpUGraph>
   392   class SwapBpUGraphAdaptor 
   393     : public BpUGraphAdaptorExtender<SwapBpUGraphAdaptorBase<_BpUGraph> > { 
   394   public:
   395 
   396     typedef _BpUGraph Graph;
   397     typedef BpUGraphAdaptorExtender<SwapBpUGraphAdaptorBase<_BpUGraph> > 
   398     Parent;
   399 
   400   protected:
   401     SwapBpUGraphAdaptor() : Parent() {}
   402 
   403   public:
   404 
   405     explicit SwapBpUGraphAdaptor(Graph& _graph) { setGraph(_graph); }
   406 
   407   };
   408 
   409 
   410 }
   411 
   412 #endif