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