test/adaptors_test.cc
author Peter Kovacs <kpeter@inf.elte.hu>
Tue, 15 Mar 2011 19:32:21 +0100
changeset 936 ddd3c0d3d9bf
parent 465 2b5496c62ccd
child 995 4bb9e72e1a41
permissions -rw-r--r--
Implement the scaling Price Refinement heuristic in CostScaling (#417)
instead of Early Termination.

These two heuristics are similar, but the newer one is faster
and not only makes it possible to skip some epsilon phases, but
it can improve the performance of the other phases, as well.
     1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library.
     4  *
     5  * Copyright (C) 2003-2009
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     9  * Permission to use, modify and distribute this software is granted
    10  * provided that this copyright notice appears in all copies. For
    11  * precise terms see the accompanying LICENSE file.
    12  *
    13  * This software is provided "AS IS" with no warranty of any kind,
    14  * express or implied, and with no claim as to its suitability for any
    15  * purpose.
    16  *
    17  */
    18 
    19 #include <iostream>
    20 #include <limits>
    21 
    22 #include <lemon/list_graph.h>
    23 #include <lemon/grid_graph.h>
    24 #include <lemon/bfs.h>
    25 #include <lemon/path.h>
    26 
    27 #include <lemon/concepts/digraph.h>
    28 #include <lemon/concepts/graph.h>
    29 #include <lemon/concepts/graph_components.h>
    30 #include <lemon/concepts/maps.h>
    31 #include <lemon/concept_check.h>
    32 
    33 #include <lemon/adaptors.h>
    34 
    35 #include "test/test_tools.h"
    36 #include "test/graph_test.h"
    37 
    38 using namespace lemon;
    39 
    40 void checkReverseDigraph() {
    41   // Check concepts
    42   checkConcept<concepts::Digraph, ReverseDigraph<concepts::Digraph> >();
    43   checkConcept<concepts::Digraph, ReverseDigraph<ListDigraph> >();
    44   checkConcept<concepts::AlterableDigraphComponent<>,
    45                ReverseDigraph<ListDigraph> >();
    46   checkConcept<concepts::ExtendableDigraphComponent<>,
    47                ReverseDigraph<ListDigraph> >();
    48   checkConcept<concepts::ErasableDigraphComponent<>,
    49                ReverseDigraph<ListDigraph> >();
    50   checkConcept<concepts::ClearableDigraphComponent<>,
    51                ReverseDigraph<ListDigraph> >();
    52 
    53   // Create a digraph and an adaptor
    54   typedef ListDigraph Digraph;
    55   typedef ReverseDigraph<Digraph> Adaptor;
    56 
    57   Digraph digraph;
    58   Adaptor adaptor(digraph);
    59 
    60   // Add nodes and arcs to the original digraph
    61   Digraph::Node n1 = digraph.addNode();
    62   Digraph::Node n2 = digraph.addNode();
    63   Digraph::Node n3 = digraph.addNode();
    64 
    65   Digraph::Arc a1 = digraph.addArc(n1, n2);
    66   Digraph::Arc a2 = digraph.addArc(n1, n3);
    67   Digraph::Arc a3 = digraph.addArc(n2, n3);
    68 
    69   // Check the adaptor
    70   checkGraphNodeList(adaptor, 3);
    71   checkGraphArcList(adaptor, 3);
    72   checkGraphConArcList(adaptor, 3);
    73 
    74   checkGraphOutArcList(adaptor, n1, 0);
    75   checkGraphOutArcList(adaptor, n2, 1);
    76   checkGraphOutArcList(adaptor, n3, 2);
    77 
    78   checkGraphInArcList(adaptor, n1, 2);
    79   checkGraphInArcList(adaptor, n2, 1);
    80   checkGraphInArcList(adaptor, n3, 0);
    81 
    82   checkNodeIds(adaptor);
    83   checkArcIds(adaptor);
    84 
    85   checkGraphNodeMap(adaptor);
    86   checkGraphArcMap(adaptor);
    87 
    88   // Check the orientation of the arcs
    89   for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) {
    90     check(adaptor.source(a) == digraph.target(a), "Wrong reverse");
    91     check(adaptor.target(a) == digraph.source(a), "Wrong reverse");
    92   }
    93 
    94   // Add and erase nodes and arcs in the digraph through the adaptor
    95   Adaptor::Node n4 = adaptor.addNode();
    96 
    97   Adaptor::Arc a4 = adaptor.addArc(n4, n3);
    98   Adaptor::Arc a5 = adaptor.addArc(n2, n4);
    99   Adaptor::Arc a6 = adaptor.addArc(n2, n4);
   100   Adaptor::Arc a7 = adaptor.addArc(n1, n4);
   101   Adaptor::Arc a8 = adaptor.addArc(n1, n2);
   102 
   103   adaptor.erase(a1);
   104   adaptor.erase(n3);
   105 
   106   // Check the adaptor
   107   checkGraphNodeList(adaptor, 3);
   108   checkGraphArcList(adaptor, 4);
   109   checkGraphConArcList(adaptor, 4);
   110 
   111   checkGraphOutArcList(adaptor, n1, 2);
   112   checkGraphOutArcList(adaptor, n2, 2);
   113   checkGraphOutArcList(adaptor, n4, 0);
   114 
   115   checkGraphInArcList(adaptor, n1, 0);
   116   checkGraphInArcList(adaptor, n2, 1);
   117   checkGraphInArcList(adaptor, n4, 3);
   118 
   119   checkNodeIds(adaptor);
   120   checkArcIds(adaptor);
   121 
   122   checkGraphNodeMap(adaptor);
   123   checkGraphArcMap(adaptor);
   124 
   125   // Check the digraph
   126   checkGraphNodeList(digraph, 3);
   127   checkGraphArcList(digraph, 4);
   128   checkGraphConArcList(digraph, 4);
   129 
   130   checkGraphOutArcList(digraph, n1, 0);
   131   checkGraphOutArcList(digraph, n2, 1);
   132   checkGraphOutArcList(digraph, n4, 3);
   133 
   134   checkGraphInArcList(digraph, n1, 2);
   135   checkGraphInArcList(digraph, n2, 2);
   136   checkGraphInArcList(digraph, n4, 0);
   137 
   138   checkNodeIds(digraph);
   139   checkArcIds(digraph);
   140 
   141   checkGraphNodeMap(digraph);
   142   checkGraphArcMap(digraph);
   143 
   144   // Check the conversion of nodes and arcs
   145   Digraph::Node nd = n4;
   146   nd = n4;
   147   Adaptor::Node na = n1;
   148   na = n2;
   149   Digraph::Arc ad = a4;
   150   ad = a5;
   151   Adaptor::Arc aa = a1;
   152   aa = a2;
   153 }
   154 
   155 void checkSubDigraph() {
   156   // Check concepts
   157   checkConcept<concepts::Digraph, SubDigraph<concepts::Digraph> >();
   158   checkConcept<concepts::Digraph, SubDigraph<ListDigraph> >();
   159   checkConcept<concepts::AlterableDigraphComponent<>,
   160                SubDigraph<ListDigraph> >();
   161   checkConcept<concepts::ExtendableDigraphComponent<>,
   162                SubDigraph<ListDigraph> >();
   163   checkConcept<concepts::ErasableDigraphComponent<>,
   164                SubDigraph<ListDigraph> >();
   165   checkConcept<concepts::ClearableDigraphComponent<>,
   166                SubDigraph<ListDigraph> >();
   167 
   168   // Create a digraph and an adaptor
   169   typedef ListDigraph Digraph;
   170   typedef Digraph::NodeMap<bool> NodeFilter;
   171   typedef Digraph::ArcMap<bool> ArcFilter;
   172   typedef SubDigraph<Digraph, NodeFilter, ArcFilter> Adaptor;
   173 
   174   Digraph digraph;
   175   NodeFilter node_filter(digraph);
   176   ArcFilter arc_filter(digraph);
   177   Adaptor adaptor(digraph, node_filter, arc_filter);
   178 
   179   // Add nodes and arcs to the original digraph and the adaptor
   180   Digraph::Node n1 = digraph.addNode();
   181   Digraph::Node n2 = digraph.addNode();
   182   Adaptor::Node n3 = adaptor.addNode();
   183 
   184   node_filter[n1] = node_filter[n2] = node_filter[n3] = true;
   185 
   186   Digraph::Arc a1 = digraph.addArc(n1, n2);
   187   Digraph::Arc a2 = digraph.addArc(n1, n3);
   188   Adaptor::Arc a3 = adaptor.addArc(n2, n3);
   189 
   190   arc_filter[a1] = arc_filter[a2] = arc_filter[a3] = true;
   191 
   192   checkGraphNodeList(adaptor, 3);
   193   checkGraphArcList(adaptor, 3);
   194   checkGraphConArcList(adaptor, 3);
   195 
   196   checkGraphOutArcList(adaptor, n1, 2);
   197   checkGraphOutArcList(adaptor, n2, 1);
   198   checkGraphOutArcList(adaptor, n3, 0);
   199 
   200   checkGraphInArcList(adaptor, n1, 0);
   201   checkGraphInArcList(adaptor, n2, 1);
   202   checkGraphInArcList(adaptor, n3, 2);
   203 
   204   checkNodeIds(adaptor);
   205   checkArcIds(adaptor);
   206 
   207   checkGraphNodeMap(adaptor);
   208   checkGraphArcMap(adaptor);
   209 
   210   // Hide an arc
   211   adaptor.status(a2, false);
   212   adaptor.disable(a3);
   213   if (!adaptor.status(a3)) adaptor.enable(a3);
   214 
   215   checkGraphNodeList(adaptor, 3);
   216   checkGraphArcList(adaptor, 2);
   217   checkGraphConArcList(adaptor, 2);
   218 
   219   checkGraphOutArcList(adaptor, n1, 1);
   220   checkGraphOutArcList(adaptor, n2, 1);
   221   checkGraphOutArcList(adaptor, n3, 0);
   222 
   223   checkGraphInArcList(adaptor, n1, 0);
   224   checkGraphInArcList(adaptor, n2, 1);
   225   checkGraphInArcList(adaptor, n3, 1);
   226 
   227   checkNodeIds(adaptor);
   228   checkArcIds(adaptor);
   229 
   230   checkGraphNodeMap(adaptor);
   231   checkGraphArcMap(adaptor);
   232 
   233   // Hide a node
   234   adaptor.status(n1, false);
   235   adaptor.disable(n3);
   236   if (!adaptor.status(n3)) adaptor.enable(n3);
   237 
   238   checkGraphNodeList(adaptor, 2);
   239   checkGraphArcList(adaptor, 1);
   240   checkGraphConArcList(adaptor, 1);
   241 
   242   checkGraphOutArcList(adaptor, n2, 1);
   243   checkGraphOutArcList(adaptor, n3, 0);
   244 
   245   checkGraphInArcList(adaptor, n2, 0);
   246   checkGraphInArcList(adaptor, n3, 1);
   247 
   248   checkNodeIds(adaptor);
   249   checkArcIds(adaptor);
   250 
   251   checkGraphNodeMap(adaptor);
   252   checkGraphArcMap(adaptor);
   253 
   254   // Hide all nodes and arcs
   255   node_filter[n1] = node_filter[n2] = node_filter[n3] = false;
   256   arc_filter[a1] = arc_filter[a2] = arc_filter[a3] = false;
   257 
   258   checkGraphNodeList(adaptor, 0);
   259   checkGraphArcList(adaptor, 0);
   260   checkGraphConArcList(adaptor, 0);
   261 
   262   checkNodeIds(adaptor);
   263   checkArcIds(adaptor);
   264 
   265   checkGraphNodeMap(adaptor);
   266   checkGraphArcMap(adaptor);
   267 
   268   // Check the conversion of nodes and arcs
   269   Digraph::Node nd = n3;
   270   nd = n3;
   271   Adaptor::Node na = n1;
   272   na = n2;
   273   Digraph::Arc ad = a3;
   274   ad = a3;
   275   Adaptor::Arc aa = a1;
   276   aa = a2;
   277 }
   278 
   279 void checkFilterNodes1() {
   280   // Check concepts
   281   checkConcept<concepts::Digraph, FilterNodes<concepts::Digraph> >();
   282   checkConcept<concepts::Digraph, FilterNodes<ListDigraph> >();
   283   checkConcept<concepts::AlterableDigraphComponent<>,
   284                FilterNodes<ListDigraph> >();
   285   checkConcept<concepts::ExtendableDigraphComponent<>,
   286                FilterNodes<ListDigraph> >();
   287   checkConcept<concepts::ErasableDigraphComponent<>,
   288                FilterNodes<ListDigraph> >();
   289   checkConcept<concepts::ClearableDigraphComponent<>,
   290                FilterNodes<ListDigraph> >();
   291 
   292   // Create a digraph and an adaptor
   293   typedef ListDigraph Digraph;
   294   typedef Digraph::NodeMap<bool> NodeFilter;
   295   typedef FilterNodes<Digraph, NodeFilter> Adaptor;
   296 
   297   Digraph digraph;
   298   NodeFilter node_filter(digraph);
   299   Adaptor adaptor(digraph, node_filter);
   300 
   301   // Add nodes and arcs to the original digraph and the adaptor
   302   Digraph::Node n1 = digraph.addNode();
   303   Digraph::Node n2 = digraph.addNode();
   304   Adaptor::Node n3 = adaptor.addNode();
   305 
   306   node_filter[n1] = node_filter[n2] = node_filter[n3] = true;
   307 
   308   Digraph::Arc a1 = digraph.addArc(n1, n2);
   309   Digraph::Arc a2 = digraph.addArc(n1, n3);
   310   Adaptor::Arc a3 = adaptor.addArc(n2, n3);
   311 
   312   checkGraphNodeList(adaptor, 3);
   313   checkGraphArcList(adaptor, 3);
   314   checkGraphConArcList(adaptor, 3);
   315 
   316   checkGraphOutArcList(adaptor, n1, 2);
   317   checkGraphOutArcList(adaptor, n2, 1);
   318   checkGraphOutArcList(adaptor, n3, 0);
   319 
   320   checkGraphInArcList(adaptor, n1, 0);
   321   checkGraphInArcList(adaptor, n2, 1);
   322   checkGraphInArcList(adaptor, n3, 2);
   323 
   324   checkNodeIds(adaptor);
   325   checkArcIds(adaptor);
   326 
   327   checkGraphNodeMap(adaptor);
   328   checkGraphArcMap(adaptor);
   329 
   330   // Hide a node
   331   adaptor.status(n1, false);
   332   adaptor.disable(n3);
   333   if (!adaptor.status(n3)) adaptor.enable(n3);
   334 
   335   checkGraphNodeList(adaptor, 2);
   336   checkGraphArcList(adaptor, 1);
   337   checkGraphConArcList(adaptor, 1);
   338 
   339   checkGraphOutArcList(adaptor, n2, 1);
   340   checkGraphOutArcList(adaptor, n3, 0);
   341 
   342   checkGraphInArcList(adaptor, n2, 0);
   343   checkGraphInArcList(adaptor, n3, 1);
   344 
   345   checkNodeIds(adaptor);
   346   checkArcIds(adaptor);
   347 
   348   checkGraphNodeMap(adaptor);
   349   checkGraphArcMap(adaptor);
   350 
   351   // Hide all nodes
   352   node_filter[n1] = node_filter[n2] = node_filter[n3] = false;
   353 
   354   checkGraphNodeList(adaptor, 0);
   355   checkGraphArcList(adaptor, 0);
   356   checkGraphConArcList(adaptor, 0);
   357 
   358   checkNodeIds(adaptor);
   359   checkArcIds(adaptor);
   360 
   361   checkGraphNodeMap(adaptor);
   362   checkGraphArcMap(adaptor);
   363 
   364   // Check the conversion of nodes and arcs
   365   Digraph::Node nd = n3;
   366   nd = n3;
   367   Adaptor::Node na = n1;
   368   na = n2;
   369   Digraph::Arc ad = a3;
   370   ad = a3;
   371   Adaptor::Arc aa = a1;
   372   aa = a2;
   373 }
   374 
   375 void checkFilterArcs() {
   376   // Check concepts
   377   checkConcept<concepts::Digraph, FilterArcs<concepts::Digraph> >();
   378   checkConcept<concepts::Digraph, FilterArcs<ListDigraph> >();
   379   checkConcept<concepts::AlterableDigraphComponent<>,
   380                FilterArcs<ListDigraph> >();
   381   checkConcept<concepts::ExtendableDigraphComponent<>,
   382                FilterArcs<ListDigraph> >();
   383   checkConcept<concepts::ErasableDigraphComponent<>,
   384                FilterArcs<ListDigraph> >();
   385   checkConcept<concepts::ClearableDigraphComponent<>,
   386                FilterArcs<ListDigraph> >();
   387 
   388   // Create a digraph and an adaptor
   389   typedef ListDigraph Digraph;
   390   typedef Digraph::ArcMap<bool> ArcFilter;
   391   typedef FilterArcs<Digraph, ArcFilter> Adaptor;
   392 
   393   Digraph digraph;
   394   ArcFilter arc_filter(digraph);
   395   Adaptor adaptor(digraph, arc_filter);
   396 
   397   // Add nodes and arcs to the original digraph and the adaptor
   398   Digraph::Node n1 = digraph.addNode();
   399   Digraph::Node n2 = digraph.addNode();
   400   Adaptor::Node n3 = adaptor.addNode();
   401 
   402   Digraph::Arc a1 = digraph.addArc(n1, n2);
   403   Digraph::Arc a2 = digraph.addArc(n1, n3);
   404   Adaptor::Arc a3 = adaptor.addArc(n2, n3);
   405 
   406   arc_filter[a1] = arc_filter[a2] = arc_filter[a3] = true;
   407 
   408   checkGraphNodeList(adaptor, 3);
   409   checkGraphArcList(adaptor, 3);
   410   checkGraphConArcList(adaptor, 3);
   411 
   412   checkGraphOutArcList(adaptor, n1, 2);
   413   checkGraphOutArcList(adaptor, n2, 1);
   414   checkGraphOutArcList(adaptor, n3, 0);
   415 
   416   checkGraphInArcList(adaptor, n1, 0);
   417   checkGraphInArcList(adaptor, n2, 1);
   418   checkGraphInArcList(adaptor, n3, 2);
   419 
   420   checkNodeIds(adaptor);
   421   checkArcIds(adaptor);
   422 
   423   checkGraphNodeMap(adaptor);
   424   checkGraphArcMap(adaptor);
   425 
   426   // Hide an arc
   427   adaptor.status(a2, false);
   428   adaptor.disable(a3);
   429   if (!adaptor.status(a3)) adaptor.enable(a3);
   430 
   431   checkGraphNodeList(adaptor, 3);
   432   checkGraphArcList(adaptor, 2);
   433   checkGraphConArcList(adaptor, 2);
   434 
   435   checkGraphOutArcList(adaptor, n1, 1);
   436   checkGraphOutArcList(adaptor, n2, 1);
   437   checkGraphOutArcList(adaptor, n3, 0);
   438 
   439   checkGraphInArcList(adaptor, n1, 0);
   440   checkGraphInArcList(adaptor, n2, 1);
   441   checkGraphInArcList(adaptor, n3, 1);
   442 
   443   checkNodeIds(adaptor);
   444   checkArcIds(adaptor);
   445 
   446   checkGraphNodeMap(adaptor);
   447   checkGraphArcMap(adaptor);
   448 
   449   // Hide all arcs
   450   arc_filter[a1] = arc_filter[a2] = arc_filter[a3] = false;
   451 
   452   checkGraphNodeList(adaptor, 3);
   453   checkGraphArcList(adaptor, 0);
   454   checkGraphConArcList(adaptor, 0);
   455 
   456   checkNodeIds(adaptor);
   457   checkArcIds(adaptor);
   458 
   459   checkGraphNodeMap(adaptor);
   460   checkGraphArcMap(adaptor);
   461 
   462   // Check the conversion of nodes and arcs
   463   Digraph::Node nd = n3;
   464   nd = n3;
   465   Adaptor::Node na = n1;
   466   na = n2;
   467   Digraph::Arc ad = a3;
   468   ad = a3;
   469   Adaptor::Arc aa = a1;
   470   aa = a2;
   471 }
   472 
   473 void checkUndirector() {
   474   // Check concepts
   475   checkConcept<concepts::Graph, Undirector<concepts::Digraph> >();
   476   checkConcept<concepts::Graph, Undirector<ListDigraph> >();
   477   checkConcept<concepts::AlterableGraphComponent<>,
   478                Undirector<ListDigraph> >();
   479   checkConcept<concepts::ExtendableGraphComponent<>,
   480                Undirector<ListDigraph> >();
   481   checkConcept<concepts::ErasableGraphComponent<>,
   482                Undirector<ListDigraph> >();
   483   checkConcept<concepts::ClearableGraphComponent<>,
   484                Undirector<ListDigraph> >();
   485 
   486 
   487   // Create a digraph and an adaptor
   488   typedef ListDigraph Digraph;
   489   typedef Undirector<Digraph> Adaptor;
   490 
   491   Digraph digraph;
   492   Adaptor adaptor(digraph);
   493 
   494   // Add nodes and arcs/edges to the original digraph and the adaptor
   495   Digraph::Node n1 = digraph.addNode();
   496   Digraph::Node n2 = digraph.addNode();
   497   Adaptor::Node n3 = adaptor.addNode();
   498 
   499   Digraph::Arc a1 = digraph.addArc(n1, n2);
   500   Digraph::Arc a2 = digraph.addArc(n1, n3);
   501   Adaptor::Edge e3 = adaptor.addEdge(n2, n3);
   502 
   503   // Check the original digraph
   504   checkGraphNodeList(digraph, 3);
   505   checkGraphArcList(digraph, 3);
   506   checkGraphConArcList(digraph, 3);
   507 
   508   checkGraphOutArcList(digraph, n1, 2);
   509   checkGraphOutArcList(digraph, n2, 1);
   510   checkGraphOutArcList(digraph, n3, 0);
   511 
   512   checkGraphInArcList(digraph, n1, 0);
   513   checkGraphInArcList(digraph, n2, 1);
   514   checkGraphInArcList(digraph, n3, 2);
   515 
   516   checkNodeIds(digraph);
   517   checkArcIds(digraph);
   518 
   519   checkGraphNodeMap(digraph);
   520   checkGraphArcMap(digraph);
   521 
   522   // Check the adaptor
   523   checkGraphNodeList(adaptor, 3);
   524   checkGraphArcList(adaptor, 6);
   525   checkGraphEdgeList(adaptor, 3);
   526   checkGraphConArcList(adaptor, 6);
   527   checkGraphConEdgeList(adaptor, 3);
   528 
   529   checkGraphIncEdgeArcLists(adaptor, n1, 2);
   530   checkGraphIncEdgeArcLists(adaptor, n2, 2);
   531   checkGraphIncEdgeArcLists(adaptor, n3, 2);
   532 
   533   checkNodeIds(adaptor);
   534   checkArcIds(adaptor);
   535   checkEdgeIds(adaptor);
   536 
   537   checkGraphNodeMap(adaptor);
   538   checkGraphArcMap(adaptor);
   539   checkGraphEdgeMap(adaptor);
   540 
   541   // Check the edges of the adaptor
   542   for (Adaptor::EdgeIt e(adaptor); e != INVALID; ++e) {
   543     check(adaptor.u(e) == digraph.source(e), "Wrong undir");
   544     check(adaptor.v(e) == digraph.target(e), "Wrong undir");
   545   }
   546 
   547   // Check CombinedArcMap
   548   typedef Adaptor::CombinedArcMap
   549     <Digraph::ArcMap<int>, Digraph::ArcMap<int> > IntCombinedMap;
   550   typedef Adaptor::CombinedArcMap
   551     <Digraph::ArcMap<bool>, Digraph::ArcMap<bool> > BoolCombinedMap;
   552   checkConcept<concepts::ReferenceMap<Adaptor::Arc, int, int&, const int&>,
   553     IntCombinedMap>();
   554   checkConcept<concepts::ReferenceMap<Adaptor::Arc, bool, bool&, const bool&>,
   555     BoolCombinedMap>();
   556 
   557   Digraph::ArcMap<int> fw_map(digraph), bk_map(digraph);
   558   for (Digraph::ArcIt a(digraph); a != INVALID; ++a) {
   559     fw_map[a] = digraph.id(a);
   560     bk_map[a] = -digraph.id(a);
   561   }
   562 
   563   Adaptor::CombinedArcMap<Digraph::ArcMap<int>, Digraph::ArcMap<int> >
   564     comb_map(fw_map, bk_map);
   565   for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) {
   566     if (adaptor.source(a) == digraph.source(a)) {
   567       check(comb_map[a] == fw_map[a], "Wrong combined map");
   568     } else {
   569       check(comb_map[a] == bk_map[a], "Wrong combined map");
   570     }
   571   }
   572 
   573   // Check the conversion of nodes and arcs/edges
   574   Digraph::Node nd = n3;
   575   nd = n3;
   576   Adaptor::Node na = n1;
   577   na = n2;
   578   Digraph::Arc ad = e3;
   579   ad = e3;
   580   Adaptor::Edge ea = a1;
   581   ea = a2;
   582 }
   583 
   584 void checkResidualDigraph() {
   585   // Check concepts
   586   checkConcept<concepts::Digraph, ResidualDigraph<concepts::Digraph> >();
   587   checkConcept<concepts::Digraph, ResidualDigraph<ListDigraph> >();
   588 
   589   // Create a digraph and an adaptor
   590   typedef ListDigraph Digraph;
   591   typedef Digraph::ArcMap<int> IntArcMap;
   592   typedef ResidualDigraph<Digraph, IntArcMap> Adaptor;
   593 
   594   Digraph digraph;
   595   IntArcMap capacity(digraph), flow(digraph);
   596   Adaptor adaptor(digraph, capacity, flow);
   597 
   598   Digraph::Node n1 = digraph.addNode();
   599   Digraph::Node n2 = digraph.addNode();
   600   Digraph::Node n3 = digraph.addNode();
   601   Digraph::Node n4 = digraph.addNode();
   602 
   603   Digraph::Arc a1 = digraph.addArc(n1, n2);
   604   Digraph::Arc a2 = digraph.addArc(n1, n3);
   605   Digraph::Arc a3 = digraph.addArc(n1, n4);
   606   Digraph::Arc a4 = digraph.addArc(n2, n3);
   607   Digraph::Arc a5 = digraph.addArc(n2, n4);
   608   Digraph::Arc a6 = digraph.addArc(n3, n4);
   609 
   610   capacity[a1] = 8;
   611   capacity[a2] = 6;
   612   capacity[a3] = 4;
   613   capacity[a4] = 4;
   614   capacity[a5] = 6;
   615   capacity[a6] = 10;
   616 
   617   // Check the adaptor with various flow values
   618   for (Digraph::ArcIt a(digraph); a != INVALID; ++a) {
   619     flow[a] = 0;
   620   }
   621 
   622   checkGraphNodeList(adaptor, 4);
   623   checkGraphArcList(adaptor, 6);
   624   checkGraphConArcList(adaptor, 6);
   625 
   626   checkGraphOutArcList(adaptor, n1, 3);
   627   checkGraphOutArcList(adaptor, n2, 2);
   628   checkGraphOutArcList(adaptor, n3, 1);
   629   checkGraphOutArcList(adaptor, n4, 0);
   630 
   631   checkGraphInArcList(adaptor, n1, 0);
   632   checkGraphInArcList(adaptor, n2, 1);
   633   checkGraphInArcList(adaptor, n3, 2);
   634   checkGraphInArcList(adaptor, n4, 3);
   635 
   636   for (Digraph::ArcIt a(digraph); a != INVALID; ++a) {
   637     flow[a] = capacity[a] / 2;
   638   }
   639 
   640   checkGraphNodeList(adaptor, 4);
   641   checkGraphArcList(adaptor, 12);
   642   checkGraphConArcList(adaptor, 12);
   643 
   644   checkGraphOutArcList(adaptor, n1, 3);
   645   checkGraphOutArcList(adaptor, n2, 3);
   646   checkGraphOutArcList(adaptor, n3, 3);
   647   checkGraphOutArcList(adaptor, n4, 3);
   648 
   649   checkGraphInArcList(adaptor, n1, 3);
   650   checkGraphInArcList(adaptor, n2, 3);
   651   checkGraphInArcList(adaptor, n3, 3);
   652   checkGraphInArcList(adaptor, n4, 3);
   653 
   654   checkNodeIds(adaptor);
   655   checkArcIds(adaptor);
   656 
   657   checkGraphNodeMap(adaptor);
   658   checkGraphArcMap(adaptor);
   659 
   660   for (Digraph::ArcIt a(digraph); a != INVALID; ++a) {
   661     flow[a] = capacity[a];
   662   }
   663 
   664   checkGraphNodeList(adaptor, 4);
   665   checkGraphArcList(adaptor, 6);
   666   checkGraphConArcList(adaptor, 6);
   667 
   668   checkGraphOutArcList(adaptor, n1, 0);
   669   checkGraphOutArcList(adaptor, n2, 1);
   670   checkGraphOutArcList(adaptor, n3, 2);
   671   checkGraphOutArcList(adaptor, n4, 3);
   672 
   673   checkGraphInArcList(adaptor, n1, 3);
   674   checkGraphInArcList(adaptor, n2, 2);
   675   checkGraphInArcList(adaptor, n3, 1);
   676   checkGraphInArcList(adaptor, n4, 0);
   677 
   678   // Saturate all backward arcs
   679   // (set the flow to zero on all forward arcs)
   680   for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) {
   681     if (adaptor.backward(a))
   682       adaptor.augment(a, adaptor.residualCapacity(a));
   683   }
   684 
   685   checkGraphNodeList(adaptor, 4);
   686   checkGraphArcList(adaptor, 6);
   687   checkGraphConArcList(adaptor, 6);
   688 
   689   checkGraphOutArcList(adaptor, n1, 3);
   690   checkGraphOutArcList(adaptor, n2, 2);
   691   checkGraphOutArcList(adaptor, n3, 1);
   692   checkGraphOutArcList(adaptor, n4, 0);
   693 
   694   checkGraphInArcList(adaptor, n1, 0);
   695   checkGraphInArcList(adaptor, n2, 1);
   696   checkGraphInArcList(adaptor, n3, 2);
   697   checkGraphInArcList(adaptor, n4, 3);
   698 
   699   // Find maximum flow by augmenting along shortest paths
   700   int flow_value = 0;
   701   Adaptor::ResidualCapacity res_cap(adaptor);
   702   while (true) {
   703 
   704     Bfs<Adaptor> bfs(adaptor);
   705     bfs.run(n1, n4);
   706 
   707     if (!bfs.reached(n4)) break;
   708 
   709     Path<Adaptor> p = bfs.path(n4);
   710 
   711     int min = std::numeric_limits<int>::max();
   712     for (Path<Adaptor>::ArcIt a(p); a != INVALID; ++a) {
   713       if (res_cap[a] < min) min = res_cap[a];
   714     }
   715 
   716     for (Path<Adaptor>::ArcIt a(p); a != INVALID; ++a) {
   717       adaptor.augment(a, min);
   718     }
   719     flow_value += min;
   720   }
   721 
   722   check(flow_value == 18, "Wrong flow with res graph adaptor");
   723 
   724   // Check forward() and backward()
   725   for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) {
   726     check(adaptor.forward(a) != adaptor.backward(a),
   727           "Wrong forward() or backward()");
   728     check((adaptor.forward(a) && adaptor.forward(Digraph::Arc(a)) == a) ||
   729           (adaptor.backward(a) && adaptor.backward(Digraph::Arc(a)) == a),
   730           "Wrong forward() or backward()");
   731   }
   732 
   733   // Check the conversion of nodes and arcs
   734   Digraph::Node nd = Adaptor::NodeIt(adaptor);
   735   nd = ++Adaptor::NodeIt(adaptor);
   736   Adaptor::Node na = n1;
   737   na = n2;
   738   Digraph::Arc ad = Adaptor::ArcIt(adaptor);
   739   ad = ++Adaptor::ArcIt(adaptor);
   740 }
   741 
   742 void checkSplitNodes() {
   743   // Check concepts
   744   checkConcept<concepts::Digraph, SplitNodes<concepts::Digraph> >();
   745   checkConcept<concepts::Digraph, SplitNodes<ListDigraph> >();
   746 
   747   // Create a digraph and an adaptor
   748   typedef ListDigraph Digraph;
   749   typedef SplitNodes<Digraph> Adaptor;
   750 
   751   Digraph digraph;
   752   Adaptor adaptor(digraph);
   753 
   754   Digraph::Node n1 = digraph.addNode();
   755   Digraph::Node n2 = digraph.addNode();
   756   Digraph::Node n3 = digraph.addNode();
   757 
   758   Digraph::Arc a1 = digraph.addArc(n1, n2);
   759   Digraph::Arc a2 = digraph.addArc(n1, n3);
   760   Digraph::Arc a3 = digraph.addArc(n2, n3);
   761 
   762   checkGraphNodeList(adaptor, 6);
   763   checkGraphArcList(adaptor, 6);
   764   checkGraphConArcList(adaptor, 6);
   765 
   766   checkGraphOutArcList(adaptor, adaptor.inNode(n1), 1);
   767   checkGraphOutArcList(adaptor, adaptor.outNode(n1), 2);
   768   checkGraphOutArcList(adaptor, adaptor.inNode(n2), 1);
   769   checkGraphOutArcList(adaptor, adaptor.outNode(n2), 1);
   770   checkGraphOutArcList(adaptor, adaptor.inNode(n3), 1);
   771   checkGraphOutArcList(adaptor, adaptor.outNode(n3), 0);
   772 
   773   checkGraphInArcList(adaptor, adaptor.inNode(n1), 0);
   774   checkGraphInArcList(adaptor, adaptor.outNode(n1), 1);
   775   checkGraphInArcList(adaptor, adaptor.inNode(n2), 1);
   776   checkGraphInArcList(adaptor, adaptor.outNode(n2), 1);
   777   checkGraphInArcList(adaptor, adaptor.inNode(n3), 2);
   778   checkGraphInArcList(adaptor, adaptor.outNode(n3), 1);
   779 
   780   checkNodeIds(adaptor);
   781   checkArcIds(adaptor);
   782 
   783   checkGraphNodeMap(adaptor);
   784   checkGraphArcMap(adaptor);
   785 
   786   // Check split
   787   for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) {
   788     if (adaptor.origArc(a)) {
   789       Digraph::Arc oa = a;
   790       check(adaptor.source(a) == adaptor.outNode(digraph.source(oa)),
   791             "Wrong split");
   792       check(adaptor.target(a) == adaptor.inNode(digraph.target(oa)),
   793             "Wrong split");
   794     } else {
   795       Digraph::Node on = a;
   796       check(adaptor.source(a) == adaptor.inNode(on), "Wrong split");
   797       check(adaptor.target(a) == adaptor.outNode(on), "Wrong split");
   798     }
   799   }
   800 
   801   // Check combined node map
   802   typedef Adaptor::CombinedNodeMap
   803     <Digraph::NodeMap<int>, Digraph::NodeMap<int> > IntCombinedNodeMap;
   804   typedef Adaptor::CombinedNodeMap
   805     <Digraph::NodeMap<bool>, Digraph::NodeMap<bool> > BoolCombinedNodeMap;
   806   checkConcept<concepts::ReferenceMap<Adaptor::Node, int, int&, const int&>,
   807     IntCombinedNodeMap>();
   808 //checkConcept<concepts::ReferenceMap<Adaptor::Node, bool, bool&, const bool&>,
   809 //  BoolCombinedNodeMap>();
   810   checkConcept<concepts::ReadWriteMap<Adaptor::Node, bool>,
   811     BoolCombinedNodeMap>();
   812 
   813   Digraph::NodeMap<int> in_map(digraph), out_map(digraph);
   814   for (Digraph::NodeIt n(digraph); n != INVALID; ++n) {
   815     in_map[n] = digraph.id(n);
   816     out_map[n] = -digraph.id(n);
   817   }
   818 
   819   Adaptor::CombinedNodeMap<Digraph::NodeMap<int>, Digraph::NodeMap<int> >
   820     node_map(in_map, out_map);
   821   for (Adaptor::NodeIt n(adaptor); n != INVALID; ++n) {
   822     if (adaptor.inNode(n)) {
   823       check(node_map[n] == in_map[n], "Wrong combined node map");
   824     } else {
   825       check(node_map[n] == out_map[n], "Wrong combined node map");
   826     }
   827   }
   828 
   829   // Check combined arc map
   830   typedef Adaptor::CombinedArcMap
   831     <Digraph::ArcMap<int>, Digraph::NodeMap<int> > IntCombinedArcMap;
   832   typedef Adaptor::CombinedArcMap
   833     <Digraph::ArcMap<bool>, Digraph::NodeMap<bool> > BoolCombinedArcMap;
   834   checkConcept<concepts::ReferenceMap<Adaptor::Arc, int, int&, const int&>,
   835     IntCombinedArcMap>();
   836 //checkConcept<concepts::ReferenceMap<Adaptor::Arc, bool, bool&, const bool&>,
   837 //  BoolCombinedArcMap>();
   838   checkConcept<concepts::ReadWriteMap<Adaptor::Arc, bool>,
   839     BoolCombinedArcMap>();
   840 
   841   Digraph::ArcMap<int> a_map(digraph);
   842   for (Digraph::ArcIt a(digraph); a != INVALID; ++a) {
   843     a_map[a] = digraph.id(a);
   844   }
   845 
   846   Adaptor::CombinedArcMap<Digraph::ArcMap<int>, Digraph::NodeMap<int> >
   847     arc_map(a_map, out_map);
   848   for (Digraph::ArcIt a(digraph); a != INVALID; ++a) {
   849     check(arc_map[adaptor.arc(a)] == a_map[a],  "Wrong combined arc map");
   850   }
   851   for (Digraph::NodeIt n(digraph); n != INVALID; ++n) {
   852     check(arc_map[adaptor.arc(n)] == out_map[n],  "Wrong combined arc map");
   853   }
   854 
   855   // Check the conversion of nodes
   856   Digraph::Node nd = adaptor.inNode(n1);
   857   check (nd == n1, "Wrong node conversion");
   858   nd = adaptor.outNode(n2);
   859   check (nd == n2, "Wrong node conversion");
   860 }
   861 
   862 void checkSubGraph() {
   863   // Check concepts
   864   checkConcept<concepts::Graph, SubGraph<concepts::Graph> >();
   865   checkConcept<concepts::Graph, SubGraph<ListGraph> >();
   866   checkConcept<concepts::AlterableGraphComponent<>,
   867                SubGraph<ListGraph> >();
   868   checkConcept<concepts::ExtendableGraphComponent<>,
   869                SubGraph<ListGraph> >();
   870   checkConcept<concepts::ErasableGraphComponent<>,
   871                SubGraph<ListGraph> >();
   872   checkConcept<concepts::ClearableGraphComponent<>,
   873                SubGraph<ListGraph> >();
   874 
   875   // Create a graph and an adaptor
   876   typedef ListGraph Graph;
   877   typedef Graph::NodeMap<bool> NodeFilter;
   878   typedef Graph::EdgeMap<bool> EdgeFilter;
   879   typedef SubGraph<Graph, NodeFilter, EdgeFilter> Adaptor;
   880 
   881   Graph graph;
   882   NodeFilter node_filter(graph);
   883   EdgeFilter edge_filter(graph);
   884   Adaptor adaptor(graph, node_filter, edge_filter);
   885 
   886   // Add nodes and edges to the original graph and the adaptor
   887   Graph::Node n1 = graph.addNode();
   888   Graph::Node n2 = graph.addNode();
   889   Adaptor::Node n3 = adaptor.addNode();
   890   Adaptor::Node n4 = adaptor.addNode();
   891 
   892   node_filter[n1] = node_filter[n2] = node_filter[n3] = node_filter[n4] = true;
   893 
   894   Graph::Edge e1 = graph.addEdge(n1, n2);
   895   Graph::Edge e2 = graph.addEdge(n1, n3);
   896   Adaptor::Edge e3 = adaptor.addEdge(n2, n3);
   897   Adaptor::Edge e4 = adaptor.addEdge(n3, n4);
   898 
   899   edge_filter[e1] = edge_filter[e2] = edge_filter[e3] = edge_filter[e4] = true;
   900 
   901   checkGraphNodeList(adaptor, 4);
   902   checkGraphArcList(adaptor, 8);
   903   checkGraphEdgeList(adaptor, 4);
   904   checkGraphConArcList(adaptor, 8);
   905   checkGraphConEdgeList(adaptor, 4);
   906 
   907   checkGraphIncEdgeArcLists(adaptor, n1, 2);
   908   checkGraphIncEdgeArcLists(adaptor, n2, 2);
   909   checkGraphIncEdgeArcLists(adaptor, n3, 3);
   910   checkGraphIncEdgeArcLists(adaptor, n4, 1);
   911 
   912   checkNodeIds(adaptor);
   913   checkArcIds(adaptor);
   914   checkEdgeIds(adaptor);
   915 
   916   checkGraphNodeMap(adaptor);
   917   checkGraphArcMap(adaptor);
   918   checkGraphEdgeMap(adaptor);
   919 
   920   // Hide an edge
   921   adaptor.status(e2, false);
   922   adaptor.disable(e3);
   923   if (!adaptor.status(e3)) adaptor.enable(e3);
   924 
   925   checkGraphNodeList(adaptor, 4);
   926   checkGraphArcList(adaptor, 6);
   927   checkGraphEdgeList(adaptor, 3);
   928   checkGraphConArcList(adaptor, 6);
   929   checkGraphConEdgeList(adaptor, 3);
   930 
   931   checkGraphIncEdgeArcLists(adaptor, n1, 1);
   932   checkGraphIncEdgeArcLists(adaptor, n2, 2);
   933   checkGraphIncEdgeArcLists(adaptor, n3, 2);
   934   checkGraphIncEdgeArcLists(adaptor, n4, 1);
   935 
   936   checkNodeIds(adaptor);
   937   checkArcIds(adaptor);
   938   checkEdgeIds(adaptor);
   939 
   940   checkGraphNodeMap(adaptor);
   941   checkGraphArcMap(adaptor);
   942   checkGraphEdgeMap(adaptor);
   943 
   944   // Hide a node
   945   adaptor.status(n1, false);
   946   adaptor.disable(n3);
   947   if (!adaptor.status(n3)) adaptor.enable(n3);
   948 
   949   checkGraphNodeList(adaptor, 3);
   950   checkGraphArcList(adaptor, 4);
   951   checkGraphEdgeList(adaptor, 2);
   952   checkGraphConArcList(adaptor, 4);
   953   checkGraphConEdgeList(adaptor, 2);
   954 
   955   checkGraphIncEdgeArcLists(adaptor, n2, 1);
   956   checkGraphIncEdgeArcLists(adaptor, n3, 2);
   957   checkGraphIncEdgeArcLists(adaptor, n4, 1);
   958 
   959   checkNodeIds(adaptor);
   960   checkArcIds(adaptor);
   961   checkEdgeIds(adaptor);
   962 
   963   checkGraphNodeMap(adaptor);
   964   checkGraphArcMap(adaptor);
   965   checkGraphEdgeMap(adaptor);
   966 
   967   // Hide all nodes and edges
   968   node_filter[n1] = node_filter[n2] = node_filter[n3] = node_filter[n4] = false;
   969   edge_filter[e1] = edge_filter[e2] = edge_filter[e3] = edge_filter[e4] = false;
   970 
   971   checkGraphNodeList(adaptor, 0);
   972   checkGraphArcList(adaptor, 0);
   973   checkGraphEdgeList(adaptor, 0);
   974   checkGraphConArcList(adaptor, 0);
   975   checkGraphConEdgeList(adaptor, 0);
   976 
   977   checkNodeIds(adaptor);
   978   checkArcIds(adaptor);
   979   checkEdgeIds(adaptor);
   980 
   981   checkGraphNodeMap(adaptor);
   982   checkGraphArcMap(adaptor);
   983   checkGraphEdgeMap(adaptor);
   984 
   985   // Check the conversion of nodes and edges
   986   Graph::Node ng = n3;
   987   ng = n4;
   988   Adaptor::Node na = n1;
   989   na = n2;
   990   Graph::Edge eg = e3;
   991   eg = e4;
   992   Adaptor::Edge ea = e1;
   993   ea = e2;
   994 }
   995 
   996 void checkFilterNodes2() {
   997   // Check concepts
   998   checkConcept<concepts::Graph, FilterNodes<concepts::Graph> >();
   999   checkConcept<concepts::Graph, FilterNodes<ListGraph> >();
  1000   checkConcept<concepts::AlterableGraphComponent<>,
  1001                FilterNodes<ListGraph> >();
  1002   checkConcept<concepts::ExtendableGraphComponent<>,
  1003                FilterNodes<ListGraph> >();
  1004   checkConcept<concepts::ErasableGraphComponent<>,
  1005                FilterNodes<ListGraph> >();
  1006   checkConcept<concepts::ClearableGraphComponent<>,
  1007                FilterNodes<ListGraph> >();
  1008 
  1009   // Create a graph and an adaptor
  1010   typedef ListGraph Graph;
  1011   typedef Graph::NodeMap<bool> NodeFilter;
  1012   typedef FilterNodes<Graph, NodeFilter> Adaptor;
  1013 
  1014   // Add nodes and edges to the original graph and the adaptor
  1015   Graph graph;
  1016   NodeFilter node_filter(graph);
  1017   Adaptor adaptor(graph, node_filter);
  1018 
  1019   Graph::Node n1 = graph.addNode();
  1020   Graph::Node n2 = graph.addNode();
  1021   Adaptor::Node n3 = adaptor.addNode();
  1022   Adaptor::Node n4 = adaptor.addNode();
  1023 
  1024   node_filter[n1] = node_filter[n2] = node_filter[n3] = node_filter[n4] = true;
  1025 
  1026   Graph::Edge e1 = graph.addEdge(n1, n2);
  1027   Graph::Edge e2 = graph.addEdge(n1, n3);
  1028   Adaptor::Edge e3 = adaptor.addEdge(n2, n3);
  1029   Adaptor::Edge e4 = adaptor.addEdge(n3, n4);
  1030 
  1031   checkGraphNodeList(adaptor, 4);
  1032   checkGraphArcList(adaptor, 8);
  1033   checkGraphEdgeList(adaptor, 4);
  1034   checkGraphConArcList(adaptor, 8);
  1035   checkGraphConEdgeList(adaptor, 4);
  1036 
  1037   checkGraphIncEdgeArcLists(adaptor, n1, 2);
  1038   checkGraphIncEdgeArcLists(adaptor, n2, 2);
  1039   checkGraphIncEdgeArcLists(adaptor, n3, 3);
  1040   checkGraphIncEdgeArcLists(adaptor, n4, 1);
  1041 
  1042   checkNodeIds(adaptor);
  1043   checkArcIds(adaptor);
  1044   checkEdgeIds(adaptor);
  1045 
  1046   checkGraphNodeMap(adaptor);
  1047   checkGraphArcMap(adaptor);
  1048   checkGraphEdgeMap(adaptor);
  1049 
  1050   // Hide a node
  1051   adaptor.status(n1, false);
  1052   adaptor.disable(n3);
  1053   if (!adaptor.status(n3)) adaptor.enable(n3);
  1054 
  1055   checkGraphNodeList(adaptor, 3);
  1056   checkGraphArcList(adaptor, 4);
  1057   checkGraphEdgeList(adaptor, 2);
  1058   checkGraphConArcList(adaptor, 4);
  1059   checkGraphConEdgeList(adaptor, 2);
  1060 
  1061   checkGraphIncEdgeArcLists(adaptor, n2, 1);
  1062   checkGraphIncEdgeArcLists(adaptor, n3, 2);
  1063   checkGraphIncEdgeArcLists(adaptor, n4, 1);
  1064 
  1065   checkNodeIds(adaptor);
  1066   checkArcIds(adaptor);
  1067   checkEdgeIds(adaptor);
  1068 
  1069   checkGraphNodeMap(adaptor);
  1070   checkGraphArcMap(adaptor);
  1071   checkGraphEdgeMap(adaptor);
  1072 
  1073   // Hide all nodes
  1074   node_filter[n1] = node_filter[n2] = node_filter[n3] = node_filter[n4] = false;
  1075 
  1076   checkGraphNodeList(adaptor, 0);
  1077   checkGraphArcList(adaptor, 0);
  1078   checkGraphEdgeList(adaptor, 0);
  1079   checkGraphConArcList(adaptor, 0);
  1080   checkGraphConEdgeList(adaptor, 0);
  1081 
  1082   checkNodeIds(adaptor);
  1083   checkArcIds(adaptor);
  1084   checkEdgeIds(adaptor);
  1085 
  1086   checkGraphNodeMap(adaptor);
  1087   checkGraphArcMap(adaptor);
  1088   checkGraphEdgeMap(adaptor);
  1089 
  1090   // Check the conversion of nodes and edges
  1091   Graph::Node ng = n3;
  1092   ng = n4;
  1093   Adaptor::Node na = n1;
  1094   na = n2;
  1095   Graph::Edge eg = e3;
  1096   eg = e4;
  1097   Adaptor::Edge ea = e1;
  1098   ea = e2;
  1099 }
  1100 
  1101 void checkFilterEdges() {
  1102   // Check concepts
  1103   checkConcept<concepts::Graph, FilterEdges<concepts::Graph> >();
  1104   checkConcept<concepts::Graph, FilterEdges<ListGraph> >();
  1105   checkConcept<concepts::AlterableGraphComponent<>,
  1106                FilterEdges<ListGraph> >();
  1107   checkConcept<concepts::ExtendableGraphComponent<>,
  1108                FilterEdges<ListGraph> >();
  1109   checkConcept<concepts::ErasableGraphComponent<>,
  1110                FilterEdges<ListGraph> >();
  1111   checkConcept<concepts::ClearableGraphComponent<>,
  1112                FilterEdges<ListGraph> >();
  1113 
  1114   // Create a graph and an adaptor
  1115   typedef ListGraph Graph;
  1116   typedef Graph::EdgeMap<bool> EdgeFilter;
  1117   typedef FilterEdges<Graph, EdgeFilter> Adaptor;
  1118 
  1119   Graph graph;
  1120   EdgeFilter edge_filter(graph);
  1121   Adaptor adaptor(graph, edge_filter);
  1122 
  1123   // Add nodes and edges to the original graph and the adaptor
  1124   Graph::Node n1 = graph.addNode();
  1125   Graph::Node n2 = graph.addNode();
  1126   Adaptor::Node n3 = adaptor.addNode();
  1127   Adaptor::Node n4 = adaptor.addNode();
  1128 
  1129   Graph::Edge e1 = graph.addEdge(n1, n2);
  1130   Graph::Edge e2 = graph.addEdge(n1, n3);
  1131   Adaptor::Edge e3 = adaptor.addEdge(n2, n3);
  1132   Adaptor::Edge e4 = adaptor.addEdge(n3, n4);
  1133 
  1134   edge_filter[e1] = edge_filter[e2] = edge_filter[e3] = edge_filter[e4] = true;
  1135 
  1136   checkGraphNodeList(adaptor, 4);
  1137   checkGraphArcList(adaptor, 8);
  1138   checkGraphEdgeList(adaptor, 4);
  1139   checkGraphConArcList(adaptor, 8);
  1140   checkGraphConEdgeList(adaptor, 4);
  1141 
  1142   checkGraphIncEdgeArcLists(adaptor, n1, 2);
  1143   checkGraphIncEdgeArcLists(adaptor, n2, 2);
  1144   checkGraphIncEdgeArcLists(adaptor, n3, 3);
  1145   checkGraphIncEdgeArcLists(adaptor, n4, 1);
  1146 
  1147   checkNodeIds(adaptor);
  1148   checkArcIds(adaptor);
  1149   checkEdgeIds(adaptor);
  1150 
  1151   checkGraphNodeMap(adaptor);
  1152   checkGraphArcMap(adaptor);
  1153   checkGraphEdgeMap(adaptor);
  1154 
  1155   // Hide an edge
  1156   adaptor.status(e2, false);
  1157   adaptor.disable(e3);
  1158   if (!adaptor.status(e3)) adaptor.enable(e3);
  1159 
  1160   checkGraphNodeList(adaptor, 4);
  1161   checkGraphArcList(adaptor, 6);
  1162   checkGraphEdgeList(adaptor, 3);
  1163   checkGraphConArcList(adaptor, 6);
  1164   checkGraphConEdgeList(adaptor, 3);
  1165 
  1166   checkGraphIncEdgeArcLists(adaptor, n1, 1);
  1167   checkGraphIncEdgeArcLists(adaptor, n2, 2);
  1168   checkGraphIncEdgeArcLists(adaptor, n3, 2);
  1169   checkGraphIncEdgeArcLists(adaptor, n4, 1);
  1170 
  1171   checkNodeIds(adaptor);
  1172   checkArcIds(adaptor);
  1173   checkEdgeIds(adaptor);
  1174 
  1175   checkGraphNodeMap(adaptor);
  1176   checkGraphArcMap(adaptor);
  1177   checkGraphEdgeMap(adaptor);
  1178 
  1179   // Hide all edges
  1180   edge_filter[e1] = edge_filter[e2] = edge_filter[e3] = edge_filter[e4] = false;
  1181 
  1182   checkGraphNodeList(adaptor, 4);
  1183   checkGraphArcList(adaptor, 0);
  1184   checkGraphEdgeList(adaptor, 0);
  1185   checkGraphConArcList(adaptor, 0);
  1186   checkGraphConEdgeList(adaptor, 0);
  1187 
  1188   checkNodeIds(adaptor);
  1189   checkArcIds(adaptor);
  1190   checkEdgeIds(adaptor);
  1191 
  1192   checkGraphNodeMap(adaptor);
  1193   checkGraphArcMap(adaptor);
  1194   checkGraphEdgeMap(adaptor);
  1195 
  1196   // Check the conversion of nodes and edges
  1197   Graph::Node ng = n3;
  1198   ng = n4;
  1199   Adaptor::Node na = n1;
  1200   na = n2;
  1201   Graph::Edge eg = e3;
  1202   eg = e4;
  1203   Adaptor::Edge ea = e1;
  1204   ea = e2;
  1205 }
  1206 
  1207 void checkOrienter() {
  1208   // Check concepts
  1209   checkConcept<concepts::Digraph, Orienter<concepts::Graph> >();
  1210   checkConcept<concepts::Digraph, Orienter<ListGraph> >();
  1211   checkConcept<concepts::AlterableDigraphComponent<>,
  1212                Orienter<ListGraph> >();
  1213   checkConcept<concepts::ExtendableDigraphComponent<>,
  1214                Orienter<ListGraph> >();
  1215   checkConcept<concepts::ErasableDigraphComponent<>,
  1216                Orienter<ListGraph> >();
  1217   checkConcept<concepts::ClearableDigraphComponent<>,
  1218                Orienter<ListGraph> >();
  1219 
  1220   // Create a graph and an adaptor
  1221   typedef ListGraph Graph;
  1222   typedef ListGraph::EdgeMap<bool> DirMap;
  1223   typedef Orienter<Graph> Adaptor;
  1224 
  1225   Graph graph;
  1226   DirMap dir(graph);
  1227   Adaptor adaptor(graph, dir);
  1228 
  1229   // Add nodes and edges to the original graph and the adaptor
  1230   Graph::Node n1 = graph.addNode();
  1231   Graph::Node n2 = graph.addNode();
  1232   Adaptor::Node n3 = adaptor.addNode();
  1233 
  1234   Graph::Edge e1 = graph.addEdge(n1, n2);
  1235   Graph::Edge e2 = graph.addEdge(n1, n3);
  1236   Adaptor::Arc e3 = adaptor.addArc(n2, n3);
  1237 
  1238   dir[e1] = dir[e2] = dir[e3] = true;
  1239 
  1240   // Check the original graph
  1241   checkGraphNodeList(graph, 3);
  1242   checkGraphArcList(graph, 6);
  1243   checkGraphConArcList(graph, 6);
  1244   checkGraphEdgeList(graph, 3);
  1245   checkGraphConEdgeList(graph, 3);
  1246 
  1247   checkGraphIncEdgeArcLists(graph, n1, 2);
  1248   checkGraphIncEdgeArcLists(graph, n2, 2);
  1249   checkGraphIncEdgeArcLists(graph, n3, 2);
  1250 
  1251   checkNodeIds(graph);
  1252   checkArcIds(graph);
  1253   checkEdgeIds(graph);
  1254 
  1255   checkGraphNodeMap(graph);
  1256   checkGraphArcMap(graph);
  1257   checkGraphEdgeMap(graph);
  1258 
  1259   // Check the adaptor
  1260   checkGraphNodeList(adaptor, 3);
  1261   checkGraphArcList(adaptor, 3);
  1262   checkGraphConArcList(adaptor, 3);
  1263 
  1264   checkGraphOutArcList(adaptor, n1, 2);
  1265   checkGraphOutArcList(adaptor, n2, 1);
  1266   checkGraphOutArcList(adaptor, n3, 0);
  1267 
  1268   checkGraphInArcList(adaptor, n1, 0);
  1269   checkGraphInArcList(adaptor, n2, 1);
  1270   checkGraphInArcList(adaptor, n3, 2);
  1271 
  1272   checkNodeIds(adaptor);
  1273   checkArcIds(adaptor);
  1274 
  1275   checkGraphNodeMap(adaptor);
  1276   checkGraphArcMap(adaptor);
  1277 
  1278   // Check direction changing
  1279   {
  1280     dir[e1] = true;
  1281     Adaptor::Node u = adaptor.source(e1);
  1282     Adaptor::Node v = adaptor.target(e1);
  1283 
  1284     dir[e1] = false;
  1285     check (u == adaptor.target(e1), "Wrong dir");
  1286     check (v == adaptor.source(e1), "Wrong dir");
  1287 
  1288     check ((u == n1 && v == n2) || (u == n2 && v == n1), "Wrong dir");
  1289     dir[e1] = n1 == u;
  1290   }
  1291 
  1292   {
  1293     dir[e2] = true;
  1294     Adaptor::Node u = adaptor.source(e2);
  1295     Adaptor::Node v = adaptor.target(e2);
  1296 
  1297     dir[e2] = false;
  1298     check (u == adaptor.target(e2), "Wrong dir");
  1299     check (v == adaptor.source(e2), "Wrong dir");
  1300 
  1301     check ((u == n1 && v == n3) || (u == n3 && v == n1), "Wrong dir");
  1302     dir[e2] = n3 == u;
  1303   }
  1304 
  1305   {
  1306     dir[e3] = true;
  1307     Adaptor::Node u = adaptor.source(e3);
  1308     Adaptor::Node v = adaptor.target(e3);
  1309 
  1310     dir[e3] = false;
  1311     check (u == adaptor.target(e3), "Wrong dir");
  1312     check (v == adaptor.source(e3), "Wrong dir");
  1313 
  1314     check ((u == n2 && v == n3) || (u == n3 && v == n2), "Wrong dir");
  1315     dir[e3] = n2 == u;
  1316   }
  1317 
  1318   // Check the adaptor again
  1319   checkGraphNodeList(adaptor, 3);
  1320   checkGraphArcList(adaptor, 3);
  1321   checkGraphConArcList(adaptor, 3);
  1322 
  1323   checkGraphOutArcList(adaptor, n1, 1);
  1324   checkGraphOutArcList(adaptor, n2, 1);
  1325   checkGraphOutArcList(adaptor, n3, 1);
  1326 
  1327   checkGraphInArcList(adaptor, n1, 1);
  1328   checkGraphInArcList(adaptor, n2, 1);
  1329   checkGraphInArcList(adaptor, n3, 1);
  1330 
  1331   checkNodeIds(adaptor);
  1332   checkArcIds(adaptor);
  1333 
  1334   checkGraphNodeMap(adaptor);
  1335   checkGraphArcMap(adaptor);
  1336 
  1337   // Check reverseArc()
  1338   adaptor.reverseArc(e2);
  1339   adaptor.reverseArc(e3);
  1340   adaptor.reverseArc(e2);
  1341 
  1342   checkGraphNodeList(adaptor, 3);
  1343   checkGraphArcList(adaptor, 3);
  1344   checkGraphConArcList(adaptor, 3);
  1345 
  1346   checkGraphOutArcList(adaptor, n1, 1);
  1347   checkGraphOutArcList(adaptor, n2, 0);
  1348   checkGraphOutArcList(adaptor, n3, 2);
  1349 
  1350   checkGraphInArcList(adaptor, n1, 1);
  1351   checkGraphInArcList(adaptor, n2, 2);
  1352   checkGraphInArcList(adaptor, n3, 0);
  1353 
  1354   // Check the conversion of nodes and arcs/edges
  1355   Graph::Node ng = n3;
  1356   ng = n3;
  1357   Adaptor::Node na = n1;
  1358   na = n2;
  1359   Graph::Edge eg = e3;
  1360   eg = e3;
  1361   Adaptor::Arc aa = e1;
  1362   aa = e2;
  1363 }
  1364 
  1365 void checkCombiningAdaptors() {
  1366   // Create a grid graph
  1367   GridGraph graph(2,2);
  1368   GridGraph::Node n1 = graph(0,0);
  1369   GridGraph::Node n2 = graph(0,1);
  1370   GridGraph::Node n3 = graph(1,0);
  1371   GridGraph::Node n4 = graph(1,1);
  1372 
  1373   GridGraph::EdgeMap<bool> dir_map(graph);
  1374   dir_map[graph.right(n1)] = graph.u(graph.right(n1)) != n1;
  1375   dir_map[graph.up(n1)] = graph.u(graph.up(n1)) == n1;
  1376   dir_map[graph.left(n4)] = graph.u(graph.left(n4)) == n4;
  1377   dir_map[graph.down(n4)] = graph.u(graph.down(n4)) == n4;
  1378 
  1379   // Apply several adaptors on the grid graph
  1380   typedef SplitNodes<Orienter< const GridGraph, GridGraph::EdgeMap<bool> > >
  1381     SplitGridGraph;
  1382   typedef Undirector<const SplitGridGraph> USplitGridGraph;
  1383   checkConcept<concepts::Digraph, SplitGridGraph>();
  1384   checkConcept<concepts::Graph, USplitGridGraph>();
  1385 
  1386   SplitGridGraph adaptor = splitNodes(orienter(graph, dir_map));
  1387   USplitGridGraph uadaptor = undirector(adaptor);
  1388 
  1389   // Check adaptor
  1390   checkGraphNodeList(adaptor, 8);
  1391   checkGraphArcList(adaptor, 8);
  1392   checkGraphConArcList(adaptor, 8);
  1393 
  1394   checkGraphOutArcList(adaptor, adaptor.inNode(n1), 1);
  1395   checkGraphOutArcList(adaptor, adaptor.outNode(n1), 1);
  1396   checkGraphOutArcList(adaptor, adaptor.inNode(n2), 1);
  1397   checkGraphOutArcList(adaptor, adaptor.outNode(n2), 0);
  1398   checkGraphOutArcList(adaptor, adaptor.inNode(n3), 1);
  1399   checkGraphOutArcList(adaptor, adaptor.outNode(n3), 1);
  1400   checkGraphOutArcList(adaptor, adaptor.inNode(n4), 1);
  1401   checkGraphOutArcList(adaptor, adaptor.outNode(n4), 2);
  1402 
  1403   checkGraphInArcList(adaptor, adaptor.inNode(n1), 1);
  1404   checkGraphInArcList(adaptor, adaptor.outNode(n1), 1);
  1405   checkGraphInArcList(adaptor, adaptor.inNode(n2), 2);
  1406   checkGraphInArcList(adaptor, adaptor.outNode(n2), 1);
  1407   checkGraphInArcList(adaptor, adaptor.inNode(n3), 1);
  1408   checkGraphInArcList(adaptor, adaptor.outNode(n3), 1);
  1409   checkGraphInArcList(adaptor, adaptor.inNode(n4), 0);
  1410   checkGraphInArcList(adaptor, adaptor.outNode(n4), 1);
  1411 
  1412   checkNodeIds(adaptor);
  1413   checkArcIds(adaptor);
  1414 
  1415   checkGraphNodeMap(adaptor);
  1416   checkGraphArcMap(adaptor);
  1417 
  1418   // Check uadaptor
  1419   checkGraphNodeList(uadaptor, 8);
  1420   checkGraphEdgeList(uadaptor, 8);
  1421   checkGraphArcList(uadaptor, 16);
  1422   checkGraphConEdgeList(uadaptor, 8);
  1423   checkGraphConArcList(uadaptor, 16);
  1424 
  1425   checkNodeIds(uadaptor);
  1426   checkEdgeIds(uadaptor);
  1427   checkArcIds(uadaptor);
  1428 
  1429   checkGraphNodeMap(uadaptor);
  1430   checkGraphEdgeMap(uadaptor);
  1431   checkGraphArcMap(uadaptor);
  1432 
  1433   checkGraphIncEdgeArcLists(uadaptor, adaptor.inNode(n1), 2);
  1434   checkGraphIncEdgeArcLists(uadaptor, adaptor.outNode(n1), 2);
  1435   checkGraphIncEdgeArcLists(uadaptor, adaptor.inNode(n2), 3);
  1436   checkGraphIncEdgeArcLists(uadaptor, adaptor.outNode(n2), 1);
  1437   checkGraphIncEdgeArcLists(uadaptor, adaptor.inNode(n3), 2);
  1438   checkGraphIncEdgeArcLists(uadaptor, adaptor.outNode(n3), 2);
  1439   checkGraphIncEdgeArcLists(uadaptor, adaptor.inNode(n4), 1);
  1440   checkGraphIncEdgeArcLists(uadaptor, adaptor.outNode(n4), 3);
  1441 }
  1442 
  1443 int main(int, const char **) {
  1444   // Check the digraph adaptors (using ListDigraph)
  1445   checkReverseDigraph();
  1446   checkSubDigraph();
  1447   checkFilterNodes1();
  1448   checkFilterArcs();
  1449   checkUndirector();
  1450   checkResidualDigraph();
  1451   checkSplitNodes();
  1452 
  1453   // Check the graph adaptors (using ListGraph)
  1454   checkSubGraph();
  1455   checkFilterNodes2();
  1456   checkFilterEdges();
  1457   checkOrienter();
  1458 
  1459   // Combine adaptors (using GridGraph)
  1460   checkCombiningAdaptors();
  1461 
  1462   return 0;
  1463 }