src/work/marci/graph_wrapper.h
author alpar
Sun, 07 Mar 2004 19:33:34 +0000
changeset 157 ee17030e5f47
parent 155 8c6292ec54c6
child 158 4f54d89fa9d2
permissions -rw-r--r--
One more step toward the standars interface.
marci@76
     1
// -*-mode: c++; -*-
marci@76
     2
#ifndef GRAPH_WRAPPER_H
marci@76
     3
#define GRAPH_WRAPPER_H
marci@76
     4
alpar@105
     5
namespace hugo {
marci@76
     6
marci@76
     7
  template<typename Graph>
marci@76
     8
  class TrivGraphWrapper {
marci@76
     9
    Graph* graph;
marci@76
    10
  
marci@76
    11
  public:
marci@76
    12
    typedef Graph BaseGraph;
marci@76
    13
marci@76
    14
    typedef typename Graph::NodeIt NodeIt;
marci@76
    15
    typedef typename Graph::EachNodeIt EachNodeIt;
marci@76
    16
marci@155
    17
    typedef typename Graph::EdgeIt EdgeIt;
marci@76
    18
    typedef typename Graph::OutEdgeIt OutEdgeIt;
marci@76
    19
    typedef typename Graph::InEdgeIt InEdgeIt;
marci@155
    20
    //typedef typename Graph::SymEdgeIt SymEdgeIt;
marci@76
    21
    typedef typename Graph::EachEdgeIt EachEdgeIt;
marci@76
    22
    
marci@76
    23
    template<typename I> I& getFirst(I& i) const { return graph->getFirst(i); }
marci@76
    24
    template<typename I, typename P> I& getFirst(I& i, const P& p) const { 
marci@76
    25
      return graph->getFirst(i, p); }
marci@155
    26
    
marci@155
    27
    template<typename I> I getNext(const I& i) const { 
marci@155
    28
      return graph->getNext(i); }
marci@155
    29
    template<typename I> I& next(I &i) const { return graph->next(i); }    
marci@76
    30
marci@76
    31
    template< typename It > It first() const { 
marci@76
    32
      It e; getFirst(e); return e; }
marci@76
    33
marci@155
    34
    template< typename It > It first(const NodeIt& v) const { 
marci@76
    35
      It e; getFirst(e, v); return e; }
marci@76
    36
marci@76
    37
    NodeIt head(const EdgeIt& e) const { return graph->head(e); }
marci@76
    38
    NodeIt tail(const EdgeIt& e) const { return graph->tail(e); }
marci@155
    39
marci@155
    40
    template<typename I> bool valid(const I& i) const 
marci@155
    41
      { return graph->valid(i); }
marci@155
    42
  
marci@155
    43
    //template<typename I> void setInvalid(const I &i);
marci@155
    44
    //{ return graph->setInvalid(i); }
marci@155
    45
marci@155
    46
    int nodeNum() const { return graph->nodeNum(); }
marci@155
    47
    int edgeNum() const { return graph->edgeNum(); }
marci@76
    48
  
marci@76
    49
    template<typename I> NodeIt aNode(const I& e) const { 
marci@76
    50
      return graph->aNode(e); }
marci@76
    51
    template<typename I> NodeIt bNode(const I& e) const { 
marci@76
    52
      return graph->bNode(e); }
marci@76
    53
  
marci@76
    54
    NodeIt addNode() const { return graph->addNode(); }
marci@76
    55
    EdgeIt addEdge(const NodeIt& tail, const NodeIt& head) const { 
marci@76
    56
      return graph->addEdge(tail, head); }
marci@76
    57
  
marci@76
    58
    template<typename I> void erase(const I& i) const { graph->erase(i); }
marci@76
    59
  
marci@76
    60
    void clear() const { graph->clear(); }
marci@155
    61
    
marci@76
    62
    template<typename T> class NodeMap : public Graph::NodeMap<T> { 
marci@76
    63
    public:
marci@155
    64
      NodeMap(const TrivGraphWrapper<Graph>& _G) : 
marci@155
    65
	Graph::NodeMap<T>(*(_G.G)) { }
marci@155
    66
      NodeMap(const TrivGraphWrapper<Graph>& _G, T a) : 
marci@155
    67
	Graph::NodeMap<T>(*(_G.G), a) { }
marci@76
    68
    };
marci@155
    69
    template<typename T> class EdgeMap : public Graph::EdgeMap<T> { 
marci@155
    70
    public:
marci@155
    71
      EdgeMap(const TrivGraphWrapper<Graph>& _G) : 
marci@155
    72
	Graph::EdgeMap<T>(*(_G.G)) { }
marci@155
    73
      EdgeMap(const TrivGraphWrapper<Graph>& _G, T a) : 
marci@155
    74
	Graph::EdgeMap<T>(*(_G.G), a) { }
marci@155
    75
    };
marci@155
    76
    
marci@76
    77
    void setGraph(Graph& _graph) { graph = &_graph; }
marci@155
    78
    Graph& getGraph() const { return (*graph); }
marci@76
    79
  
marci@76
    80
    //TrivGraphWrapper() : graph(0) { }
marci@76
    81
    TrivGraphWrapper(Graph& _graph) : graph(&_graph) { }
marci@76
    82
  };
marci@76
    83
marci@76
    84
  template<typename Graph>
marci@76
    85
  class RevGraphWrapper
marci@76
    86
  {
marci@76
    87
    Graph* graph;
marci@76
    88
  
marci@76
    89
  public:
marci@76
    90
    typedef Graph BaseGraph;
marci@76
    91
marci@155
    92
    typedef typename Graph::NodeIt NodeIt;    
marci@76
    93
    typedef typename Graph::EachNodeIt EachNodeIt;
marci@76
    94
  
marci@155
    95
    typedef typename Graph::EdgeIt EdgeIt;
marci@76
    96
    typedef typename Graph::OutEdgeIt InEdgeIt;
marci@76
    97
    typedef typename Graph::InEdgeIt OutEdgeIt;
marci@155
    98
    //typedef typename Graph::SymEdgeIt SymEdgeIt;
marci@76
    99
    typedef typename Graph::EachEdgeIt EachEdgeIt;
marci@76
   100
    
marci@76
   101
    template<typename I> I& getFirst(I& i) const { return graph->getFirst(i); }
marci@76
   102
    template<typename I, typename P> I& getFirst(I& i, const P& p) const { 
marci@76
   103
      return graph->getFirst(i, p); }
marci@155
   104
marci@155
   105
    template<typename I> I getNext(const I& i) const { 
marci@155
   106
      return graph->getNext(i); }
marci@155
   107
    template<typename I> I& next(I &i) const { return graph->next(i); }    
marci@76
   108
marci@76
   109
    template< typename It > It first() const { 
marci@76
   110
      It e; getFirst(e); return e; }
marci@76
   111
marci@155
   112
    template< typename It > It first(const NodeIt& v) const { 
marci@76
   113
      It e; getFirst(e, v); return e; }
marci@76
   114
marci@76
   115
    NodeIt head(const EdgeIt& e) const { return graph->tail(e); }
marci@76
   116
    NodeIt tail(const EdgeIt& e) const { return graph->head(e); }
marci@76
   117
  
marci@155
   118
    template<typename I> bool valid(const I& i) const 
marci@155
   119
      { return graph->valid(i); }
marci@155
   120
  
marci@155
   121
    //template<typename I> void setInvalid(const I &i);
marci@155
   122
    //{ return graph->setInvalid(i); }
marci@155
   123
  
marci@76
   124
    template<typename I> NodeIt aNode(const I& e) const { 
marci@76
   125
      return graph->aNode(e); }
marci@76
   126
    template<typename I> NodeIt bNode(const I& e) const { 
marci@76
   127
      return graph->bNode(e); }
marci@155
   128
marci@155
   129
    NodeIt addNode() const { return graph->addNode(); }
marci@155
   130
    EdgeIt addEdge(const NodeIt& tail, const NodeIt& head) const { 
marci@76
   131
      return graph->addEdge(tail, head); }
marci@76
   132
  
marci@155
   133
    int nodeNum() const { return graph->nodeNum(); }
marci@155
   134
    int edgeNum() const { return graph->edgeNum(); }
marci@76
   135
  
marci@155
   136
    template<typename I> void erase(const I& i) const { graph->erase(i); }
marci@76
   137
  
marci@155
   138
    void clear() const { graph->clear(); }
marci@155
   139
marci@155
   140
    template<typename T> class NodeMap : public Graph::NodeMap<T> { 
marci@155
   141
    public:
marci@155
   142
      NodeMap(const RevGraphWrapper<Graph>& _G) : 
marci@155
   143
	Graph::NodeMap<T>(*(_G.G)) { }
marci@155
   144
      NodeMap(const RevGraphWrapper<Graph>& _G, T a) : 
marci@155
   145
	Graph::NodeMap<T>(*(_G.G), a) { }
marci@155
   146
    };
marci@155
   147
    template<typename T> class EdgeMap : public Graph::EdgeMap<T> { 
marci@155
   148
    public:
marci@155
   149
      EdgeMap(const RevGraphWrapper<Graph>& _G) : 
marci@155
   150
	Graph::EdgeMap<T>(*(_G.G)) { }
marci@155
   151
      EdgeMap(const RevGraphWrapper<Graph>& _G, T a) : 
marci@155
   152
	Graph::EdgeMap<T>(*(_G.G), a) { }
marci@155
   153
    };
marci@155
   154
marci@76
   155
    void setGraph(Graph& _graph) { graph = &_graph; }
marci@155
   156
    Graph& getGraph() const { return (*graph); }
marci@76
   157
marci@76
   158
    //RevGraphWrapper() : graph(0) { }
marci@76
   159
    RevGraphWrapper(Graph& _graph) : graph(&_graph) { }
marci@76
   160
  };
marci@76
   161
marci@155
   162
marci@155
   163
//   template<typename Graph>
marci@155
   164
//   class SymGraphWrapper
marci@155
   165
//   {
marci@155
   166
//     Graph* graph;
marci@76
   167
  
marci@155
   168
//   public:
marci@155
   169
//     typedef Graph BaseGraph;
marci@155
   170
marci@155
   171
//     typedef typename Graph::NodeIt NodeIt;
marci@155
   172
//     typedef typename Graph::EdgeIt EdgeIt;
marci@155
   173
  
marci@155
   174
//     typedef typename Graph::EachNodeIt EachNodeIt;
marci@155
   175
    
marci@155
   176
//     //FIXME tag-ekkel megcsinalni, hogy abbol csinaljon
marci@155
   177
//     //iranyitatlant, ami van
marci@155
   178
//     //mert csak 1 dolgot lehet be typedef-elni
marci@155
   179
//     typedef typename Graph::OutEdgeIt SymEdgeIt;
marci@155
   180
//     //typedef typename Graph::InEdgeIt SymEdgeIt;
marci@155
   181
//     //typedef typename Graph::SymEdgeIt SymEdgeIt;
marci@155
   182
//     typedef typename Graph::EachEdgeIt EachEdgeIt;
marci@155
   183
marci@155
   184
//     int nodeNum() const { return graph->nodeNum(); }
marci@155
   185
//     int edgeNum() const { return graph->edgeNum(); }
marci@155
   186
    
marci@155
   187
//     template<typename I> I& getFirst(I& i) const { return graph->getFirst(i); }
marci@155
   188
//     template<typename I, typename P> I& getFirst(I& i, const P& p) const { 
marci@155
   189
//       return graph->getFirst(i, p); }
marci@155
   190
//     //template<typename I> I next(const I i); { return graph->goNext(i); }
marci@155
   191
//     //template<typename I> I &goNext(I &i); { return graph->goNext(i); }
marci@155
   192
marci@155
   193
//     template< typename It > It first() const { 
marci@155
   194
//       It e; getFirst(e); return e; }
marci@155
   195
marci@155
   196
//     template< typename It > It first(NodeIt v) const { 
marci@155
   197
//       It e; getFirst(e, v); return e; }
marci@155
   198
marci@155
   199
//     NodeIt head(const EdgeIt& e) const { return graph->head(e); }
marci@155
   200
//     NodeIt tail(const EdgeIt& e) const { return graph->tail(e); }
marci@155
   201
  
marci@155
   202
//     template<typename I> NodeIt aNode(const I& e) const { 
marci@155
   203
//       return graph->aNode(e); }
marci@155
   204
//     template<typename I> NodeIt bNode(const I& e) const { 
marci@155
   205
//       return graph->bNode(e); }
marci@155
   206
  
marci@155
   207
//     //template<typename I> bool valid(const I i);
marci@155
   208
//     //{ return graph->valid(i); }
marci@155
   209
  
marci@155
   210
//     //template<typename I> void setInvalid(const I &i);
marci@155
   211
//     //{ return graph->setInvalid(i); }
marci@155
   212
  
marci@155
   213
//     NodeIt addNode() { return graph->addNode(); }
marci@155
   214
//     EdgeIt addEdge(const NodeIt& tail, const NodeIt& head) { 
marci@155
   215
//       return graph->addEdge(tail, head); }
marci@155
   216
  
marci@155
   217
//     template<typename I> void erase(const I& i) { graph->erase(i); }
marci@155
   218
  
marci@155
   219
//     void clear() { graph->clear(); }
marci@155
   220
  
marci@155
   221
//     template<typename T> class NodeMap : public Graph::NodeMap<T> { };
marci@155
   222
//     template<typename T> class EdgeMap : public Graph::EdgeMap<T> { };
marci@155
   223
  
marci@155
   224
//     void setGraph(Graph& _graph) { graph = &_graph; }
marci@155
   225
//     Graph& getGraph() { return (*graph); }
marci@155
   226
marci@155
   227
//     //SymGraphWrapper() : graph(0) { }
marci@155
   228
//     SymGraphWrapper(Graph& _graph) : graph(&_graph) { }
marci@155
   229
//   };
marci@155
   230
marci@155
   231
marci@155
   232
  template<typename Graph, typename Number, typename FlowMap, typename CapacityMap>
marci@155
   233
  class ResGraphWrapper {
marci@76
   234
  public:
marci@76
   235
    typedef Graph BaseGraph;
marci@155
   236
    typedef typename Graph::NodeIt NodeIt;
marci@155
   237
    typedef typename Graph::EachNodeIt EachNodeIt;
marci@155
   238
  private:
marci@155
   239
    typedef typename Graph::OutEdgeIt OldOutEdgeIt;
marci@155
   240
    typedef typename Graph::InEdgeIt OldInEdgeIt;
marci@155
   241
    const Graph* G;
marci@155
   242
    FlowMap* flow;
marci@155
   243
    const CapacityMap* capacity;
marci@155
   244
  public:
marci@155
   245
    ResGraphWrapper(const Graph& _G, FlowMap& _flow, 
marci@155
   246
	     const CapacityMap& _capacity) : 
marci@155
   247
      G(&_G), flow(&_flow), capacity(&_capacity) { }
marci@155
   248
//     ResGraphWrapper(const ResGraphWrapper& res_graph_wrapper) : 
marci@155
   249
//       G(res_graph_wrapper.G), flow(res_graph_wrapper.flow), capacity(res_graph_wrapper.capacity) { }
marci@155
   250
    class EdgeIt; 
marci@155
   251
    class OutEdgeIt; 
marci@155
   252
    friend class EdgeIt; 
marci@155
   253
    friend class OutEdgeIt; 
marci@76
   254
marci@155
   255
    class EdgeIt {
marci@155
   256
      friend class ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>;
marci@155
   257
    protected:
marci@155
   258
      //const ResGraph3<Graph, Number, FlowMap, CapacityMap>* resG;
marci@155
   259
      const Graph* G;
marci@155
   260
      FlowMap* flow;
marci@155
   261
      const CapacityMap* capacity;
marci@155
   262
      //OldSymEdgeIt sym;
marci@155
   263
      OldOutEdgeIt out;
marci@155
   264
      OldInEdgeIt in;
marci@155
   265
      bool out_or_in; //true, iff out
marci@155
   266
    public:
marci@155
   267
      EdgeIt() : out_or_in(true) { } 
marci@155
   268
      EdgeIt(const Graph& _G, FlowMap& _flow, const CapacityMap& _capacity) : 
marci@155
   269
	G(&_G), flow(&_flow), capacity(&_capacity), out_or_in(true) { }
marci@155
   270
      //EdgeIt(const EdgeIt& e) : G(e.G), flow(e.flow), capacity(e.capacity), out(e.out), in(e.in), out_or_in(e.out_or_in) { }
marci@155
   271
      Number free() const { 
marci@155
   272
	if (out_or_in) { 
marci@155
   273
	  return (/*resG->*/capacity->get(out)-/*resG->*/flow->get(out)); 
marci@155
   274
	} else { 
marci@155
   275
	  return (/*resG->*/flow->get(in)); 
marci@155
   276
	}
marci@155
   277
      }
marci@155
   278
      bool valid() const { 
marci@155
   279
	return out_or_in && out.valid() || in.valid(); }
marci@155
   280
      void augment(Number a) const {
marci@155
   281
	if (out_or_in) { 
marci@155
   282
	  /*resG->*/flow->set(out, /*resG->*/flow->get(out)+a);
marci@155
   283
	} else { 
marci@155
   284
	  /*resG->*/flow->set(in, /*resG->*/flow->get(in)-a);
marci@155
   285
	}
marci@155
   286
      }
marci@155
   287
      void print() { 
marci@155
   288
	if (out_or_in) {
marci@155
   289
	  std::cout << "out "; 
marci@155
   290
	  if (out.valid()) 
marci@155
   291
	    std::cout << G->id(G->tail(out)) << "--"<< G->id(out) <<"->"<< G->id(G->head(out)); 
marci@155
   292
	  else 
marci@155
   293
	    std::cout << "invalid"; 
marci@155
   294
	}
marci@155
   295
	else {
marci@155
   296
	  std::cout << "in "; 
marci@155
   297
	  if (in.valid()) 
marci@155
   298
	    std::cout << G->id(G->head(in)) << "<-"<< G->id(in) <<"--"<< G->id(G->tail(in)); 
marci@155
   299
	  else 
marci@155
   300
	    std::cout << "invalid"; 
marci@155
   301
	}
marci@155
   302
	std::cout << std::endl;
marci@155
   303
      }
marci@155
   304
    };
marci@155
   305
marci@155
   306
    Number free(OldOutEdgeIt out) const { 
marci@155
   307
      return (/*resG->*/capacity->get(out)-/*resG->*/flow->get(out)); 
marci@155
   308
    }
marci@155
   309
    Number free(OldInEdgeIt in) const { 
marci@155
   310
      return (/*resG->*/flow->get(in)); 
marci@155
   311
    }
marci@155
   312
marci@155
   313
    class OutEdgeIt : public EdgeIt {
marci@155
   314
      friend class ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>;
marci@155
   315
    public:
marci@155
   316
      OutEdgeIt() { }
marci@155
   317
    private:
marci@155
   318
      OutEdgeIt(const Graph& _G, NodeIt v, FlowMap& _flow, const CapacityMap& _capacity) : EdgeIt(_G, _flow, _capacity) { 
marci@155
   319
	//out=/*resG->*/G->template first<OldOutEdgeIt>(v);
marci@155
   320
	G->getFirst(out, v);
marci@155
   321
	while( out.valid() && !(EdgeIt::free()>0) ) { ++out; }
marci@155
   322
	if (!out.valid()) {
marci@155
   323
	  out_or_in=0;
marci@155
   324
	  //in=/*resG->*/G->template first<OldInEdgeIt>(v);
marci@155
   325
	  G->getFirst(in, v);
marci@155
   326
	  while( in.valid() && !(EdgeIt::free()>0) ) { ++in; }
marci@155
   327
	}
marci@155
   328
      }
marci@155
   329
    public:
marci@155
   330
      OutEdgeIt& operator++() { 
marci@155
   331
	if (out_or_in) {
marci@155
   332
	  NodeIt v=/*resG->*/G->aNode(out);
marci@155
   333
	  ++out;
marci@155
   334
	  while( out.valid() && !(EdgeIt::free()>0) ) { ++out; }
marci@155
   335
	  if (!out.valid()) {
marci@155
   336
	    out_or_in=0;
marci@155
   337
	    G->getFirst(in, v); //=/*resG->*/G->template first<OldInEdgeIt>(v);
marci@155
   338
	    while( in.valid() && !(EdgeIt::free()>0) ) { ++in; }
marci@155
   339
	  }
marci@155
   340
	} else {
marci@155
   341
	  ++in;
marci@155
   342
	  while( in.valid() && !(EdgeIt::free()>0) ) { ++in; } 
marci@155
   343
	}
marci@155
   344
	return *this; 
marci@155
   345
      }
marci@155
   346
    };
marci@155
   347
marci@155
   348
    class EachEdgeIt : public EdgeIt {
marci@155
   349
      friend class ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>;
marci@155
   350
      typename Graph::EachNodeIt v;
marci@155
   351
    public:
marci@155
   352
      EachEdgeIt() { }
marci@155
   353
      //EachEdgeIt(const EachEdgeIt& e) : EdgeIt(e), v(e.v) { }
marci@155
   354
      EachEdgeIt(const Graph& _G, FlowMap& _flow, const CapacityMap& _capacity) : EdgeIt(_G, _flow, _capacity) { 
marci@155
   355
	out_or_in=true;
marci@155
   356
	G->getFirst(v);
marci@155
   357
	if (v.valid()) G->getFirst(out, v); else out=OldOutEdgeIt();
marci@155
   358
	while (out.valid() && !(EdgeIt::free()>0) ) { ++out; }
marci@155
   359
	while (v.valid() && !out.valid()) { 
marci@155
   360
	  ++v; 
marci@155
   361
	  if (v.valid()) G->getFirst(out, v); 
marci@155
   362
	  while (out.valid() && !(EdgeIt::free()>0) ) { ++out; }
marci@155
   363
	}
marci@155
   364
	if (!out.valid()) {
marci@155
   365
	  out_or_in=0;
marci@155
   366
	  G->getFirst(v);
marci@155
   367
	  if (v.valid()) G->getFirst(in, v); else in=OldInEdgeIt();
marci@155
   368
	  while (in.valid() && !(EdgeIt::free()>0) ) { ++in; }
marci@155
   369
	  while (v.valid() && !in.valid()) { 
marci@155
   370
	    ++v; 
marci@155
   371
	    if (v.valid()) G->getFirst(in, v); 
marci@155
   372
	    while (in.valid() && !(EdgeIt::free()>0) ) { ++in; }
marci@155
   373
	  }
marci@155
   374
	}
marci@155
   375
      }
marci@155
   376
      EachEdgeIt& operator++() { 
marci@155
   377
	if (out_or_in) {
marci@155
   378
	  ++out;
marci@155
   379
	  while (out.valid() && !(EdgeIt::free()>0) ) { ++out; }
marci@155
   380
	  while (v.valid() && !out.valid()) { 
marci@155
   381
	    ++v; 
marci@155
   382
	    if (v.valid()) G->getFirst(out, v); 
marci@155
   383
	    while (out.valid() && !(EdgeIt::free()>0) ) { ++out; }
marci@155
   384
	  }
marci@155
   385
	  if (!out.valid()) {
marci@155
   386
	    out_or_in=0;
marci@155
   387
	    G->getFirst(v);
marci@155
   388
	    if (v.valid()) G->getFirst(in, v); else in=OldInEdgeIt();
marci@155
   389
	    while (in.valid() && !(EdgeIt::free()>0) ) { ++in; }
marci@155
   390
	    while (v.valid() && !in.valid()) { 
marci@155
   391
	      ++v; 
marci@155
   392
	      if (v.valid()) G->getFirst(in, v); 
marci@155
   393
	      while (in.valid() && !(EdgeIt::free()>0) ) { ++in; }
marci@155
   394
	    }  
marci@155
   395
	  }
marci@155
   396
	} else {
marci@155
   397
	  ++in;
marci@155
   398
	  while (in.valid() && !(EdgeIt::free()>0) ) { ++in; }
marci@155
   399
	  while (v.valid() && !in.valid()) { 
marci@155
   400
	    ++v; 
marci@155
   401
	    if (v.valid()) G->getFirst(in, v); 
marci@155
   402
	    while (in.valid() && !(EdgeIt::free()>0) ) { ++in; }
marci@155
   403
	  }
marci@155
   404
	}
marci@155
   405
	return *this;
marci@155
   406
      }
marci@155
   407
    };
marci@155
   408
marci@155
   409
    void getFirst(EachNodeIt& v) const { G->getFirst(v); }
marci@155
   410
    void getFirst(OutEdgeIt& e, NodeIt v) const { 
marci@155
   411
      e=OutEdgeIt(*G, v, *flow, *capacity); 
marci@155
   412
    }
marci@155
   413
    void getFirst(EachEdgeIt& e) const { 
marci@155
   414
      e=EachEdgeIt(*G, *flow, *capacity); 
marci@155
   415
    }
marci@155
   416
   
marci@155
   417
    EachNodeIt& next(EachNodeIt& n) const { return G->next(n); }
marci@155
   418
marci@155
   419
    OutEdgeIt& next(OutEdgeIt& e) const { 
marci@155
   420
      if (e.out_or_in) {
marci@155
   421
	NodeIt v=G->aNode(e.out);
marci@155
   422
	++(e.out);
marci@155
   423
	while( G->valid(e.out) && !(e.free()>0) ) { ++(e.out); }
marci@155
   424
	if (!G->valid(e.out)) {
marci@155
   425
	  e.out_or_in=0;
marci@155
   426
	  G->getFirst(e.in, v); //=/*resG->*/G->template first<OldInEdgeIt>(v);
marci@155
   427
	  while( G->valid(e.in) && !(e.free()>0) ) { ++(e.in); }
marci@155
   428
	}
marci@155
   429
      } else {
marci@155
   430
	++(e.in);
marci@155
   431
	while( G->valid(e.in) && !(e.free()>0) ) { ++(e.in); } 
marci@155
   432
      }
marci@155
   433
      return e;
marci@155
   434
    }
marci@155
   435
marci@155
   436
    EachEdgeIt& next(EachEdgeIt& e) const { 
marci@155
   437
      if (e.out_or_in) {
marci@155
   438
	++(e.out);
marci@155
   439
	while (G->valid(e.out) && !(e.free()>0) ) { ++(e.out); }
marci@155
   440
	  while (G->valid(e.v) && !G->valid(e.out)) { 
marci@155
   441
	    ++(e.v); 
marci@155
   442
	    if (G->valid(e.v)) G->getFirst(e.out, e.v); 
marci@155
   443
	    while (G->valid(e.out) && !(e.free()>0) ) { ++(e.out); }
marci@155
   444
	  }
marci@155
   445
	  if (!G->valid(e.out)) {
marci@155
   446
	    e.out_or_in=0;
marci@155
   447
	    G->getFirst(e.v);
marci@155
   448
	    if (G->valid(e.v)) G->getFirst(e.in, e.v); else e.in=OldInEdgeIt();
marci@155
   449
	    while (G->valid(e.in) && !(e.free()>0) ) { ++(e.in); }
marci@155
   450
	    while (G->valid(e.v) && !G->valid(e.in)) { 
marci@155
   451
	      ++(e.v); 
marci@155
   452
	      if (G->valid(e.v)) G->getFirst(e.in, e.v); 
marci@155
   453
	      while (G->valid(e.in) && !(e.free()>0) ) { ++(e.in); }
marci@155
   454
	    }  
marci@155
   455
	  }
marci@155
   456
	} else {
marci@155
   457
	  ++(e.in);
marci@155
   458
	  while (G->valid(e.in) && !(e.free()>0) ) { ++(e.in); }
marci@155
   459
	  while (G->valid(e.v) && !G->valid(e.in)) { 
marci@155
   460
	    ++(e.v); 
marci@155
   461
	    if (G->valid(e.v)) G->getFirst(e.in, e.v); 
marci@155
   462
	    while (G->valid(e.in) && !(e.free()>0) ) { ++(e.in); }
marci@155
   463
	  }
marci@155
   464
	}
marci@155
   465
	return e;
marci@155
   466
      }
marci@76
   467
    
marci@76
   468
marci@155
   469
    template< typename It >
marci@155
   470
    It first() const { 
marci@155
   471
      It e;
marci@155
   472
      getFirst(e);
marci@155
   473
      return e; 
marci@155
   474
    }
marci@76
   475
marci@155
   476
    template< typename It >
marci@155
   477
    It first(NodeIt v) const { 
marci@155
   478
      It e;
marci@155
   479
      getFirst(e, v);
marci@155
   480
      return e; 
marci@155
   481
    }
marci@76
   482
marci@155
   483
    NodeIt tail(EdgeIt e) const { 
marci@155
   484
      return ((e.out_or_in) ? G->aNode(e.out) : G->aNode(e.in)); }
marci@155
   485
    NodeIt head(EdgeIt e) const { 
marci@155
   486
      return ((e.out_or_in) ? G->bNode(e.out) : G->bNode(e.in)); }
marci@76
   487
marci@155
   488
    NodeIt aNode(OutEdgeIt e) const { 
marci@155
   489
      return ((e.out_or_in) ? G->aNode(e.out) : G->aNode(e.in)); }
marci@155
   490
    NodeIt bNode(OutEdgeIt e) const { 
marci@155
   491
      return ((e.out_or_in) ? G->bNode(e.out) : G->bNode(e.in)); }
marci@76
   492
marci@155
   493
    int id(NodeIt v) const { return G->id(v); }
marci@155
   494
marci@155
   495
    bool valid(NodeIt n) const { return G->valid(n); }
marci@155
   496
    bool valid(EdgeIt e) const { 
marci@155
   497
      return e.out_or_in ? G->valid(e.out) : G->valid(e.in); }
marci@155
   498
marci@155
   499
    template<typename T> class NodeMap : public Graph::NodeMap<T> { 
marci@155
   500
    public:
marci@155
   501
      NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) 
marci@155
   502
	: Graph::NodeMap<T>(*(_G.G)) { }
marci@155
   503
      NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, 
marci@155
   504
	      T a) : Graph::NodeMap<T>(*(_G.G), a) { }
marci@155
   505
    };
marci@155
   506
marci@155
   507
//     template <typename T>
marci@155
   508
//     class NodeMap {
marci@155
   509
//       typename Graph::NodeMap<T> node_map; 
marci@155
   510
//     public:
marci@155
   511
//       NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : node_map(*(_G.G)) { }
marci@155
   512
//       NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : node_map(*(_G.G), a) { }
marci@155
   513
//       void set(NodeIt nit, T a) { node_map.set(nit, a); }
marci@155
   514
//       T get(NodeIt nit) const { return node_map.get(nit); }
marci@155
   515
//     };
marci@155
   516
marci@155
   517
    template <typename T>
marci@155
   518
    class EdgeMap {
marci@155
   519
      typename Graph::EdgeMap<T> forward_map, backward_map; 
marci@155
   520
    public:
marci@155
   521
      EdgeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : forward_map(*(_G.G)), backward_map(*(_G.G)) { }
marci@155
   522
      EdgeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : forward_map(*(_G.G), a), backward_map(*(_G.G), a) { }
marci@155
   523
      void set(EdgeIt e, T a) { 
marci@155
   524
	if (e.out_or_in) 
marci@155
   525
	  forward_map.set(e.out, a); 
marci@155
   526
	else 
marci@155
   527
	  backward_map.set(e.in, a); 
marci@155
   528
      }
marci@155
   529
      T get(EdgeIt e) { 
marci@155
   530
	if (e.out_or_in) 
marci@155
   531
	  return forward_map.get(e.out); 
marci@155
   532
	else 
marci@155
   533
	  return backward_map.get(e.in); 
marci@155
   534
      }
marci@155
   535
    };
marci@155
   536
marci@76
   537
  };
marci@76
   538
marci@76
   539
marci@148
   540
marci@148
   541
// // FIXME: comparison should be made better!!!
marci@148
   542
//   template<typename Graph, typename T, typename LowerMap, typename FlowMap, typename UpperMap>
marci@148
   543
//   class ResGraphWrapper
marci@148
   544
//   {
marci@148
   545
//     Graph* graph;
marci@76
   546
  
marci@148
   547
//   public:
marci@148
   548
//     typedef Graph BaseGraph;
marci@76
   549
marci@148
   550
//     typedef typename Graph::NodeIt NodeIt;
marci@148
   551
//     typedef typename Graph::EdgeIt EdgeIt;
marci@76
   552
  
marci@148
   553
//     typedef typename Graph::EachNodeIt EachNodeIt;
marci@76
   554
   
marci@148
   555
//     class OutEdgeIt {
marci@148
   556
//     public:
marci@148
   557
//       //Graph::NodeIt n;
marci@148
   558
//       bool out_or_in;
marci@148
   559
//       typename Graph::OutEdgeIt o;
marci@148
   560
//       typename Graph::InEdgeIt i;   
marci@148
   561
//     };
marci@148
   562
//     class InEdgeIt {
marci@148
   563
//     public:
marci@148
   564
//       //Graph::NodeIt n;
marci@148
   565
//       bool out_or_in;
marci@148
   566
//       typename Graph::OutEdgeIt o;
marci@148
   567
//       typename Graph::InEdgeIt i;   
marci@148
   568
//     };
marci@148
   569
//     typedef typename Graph::SymEdgeIt SymEdgeIt;
marci@148
   570
//     typedef typename Graph::EachEdgeIt EachEdgeIt;
marci@76
   571
marci@148
   572
//     int nodeNum() const { return graph->nodeNum(); }
marci@148
   573
//     int edgeNum() const { return graph->edgeNum(); }
marci@76
   574
marci@148
   575
//     NodeIt& getFirst(NodeIt& n) const { return graph->getFirst(n); }
marci@76
   576
marci@148
   577
//     // EachEdge and SymEdge  is missing!!!!
marci@148
   578
//     // EdgeIt <-> In/OutEdgeIt conversion is missing!!!!
marci@76
   579
marci@148
   580
//     //FIXME
marci@148
   581
//     OutEdgeIt& getFirst(OutEdgeIt& e, const NodeIt& n) const 
marci@148
   582
//       {
marci@148
   583
// 	e.n=n;
marci@148
   584
// 	graph->getFirst(e.o,n);
marci@148
   585
// 	while(graph->valid(e.o) && fmap.get(e.o)>=himap.get(e.o))
marci@148
   586
// 	  graph->goNext(e.o);
marci@148
   587
// 	if(!graph->valid(e.o)) {
marci@148
   588
// 	  graph->getFirst(e.i,n);
marci@148
   589
// 	  while(graph->valid(e.i) && fmap.get(e.i)<=lomap.get(e.i))
marci@148
   590
// 	    graph->goNext(e.i);
marci@148
   591
// 	}
marci@148
   592
// 	return e;
marci@148
   593
//       }
marci@148
   594
// /*
marci@148
   595
//   OutEdgeIt &goNext(OutEdgeIt &e)
marci@148
   596
//   {
marci@148
   597
//   if(graph->valid(e.o)) {
marci@148
   598
//   while(graph->valid(e.o) && fmap.get(e.o)>=himap.get(e.o))
marci@148
   599
//   graph->goNext(e.o);
marci@148
   600
//   if(graph->valid(e.o)) return e;
marci@148
   601
//   else graph->getFirst(e.i,e.n);
marci@148
   602
//   }
marci@148
   603
//   else {
marci@148
   604
//   while(graph->valid(e.i) && fmap.get(e.i)<=lomap.get(e.i))
marci@148
   605
//   graph->goNext(e.i);
marci@148
   606
//   return e;
marci@148
   607
//   }
marci@148
   608
//   }
marci@148
   609
//   OutEdgeIt Next(const OutEdgeIt &e) {OutEdgeIt t(e); return goNext(t);}
marci@148
   610
// */
marci@148
   611
//     //bool valid(const OutEdgeIt e) { return graph->valid(e.o)||graph->valid(e.i);}
marci@76
   612
marci@148
   613
//     //FIXME
marci@148
   614
//     InEdgeIt& getFirst(InEdgeIt& e, const NodeIt& n) const 
marci@148
   615
//       {
marci@148
   616
// 	e.n=n;
marci@148
   617
// 	graph->getFirst(e.i,n);
marci@148
   618
// 	while(graph->valid(e.i) && fmap.get(e.i)>=himap.get(e.i))
marci@148
   619
// 	  graph->goNext(e.i);
marci@148
   620
// 	if(!graph->valid(e.i)) {
marci@148
   621
// 	  graph->getFirst(e.o,n);
marci@148
   622
// 	  while(graph->valid(e.o) && fmap.get(e.o)<=lomap.get(e.o))
marci@148
   623
// 	    graph->goNext(e.o);
marci@148
   624
// 	}
marci@148
   625
// 	return e;
marci@148
   626
//       }
marci@148
   627
// /*
marci@148
   628
//   InEdgeIt &goNext(InEdgeIt &e)
marci@148
   629
//   {
marci@148
   630
//   if(graph->valid(e.i)) {
marci@148
   631
//   while(graph->valid(e.i) && fmap.get(e.i)>=himap.get(e.i))
marci@148
   632
//   graph->goNext(e.i);
marci@148
   633
//   if(graph->valid(e.i)) return e;
marci@148
   634
//   else graph->getFirst(e.o,e.n);
marci@148
   635
//   }
marci@148
   636
//   else {
marci@148
   637
//   while(graph->valid(e.o) && fmap.get(e.o)<=lomap.get(e.o))
marci@148
   638
//   graph->goNext(e.o);
marci@148
   639
//   return e;
marci@148
   640
//   }
marci@148
   641
//   }
marci@148
   642
//   InEdgeIt Next(const InEdgeIt &e) {InEdgeIt t(e); return goNext(t);}
marci@148
   643
// */
marci@148
   644
//     //bool valid(const InEdgeIt e) { return graph->valid(e.i)||graph->valid(e.o);}
marci@76
   645
marci@148
   646
//     //template<typename I> I &goNext(I &i); { return graph->goNext(i); }
marci@148
   647
//     //template<typename I> I next(const I i); { return graph->goNext(i); }
marci@76
   648
marci@148
   649
//     template< typename It > It first() const { 
marci@148
   650
//       It e; getFirst(e); return e; }
marci@76
   651
marci@148
   652
//     template< typename It > It first(NodeIt v) const { 
marci@148
   653
//       It e; getFirst(e, v); return e; }
marci@76
   654
marci@148
   655
//     NodeIt head(const EdgeIt& e) const { return graph->head(e); }
marci@148
   656
//     NodeIt tail(const EdgeIt& e) const { return graph->tail(e); }
marci@76
   657
  
marci@148
   658
//     template<typename I> NodeIt aNode(const I& e) const { 
marci@148
   659
//       return graph->aNode(e); }
marci@148
   660
//     template<typename I> NodeIt bNode(const I& e) const { 
marci@148
   661
//       return graph->bNode(e); }
marci@76
   662
  
marci@148
   663
//     //template<typename I> bool valid(const I i);
marci@148
   664
//     //{ return graph->valid(i); }
marci@76
   665
  
marci@148
   666
//     //template<typename I> void setInvalid(const I &i);
marci@148
   667
//     //{ return graph->setInvalid(i); }
marci@76
   668
  
marci@148
   669
//     NodeIt addNode() { return graph->addNode(); }
marci@148
   670
//     EdgeIt addEdge(const NodeIt& tail, const NodeIt& head) { 
marci@148
   671
//       return graph->addEdge(tail, head); }
marci@76
   672
  
marci@148
   673
//     template<typename I> void erase(const I& i) { graph->erase(i); }
marci@76
   674
  
marci@148
   675
//     void clear() { graph->clear(); }
marci@76
   676
  
marci@148
   677
//     template<typename S> class NodeMap : public Graph::NodeMap<S> { };
marci@148
   678
//     template<typename S> class EdgeMap : public Graph::EdgeMap<S> { };
marci@76
   679
  
marci@148
   680
//     void setGraph(Graph& _graph) { graph = &_graph; }
marci@148
   681
//     Graph& getGraph() { return (*graph); }
marci@76
   682
marci@148
   683
//     //ResGraphWrapper() : graph(0) { }
marci@148
   684
//     ResGraphWrapper(Graph& _graph) : graph(&_graph) { }
marci@148
   685
//   };
marci@76
   686
alpar@105
   687
} //namespace hugo
marci@76
   688
marci@76
   689
#endif //GRAPH_WRAPPER_H
marci@76
   690