test/graph_adaptor_test.cc
author Balazs Dezso <deba@inf.elte.hu>
Sun, 30 Nov 2008 19:00:30 +0100
changeset 415 4b6112235fad
parent 414 05357da973ce
child 416 76287c8caa26
permissions -rw-r--r--
Improvements in graph adaptors (#67)

Remove DigraphAdaptor and GraphAdaptor
Remove docs of base classes
Move the member documentations to real adaptors
Minor improvements in documentation
deba@414
     1
/* -*- C++ -*-
deba@414
     2
 *
deba@414
     3
 * This file is a part of LEMON, a generic C++ optimization library
deba@414
     4
 *
deba@414
     5
 * Copyright (C) 2003-2008
deba@414
     6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
deba@414
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
deba@414
     8
 *
deba@414
     9
 * Permission to use, modify and distribute this software is granted
deba@414
    10
 * provided that this copyright notice appears in all copies. For
deba@414
    11
 * precise terms see the accompanying LICENSE file.
deba@414
    12
 *
deba@414
    13
 * This software is provided "AS IS" with no warranty of any kind,
deba@414
    14
 * express or implied, and with no claim as to its suitability for any
deba@414
    15
 * purpose.
deba@414
    16
 *
deba@414
    17
 */
deba@414
    18
deba@414
    19
#include<iostream>
deba@414
    20
#include<lemon/concept_check.h>
deba@414
    21
deba@414
    22
#include<lemon/list_graph.h>
deba@414
    23
#include<lemon/smart_graph.h>
deba@414
    24
deba@414
    25
#include<lemon/concepts/digraph.h>
deba@414
    26
#include<lemon/concepts/graph.h>
deba@414
    27
deba@414
    28
#include<lemon/digraph_adaptor.h>
deba@414
    29
#include<lemon/graph_adaptor.h>
deba@414
    30
deba@414
    31
#include <limits>
deba@414
    32
#include <lemon/bfs.h>
deba@414
    33
#include <lemon/path.h>
deba@414
    34
deba@414
    35
#include"test/test_tools.h"
deba@414
    36
#include"test/graph_test.h"
deba@414
    37
deba@414
    38
using namespace lemon;
deba@414
    39
deba@414
    40
void checkRevDigraphAdaptor() {
deba@414
    41
  checkConcept<concepts::Digraph, RevDigraphAdaptor<concepts::Digraph> >();
deba@414
    42
deba@414
    43
  typedef ListDigraph Digraph;
deba@414
    44
  typedef RevDigraphAdaptor<Digraph> Adaptor;
deba@414
    45
deba@414
    46
  Digraph digraph;
deba@414
    47
  Adaptor adaptor(digraph);
deba@414
    48
deba@414
    49
  Digraph::Node n1 = digraph.addNode();
deba@414
    50
  Digraph::Node n2 = digraph.addNode();
deba@414
    51
  Digraph::Node n3 = digraph.addNode();
deba@414
    52
deba@414
    53
  Digraph::Arc a1 = digraph.addArc(n1, n2);
deba@414
    54
  Digraph::Arc a2 = digraph.addArc(n1, n3);
deba@414
    55
  Digraph::Arc a3 = digraph.addArc(n2, n3);
deba@414
    56
  
deba@414
    57
  checkGraphNodeList(adaptor, 3);
deba@414
    58
  checkGraphArcList(adaptor, 3);
deba@414
    59
  checkGraphConArcList(adaptor, 3);
deba@414
    60
deba@414
    61
  checkGraphOutArcList(adaptor, n1, 0);
deba@414
    62
  checkGraphOutArcList(adaptor, n2, 1);
deba@414
    63
  checkGraphOutArcList(adaptor, n3, 2);
deba@414
    64
deba@414
    65
  checkGraphInArcList(adaptor, n1, 2);
deba@414
    66
  checkGraphInArcList(adaptor, n2, 1);
deba@414
    67
  checkGraphInArcList(adaptor, n3, 0);
deba@414
    68
deba@414
    69
  checkNodeIds(adaptor);
deba@414
    70
  checkArcIds(adaptor);
deba@414
    71
deba@414
    72
  checkGraphNodeMap(adaptor);
deba@414
    73
  checkGraphArcMap(adaptor);
deba@414
    74
deba@414
    75
  for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) {
deba@414
    76
    check(adaptor.source(a) == digraph.target(a), "Wrong reverse");
deba@414
    77
    check(adaptor.target(a) == digraph.source(a), "Wrong reverse");
deba@414
    78
  }
deba@414
    79
}
deba@414
    80
deba@414
    81
void checkSubDigraphAdaptor() {
deba@414
    82
  checkConcept<concepts::Digraph, 
deba@414
    83
    SubDigraphAdaptor<concepts::Digraph, 
deba@414
    84
    concepts::Digraph::NodeMap<bool>,
deba@414
    85
    concepts::Digraph::ArcMap<bool> > >();
deba@414
    86
deba@414
    87
  typedef ListDigraph Digraph;
deba@414
    88
  typedef Digraph::NodeMap<bool> NodeFilter;
deba@414
    89
  typedef Digraph::ArcMap<bool> ArcFilter;
deba@414
    90
  typedef SubDigraphAdaptor<Digraph, NodeFilter, ArcFilter> Adaptor;
deba@414
    91
deba@414
    92
  Digraph digraph;
deba@414
    93
  NodeFilter node_filter(digraph);
deba@414
    94
  ArcFilter arc_filter(digraph);
deba@414
    95
  Adaptor adaptor(digraph, node_filter, arc_filter);
deba@414
    96
deba@414
    97
  Digraph::Node n1 = digraph.addNode();
deba@414
    98
  Digraph::Node n2 = digraph.addNode();
deba@414
    99
  Digraph::Node n3 = digraph.addNode();
deba@414
   100
deba@414
   101
  Digraph::Arc a1 = digraph.addArc(n1, n2);
deba@414
   102
  Digraph::Arc a2 = digraph.addArc(n1, n3);
deba@414
   103
  Digraph::Arc a3 = digraph.addArc(n2, n3);
deba@414
   104
deba@414
   105
  node_filter[n1] = node_filter[n2] = node_filter[n3] = true;
deba@414
   106
  arc_filter[a1] = arc_filter[a2] = arc_filter[a3] = true;
deba@414
   107
  
deba@414
   108
  checkGraphNodeList(adaptor, 3);
deba@414
   109
  checkGraphArcList(adaptor, 3);
deba@414
   110
  checkGraphConArcList(adaptor, 3);
deba@414
   111
deba@414
   112
  checkGraphOutArcList(adaptor, n1, 2);
deba@414
   113
  checkGraphOutArcList(adaptor, n2, 1);
deba@414
   114
  checkGraphOutArcList(adaptor, n3, 0);
deba@414
   115
deba@414
   116
  checkGraphInArcList(adaptor, n1, 0);
deba@414
   117
  checkGraphInArcList(adaptor, n2, 1);
deba@414
   118
  checkGraphInArcList(adaptor, n3, 2);
deba@414
   119
deba@414
   120
  checkNodeIds(adaptor);
deba@414
   121
  checkArcIds(adaptor);
deba@414
   122
deba@414
   123
  checkGraphNodeMap(adaptor);
deba@414
   124
  checkGraphArcMap(adaptor);
deba@414
   125
deba@414
   126
  arc_filter[a2] = false; 
deba@414
   127
deba@414
   128
  checkGraphNodeList(adaptor, 3);
deba@414
   129
  checkGraphArcList(adaptor, 2);
deba@414
   130
  checkGraphConArcList(adaptor, 2);
deba@414
   131
deba@414
   132
  checkGraphOutArcList(adaptor, n1, 1);
deba@414
   133
  checkGraphOutArcList(adaptor, n2, 1);
deba@414
   134
  checkGraphOutArcList(adaptor, n3, 0);
deba@414
   135
deba@414
   136
  checkGraphInArcList(adaptor, n1, 0);
deba@414
   137
  checkGraphInArcList(adaptor, n2, 1);
deba@414
   138
  checkGraphInArcList(adaptor, n3, 1);
deba@414
   139
deba@414
   140
  checkNodeIds(adaptor);
deba@414
   141
  checkArcIds(adaptor);
deba@414
   142
deba@414
   143
  checkGraphNodeMap(adaptor);
deba@414
   144
  checkGraphArcMap(adaptor);
deba@414
   145
deba@414
   146
  node_filter[n1] = false; 
deba@414
   147
deba@414
   148
  checkGraphNodeList(adaptor, 2);
deba@414
   149
  checkGraphArcList(adaptor, 1);
deba@414
   150
  checkGraphConArcList(adaptor, 1);
deba@414
   151
deba@414
   152
  checkGraphOutArcList(adaptor, n2, 1);
deba@414
   153
  checkGraphOutArcList(adaptor, n3, 0);
deba@414
   154
deba@414
   155
  checkGraphInArcList(adaptor, n2, 0);
deba@414
   156
  checkGraphInArcList(adaptor, n3, 1);
deba@414
   157
deba@414
   158
  checkNodeIds(adaptor);
deba@414
   159
  checkArcIds(adaptor);
deba@414
   160
deba@414
   161
  checkGraphNodeMap(adaptor);
deba@414
   162
  checkGraphArcMap(adaptor);
deba@414
   163
deba@414
   164
  node_filter[n1] = node_filter[n2] = node_filter[n3] = false;
deba@414
   165
  arc_filter[a1] = arc_filter[a2] = arc_filter[a3] = false;
deba@414
   166
deba@414
   167
  checkGraphNodeList(adaptor, 0);
deba@414
   168
  checkGraphArcList(adaptor, 0);
deba@414
   169
  checkGraphConArcList(adaptor, 0);
deba@414
   170
deba@414
   171
  checkNodeIds(adaptor);
deba@414
   172
  checkArcIds(adaptor);
deba@414
   173
deba@414
   174
  checkGraphNodeMap(adaptor);
deba@414
   175
  checkGraphArcMap(adaptor);
deba@414
   176
}
deba@414
   177
deba@414
   178
void checkNodeSubDigraphAdaptor() {
deba@414
   179
  checkConcept<concepts::Digraph, 
deba@414
   180
    NodeSubDigraphAdaptor<concepts::Digraph, 
deba@414
   181
      concepts::Digraph::NodeMap<bool> > >();
deba@414
   182
deba@414
   183
  typedef ListDigraph Digraph;
deba@414
   184
  typedef Digraph::NodeMap<bool> NodeFilter;
deba@414
   185
  typedef NodeSubDigraphAdaptor<Digraph, NodeFilter> Adaptor;
deba@414
   186
deba@414
   187
  Digraph digraph;
deba@414
   188
  NodeFilter node_filter(digraph);
deba@414
   189
  Adaptor adaptor(digraph, node_filter);
deba@414
   190
deba@414
   191
  Digraph::Node n1 = digraph.addNode();
deba@414
   192
  Digraph::Node n2 = digraph.addNode();
deba@414
   193
  Digraph::Node n3 = digraph.addNode();
deba@414
   194
deba@414
   195
  Digraph::Arc a1 = digraph.addArc(n1, n2);
deba@414
   196
  Digraph::Arc a2 = digraph.addArc(n1, n3);
deba@414
   197
  Digraph::Arc a3 = digraph.addArc(n2, n3);
deba@414
   198
deba@414
   199
  node_filter[n1] = node_filter[n2] = node_filter[n3] = true;
deba@414
   200
  
deba@414
   201
  checkGraphNodeList(adaptor, 3);
deba@414
   202
  checkGraphArcList(adaptor, 3);
deba@414
   203
  checkGraphConArcList(adaptor, 3);
deba@414
   204
deba@414
   205
  checkGraphOutArcList(adaptor, n1, 2);
deba@414
   206
  checkGraphOutArcList(adaptor, n2, 1);
deba@414
   207
  checkGraphOutArcList(adaptor, n3, 0);
deba@414
   208
deba@414
   209
  checkGraphInArcList(adaptor, n1, 0);
deba@414
   210
  checkGraphInArcList(adaptor, n2, 1);
deba@414
   211
  checkGraphInArcList(adaptor, n3, 2);
deba@414
   212
deba@414
   213
  checkNodeIds(adaptor);
deba@414
   214
  checkArcIds(adaptor);
deba@414
   215
deba@414
   216
  checkGraphNodeMap(adaptor);
deba@414
   217
  checkGraphArcMap(adaptor);
deba@414
   218
deba@414
   219
  node_filter[n1] = false; 
deba@414
   220
deba@414
   221
  checkGraphNodeList(adaptor, 2);
deba@414
   222
  checkGraphArcList(adaptor, 1);
deba@414
   223
  checkGraphConArcList(adaptor, 1);
deba@414
   224
deba@414
   225
  checkGraphOutArcList(adaptor, n2, 1);
deba@414
   226
  checkGraphOutArcList(adaptor, n3, 0);
deba@414
   227
deba@414
   228
  checkGraphInArcList(adaptor, n2, 0);
deba@414
   229
  checkGraphInArcList(adaptor, n3, 1);
deba@414
   230
deba@414
   231
  checkNodeIds(adaptor);
deba@414
   232
  checkArcIds(adaptor);
deba@414
   233
deba@414
   234
  checkGraphNodeMap(adaptor);
deba@414
   235
  checkGraphArcMap(adaptor);
deba@414
   236
deba@414
   237
  node_filter[n1] = node_filter[n2] = node_filter[n3] = false;
deba@414
   238
deba@414
   239
  checkGraphNodeList(adaptor, 0);
deba@414
   240
  checkGraphArcList(adaptor, 0);
deba@414
   241
  checkGraphConArcList(adaptor, 0);
deba@414
   242
deba@414
   243
  checkNodeIds(adaptor);
deba@414
   244
  checkArcIds(adaptor);
deba@414
   245
deba@414
   246
  checkGraphNodeMap(adaptor);
deba@414
   247
  checkGraphArcMap(adaptor);
deba@414
   248
}
deba@414
   249
deba@414
   250
void checkArcSubDigraphAdaptor() {
deba@414
   251
  checkConcept<concepts::Digraph, 
deba@414
   252
    ArcSubDigraphAdaptor<concepts::Digraph, 
deba@414
   253
    concepts::Digraph::ArcMap<bool> > >();
deba@414
   254
deba@414
   255
  typedef ListDigraph Digraph;
deba@414
   256
  typedef Digraph::ArcMap<bool> ArcFilter;
deba@414
   257
  typedef ArcSubDigraphAdaptor<Digraph, ArcFilter> Adaptor;
deba@414
   258
deba@414
   259
  Digraph digraph;
deba@414
   260
  ArcFilter arc_filter(digraph);
deba@414
   261
  Adaptor adaptor(digraph, arc_filter);
deba@414
   262
deba@414
   263
  Digraph::Node n1 = digraph.addNode();
deba@414
   264
  Digraph::Node n2 = digraph.addNode();
deba@414
   265
  Digraph::Node n3 = digraph.addNode();
deba@414
   266
deba@414
   267
  Digraph::Arc a1 = digraph.addArc(n1, n2);
deba@414
   268
  Digraph::Arc a2 = digraph.addArc(n1, n3);
deba@414
   269
  Digraph::Arc a3 = digraph.addArc(n2, n3);
deba@414
   270
deba@414
   271
  arc_filter[a1] = arc_filter[a2] = arc_filter[a3] = true;
deba@414
   272
  
deba@414
   273
  checkGraphNodeList(adaptor, 3);
deba@414
   274
  checkGraphArcList(adaptor, 3);
deba@414
   275
  checkGraphConArcList(adaptor, 3);
deba@414
   276
deba@414
   277
  checkGraphOutArcList(adaptor, n1, 2);
deba@414
   278
  checkGraphOutArcList(adaptor, n2, 1);
deba@414
   279
  checkGraphOutArcList(adaptor, n3, 0);
deba@414
   280
deba@414
   281
  checkGraphInArcList(adaptor, n1, 0);
deba@414
   282
  checkGraphInArcList(adaptor, n2, 1);
deba@414
   283
  checkGraphInArcList(adaptor, n3, 2);
deba@414
   284
deba@414
   285
  checkNodeIds(adaptor);
deba@414
   286
  checkArcIds(adaptor);
deba@414
   287
deba@414
   288
  checkGraphNodeMap(adaptor);
deba@414
   289
  checkGraphArcMap(adaptor);
deba@414
   290
deba@414
   291
  arc_filter[a2] = false; 
deba@414
   292
deba@414
   293
  checkGraphNodeList(adaptor, 3);
deba@414
   294
  checkGraphArcList(adaptor, 2);
deba@414
   295
  checkGraphConArcList(adaptor, 2);
deba@414
   296
deba@414
   297
  checkGraphOutArcList(adaptor, n1, 1);
deba@414
   298
  checkGraphOutArcList(adaptor, n2, 1);
deba@414
   299
  checkGraphOutArcList(adaptor, n3, 0);
deba@414
   300
deba@414
   301
  checkGraphInArcList(adaptor, n1, 0);
deba@414
   302
  checkGraphInArcList(adaptor, n2, 1);
deba@414
   303
  checkGraphInArcList(adaptor, n3, 1);
deba@414
   304
deba@414
   305
  checkNodeIds(adaptor);
deba@414
   306
  checkArcIds(adaptor);
deba@414
   307
deba@414
   308
  checkGraphNodeMap(adaptor);
deba@414
   309
  checkGraphArcMap(adaptor);
deba@414
   310
deba@414
   311
  arc_filter[a1] = arc_filter[a2] = arc_filter[a3] = false;
deba@414
   312
deba@414
   313
  checkGraphNodeList(adaptor, 3);
deba@414
   314
  checkGraphArcList(adaptor, 0);
deba@414
   315
  checkGraphConArcList(adaptor, 0);
deba@414
   316
deba@414
   317
  checkNodeIds(adaptor);
deba@414
   318
  checkArcIds(adaptor);
deba@414
   319
deba@414
   320
  checkGraphNodeMap(adaptor);
deba@414
   321
  checkGraphArcMap(adaptor);
deba@414
   322
}
deba@414
   323
deba@414
   324
void checkUndirDigraphAdaptor() {
deba@414
   325
  checkConcept<concepts::Graph, UndirDigraphAdaptor<concepts::Digraph> >();
deba@414
   326
deba@414
   327
  typedef ListDigraph Digraph;
deba@414
   328
  typedef UndirDigraphAdaptor<Digraph> Adaptor;
deba@414
   329
deba@414
   330
  Digraph digraph;
deba@414
   331
  Adaptor adaptor(digraph);
deba@414
   332
deba@414
   333
  Digraph::Node n1 = digraph.addNode();
deba@414
   334
  Digraph::Node n2 = digraph.addNode();
deba@414
   335
  Digraph::Node n3 = digraph.addNode();
deba@414
   336
deba@414
   337
  Digraph::Arc a1 = digraph.addArc(n1, n2);
deba@414
   338
  Digraph::Arc a2 = digraph.addArc(n1, n3);
deba@414
   339
  Digraph::Arc a3 = digraph.addArc(n2, n3);
deba@414
   340
  
deba@414
   341
  checkGraphNodeList(adaptor, 3);
deba@414
   342
  checkGraphArcList(adaptor, 6);
deba@414
   343
  checkGraphEdgeList(adaptor, 3);
deba@414
   344
  checkGraphConArcList(adaptor, 6);
deba@414
   345
  checkGraphConEdgeList(adaptor, 3);
deba@414
   346
deba@414
   347
  checkGraphOutArcList(adaptor, n1, 2);
deba@414
   348
  checkGraphOutArcList(adaptor, n2, 2);
deba@414
   349
  checkGraphOutArcList(adaptor, n3, 2);
deba@414
   350
deba@414
   351
  checkGraphInArcList(adaptor, n1, 2);
deba@414
   352
  checkGraphInArcList(adaptor, n2, 2);
deba@414
   353
  checkGraphInArcList(adaptor, n3, 2);
deba@414
   354
deba@414
   355
  checkGraphIncEdgeList(adaptor, n1, 2);
deba@414
   356
  checkGraphIncEdgeList(adaptor, n2, 2);
deba@414
   357
  checkGraphIncEdgeList(adaptor, n3, 2);
deba@414
   358
deba@414
   359
  checkNodeIds(adaptor);
deba@414
   360
  checkArcIds(adaptor);
deba@414
   361
  checkEdgeIds(adaptor);
deba@414
   362
deba@414
   363
  checkGraphNodeMap(adaptor);
deba@414
   364
  checkGraphArcMap(adaptor);
deba@414
   365
  checkGraphEdgeMap(adaptor);
deba@414
   366
deba@414
   367
  for (Adaptor::EdgeIt e(adaptor); e != INVALID; ++e) {
deba@414
   368
    check(adaptor.u(e) == digraph.source(e), "Wrong undir");
deba@414
   369
    check(adaptor.v(e) == digraph.target(e), "Wrong undir");
deba@414
   370
  }
deba@414
   371
deba@414
   372
}
deba@414
   373
deba@414
   374
void checkResDigraphAdaptor() {
deba@414
   375
  checkConcept<concepts::Digraph, 
deba@414
   376
    ResDigraphAdaptor<concepts::Digraph, 
deba@414
   377
    concepts::Digraph::ArcMap<int>, 
deba@414
   378
    concepts::Digraph::ArcMap<int> > >();
deba@414
   379
deba@414
   380
  typedef ListDigraph Digraph;
deba@414
   381
  typedef Digraph::ArcMap<int> IntArcMap;
deba@414
   382
  typedef ResDigraphAdaptor<Digraph, IntArcMap> Adaptor;
deba@414
   383
deba@414
   384
  Digraph digraph;
deba@414
   385
  IntArcMap capacity(digraph), flow(digraph);
deba@414
   386
  Adaptor adaptor(digraph, capacity, flow);
deba@414
   387
deba@414
   388
  Digraph::Node n1 = digraph.addNode();
deba@414
   389
  Digraph::Node n2 = digraph.addNode();
deba@414
   390
  Digraph::Node n3 = digraph.addNode();
deba@414
   391
  Digraph::Node n4 = digraph.addNode();
deba@414
   392
deba@414
   393
  Digraph::Arc a1 = digraph.addArc(n1, n2);
deba@414
   394
  Digraph::Arc a2 = digraph.addArc(n1, n3);
deba@414
   395
  Digraph::Arc a3 = digraph.addArc(n1, n4);
deba@414
   396
  Digraph::Arc a4 = digraph.addArc(n2, n3);
deba@414
   397
  Digraph::Arc a5 = digraph.addArc(n2, n4);
deba@414
   398
  Digraph::Arc a6 = digraph.addArc(n3, n4);
deba@414
   399
deba@414
   400
  capacity[a1] = 8;
deba@414
   401
  capacity[a2] = 6;
deba@414
   402
  capacity[a3] = 4;
deba@414
   403
  capacity[a4] = 4;
deba@414
   404
  capacity[a5] = 6;
deba@414
   405
  capacity[a6] = 10;
deba@414
   406
deba@414
   407
  for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) {
deba@414
   408
    flow[a] = 0;
deba@414
   409
  }
deba@414
   410
  
deba@414
   411
  checkGraphNodeList(adaptor, 4);
deba@414
   412
  checkGraphArcList(adaptor, 6);
deba@414
   413
  checkGraphConArcList(adaptor, 6);
deba@414
   414
deba@414
   415
  checkGraphOutArcList(adaptor, n1, 3);
deba@414
   416
  checkGraphOutArcList(adaptor, n2, 2);
deba@414
   417
  checkGraphOutArcList(adaptor, n3, 1);
deba@414
   418
  checkGraphOutArcList(adaptor, n4, 0);
deba@414
   419
deba@414
   420
  checkGraphInArcList(adaptor, n1, 0);
deba@414
   421
  checkGraphInArcList(adaptor, n2, 1);
deba@414
   422
  checkGraphInArcList(adaptor, n3, 2);
deba@414
   423
  checkGraphInArcList(adaptor, n4, 3);
deba@414
   424
deba@414
   425
  for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) {
deba@414
   426
    flow[a] = capacity[a] / 2;
deba@414
   427
  }
deba@414
   428
  
deba@414
   429
  checkGraphNodeList(adaptor, 4);
deba@414
   430
  checkGraphArcList(adaptor, 12);
deba@414
   431
  checkGraphConArcList(adaptor, 12);
deba@414
   432
deba@414
   433
  checkGraphOutArcList(adaptor, n1, 3);
deba@414
   434
  checkGraphOutArcList(adaptor, n2, 3);
deba@414
   435
  checkGraphOutArcList(adaptor, n3, 3);
deba@414
   436
  checkGraphOutArcList(adaptor, n4, 3);
deba@414
   437
deba@414
   438
  checkGraphInArcList(adaptor, n1, 3);
deba@414
   439
  checkGraphInArcList(adaptor, n2, 3);
deba@414
   440
  checkGraphInArcList(adaptor, n3, 3);
deba@414
   441
  checkGraphInArcList(adaptor, n4, 3);
deba@414
   442
deba@414
   443
  checkNodeIds(adaptor);
deba@414
   444
  checkArcIds(adaptor);
deba@414
   445
deba@414
   446
  checkGraphNodeMap(adaptor);
deba@414
   447
  checkGraphArcMap(adaptor);
deba@414
   448
deba@414
   449
  for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) {
deba@414
   450
    flow[a] = capacity[a];
deba@414
   451
  }
deba@414
   452
  
deba@414
   453
  checkGraphNodeList(adaptor, 4);
deba@414
   454
  checkGraphArcList(adaptor, 6);
deba@414
   455
  checkGraphConArcList(adaptor, 6);
deba@414
   456
deba@414
   457
  checkGraphOutArcList(adaptor, n1, 0);
deba@414
   458
  checkGraphOutArcList(adaptor, n2, 1);
deba@414
   459
  checkGraphOutArcList(adaptor, n3, 2);
deba@414
   460
  checkGraphOutArcList(adaptor, n4, 3);
deba@414
   461
deba@414
   462
  checkGraphInArcList(adaptor, n1, 3);
deba@414
   463
  checkGraphInArcList(adaptor, n2, 2);
deba@414
   464
  checkGraphInArcList(adaptor, n3, 1);
deba@414
   465
  checkGraphInArcList(adaptor, n4, 0);
deba@414
   466
deba@414
   467
  for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) {
deba@414
   468
    flow[a] = 0;
deba@414
   469
  }
deba@414
   470
deba@414
   471
  int flow_value = 0;
deba@414
   472
  while (true) {
deba@414
   473
    
deba@414
   474
    Bfs<Adaptor> bfs(adaptor);
deba@414
   475
    bfs.run(n1, n4);
deba@414
   476
    
deba@414
   477
    if (!bfs.reached(n4)) break;
deba@414
   478
deba@414
   479
    Path<Adaptor> p = bfs.path(n4);
deba@414
   480
    
deba@414
   481
    int min = std::numeric_limits<int>::max();
deba@414
   482
    for (Path<Adaptor>::ArcIt a(p); a != INVALID; ++a) {
deba@414
   483
      if (adaptor.rescap(a) < min) min = adaptor.rescap(a);
deba@414
   484
    }
deba@414
   485
deba@414
   486
    for (Path<Adaptor>::ArcIt a(p); a != INVALID; ++a) {
deba@414
   487
      adaptor.augment(a, min);
deba@414
   488
    }
deba@414
   489
    flow_value += min;
deba@414
   490
  }
deba@414
   491
deba@414
   492
  check(flow_value == 18, "Wrong flow with res graph adaptor");
deba@414
   493
deba@414
   494
}
deba@414
   495
deba@414
   496
void checkSplitDigraphAdaptor() {
deba@414
   497
  checkConcept<concepts::Digraph, SplitDigraphAdaptor<concepts::Digraph> >();
deba@414
   498
deba@414
   499
  typedef ListDigraph Digraph;
deba@414
   500
  typedef SplitDigraphAdaptor<Digraph> Adaptor;
deba@414
   501
deba@414
   502
  Digraph digraph;
deba@414
   503
  Adaptor adaptor(digraph);
deba@414
   504
deba@414
   505
  Digraph::Node n1 = digraph.addNode();
deba@414
   506
  Digraph::Node n2 = digraph.addNode();
deba@414
   507
  Digraph::Node n3 = digraph.addNode();
deba@414
   508
deba@414
   509
  Digraph::Arc a1 = digraph.addArc(n1, n2);
deba@414
   510
  Digraph::Arc a2 = digraph.addArc(n1, n3);
deba@414
   511
  Digraph::Arc a3 = digraph.addArc(n2, n3);
deba@414
   512
  
deba@414
   513
  checkGraphNodeList(adaptor, 6);
deba@414
   514
  checkGraphArcList(adaptor, 6);
deba@414
   515
  checkGraphConArcList(adaptor, 6);
deba@414
   516
deba@414
   517
  checkGraphOutArcList(adaptor, adaptor.inNode(n1), 1);
deba@414
   518
  checkGraphOutArcList(adaptor, adaptor.outNode(n1), 2);
deba@414
   519
  checkGraphOutArcList(adaptor, adaptor.inNode(n2), 1);
deba@414
   520
  checkGraphOutArcList(adaptor, adaptor.outNode(n2), 1);
deba@414
   521
  checkGraphOutArcList(adaptor, adaptor.inNode(n3), 1);
deba@414
   522
  checkGraphOutArcList(adaptor, adaptor.outNode(n3), 0);
deba@414
   523
deba@414
   524
  checkGraphInArcList(adaptor, adaptor.inNode(n1), 0);
deba@414
   525
  checkGraphInArcList(adaptor, adaptor.outNode(n1), 1);
deba@414
   526
  checkGraphInArcList(adaptor, adaptor.inNode(n2), 1);
deba@414
   527
  checkGraphInArcList(adaptor, adaptor.outNode(n2), 1);
deba@414
   528
  checkGraphInArcList(adaptor, adaptor.inNode(n3), 2);
deba@414
   529
  checkGraphInArcList(adaptor, adaptor.outNode(n3), 1);
deba@414
   530
deba@414
   531
  checkNodeIds(adaptor);
deba@414
   532
  checkArcIds(adaptor);
deba@414
   533
  
deba@414
   534
  checkGraphNodeMap(adaptor);
deba@414
   535
  checkGraphArcMap(adaptor);
deba@414
   536
deba@414
   537
  for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) {
deba@414
   538
    if (adaptor.origArc(a)) {
deba@414
   539
      Digraph::Arc oa = a;
deba@414
   540
      check(adaptor.source(a) == adaptor.outNode(digraph.source(oa)), 
deba@414
   541
	    "Wrong split");
deba@414
   542
      check(adaptor.target(a) == adaptor.inNode(digraph.target(oa)), 
deba@414
   543
	    "Wrong split"); 
deba@414
   544
    } else {
deba@414
   545
      Digraph::Node on = a;
deba@414
   546
      check(adaptor.source(a) == adaptor.inNode(on), "Wrong split");
deba@414
   547
      check(adaptor.target(a) == adaptor.outNode(on), "Wrong split");
deba@414
   548
    }
deba@414
   549
  }
deba@414
   550
}
deba@414
   551
deba@414
   552
void checkSubGraphAdaptor() {
deba@414
   553
  checkConcept<concepts::Graph, 
deba@414
   554
    SubGraphAdaptor<concepts::Graph, 
deba@414
   555
    concepts::Graph::NodeMap<bool>,
deba@414
   556
    concepts::Graph::EdgeMap<bool> > >();
deba@414
   557
deba@414
   558
  typedef ListGraph Graph;
deba@414
   559
  typedef Graph::NodeMap<bool> NodeFilter;
deba@414
   560
  typedef Graph::EdgeMap<bool> EdgeFilter;
deba@414
   561
  typedef SubGraphAdaptor<Graph, NodeFilter, EdgeFilter> Adaptor;
deba@414
   562
deba@414
   563
  Graph graph;
deba@414
   564
  NodeFilter node_filter(graph);
deba@414
   565
  EdgeFilter edge_filter(graph);
deba@414
   566
  Adaptor adaptor(graph, node_filter, edge_filter);
deba@414
   567
deba@414
   568
  Graph::Node n1 = graph.addNode();
deba@414
   569
  Graph::Node n2 = graph.addNode();
deba@414
   570
  Graph::Node n3 = graph.addNode();
deba@414
   571
  Graph::Node n4 = graph.addNode();
deba@414
   572
deba@414
   573
  Graph::Edge e1 = graph.addEdge(n1, n2);
deba@414
   574
  Graph::Edge e2 = graph.addEdge(n1, n3);
deba@414
   575
  Graph::Edge e3 = graph.addEdge(n2, n3);
deba@414
   576
  Graph::Edge e4 = graph.addEdge(n3, n4);
deba@414
   577
deba@414
   578
  node_filter[n1] = node_filter[n2] = node_filter[n3] = node_filter[n4] = true;
deba@414
   579
  edge_filter[e1] = edge_filter[e2] = edge_filter[e3] = edge_filter[e4] = true;
deba@414
   580
  
deba@414
   581
  checkGraphNodeList(adaptor, 4);
deba@414
   582
  checkGraphArcList(adaptor, 8);
deba@414
   583
  checkGraphEdgeList(adaptor, 4);
deba@414
   584
  checkGraphConArcList(adaptor, 8);
deba@414
   585
  checkGraphConEdgeList(adaptor, 4);
deba@414
   586
deba@414
   587
  checkGraphOutArcList(adaptor, n1, 2);
deba@414
   588
  checkGraphOutArcList(adaptor, n2, 2);
deba@414
   589
  checkGraphOutArcList(adaptor, n3, 3);
deba@414
   590
  checkGraphOutArcList(adaptor, n4, 1);
deba@414
   591
deba@414
   592
  checkGraphInArcList(adaptor, n1, 2);
deba@414
   593
  checkGraphInArcList(adaptor, n2, 2);
deba@414
   594
  checkGraphInArcList(adaptor, n3, 3);
deba@414
   595
  checkGraphInArcList(adaptor, n4, 1);
deba@414
   596
deba@414
   597
  checkGraphIncEdgeList(adaptor, n1, 2);
deba@414
   598
  checkGraphIncEdgeList(adaptor, n2, 2);
deba@414
   599
  checkGraphIncEdgeList(adaptor, n3, 3);
deba@414
   600
  checkGraphIncEdgeList(adaptor, n4, 1);
deba@414
   601
deba@414
   602
  checkNodeIds(adaptor);
deba@414
   603
  checkArcIds(adaptor);
deba@414
   604
  checkEdgeIds(adaptor);
deba@414
   605
deba@414
   606
  checkGraphNodeMap(adaptor);
deba@414
   607
  checkGraphArcMap(adaptor);
deba@414
   608
  checkGraphEdgeMap(adaptor);
deba@414
   609
deba@414
   610
  edge_filter[e2] = false; 
deba@414
   611
deba@414
   612
  checkGraphNodeList(adaptor, 4);
deba@414
   613
  checkGraphArcList(adaptor, 6);
deba@414
   614
  checkGraphEdgeList(adaptor, 3);
deba@414
   615
  checkGraphConArcList(adaptor, 6);
deba@414
   616
  checkGraphConEdgeList(adaptor, 3);
deba@414
   617
deba@414
   618
  checkGraphOutArcList(adaptor, n1, 1);
deba@414
   619
  checkGraphOutArcList(adaptor, n2, 2);
deba@414
   620
  checkGraphOutArcList(adaptor, n3, 2);
deba@414
   621
  checkGraphOutArcList(adaptor, n4, 1);
deba@414
   622
deba@414
   623
  checkGraphInArcList(adaptor, n1, 1);
deba@414
   624
  checkGraphInArcList(adaptor, n2, 2);
deba@414
   625
  checkGraphInArcList(adaptor, n3, 2);
deba@414
   626
  checkGraphInArcList(adaptor, n4, 1);
deba@414
   627
deba@414
   628
  checkGraphIncEdgeList(adaptor, n1, 1);
deba@414
   629
  checkGraphIncEdgeList(adaptor, n2, 2);
deba@414
   630
  checkGraphIncEdgeList(adaptor, n3, 2);
deba@414
   631
  checkGraphIncEdgeList(adaptor, n4, 1);
deba@414
   632
deba@414
   633
  checkNodeIds(adaptor);
deba@414
   634
  checkArcIds(adaptor);
deba@414
   635
  checkEdgeIds(adaptor);
deba@414
   636
deba@414
   637
  checkGraphNodeMap(adaptor);
deba@414
   638
  checkGraphArcMap(adaptor);
deba@414
   639
  checkGraphEdgeMap(adaptor);
deba@414
   640
deba@414
   641
  node_filter[n1] = false; 
deba@414
   642
deba@414
   643
  checkGraphNodeList(adaptor, 3);
deba@414
   644
  checkGraphArcList(adaptor, 4);
deba@414
   645
  checkGraphEdgeList(adaptor, 2);
deba@414
   646
  checkGraphConArcList(adaptor, 4);
deba@414
   647
  checkGraphConEdgeList(adaptor, 2);
deba@414
   648
deba@414
   649
  checkGraphOutArcList(adaptor, n2, 1);
deba@414
   650
  checkGraphOutArcList(adaptor, n3, 2);
deba@414
   651
  checkGraphOutArcList(adaptor, n4, 1);
deba@414
   652
deba@414
   653
  checkGraphInArcList(adaptor, n2, 1);
deba@414
   654
  checkGraphInArcList(adaptor, n3, 2);
deba@414
   655
  checkGraphInArcList(adaptor, n4, 1);
deba@414
   656
deba@414
   657
  checkGraphIncEdgeList(adaptor, n2, 1);
deba@414
   658
  checkGraphIncEdgeList(adaptor, n3, 2);
deba@414
   659
  checkGraphIncEdgeList(adaptor, n4, 1);
deba@414
   660
deba@414
   661
  checkNodeIds(adaptor);
deba@414
   662
  checkArcIds(adaptor);
deba@414
   663
  checkEdgeIds(adaptor);
deba@414
   664
deba@414
   665
  checkGraphNodeMap(adaptor);
deba@414
   666
  checkGraphArcMap(adaptor);
deba@414
   667
  checkGraphEdgeMap(adaptor);
deba@414
   668
deba@414
   669
  node_filter[n1] = node_filter[n2] = node_filter[n3] = node_filter[n4] = false;
deba@414
   670
  edge_filter[e1] = edge_filter[e2] = edge_filter[e3] = edge_filter[e4] = false;
deba@414
   671
deba@414
   672
  checkGraphNodeList(adaptor, 0);
deba@414
   673
  checkGraphArcList(adaptor, 0);
deba@414
   674
  checkGraphEdgeList(adaptor, 0);
deba@414
   675
  checkGraphConArcList(adaptor, 0);
deba@414
   676
  checkGraphConEdgeList(adaptor, 0);
deba@414
   677
deba@414
   678
  checkNodeIds(adaptor);
deba@414
   679
  checkArcIds(adaptor);
deba@414
   680
  checkEdgeIds(adaptor);
deba@414
   681
deba@414
   682
  checkGraphNodeMap(adaptor);
deba@414
   683
  checkGraphArcMap(adaptor);
deba@414
   684
  checkGraphEdgeMap(adaptor);
deba@414
   685
}
deba@414
   686
deba@414
   687
void checkNodeSubGraphAdaptor() {
deba@414
   688
  checkConcept<concepts::Graph, 
deba@414
   689
    NodeSubGraphAdaptor<concepts::Graph, 
deba@414
   690
      concepts::Graph::NodeMap<bool> > >();
deba@414
   691
deba@414
   692
  typedef ListGraph Graph;
deba@414
   693
  typedef Graph::NodeMap<bool> NodeFilter;
deba@414
   694
  typedef NodeSubGraphAdaptor<Graph, NodeFilter> Adaptor;
deba@414
   695
deba@414
   696
  Graph graph;
deba@414
   697
  NodeFilter node_filter(graph);
deba@414
   698
  Adaptor adaptor(graph, node_filter);
deba@414
   699
deba@414
   700
  Graph::Node n1 = graph.addNode();
deba@414
   701
  Graph::Node n2 = graph.addNode();
deba@414
   702
  Graph::Node n3 = graph.addNode();
deba@414
   703
  Graph::Node n4 = graph.addNode();
deba@414
   704
deba@414
   705
  Graph::Edge e1 = graph.addEdge(n1, n2);
deba@414
   706
  Graph::Edge e2 = graph.addEdge(n1, n3);
deba@414
   707
  Graph::Edge e3 = graph.addEdge(n2, n3);
deba@414
   708
  Graph::Edge e4 = graph.addEdge(n3, n4);
deba@414
   709
deba@414
   710
  node_filter[n1] = node_filter[n2] = node_filter[n3] = node_filter[n4] = true;
deba@414
   711
  
deba@414
   712
  checkGraphNodeList(adaptor, 4);
deba@414
   713
  checkGraphArcList(adaptor, 8);
deba@414
   714
  checkGraphEdgeList(adaptor, 4);
deba@414
   715
  checkGraphConArcList(adaptor, 8);
deba@414
   716
  checkGraphConEdgeList(adaptor, 4);
deba@414
   717
deba@414
   718
  checkGraphOutArcList(adaptor, n1, 2);
deba@414
   719
  checkGraphOutArcList(adaptor, n2, 2);
deba@414
   720
  checkGraphOutArcList(adaptor, n3, 3);
deba@414
   721
  checkGraphOutArcList(adaptor, n4, 1);
deba@414
   722
deba@414
   723
  checkGraphInArcList(adaptor, n1, 2);
deba@414
   724
  checkGraphInArcList(adaptor, n2, 2);
deba@414
   725
  checkGraphInArcList(adaptor, n3, 3);
deba@414
   726
  checkGraphInArcList(adaptor, n4, 1);
deba@414
   727
deba@414
   728
  checkGraphIncEdgeList(adaptor, n1, 2);
deba@414
   729
  checkGraphIncEdgeList(adaptor, n2, 2);
deba@414
   730
  checkGraphIncEdgeList(adaptor, n3, 3);
deba@414
   731
  checkGraphIncEdgeList(adaptor, n4, 1);
deba@414
   732
deba@414
   733
  checkNodeIds(adaptor);
deba@414
   734
  checkArcIds(adaptor);
deba@414
   735
  checkEdgeIds(adaptor);
deba@414
   736
deba@414
   737
  checkGraphNodeMap(adaptor);
deba@414
   738
  checkGraphArcMap(adaptor);
deba@414
   739
  checkGraphEdgeMap(adaptor);
deba@414
   740
deba@414
   741
  node_filter[n1] = false; 
deba@414
   742
deba@414
   743
  checkGraphNodeList(adaptor, 3);
deba@414
   744
  checkGraphArcList(adaptor, 4);
deba@414
   745
  checkGraphEdgeList(adaptor, 2);
deba@414
   746
  checkGraphConArcList(adaptor, 4);
deba@414
   747
  checkGraphConEdgeList(adaptor, 2);
deba@414
   748
deba@414
   749
  checkGraphOutArcList(adaptor, n2, 1);
deba@414
   750
  checkGraphOutArcList(adaptor, n3, 2);
deba@414
   751
  checkGraphOutArcList(adaptor, n4, 1);
deba@414
   752
deba@414
   753
  checkGraphInArcList(adaptor, n2, 1);
deba@414
   754
  checkGraphInArcList(adaptor, n3, 2);
deba@414
   755
  checkGraphInArcList(adaptor, n4, 1);
deba@414
   756
deba@414
   757
  checkGraphIncEdgeList(adaptor, n2, 1);
deba@414
   758
  checkGraphIncEdgeList(adaptor, n3, 2);
deba@414
   759
  checkGraphIncEdgeList(adaptor, n4, 1);
deba@414
   760
deba@414
   761
  checkNodeIds(adaptor);
deba@414
   762
  checkArcIds(adaptor);
deba@414
   763
  checkEdgeIds(adaptor);
deba@414
   764
deba@414
   765
  checkGraphNodeMap(adaptor);
deba@414
   766
  checkGraphArcMap(adaptor);
deba@414
   767
  checkGraphEdgeMap(adaptor);
deba@414
   768
deba@414
   769
  node_filter[n1] = node_filter[n2] = node_filter[n3] = node_filter[n4] = false;
deba@414
   770
deba@414
   771
  checkGraphNodeList(adaptor, 0);
deba@414
   772
  checkGraphArcList(adaptor, 0);
deba@414
   773
  checkGraphEdgeList(adaptor, 0);
deba@414
   774
  checkGraphConArcList(adaptor, 0);
deba@414
   775
  checkGraphConEdgeList(adaptor, 0);
deba@414
   776
deba@414
   777
  checkNodeIds(adaptor);
deba@414
   778
  checkArcIds(adaptor);
deba@414
   779
  checkEdgeIds(adaptor);
deba@414
   780
deba@414
   781
  checkGraphNodeMap(adaptor);
deba@414
   782
  checkGraphArcMap(adaptor);
deba@414
   783
  checkGraphEdgeMap(adaptor);
deba@414
   784
}
deba@414
   785
deba@414
   786
void checkEdgeSubGraphAdaptor() {
deba@414
   787
  checkConcept<concepts::Graph, 
deba@414
   788
    EdgeSubGraphAdaptor<concepts::Graph, 
deba@414
   789
    concepts::Graph::EdgeMap<bool> > >();
deba@414
   790
deba@414
   791
  typedef ListGraph Graph;
deba@414
   792
  typedef Graph::EdgeMap<bool> EdgeFilter;
deba@414
   793
  typedef EdgeSubGraphAdaptor<Graph, EdgeFilter> Adaptor;
deba@414
   794
deba@414
   795
  Graph graph;
deba@414
   796
  EdgeFilter edge_filter(graph);
deba@414
   797
  Adaptor adaptor(graph, edge_filter);
deba@414
   798
deba@414
   799
  Graph::Node n1 = graph.addNode();
deba@414
   800
  Graph::Node n2 = graph.addNode();
deba@414
   801
  Graph::Node n3 = graph.addNode();
deba@414
   802
  Graph::Node n4 = graph.addNode();
deba@414
   803
deba@414
   804
  Graph::Edge e1 = graph.addEdge(n1, n2);
deba@414
   805
  Graph::Edge e2 = graph.addEdge(n1, n3);
deba@414
   806
  Graph::Edge e3 = graph.addEdge(n2, n3);
deba@414
   807
  Graph::Edge e4 = graph.addEdge(n3, n4);
deba@414
   808
deba@414
   809
  edge_filter[e1] = edge_filter[e2] = edge_filter[e3] = edge_filter[e4] = true;
deba@414
   810
  
deba@414
   811
  checkGraphNodeList(adaptor, 4);
deba@414
   812
  checkGraphArcList(adaptor, 8);
deba@414
   813
  checkGraphEdgeList(adaptor, 4);
deba@414
   814
  checkGraphConArcList(adaptor, 8);
deba@414
   815
  checkGraphConEdgeList(adaptor, 4);
deba@414
   816
deba@414
   817
  checkGraphOutArcList(adaptor, n1, 2);
deba@414
   818
  checkGraphOutArcList(adaptor, n2, 2);
deba@414
   819
  checkGraphOutArcList(adaptor, n3, 3);
deba@414
   820
  checkGraphOutArcList(adaptor, n4, 1);
deba@414
   821
deba@414
   822
  checkGraphInArcList(adaptor, n1, 2);
deba@414
   823
  checkGraphInArcList(adaptor, n2, 2);
deba@414
   824
  checkGraphInArcList(adaptor, n3, 3);
deba@414
   825
  checkGraphInArcList(adaptor, n4, 1);
deba@414
   826
deba@414
   827
  checkGraphIncEdgeList(adaptor, n1, 2);
deba@414
   828
  checkGraphIncEdgeList(adaptor, n2, 2);
deba@414
   829
  checkGraphIncEdgeList(adaptor, n3, 3);
deba@414
   830
  checkGraphIncEdgeList(adaptor, n4, 1);
deba@414
   831
deba@414
   832
  checkNodeIds(adaptor);
deba@414
   833
  checkArcIds(adaptor);
deba@414
   834
  checkEdgeIds(adaptor);
deba@414
   835
deba@414
   836
  checkGraphNodeMap(adaptor);
deba@414
   837
  checkGraphArcMap(adaptor);
deba@414
   838
  checkGraphEdgeMap(adaptor);
deba@414
   839
deba@414
   840
  edge_filter[e2] = false; 
deba@414
   841
deba@414
   842
  checkGraphNodeList(adaptor, 4);
deba@414
   843
  checkGraphArcList(adaptor, 6);
deba@414
   844
  checkGraphEdgeList(adaptor, 3);
deba@414
   845
  checkGraphConArcList(adaptor, 6);
deba@414
   846
  checkGraphConEdgeList(adaptor, 3);
deba@414
   847
deba@414
   848
  checkGraphOutArcList(adaptor, n1, 1);
deba@414
   849
  checkGraphOutArcList(adaptor, n2, 2);
deba@414
   850
  checkGraphOutArcList(adaptor, n3, 2);
deba@414
   851
  checkGraphOutArcList(adaptor, n4, 1);
deba@414
   852
deba@414
   853
  checkGraphInArcList(adaptor, n1, 1);
deba@414
   854
  checkGraphInArcList(adaptor, n2, 2);
deba@414
   855
  checkGraphInArcList(adaptor, n3, 2);
deba@414
   856
  checkGraphInArcList(adaptor, n4, 1);
deba@414
   857
deba@414
   858
  checkGraphIncEdgeList(adaptor, n1, 1);
deba@414
   859
  checkGraphIncEdgeList(adaptor, n2, 2);
deba@414
   860
  checkGraphIncEdgeList(adaptor, n3, 2);
deba@414
   861
  checkGraphIncEdgeList(adaptor, n4, 1);
deba@414
   862
deba@414
   863
  checkNodeIds(adaptor);
deba@414
   864
  checkArcIds(adaptor);
deba@414
   865
  checkEdgeIds(adaptor);
deba@414
   866
deba@414
   867
  checkGraphNodeMap(adaptor);
deba@414
   868
  checkGraphArcMap(adaptor);
deba@414
   869
  checkGraphEdgeMap(adaptor);
deba@414
   870
deba@414
   871
  edge_filter[e1] = edge_filter[e2] = edge_filter[e3] = edge_filter[e4] = false;
deba@414
   872
deba@414
   873
  checkGraphNodeList(adaptor, 4);
deba@414
   874
  checkGraphArcList(adaptor, 0);
deba@414
   875
  checkGraphEdgeList(adaptor, 0);
deba@414
   876
  checkGraphConArcList(adaptor, 0);
deba@414
   877
  checkGraphConEdgeList(adaptor, 0);
deba@414
   878
deba@414
   879
  checkNodeIds(adaptor);
deba@414
   880
  checkArcIds(adaptor);
deba@414
   881
  checkEdgeIds(adaptor);
deba@414
   882
deba@414
   883
  checkGraphNodeMap(adaptor);
deba@414
   884
  checkGraphArcMap(adaptor);
deba@414
   885
  checkGraphEdgeMap(adaptor);
deba@414
   886
}
deba@414
   887
deba@414
   888
void checkDirGraphAdaptor() {
deba@414
   889
  checkConcept<concepts::Digraph, 
deba@414
   890
    DirGraphAdaptor<concepts::Graph, concepts::Graph::EdgeMap<bool> > >();
deba@414
   891
deba@414
   892
  typedef ListGraph Graph;
deba@414
   893
  typedef ListGraph::EdgeMap<bool> DirMap;
deba@414
   894
  typedef DirGraphAdaptor<Graph> Adaptor;
deba@414
   895
deba@414
   896
  Graph graph;
deba@414
   897
  DirMap dir(graph, true);
deba@414
   898
  Adaptor adaptor(graph, dir);
deba@414
   899
deba@414
   900
  Graph::Node n1 = graph.addNode();
deba@414
   901
  Graph::Node n2 = graph.addNode();
deba@414
   902
  Graph::Node n3 = graph.addNode();
deba@414
   903
deba@414
   904
  Graph::Edge e1 = graph.addEdge(n1, n2);
deba@414
   905
  Graph::Edge e2 = graph.addEdge(n1, n3);
deba@414
   906
  Graph::Edge e3 = graph.addEdge(n2, n3);
deba@414
   907
  
deba@414
   908
  checkGraphNodeList(adaptor, 3);
deba@414
   909
  checkGraphArcList(adaptor, 3);
deba@414
   910
  checkGraphConArcList(adaptor, 3);
deba@414
   911
  
deba@414
   912
  {
deba@414
   913
    dir[e1] = true;
deba@414
   914
    Adaptor::Node u = adaptor.source(e1);
deba@414
   915
    Adaptor::Node v = adaptor.target(e1);
deba@414
   916
    
deba@414
   917
    dir[e1] = false;
deba@414
   918
    check (u == adaptor.target(e1), "Wrong dir");
deba@414
   919
    check (v == adaptor.source(e1), "Wrong dir");
deba@414
   920
deba@414
   921
    check ((u == n1 && v == n2) || (u == n2 && v == n1), "Wrong dir");
deba@414
   922
    dir[e1] = n1 == u;
deba@414
   923
  }
deba@414
   924
deba@414
   925
  {
deba@414
   926
    dir[e2] = true;
deba@414
   927
    Adaptor::Node u = adaptor.source(e2);
deba@414
   928
    Adaptor::Node v = adaptor.target(e2);
deba@414
   929
    
deba@414
   930
    dir[e2] = false;
deba@414
   931
    check (u == adaptor.target(e2), "Wrong dir");
deba@414
   932
    check (v == adaptor.source(e2), "Wrong dir");
deba@414
   933
deba@414
   934
    check ((u == n1 && v == n3) || (u == n3 && v == n1), "Wrong dir");
deba@414
   935
    dir[e2] = n3 == u;
deba@414
   936
  }
deba@414
   937
deba@414
   938
  {
deba@414
   939
    dir[e3] = true;
deba@414
   940
    Adaptor::Node u = adaptor.source(e3);
deba@414
   941
    Adaptor::Node v = adaptor.target(e3);
deba@414
   942
    
deba@414
   943
    dir[e3] = false;
deba@414
   944
    check (u == adaptor.target(e3), "Wrong dir");
deba@414
   945
    check (v == adaptor.source(e3), "Wrong dir");
deba@414
   946
deba@414
   947
    check ((u == n2 && v == n3) || (u == n3 && v == n2), "Wrong dir");
deba@414
   948
    dir[e3] = n2 == u;
deba@414
   949
  }
deba@414
   950
deba@414
   951
  checkGraphOutArcList(adaptor, n1, 1);
deba@414
   952
  checkGraphOutArcList(adaptor, n2, 1);
deba@414
   953
  checkGraphOutArcList(adaptor, n3, 1);
deba@414
   954
deba@414
   955
  checkGraphInArcList(adaptor, n1, 1);
deba@414
   956
  checkGraphInArcList(adaptor, n2, 1);
deba@414
   957
  checkGraphInArcList(adaptor, n3, 1);
deba@414
   958
deba@414
   959
  checkNodeIds(adaptor);
deba@414
   960
  checkArcIds(adaptor);
deba@414
   961
deba@414
   962
  checkGraphNodeMap(adaptor);
deba@414
   963
  checkGraphArcMap(adaptor);
deba@414
   964
deba@414
   965
}
deba@414
   966
deba@414
   967
deba@414
   968
int main(int, const char **) {
deba@414
   969
deba@414
   970
  checkRevDigraphAdaptor();
deba@414
   971
  checkSubDigraphAdaptor();
deba@414
   972
  checkNodeSubDigraphAdaptor();
deba@414
   973
  checkArcSubDigraphAdaptor();
deba@414
   974
  checkUndirDigraphAdaptor();
deba@414
   975
  checkResDigraphAdaptor();
deba@414
   976
  checkSplitDigraphAdaptor();
deba@414
   977
deba@414
   978
  checkSubGraphAdaptor();
deba@414
   979
  checkNodeSubGraphAdaptor();
deba@414
   980
  checkEdgeSubGraphAdaptor();
deba@414
   981
  checkDirGraphAdaptor();
deba@414
   982
deba@414
   983
  return 0;
deba@414
   984
}