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