lemon/bits/graph_adaptor_extender.h
author Peter Kovacs <kpeter@inf.elte.hu>
Tue, 15 Mar 2011 19:32:21 +0100
changeset 936 ddd3c0d3d9bf
parent 617 4137ef9aacc6
child 1092 dceba191c00d
permissions -rw-r--r--
Implement the scaling Price Refinement heuristic in CostScaling (#417)
instead of Early Termination.

These two heuristics are similar, but the newer one is faster
and not only makes it possible to skip some epsilon phases, but
it can improve the performance of the other phases, as well.
     1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library.
     4  *
     5  * Copyright (C) 2003-2009
     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_BITS_GRAPH_ADAPTOR_EXTENDER_H
    20 #define LEMON_BITS_GRAPH_ADAPTOR_EXTENDER_H
    21 
    22 #include <lemon/core.h>
    23 #include <lemon/error.h>
    24 
    25 namespace lemon {
    26 
    27   template <typename _Digraph>
    28   class DigraphAdaptorExtender : public _Digraph {
    29     typedef _Digraph Parent;
    30 
    31   public:
    32 
    33     typedef _Digraph Digraph;
    34     typedef DigraphAdaptorExtender Adaptor;
    35 
    36     // Base extensions
    37 
    38     typedef typename Parent::Node Node;
    39     typedef typename Parent::Arc Arc;
    40 
    41     int maxId(Node) const {
    42       return Parent::maxNodeId();
    43     }
    44 
    45     int maxId(Arc) const {
    46       return Parent::maxArcId();
    47     }
    48 
    49     Node fromId(int id, Node) const {
    50       return Parent::nodeFromId(id);
    51     }
    52 
    53     Arc fromId(int id, Arc) const {
    54       return Parent::arcFromId(id);
    55     }
    56 
    57     Node oppositeNode(const Node &n, const Arc &e) const {
    58       if (n == Parent::source(e))
    59         return Parent::target(e);
    60       else if(n==Parent::target(e))
    61         return Parent::source(e);
    62       else
    63         return INVALID;
    64     }
    65 
    66     class NodeIt : public Node {
    67       const Adaptor* _adaptor;
    68     public:
    69 
    70       NodeIt() {}
    71 
    72       NodeIt(Invalid i) : Node(i) { }
    73 
    74       explicit NodeIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
    75         _adaptor->first(static_cast<Node&>(*this));
    76       }
    77 
    78       NodeIt(const Adaptor& adaptor, const Node& node)
    79         : Node(node), _adaptor(&adaptor) {}
    80 
    81       NodeIt& operator++() {
    82         _adaptor->next(*this);
    83         return *this;
    84       }
    85 
    86     };
    87 
    88 
    89     class ArcIt : public Arc {
    90       const Adaptor* _adaptor;
    91     public:
    92 
    93       ArcIt() { }
    94 
    95       ArcIt(Invalid i) : Arc(i) { }
    96 
    97       explicit ArcIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
    98         _adaptor->first(static_cast<Arc&>(*this));
    99       }
   100 
   101       ArcIt(const Adaptor& adaptor, const Arc& e) :
   102         Arc(e), _adaptor(&adaptor) { }
   103 
   104       ArcIt& operator++() {
   105         _adaptor->next(*this);
   106         return *this;
   107       }
   108 
   109     };
   110 
   111 
   112     class OutArcIt : public Arc {
   113       const Adaptor* _adaptor;
   114     public:
   115 
   116       OutArcIt() { }
   117 
   118       OutArcIt(Invalid i) : Arc(i) { }
   119 
   120       OutArcIt(const Adaptor& adaptor, const Node& node)
   121         : _adaptor(&adaptor) {
   122         _adaptor->firstOut(*this, node);
   123       }
   124 
   125       OutArcIt(const Adaptor& adaptor, const Arc& arc)
   126         : Arc(arc), _adaptor(&adaptor) {}
   127 
   128       OutArcIt& operator++() {
   129         _adaptor->nextOut(*this);
   130         return *this;
   131       }
   132 
   133     };
   134 
   135 
   136     class InArcIt : public Arc {
   137       const Adaptor* _adaptor;
   138     public:
   139 
   140       InArcIt() { }
   141 
   142       InArcIt(Invalid i) : Arc(i) { }
   143 
   144       InArcIt(const Adaptor& adaptor, const Node& node)
   145         : _adaptor(&adaptor) {
   146         _adaptor->firstIn(*this, node);
   147       }
   148 
   149       InArcIt(const Adaptor& adaptor, const Arc& arc) :
   150         Arc(arc), _adaptor(&adaptor) {}
   151 
   152       InArcIt& operator++() {
   153         _adaptor->nextIn(*this);
   154         return *this;
   155       }
   156 
   157     };
   158 
   159     Node baseNode(const OutArcIt &e) const {
   160       return Parent::source(e);
   161     }
   162     Node runningNode(const OutArcIt &e) const {
   163       return Parent::target(e);
   164     }
   165 
   166     Node baseNode(const InArcIt &e) const {
   167       return Parent::target(e);
   168     }
   169     Node runningNode(const InArcIt &e) const {
   170       return Parent::source(e);
   171     }
   172 
   173   };
   174 
   175   template <typename _Graph>
   176   class GraphAdaptorExtender : public _Graph {
   177     typedef _Graph Parent;
   178 
   179   public:
   180 
   181     typedef _Graph Graph;
   182     typedef GraphAdaptorExtender Adaptor;
   183 
   184     typedef True UndirectedTag;
   185 
   186     typedef typename Parent::Node Node;
   187     typedef typename Parent::Arc Arc;
   188     typedef typename Parent::Edge Edge;
   189 
   190     // Graph extension
   191 
   192     int maxId(Node) const {
   193       return Parent::maxNodeId();
   194     }
   195 
   196     int maxId(Arc) const {
   197       return Parent::maxArcId();
   198     }
   199 
   200     int maxId(Edge) const {
   201       return Parent::maxEdgeId();
   202     }
   203 
   204     Node fromId(int id, Node) const {
   205       return Parent::nodeFromId(id);
   206     }
   207 
   208     Arc fromId(int id, Arc) const {
   209       return Parent::arcFromId(id);
   210     }
   211 
   212     Edge fromId(int id, Edge) const {
   213       return Parent::edgeFromId(id);
   214     }
   215 
   216     Node oppositeNode(const Node &n, const Edge &e) const {
   217       if( n == Parent::u(e))
   218         return Parent::v(e);
   219       else if( n == Parent::v(e))
   220         return Parent::u(e);
   221       else
   222         return INVALID;
   223     }
   224 
   225     Arc oppositeArc(const Arc &a) const {
   226       return Parent::direct(a, !Parent::direction(a));
   227     }
   228 
   229     using Parent::direct;
   230     Arc direct(const Edge &e, const Node &s) const {
   231       return Parent::direct(e, Parent::u(e) == s);
   232     }
   233 
   234 
   235     class NodeIt : public Node {
   236       const Adaptor* _adaptor;
   237     public:
   238 
   239       NodeIt() {}
   240 
   241       NodeIt(Invalid i) : Node(i) { }
   242 
   243       explicit NodeIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
   244         _adaptor->first(static_cast<Node&>(*this));
   245       }
   246 
   247       NodeIt(const Adaptor& adaptor, const Node& node)
   248         : Node(node), _adaptor(&adaptor) {}
   249 
   250       NodeIt& operator++() {
   251         _adaptor->next(*this);
   252         return *this;
   253       }
   254 
   255     };
   256 
   257 
   258     class ArcIt : public Arc {
   259       const Adaptor* _adaptor;
   260     public:
   261 
   262       ArcIt() { }
   263 
   264       ArcIt(Invalid i) : Arc(i) { }
   265 
   266       explicit ArcIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
   267         _adaptor->first(static_cast<Arc&>(*this));
   268       }
   269 
   270       ArcIt(const Adaptor& adaptor, const Arc& e) :
   271         Arc(e), _adaptor(&adaptor) { }
   272 
   273       ArcIt& operator++() {
   274         _adaptor->next(*this);
   275         return *this;
   276       }
   277 
   278     };
   279 
   280 
   281     class OutArcIt : public Arc {
   282       const Adaptor* _adaptor;
   283     public:
   284 
   285       OutArcIt() { }
   286 
   287       OutArcIt(Invalid i) : Arc(i) { }
   288 
   289       OutArcIt(const Adaptor& adaptor, const Node& node)
   290         : _adaptor(&adaptor) {
   291         _adaptor->firstOut(*this, node);
   292       }
   293 
   294       OutArcIt(const Adaptor& adaptor, const Arc& arc)
   295         : Arc(arc), _adaptor(&adaptor) {}
   296 
   297       OutArcIt& operator++() {
   298         _adaptor->nextOut(*this);
   299         return *this;
   300       }
   301 
   302     };
   303 
   304 
   305     class InArcIt : public Arc {
   306       const Adaptor* _adaptor;
   307     public:
   308 
   309       InArcIt() { }
   310 
   311       InArcIt(Invalid i) : Arc(i) { }
   312 
   313       InArcIt(const Adaptor& adaptor, const Node& node)
   314         : _adaptor(&adaptor) {
   315         _adaptor->firstIn(*this, node);
   316       }
   317 
   318       InArcIt(const Adaptor& adaptor, const Arc& arc) :
   319         Arc(arc), _adaptor(&adaptor) {}
   320 
   321       InArcIt& operator++() {
   322         _adaptor->nextIn(*this);
   323         return *this;
   324       }
   325 
   326     };
   327 
   328     class EdgeIt : public Parent::Edge {
   329       const Adaptor* _adaptor;
   330     public:
   331 
   332       EdgeIt() { }
   333 
   334       EdgeIt(Invalid i) : Edge(i) { }
   335 
   336       explicit EdgeIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
   337         _adaptor->first(static_cast<Edge&>(*this));
   338       }
   339 
   340       EdgeIt(const Adaptor& adaptor, const Edge& e) :
   341         Edge(e), _adaptor(&adaptor) { }
   342 
   343       EdgeIt& operator++() {
   344         _adaptor->next(*this);
   345         return *this;
   346       }
   347 
   348     };
   349 
   350     class IncEdgeIt : public Edge {
   351       friend class GraphAdaptorExtender;
   352       const Adaptor* _adaptor;
   353       bool direction;
   354     public:
   355 
   356       IncEdgeIt() { }
   357 
   358       IncEdgeIt(Invalid i) : Edge(i), direction(false) { }
   359 
   360       IncEdgeIt(const Adaptor& adaptor, const Node &n) : _adaptor(&adaptor) {
   361         _adaptor->firstInc(static_cast<Edge&>(*this), direction, n);
   362       }
   363 
   364       IncEdgeIt(const Adaptor& adaptor, const Edge &e, const Node &n)
   365         : _adaptor(&adaptor), Edge(e) {
   366         direction = (_adaptor->u(e) == n);
   367       }
   368 
   369       IncEdgeIt& operator++() {
   370         _adaptor->nextInc(*this, direction);
   371         return *this;
   372       }
   373     };
   374 
   375     Node baseNode(const OutArcIt &a) const {
   376       return Parent::source(a);
   377     }
   378     Node runningNode(const OutArcIt &a) const {
   379       return Parent::target(a);
   380     }
   381 
   382     Node baseNode(const InArcIt &a) const {
   383       return Parent::target(a);
   384     }
   385     Node runningNode(const InArcIt &a) const {
   386       return Parent::source(a);
   387     }
   388 
   389     Node baseNode(const IncEdgeIt &e) const {
   390       return e.direction ? Parent::u(e) : Parent::v(e);
   391     }
   392     Node runningNode(const IncEdgeIt &e) const {
   393       return e.direction ? Parent::v(e) : Parent::u(e);
   394     }
   395 
   396   };
   397 
   398 }
   399 
   400 
   401 #endif