gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge
1 4 1
merge default
3 files changed with 872 insertions and 347 deletions:
↑ Collapse diff ↑
Show white space 96 line context
... ...
@@ -2621,192 +2621,192 @@
2621 2621
      const CapacityMap* _capacity;
2622 2622
      const FlowMap* _flow;
2623 2623
      Tolerance _tolerance;
2624 2624
    public:
2625 2625

	
2626 2626
      ResForwardFilter(const CapacityMap& capacity, const FlowMap& flow,
2627 2627
                       const Tolerance& tolerance = Tolerance())
2628 2628
        : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
2629 2629

	
2630 2630
      bool operator[](const typename Digraph::Arc& a) const {
2631 2631
        return _tolerance.positive((*_capacity)[a] - (*_flow)[a]);
2632 2632
      }
2633 2633
    };
2634 2634

	
2635 2635
    template<typename Digraph,
2636 2636
             typename CapacityMap,
2637 2637
             typename FlowMap,
2638 2638
             typename Tolerance>
2639 2639
    class ResBackwardFilter {
2640 2640
    public:
2641 2641

	
2642 2642
      typedef typename Digraph::Arc Key;
2643 2643
      typedef bool Value;
2644 2644

	
2645 2645
    private:
2646 2646

	
2647 2647
      const CapacityMap* _capacity;
2648 2648
      const FlowMap* _flow;
2649 2649
      Tolerance _tolerance;
2650 2650

	
2651 2651
    public:
2652 2652

	
2653 2653
      ResBackwardFilter(const CapacityMap& capacity, const FlowMap& flow,
2654 2654
                        const Tolerance& tolerance = Tolerance())
2655 2655
        : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
2656 2656

	
2657 2657
      bool operator[](const typename Digraph::Arc& a) const {
2658 2658
        return _tolerance.positive((*_flow)[a]);
2659 2659
      }
2660 2660
    };
2661 2661

	
2662 2662
  }
2663 2663

	
2664 2664
  /// \ingroup graph_adaptors
2665 2665
  ///
2666 2666
  /// \brief Adaptor class for composing the residual digraph for directed
2667 2667
  /// flow and circulation problems.
2668 2668
  ///
2669
  /// Residual can be used for composing the \e residual digraph for directed
2670
  /// flow and circulation problems. Let \f$ G=(V, A) \f$ be a directed graph
2671
  /// and let \f$ F \f$ be a number type. Let \f$ flow, cap: A\to F \f$ be
2672
  /// functions on the arcs.
2669
  /// ResidualDigraph can be used for composing the \e residual digraph
2670
  /// for directed flow and circulation problems. Let \f$ G=(V, A) \f$
2671
  /// be a directed graph and let \f$ F \f$ be a number type.
2672
  /// Let \f$ flow, cap: A\to F \f$ be functions on the arcs.
2673 2673
  /// This adaptor implements a digraph structure with node set \f$ V \f$
2674 2674
  /// and arc set \f$ A_{forward}\cup A_{backward} \f$,
2675 2675
  /// where \f$ A_{forward}=\{uv : uv\in A, flow(uv)<cap(uv)\} \f$ and
2676 2676
  /// \f$ A_{backward}=\{vu : uv\in A, flow(uv)>0\} \f$, i.e. the so
2677 2677
  /// called residual digraph.
2678 2678
  /// When the union \f$ A_{forward}\cup A_{backward} \f$ is taken,
2679 2679
  /// multiplicities are counted, i.e. the adaptor has exactly
2680 2680
  /// \f$ |A_{forward}| + |A_{backward}|\f$ arcs (it may have parallel
2681 2681
  /// arcs).
2682 2682
  /// This class conforms to the \ref concepts::Digraph "Digraph" concept.
2683 2683
  ///
2684 2684
  /// \tparam GR The type of the adapted digraph.
2685 2685
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
2686 2686
  /// It is implicitly \c const.
2687 2687
  /// \tparam CM The type of the capacity map.
2688 2688
  /// It must be an arc map of some numerical type, which defines
2689 2689
  /// the capacities in the flow problem. It is implicitly \c const.
2690 2690
  /// The default type is
2691 2691
  /// \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
2692 2692
  /// \tparam FM The type of the flow map.
2693 2693
  /// It must be an arc map of some numerical type, which defines
2694 2694
  /// the flow values in the flow problem. The default type is \c CM.
2695 2695
  /// \tparam TL The tolerance type for handling inexact computation.
2696 2696
  /// The default tolerance type depends on the value type of the
2697 2697
  /// capacity map.
2698 2698
  ///
2699 2699
  /// \note This adaptor is implemented using Undirector and FilterArcs
2700 2700
  /// adaptors.
2701 2701
  ///
2702 2702
  /// \note The \c Node type of this adaptor and the adapted digraph are
2703 2703
  /// convertible to each other, moreover the \c Arc type of the adaptor
2704 2704
  /// is convertible to the \c Arc type of the adapted digraph.
2705 2705
#ifdef DOXYGEN
2706 2706
  template<typename GR, typename CM, typename FM, typename TL>
2707
  class Residual
2707
  class ResidualDigraph
2708 2708
#else
2709 2709
  template<typename GR,
2710 2710
           typename CM = typename GR::template ArcMap<int>,
2711 2711
           typename FM = CM,
2712 2712
           typename TL = Tolerance<typename CM::Value> >
2713
  class Residual :
2713
  class ResidualDigraph :
2714 2714
    public FilterArcs<
2715 2715
      Undirector<const GR>,
2716 2716
      typename Undirector<const GR>::template CombinedArcMap<
2717 2717
        _adaptor_bits::ResForwardFilter<const GR, CM, FM, TL>,
2718 2718
        _adaptor_bits::ResBackwardFilter<const GR, CM, FM, TL> > >
2719 2719
#endif
2720 2720
  {
2721 2721
  public:
2722 2722

	
2723 2723
    /// The type of the underlying digraph.
2724 2724
    typedef GR Digraph;
2725 2725
    /// The type of the capacity map.
2726 2726
    typedef CM CapacityMap;
2727 2727
    /// The type of the flow map.
2728 2728
    typedef FM FlowMap;
2729 2729
    /// The tolerance type.
2730 2730
    typedef TL Tolerance;
2731 2731

	
2732 2732
    typedef typename CapacityMap::Value Value;
2733
    typedef Residual Adaptor;
2733
    typedef ResidualDigraph Adaptor;
2734 2734

	
2735 2735
  protected:
2736 2736

	
2737 2737
    typedef Undirector<const Digraph> Undirected;
2738 2738

	
2739 2739
    typedef _adaptor_bits::ResForwardFilter<const Digraph, CapacityMap,
2740 2740
                                            FlowMap, Tolerance> ForwardFilter;
2741 2741

	
2742 2742
    typedef _adaptor_bits::ResBackwardFilter<const Digraph, CapacityMap,
2743 2743
                                             FlowMap, Tolerance> BackwardFilter;
2744 2744

	
2745 2745
    typedef typename Undirected::
2746 2746
      template CombinedArcMap<ForwardFilter, BackwardFilter> ArcFilter;
2747 2747

	
2748 2748
    typedef FilterArcs<Undirected, ArcFilter> Parent;
2749 2749

	
2750 2750
    const CapacityMap* _capacity;
2751 2751
    FlowMap* _flow;
2752 2752

	
2753 2753
    Undirected _graph;
2754 2754
    ForwardFilter _forward_filter;
2755 2755
    BackwardFilter _backward_filter;
2756 2756
    ArcFilter _arc_filter;
2757 2757

	
2758 2758
  public:
2759 2759

	
2760 2760
    /// \brief Constructor
2761 2761
    ///
2762 2762
    /// Constructor of the residual digraph adaptor. The parameters are the
2763 2763
    /// digraph, the capacity map, the flow map, and a tolerance object.
2764
    Residual(const Digraph& digraph, const CapacityMap& capacity,
2764
    ResidualDigraph(const Digraph& digraph, const CapacityMap& capacity,
2765 2765
             FlowMap& flow, const Tolerance& tolerance = Tolerance())
2766 2766
      : Parent(), _capacity(&capacity), _flow(&flow), _graph(digraph),
2767 2767
        _forward_filter(capacity, flow, tolerance),
2768 2768
        _backward_filter(capacity, flow, tolerance),
2769 2769
        _arc_filter(_forward_filter, _backward_filter)
2770 2770
    {
2771 2771
      Parent::setDigraph(_graph);
2772 2772
      Parent::setArcFilterMap(_arc_filter);
2773 2773
    }
2774 2774

	
2775 2775
    typedef typename Parent::Arc Arc;
2776 2776

	
2777 2777
    /// \brief Returns the residual capacity of the given arc.
2778 2778
    ///
2779 2779
    /// Returns the residual capacity of the given arc.
2780 2780
    Value residualCapacity(const Arc& a) const {
2781 2781
      if (Undirected::direction(a)) {
2782 2782
        return (*_capacity)[a] - (*_flow)[a];
2783 2783
      } else {
2784 2784
        return (*_flow)[a];
2785 2785
      }
2786 2786
    }
2787 2787

	
2788 2788
    /// \brief Augments on the given arc in the residual digraph.
2789 2789
    ///
2790 2790
    /// Augments on the given arc in the residual digraph. It increases
2791 2791
    /// or decreases the flow value on the original arc according to the
2792 2792
    /// direction of the residual arc.
2793 2793
    void augment(const Arc& a, const Value& v) const {
2794 2794
      if (Undirected::direction(a)) {
2795 2795
        _flow->set(a, (*_flow)[a] + v);
2796 2796
      } else {
2797 2797
        _flow->set(a, (*_flow)[a] - v);
2798 2798
      }
2799 2799
    }
2800 2800

	
2801 2801
    /// \brief Returns \c true if the given residual arc is a forward arc.
2802 2802
    ///
2803 2803
    /// Returns \c true if the given residual arc has the same orientation
2804 2804
    /// as the original arc, i.e. it is a so called forward arc.
2805 2805
    static bool forward(const Arc& a) {
2806 2806
      return Undirected::direction(a);
2807 2807
    }
2808 2808

	
2809 2809
    /// \brief Returns \c true if the given residual arc is a backward arc.
2810 2810
    ///
2811 2811
    /// Returns \c true if the given residual arc has the opposite orientation
2812 2812
    /// than the original arc, i.e. it is a so called backward arc.
... ...
@@ -2824,100 +2824,99 @@
2824 2824

	
2825 2825
    /// \brief Returns the backward oriented residual arc.
2826 2826
    ///
2827 2827
    /// Returns the backward oriented residual arc related to the given
2828 2828
    /// arc of the underlying digraph.
2829 2829
    static Arc backward(const typename Digraph::Arc& a) {
2830 2830
      return Undirected::direct(a, false);
2831 2831
    }
2832 2832

	
2833 2833
    /// \brief Residual capacity map.
2834 2834
    ///
2835 2835
    /// This map adaptor class can be used for obtaining the residual
2836 2836
    /// capacities as an arc map of the residual digraph.
2837 2837
    /// Its value type is inherited from the capacity map.
2838 2838
    class ResidualCapacity {
2839 2839
    protected:
2840 2840
      const Adaptor* _adaptor;
2841 2841
    public:
2842 2842
      /// The key type of the map
2843 2843
      typedef Arc Key;
2844 2844
      /// The value type of the map
2845 2845
      typedef typename CapacityMap::Value Value;
2846 2846

	
2847 2847
      /// Constructor
2848 2848
      ResidualCapacity(const Adaptor& adaptor) : _adaptor(&adaptor) {}
2849 2849

	
2850 2850
      /// Returns the value associated with the given residual arc
2851 2851
      Value operator[](const Arc& a) const {
2852 2852
        return _adaptor->residualCapacity(a);
2853 2853
      }
2854 2854

	
2855 2855
    };
2856 2856

	
2857 2857
    /// \brief Returns a residual capacity map
2858 2858
    ///
2859 2859
    /// This function just returns a residual capacity map.
2860 2860
    ResidualCapacity residualCapacity() const {
2861 2861
      return ResidualCapacity(*this);
2862 2862
    }
2863 2863

	
2864 2864
  };
2865 2865

	
2866 2866
  /// \brief Returns a (read-only) Residual adaptor
2867 2867
  ///
2868 2868
  /// This function just returns a (read-only) \ref Residual adaptor.
2869 2869
  /// \ingroup graph_adaptors
2870 2870
  /// \relates Residual
2871 2871
  template<typename GR, typename CM, typename FM>
2872
  Residual<GR, CM, FM> residual(const GR& digraph,
2873
                                const CM& capacity_map,
2874
                                FM& flow_map) {
2875
    return Residual<GR, CM, FM> (digraph, capacity_map, flow_map);
2872
  ResidualDigraph<GR, CM, FM>
2873
  residualDigraph(const GR& digraph, const CM& capacity_map, FM& flow_map) {
2874
    return ResidualDigraph<GR, CM, FM> (digraph, capacity_map, flow_map);
2876 2875
  }
2877 2876

	
2878 2877

	
2879 2878
  template <typename _Digraph>
2880 2879
  class SplitNodesBase {
2881 2880
  public:
2882 2881

	
2883 2882
    typedef _Digraph Digraph;
2884 2883
    typedef DigraphAdaptorBase<const _Digraph> Parent;
2885 2884
    typedef SplitNodesBase Adaptor;
2886 2885

	
2887 2886
    typedef typename Digraph::Node DigraphNode;
2888 2887
    typedef typename Digraph::Arc DigraphArc;
2889 2888

	
2890 2889
    class Node;
2891 2890
    class Arc;
2892 2891

	
2893 2892
  private:
2894 2893

	
2895 2894
    template <typename T> class NodeMapBase;
2896 2895
    template <typename T> class ArcMapBase;
2897 2896

	
2898 2897
  public:
2899 2898

	
2900 2899
    class Node : public DigraphNode {
2901 2900
      friend class SplitNodesBase;
2902 2901
      template <typename T> friend class NodeMapBase;
2903 2902
    private:
2904 2903

	
2905 2904
      bool _in;
2906 2905
      Node(DigraphNode node, bool in)
2907 2906
        : DigraphNode(node), _in(in) {}
2908 2907

	
2909 2908
    public:
2910 2909

	
2911 2910
      Node() {}
2912 2911
      Node(Invalid) : DigraphNode(INVALID), _in(true) {}
2913 2912

	
2914 2913
      bool operator==(const Node& node) const {
2915 2914
        return DigraphNode::operator==(node) && _in == node._in;
2916 2915
      }
2917 2916

	
2918 2917
      bool operator!=(const Node& node) const {
2919 2918
        return !(*this == node);
2920 2919
      }
2921 2920

	
2922 2921
      bool operator<(const Node& node) const {
2923 2922
        return DigraphNode::operator<(node) ||
Show white space 96 line context
1 1
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR})
2 2

	
3 3
LINK_DIRECTORIES(${CMAKE_BINARY_DIR}/lemon)
4 4

	
5 5
SET(TESTS
6
  adaptors_test
6 7
  bfs_test
7 8
  circulation_test
8 9
  counter_test
9 10
  dfs_test
10 11
  digraph_test
11 12
  dijkstra_test
12 13
  dim_test
13 14
  error_test
14
  graph_adaptor_test
15 15
  graph_copy_test
16 16
  graph_test
17 17
  graph_utils_test
18 18
  hao_orlin_test
19 19
  heap_test
20 20
  kruskal_test
21 21
  lp_test
22 22
  mip_test
23 23
  maps_test
24 24
  max_matching_test
25 25
  radix_sort_test
26 26
  path_test
27 27
  preflow_test
28 28
  random_test
29 29
  suurballe_test
30 30
  time_measure_test
31 31
  unionfind_test)
32 32

	
33 33
FOREACH(TEST_NAME ${TESTS})
34 34
  ADD_EXECUTABLE(${TEST_NAME} ${TEST_NAME}.cc)
35 35
  TARGET_LINK_LIBRARIES(${TEST_NAME} lemon)
36 36
  ADD_TEST(${TEST_NAME} ${TEST_NAME})
37 37
ENDFOREACH(TEST_NAME)
Show white space 96 line context
1 1
EXTRA_DIST += \
2 2
	test/CMakeLists.txt
3 3

	
4 4
noinst_HEADERS += \
5 5
	test/graph_test.h \
6 6
	test/test_tools.h
7 7

	
8 8
check_PROGRAMS += \
9
	test/adaptors_test \
9 10
	test/bfs_test \
10 11
	test/circulation_test \
11 12
	test/counter_test \
12 13
	test/dfs_test \
13 14
	test/digraph_test \
14 15
	test/dijkstra_test \
15 16
	test/dim_test \
16 17
	test/error_test \
17
	test/graph_adaptor_test \
18 18
	test/graph_copy_test \
19 19
	test/graph_test \
20 20
	test/graph_utils_test \
21 21
	test/hao_orlin_test \
22 22
	test/heap_test \
23 23
	test/kruskal_test \
24 24
	test/maps_test \
25 25
	test/max_matching_test \
26 26
	test/path_test \
27 27
	test/preflow_test \
28 28
	test/radix_sort_test \
29 29
	test/random_test \
30 30
	test/suurballe_test \
31 31
	test/test_tools_fail \
32 32
	test/test_tools_pass \
33 33
	test/time_measure_test \
34 34
	test/unionfind_test
35 35

	
36 36
if HAVE_LP
37 37
check_PROGRAMS += test/lp_test
38 38
endif HAVE_LP
39 39
if HAVE_MIP
40 40
check_PROGRAMS += test/mip_test
41 41
endif HAVE_MIP
42 42

	
43 43
TESTS += $(check_PROGRAMS)
44 44
XFAIL_TESTS += test/test_tools_fail$(EXEEXT)
45 45

	
46
test_adaptors_test_SOURCES = test/adaptors_test.cc
46 47
test_bfs_test_SOURCES = test/bfs_test.cc
47 48
test_circulation_test_SOURCES = test/circulation_test.cc
48 49
test_counter_test_SOURCES = test/counter_test.cc
49 50
test_dfs_test_SOURCES = test/dfs_test.cc
50 51
test_digraph_test_SOURCES = test/digraph_test.cc
51 52
test_dijkstra_test_SOURCES = test/dijkstra_test.cc
52 53
test_dim_test_SOURCES = test/dim_test.cc
53 54
test_error_test_SOURCES = test/error_test.cc
54
test_graph_adaptor_test_SOURCES = test/graph_adaptor_test.cc
55 55
test_graph_copy_test_SOURCES = test/graph_copy_test.cc
56 56
test_graph_test_SOURCES = test/graph_test.cc
57 57
test_graph_utils_test_SOURCES = test/graph_utils_test.cc
58 58
test_heap_test_SOURCES = test/heap_test.cc
59 59
test_kruskal_test_SOURCES = test/kruskal_test.cc
60 60
test_hao_orlin_test_SOURCES = test/hao_orlin_test.cc
61 61
test_lp_test_SOURCES = test/lp_test.cc
62 62
test_maps_test_SOURCES = test/maps_test.cc
63 63
test_mip_test_SOURCES = test/mip_test.cc
64 64
test_max_matching_test_SOURCES = test/max_matching_test.cc
65 65
test_path_test_SOURCES = test/path_test.cc
66 66
test_preflow_test_SOURCES = test/preflow_test.cc
67 67
test_radix_sort_test_SOURCES = test/radix_sort_test.cc
68 68
test_suurballe_test_SOURCES = test/suurballe_test.cc
69 69
test_random_test_SOURCES = test/random_test.cc
70 70
test_test_tools_fail_SOURCES = test/test_tools_fail.cc
71 71
test_test_tools_pass_SOURCES = test/test_tools_pass.cc
72 72
test_time_measure_test_SOURCES = test/time_measure_test.cc
73 73
test_unionfind_test_SOURCES = test/unionfind_test.cc
Show white space 96 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include<iostream>
20
#include<lemon/concept_check.h>
20
#include <limits>
21 21

	
22 22
#include<lemon/list_graph.h>
23
#include<lemon/smart_graph.h>
23
#include <lemon/grid_graph.h>
24
#include <lemon/bfs.h>
25
#include <lemon/path.h>
24 26

	
25 27
#include<lemon/concepts/digraph.h>
26 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>
27 32

	
28 33
#include<lemon/adaptors.h>
29 34

	
30
#include <limits>
31
#include <lemon/bfs.h>
32
#include <lemon/path.h>
33

	
34 35
#include"test/test_tools.h"
35 36
#include"test/graph_test.h"
36 37

	
37 38
using namespace lemon;
38 39

	
39 40
void checkReverseDigraph() {
41
  // Check concepts
40 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> >();
41 52

	
53
  // Create a digraph and an adaptor
42 54
  typedef ListDigraph Digraph;
43 55
  typedef ReverseDigraph<Digraph> Adaptor;
44 56

	
45 57
  Digraph digraph;
46 58
  Adaptor adaptor(digraph);
47 59

	
60
  // Add nodes and arcs to the original digraph
48 61
  Digraph::Node n1 = digraph.addNode();
49 62
  Digraph::Node n2 = digraph.addNode();
50 63
  Digraph::Node n3 = digraph.addNode();
51 64

	
52 65
  Digraph::Arc a1 = digraph.addArc(n1, n2);
53 66
  Digraph::Arc a2 = digraph.addArc(n1, n3);
54 67
  Digraph::Arc a3 = digraph.addArc(n2, n3);
55 68

	
69
  // Check the adaptor
56 70
  checkGraphNodeList(adaptor, 3);
57 71
  checkGraphArcList(adaptor, 3);
58 72
  checkGraphConArcList(adaptor, 3);
59 73

	
60 74
  checkGraphOutArcList(adaptor, n1, 0);
61 75
  checkGraphOutArcList(adaptor, n2, 1);
62 76
  checkGraphOutArcList(adaptor, n3, 2);
63 77

	
64 78
  checkGraphInArcList(adaptor, n1, 2);
65 79
  checkGraphInArcList(adaptor, n2, 1);
66 80
  checkGraphInArcList(adaptor, n3, 0);
67 81

	
68 82
  checkNodeIds(adaptor);
69 83
  checkArcIds(adaptor);
70 84

	
71 85
  checkGraphNodeMap(adaptor);
72 86
  checkGraphArcMap(adaptor);
73 87

	
88
  // Check the orientation of the arcs
74 89
  for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) {
75 90
    check(adaptor.source(a) == digraph.target(a), "Wrong reverse");
76 91
    check(adaptor.target(a) == digraph.source(a), "Wrong reverse");
77 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;
78 153
}
79 154

	
80 155
void checkSubDigraph() {
81
  checkConcept<concepts::Digraph,
82
    SubDigraph<concepts::Digraph,
83
    concepts::Digraph::NodeMap<bool>,
84
    concepts::Digraph::ArcMap<bool> > >();
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> >();
85 167

	
168
  // Create a digraph and an adaptor
86 169
  typedef ListDigraph Digraph;
87 170
  typedef Digraph::NodeMap<bool> NodeFilter;
88 171
  typedef Digraph::ArcMap<bool> ArcFilter;
89 172
  typedef SubDigraph<Digraph, NodeFilter, ArcFilter> Adaptor;
90 173

	
91 174
  Digraph digraph;
92 175
  NodeFilter node_filter(digraph);
93 176
  ArcFilter arc_filter(digraph);
94 177
  Adaptor adaptor(digraph, node_filter, arc_filter);
95 178

	
179
  // Add nodes and arcs to the original digraph and the adaptor
96 180
  Digraph::Node n1 = digraph.addNode();
97 181
  Digraph::Node n2 = digraph.addNode();
98
  Digraph::Node n3 = digraph.addNode();
182
  Adaptor::Node n3 = adaptor.addNode();
183

	
184
  node_filter[n1] = node_filter[n2] = node_filter[n3] = true;
99 185

	
100 186
  Digraph::Arc a1 = digraph.addArc(n1, n2);
101 187
  Digraph::Arc a2 = digraph.addArc(n1, n3);
102
  Digraph::Arc a3 = digraph.addArc(n2, n3);
103

	
104
  node_filter[n1] = node_filter[n2] = node_filter[n3] = true;
105
  arc_filter[a1] = arc_filter[a2] = arc_filter[a3] = true;
106

	
107
  checkGraphNodeList(adaptor, 3);
108
  checkGraphArcList(adaptor, 3);
109
  checkGraphConArcList(adaptor, 3);
110

	
111
  checkGraphOutArcList(adaptor, n1, 2);
112
  checkGraphOutArcList(adaptor, n2, 1);
113
  checkGraphOutArcList(adaptor, n3, 0);
114

	
115
  checkGraphInArcList(adaptor, n1, 0);
116
  checkGraphInArcList(adaptor, n2, 1);
117
  checkGraphInArcList(adaptor, n3, 2);
118

	
119
  checkNodeIds(adaptor);
120
  checkArcIds(adaptor);
121

	
122
  checkGraphNodeMap(adaptor);
123
  checkGraphArcMap(adaptor);
124

	
125
  arc_filter[a2] = false;
126

	
127
  checkGraphNodeList(adaptor, 3);
128
  checkGraphArcList(adaptor, 2);
129
  checkGraphConArcList(adaptor, 2);
130

	
131
  checkGraphOutArcList(adaptor, n1, 1);
132
  checkGraphOutArcList(adaptor, n2, 1);
133
  checkGraphOutArcList(adaptor, n3, 0);
134

	
135
  checkGraphInArcList(adaptor, n1, 0);
136
  checkGraphInArcList(adaptor, n2, 1);
137
  checkGraphInArcList(adaptor, n3, 1);
138

	
139
  checkNodeIds(adaptor);
140
  checkArcIds(adaptor);
141

	
142
  checkGraphNodeMap(adaptor);
143
  checkGraphArcMap(adaptor);
144

	
145
  node_filter[n1] = false;
146

	
147
  checkGraphNodeList(adaptor, 2);
148
  checkGraphArcList(adaptor, 1);
149
  checkGraphConArcList(adaptor, 1);
150

	
151
  checkGraphOutArcList(adaptor, n2, 1);
152
  checkGraphOutArcList(adaptor, n3, 0);
153

	
154
  checkGraphInArcList(adaptor, n2, 0);
155
  checkGraphInArcList(adaptor, n3, 1);
156

	
157
  checkNodeIds(adaptor);
158
  checkArcIds(adaptor);
159

	
160
  checkGraphNodeMap(adaptor);
161
  checkGraphArcMap(adaptor);
162

	
163
  node_filter[n1] = node_filter[n2] = node_filter[n3] = false;
164
  arc_filter[a1] = arc_filter[a2] = arc_filter[a3] = false;
165

	
166
  checkGraphNodeList(adaptor, 0);
167
  checkGraphArcList(adaptor, 0);
168
  checkGraphConArcList(adaptor, 0);
169

	
170
  checkNodeIds(adaptor);
171
  checkArcIds(adaptor);
172

	
173
  checkGraphNodeMap(adaptor);
174
  checkGraphArcMap(adaptor);
175
}
176

	
177
void checkFilterNodes1() {
178
  checkConcept<concepts::Digraph,
179
    FilterNodes<concepts::Digraph,
180
      concepts::Digraph::NodeMap<bool> > >();
181

	
182
  typedef ListDigraph Digraph;
183
  typedef Digraph::NodeMap<bool> NodeFilter;
184
  typedef FilterNodes<Digraph, NodeFilter> Adaptor;
185

	
186
  Digraph digraph;
187
  NodeFilter node_filter(digraph);
188
  Adaptor adaptor(digraph, node_filter);
189

	
190
  Digraph::Node n1 = digraph.addNode();
191
  Digraph::Node n2 = digraph.addNode();
192
  Digraph::Node n3 = digraph.addNode();
193

	
194
  Digraph::Arc a1 = digraph.addArc(n1, n2);
195
  Digraph::Arc a2 = digraph.addArc(n1, n3);
196
  Digraph::Arc a3 = digraph.addArc(n2, n3);
197

	
198
  node_filter[n1] = node_filter[n2] = node_filter[n3] = true;
199

	
200
  checkGraphNodeList(adaptor, 3);
201
  checkGraphArcList(adaptor, 3);
202
  checkGraphConArcList(adaptor, 3);
203

	
204
  checkGraphOutArcList(adaptor, n1, 2);
205
  checkGraphOutArcList(adaptor, n2, 1);
206
  checkGraphOutArcList(adaptor, n3, 0);
207

	
208
  checkGraphInArcList(adaptor, n1, 0);
209
  checkGraphInArcList(adaptor, n2, 1);
210
  checkGraphInArcList(adaptor, n3, 2);
211

	
212
  checkNodeIds(adaptor);
213
  checkArcIds(adaptor);
214

	
215
  checkGraphNodeMap(adaptor);
216
  checkGraphArcMap(adaptor);
217

	
218
  node_filter[n1] = false;
219

	
220
  checkGraphNodeList(adaptor, 2);
221
  checkGraphArcList(adaptor, 1);
222
  checkGraphConArcList(adaptor, 1);
223

	
224
  checkGraphOutArcList(adaptor, n2, 1);
225
  checkGraphOutArcList(adaptor, n3, 0);
226

	
227
  checkGraphInArcList(adaptor, n2, 0);
228
  checkGraphInArcList(adaptor, n3, 1);
229

	
230
  checkNodeIds(adaptor);
231
  checkArcIds(adaptor);
232

	
233
  checkGraphNodeMap(adaptor);
234
  checkGraphArcMap(adaptor);
235

	
236
  node_filter[n1] = node_filter[n2] = node_filter[n3] = false;
237

	
238
  checkGraphNodeList(adaptor, 0);
239
  checkGraphArcList(adaptor, 0);
240
  checkGraphConArcList(adaptor, 0);
241

	
242
  checkNodeIds(adaptor);
243
  checkArcIds(adaptor);
244

	
245
  checkGraphNodeMap(adaptor);
246
  checkGraphArcMap(adaptor);
247
}
248

	
249
void checkFilterArcs() {
250
  checkConcept<concepts::Digraph,
251
    FilterArcs<concepts::Digraph,
252
    concepts::Digraph::ArcMap<bool> > >();
253

	
254
  typedef ListDigraph Digraph;
255
  typedef Digraph::ArcMap<bool> ArcFilter;
256
  typedef FilterArcs<Digraph, ArcFilter> Adaptor;
257

	
258
  Digraph digraph;
259
  ArcFilter arc_filter(digraph);
260
  Adaptor adaptor(digraph, arc_filter);
261

	
262
  Digraph::Node n1 = digraph.addNode();
263
  Digraph::Node n2 = digraph.addNode();
264
  Digraph::Node n3 = digraph.addNode();
265

	
266
  Digraph::Arc a1 = digraph.addArc(n1, n2);
267
  Digraph::Arc a2 = digraph.addArc(n1, n3);
268
  Digraph::Arc a3 = digraph.addArc(n2, n3);
188
  Adaptor::Arc a3 = adaptor.addArc(n2, n3);
269 189

	
270 190
  arc_filter[a1] = arc_filter[a2] = arc_filter[a3] = true;
271 191

	
272 192
  checkGraphNodeList(adaptor, 3);
273 193
  checkGraphArcList(adaptor, 3);
274 194
  checkGraphConArcList(adaptor, 3);
275 195

	
276 196
  checkGraphOutArcList(adaptor, n1, 2);
277 197
  checkGraphOutArcList(adaptor, n2, 1);
278 198
  checkGraphOutArcList(adaptor, n3, 0);
279 199

	
280 200
  checkGraphInArcList(adaptor, n1, 0);
281 201
  checkGraphInArcList(adaptor, n2, 1);
282 202
  checkGraphInArcList(adaptor, n3, 2);
283 203

	
284 204
  checkNodeIds(adaptor);
285 205
  checkArcIds(adaptor);
286 206

	
287 207
  checkGraphNodeMap(adaptor);
288 208
  checkGraphArcMap(adaptor);
289 209

	
290
  arc_filter[a2] = false;
210
  // Hide an arc
211
  adaptor.status(a2, false);
212
  adaptor.disable(a3);
213
  if (!adaptor.status(a3)) adaptor.enable(a3);
291 214

	
292 215
  checkGraphNodeList(adaptor, 3);
293 216
  checkGraphArcList(adaptor, 2);
294 217
  checkGraphConArcList(adaptor, 2);
295 218

	
296 219
  checkGraphOutArcList(adaptor, n1, 1);
297 220
  checkGraphOutArcList(adaptor, n2, 1);
298 221
  checkGraphOutArcList(adaptor, n3, 0);
299 222

	
300 223
  checkGraphInArcList(adaptor, n1, 0);
301 224
  checkGraphInArcList(adaptor, n2, 1);
302 225
  checkGraphInArcList(adaptor, n3, 1);
303 226

	
304 227
  checkNodeIds(adaptor);
305 228
  checkArcIds(adaptor);
306 229

	
307 230
  checkGraphNodeMap(adaptor);
308 231
  checkGraphArcMap(adaptor);
309 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
310 450
  arc_filter[a1] = arc_filter[a2] = arc_filter[a3] = false;
311 451

	
312 452
  checkGraphNodeList(adaptor, 3);
313 453
  checkGraphArcList(adaptor, 0);
314 454
  checkGraphConArcList(adaptor, 0);
315 455

	
316 456
  checkNodeIds(adaptor);
317 457
  checkArcIds(adaptor);
318 458

	
319 459
  checkGraphNodeMap(adaptor);
320 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;
321 471
}
322 472

	
323 473
void checkUndirector() {
474
  // Check concepts
324 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> >();
325 485

	
486

	
487
  // Create a digraph and an adaptor
326 488
  typedef ListDigraph Digraph;
327 489
  typedef Undirector<Digraph> Adaptor;
328 490

	
329 491
  Digraph digraph;
330 492
  Adaptor adaptor(digraph);
331 493

	
494
  // Add nodes and arcs/edges to the original digraph and the adaptor
332 495
  Digraph::Node n1 = digraph.addNode();
333 496
  Digraph::Node n2 = digraph.addNode();
334
  Digraph::Node n3 = digraph.addNode();
497
  Adaptor::Node n3 = adaptor.addNode();
335 498

	
336 499
  Digraph::Arc a1 = digraph.addArc(n1, n2);
337 500
  Digraph::Arc a2 = digraph.addArc(n1, n3);
338
  Digraph::Arc a3 = digraph.addArc(n2, n3);
501
  Adaptor::Edge e3 = adaptor.addEdge(n2, n3);
339 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
340 523
  checkGraphNodeList(adaptor, 3);
341 524
  checkGraphArcList(adaptor, 6);
342 525
  checkGraphEdgeList(adaptor, 3);
343 526
  checkGraphConArcList(adaptor, 6);
344 527
  checkGraphConEdgeList(adaptor, 3);
345 528

	
346
  checkGraphOutArcList(adaptor, n1, 2);
347
  checkGraphOutArcList(adaptor, n2, 2);
348
  checkGraphOutArcList(adaptor, n3, 2);
349

	
350
  checkGraphInArcList(adaptor, n1, 2);
351
  checkGraphInArcList(adaptor, n2, 2);
352
  checkGraphInArcList(adaptor, n3, 2);
353

	
354
  checkGraphIncEdgeList(adaptor, n1, 2);
355
  checkGraphIncEdgeList(adaptor, n2, 2);
356
  checkGraphIncEdgeList(adaptor, n3, 2);
529
  checkGraphIncEdgeArcLists(adaptor, n1, 2);
530
  checkGraphIncEdgeArcLists(adaptor, n2, 2);
531
  checkGraphIncEdgeArcLists(adaptor, n3, 2);
357 532

	
358 533
  checkNodeIds(adaptor);
359 534
  checkArcIds(adaptor);
360 535
  checkEdgeIds(adaptor);
361 536

	
362 537
  checkGraphNodeMap(adaptor);
363 538
  checkGraphArcMap(adaptor);
364 539
  checkGraphEdgeMap(adaptor);
365 540

	
541
  // Check the edges of the adaptor
366 542
  for (Adaptor::EdgeIt e(adaptor); e != INVALID; ++e) {
367 543
    check(adaptor.u(e) == digraph.source(e), "Wrong undir");
368 544
    check(adaptor.v(e) == digraph.target(e), "Wrong undir");
369 545
  }
370 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);
371 561
}
372 562

	
373
void checkResidual() {
374
  checkConcept<concepts::Digraph,
375
    Residual<concepts::Digraph,
376
    concepts::Digraph::ArcMap<int>,
377
    concepts::Digraph::ArcMap<int> > >();
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
  }
378 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
379 590
  typedef ListDigraph Digraph;
380 591
  typedef Digraph::ArcMap<int> IntArcMap;
381
  typedef Residual<Digraph, IntArcMap> Adaptor;
592
  typedef ResidualDigraph<Digraph, IntArcMap> Adaptor;
382 593

	
383 594
  Digraph digraph;
384 595
  IntArcMap capacity(digraph), flow(digraph);
385 596
  Adaptor adaptor(digraph, capacity, flow);
386 597

	
387 598
  Digraph::Node n1 = digraph.addNode();
388 599
  Digraph::Node n2 = digraph.addNode();
389 600
  Digraph::Node n3 = digraph.addNode();
390 601
  Digraph::Node n4 = digraph.addNode();
391 602

	
392 603
  Digraph::Arc a1 = digraph.addArc(n1, n2);
393 604
  Digraph::Arc a2 = digraph.addArc(n1, n3);
394 605
  Digraph::Arc a3 = digraph.addArc(n1, n4);
395 606
  Digraph::Arc a4 = digraph.addArc(n2, n3);
396 607
  Digraph::Arc a5 = digraph.addArc(n2, n4);
397 608
  Digraph::Arc a6 = digraph.addArc(n3, n4);
398 609

	
399 610
  capacity[a1] = 8;
400 611
  capacity[a2] = 6;
401 612
  capacity[a3] = 4;
402 613
  capacity[a4] = 4;
403 614
  capacity[a5] = 6;
404 615
  capacity[a6] = 10;
405 616

	
406
  for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) {
617
  // Check the adaptor with various flow values
618
  for (Digraph::ArcIt a(digraph); a != INVALID; ++a) {
407 619
    flow[a] = 0;
408 620
  }
409 621

	
410 622
  checkGraphNodeList(adaptor, 4);
411 623
  checkGraphArcList(adaptor, 6);
412 624
  checkGraphConArcList(adaptor, 6);
413 625

	
414 626
  checkGraphOutArcList(adaptor, n1, 3);
415 627
  checkGraphOutArcList(adaptor, n2, 2);
416 628
  checkGraphOutArcList(adaptor, n3, 1);
417 629
  checkGraphOutArcList(adaptor, n4, 0);
418 630

	
419 631
  checkGraphInArcList(adaptor, n1, 0);
420 632
  checkGraphInArcList(adaptor, n2, 1);
421 633
  checkGraphInArcList(adaptor, n3, 2);
422 634
  checkGraphInArcList(adaptor, n4, 3);
423 635

	
424
  for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) {
636
  for (Digraph::ArcIt a(digraph); a != INVALID; ++a) {
425 637
    flow[a] = capacity[a] / 2;
426 638
  }
427 639

	
428 640
  checkGraphNodeList(adaptor, 4);
429 641
  checkGraphArcList(adaptor, 12);
430 642
  checkGraphConArcList(adaptor, 12);
431 643

	
432 644
  checkGraphOutArcList(adaptor, n1, 3);
433 645
  checkGraphOutArcList(adaptor, n2, 3);
434 646
  checkGraphOutArcList(adaptor, n3, 3);
435 647
  checkGraphOutArcList(adaptor, n4, 3);
436 648

	
437 649
  checkGraphInArcList(adaptor, n1, 3);
438 650
  checkGraphInArcList(adaptor, n2, 3);
439 651
  checkGraphInArcList(adaptor, n3, 3);
440 652
  checkGraphInArcList(adaptor, n4, 3);
441 653

	
442 654
  checkNodeIds(adaptor);
443 655
  checkArcIds(adaptor);
444 656

	
445 657
  checkGraphNodeMap(adaptor);
446 658
  checkGraphArcMap(adaptor);
447 659

	
448
  for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) {
660
  for (Digraph::ArcIt a(digraph); a != INVALID; ++a) {
449 661
    flow[a] = capacity[a];
450 662
  }
451 663

	
452 664
  checkGraphNodeList(adaptor, 4);
453 665
  checkGraphArcList(adaptor, 6);
454 666
  checkGraphConArcList(adaptor, 6);
455 667

	
456 668
  checkGraphOutArcList(adaptor, n1, 0);
457 669
  checkGraphOutArcList(adaptor, n2, 1);
458 670
  checkGraphOutArcList(adaptor, n3, 2);
459 671
  checkGraphOutArcList(adaptor, n4, 3);
460 672

	
461 673
  checkGraphInArcList(adaptor, n1, 3);
462 674
  checkGraphInArcList(adaptor, n2, 2);
463 675
  checkGraphInArcList(adaptor, n3, 1);
464 676
  checkGraphInArcList(adaptor, n4, 0);
465 677

	
678
  // Saturate all backward arcs
679
  // (set the flow to zero on all forward arcs)
466 680
  for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) {
467
    flow[a] = 0;
681
    if (adaptor.backward(a))
682
      adaptor.augment(a, adaptor.residualCapacity(a));
468 683
  }
469 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
470 700
  int flow_value = 0;
701
  Adaptor::ResidualCapacity res_cap(adaptor);
471 702
  while (true) {
472 703

	
473 704
    Bfs<Adaptor> bfs(adaptor);
474 705
    bfs.run(n1, n4);
475 706

	
476 707
    if (!bfs.reached(n4)) break;
477 708

	
478 709
    Path<Adaptor> p = bfs.path(n4);
479 710

	
480 711
    int min = std::numeric_limits<int>::max();
481 712
    for (Path<Adaptor>::ArcIt a(p); a != INVALID; ++a) {
482
      if (adaptor.residualCapacity(a) < min)
483
        min = adaptor.residualCapacity(a);
713
      if (res_cap[a] < min) min = res_cap[a];
484 714
    }
485 715

	
486 716
    for (Path<Adaptor>::ArcIt a(p); a != INVALID; ++a) {
487 717
      adaptor.augment(a, min);
488 718
    }
489 719
    flow_value += min;
490 720
  }
491 721

	
492 722
  check(flow_value == 18, "Wrong flow with res graph adaptor");
493 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);
494 740
}
495 741

	
496 742
void checkSplitNodes() {
743
  // Check concepts
497 744
  checkConcept<concepts::Digraph, SplitNodes<concepts::Digraph> >();
745
  checkConcept<concepts::Digraph, SplitNodes<ListDigraph> >();
498 746

	
747
  // Create a digraph and an adaptor
499 748
  typedef ListDigraph Digraph;
500 749
  typedef SplitNodes<Digraph> Adaptor;
501 750

	
502 751
  Digraph digraph;
503 752
  Adaptor adaptor(digraph);
504 753

	
505 754
  Digraph::Node n1 = digraph.addNode();
506 755
  Digraph::Node n2 = digraph.addNode();
507 756
  Digraph::Node n3 = digraph.addNode();
508 757

	
509 758
  Digraph::Arc a1 = digraph.addArc(n1, n2);
510 759
  Digraph::Arc a2 = digraph.addArc(n1, n3);
511 760
  Digraph::Arc a3 = digraph.addArc(n2, n3);
512 761

	
513 762
  checkGraphNodeList(adaptor, 6);
514 763
  checkGraphArcList(adaptor, 6);
515 764
  checkGraphConArcList(adaptor, 6);
516 765

	
517 766
  checkGraphOutArcList(adaptor, adaptor.inNode(n1), 1);
518 767
  checkGraphOutArcList(adaptor, adaptor.outNode(n1), 2);
519 768
  checkGraphOutArcList(adaptor, adaptor.inNode(n2), 1);
520 769
  checkGraphOutArcList(adaptor, adaptor.outNode(n2), 1);
521 770
  checkGraphOutArcList(adaptor, adaptor.inNode(n3), 1);
522 771
  checkGraphOutArcList(adaptor, adaptor.outNode(n3), 0);
523 772

	
524 773
  checkGraphInArcList(adaptor, adaptor.inNode(n1), 0);
525 774
  checkGraphInArcList(adaptor, adaptor.outNode(n1), 1);
526 775
  checkGraphInArcList(adaptor, adaptor.inNode(n2), 1);
527 776
  checkGraphInArcList(adaptor, adaptor.outNode(n2), 1);
528 777
  checkGraphInArcList(adaptor, adaptor.inNode(n3), 2);
529 778
  checkGraphInArcList(adaptor, adaptor.outNode(n3), 1);
530 779

	
531 780
  checkNodeIds(adaptor);
532 781
  checkArcIds(adaptor);
533 782

	
534 783
  checkGraphNodeMap(adaptor);
535 784
  checkGraphArcMap(adaptor);
536 785

	
786
  // Check split
537 787
  for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) {
538 788
    if (adaptor.origArc(a)) {
539 789
      Digraph::Arc oa = a;
540 790
      check(adaptor.source(a) == adaptor.outNode(digraph.source(oa)),
541 791
            "Wrong split");
542 792
      check(adaptor.target(a) == adaptor.inNode(digraph.target(oa)),
543 793
            "Wrong split");
544 794
    } else {
545 795
      Digraph::Node on = a;
546 796
      check(adaptor.source(a) == adaptor.inNode(on), "Wrong split");
547 797
      check(adaptor.target(a) == adaptor.outNode(on), "Wrong split");
548 798
    }
549 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");
550 860
}
551 861

	
552 862
void checkSubGraph() {
553
  checkConcept<concepts::Graph,
554
    SubGraph<concepts::Graph,
555
    concepts::Graph::NodeMap<bool>,
556
    concepts::Graph::EdgeMap<bool> > >();
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> >();
557 874

	
875
  // Create a graph and an adaptor
558 876
  typedef ListGraph Graph;
559 877
  typedef Graph::NodeMap<bool> NodeFilter;
560 878
  typedef Graph::EdgeMap<bool> EdgeFilter;
561 879
  typedef SubGraph<Graph, NodeFilter, EdgeFilter> Adaptor;
562 880

	
563 881
  Graph graph;
564 882
  NodeFilter node_filter(graph);
565 883
  EdgeFilter edge_filter(graph);
566 884
  Adaptor adaptor(graph, node_filter, edge_filter);
567 885

	
886
  // Add nodes and edges to the original graph and the adaptor
568 887
  Graph::Node n1 = graph.addNode();
569 888
  Graph::Node n2 = graph.addNode();
570
  Graph::Node n3 = graph.addNode();
571
  Graph::Node n4 = 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;
572 893

	
573 894
  Graph::Edge e1 = graph.addEdge(n1, n2);
574 895
  Graph::Edge e2 = graph.addEdge(n1, n3);
575
  Graph::Edge e3 = graph.addEdge(n2, n3);
576
  Graph::Edge e4 = graph.addEdge(n3, n4);
896
  Adaptor::Edge e3 = adaptor.addEdge(n2, n3);
897
  Adaptor::Edge e4 = adaptor.addEdge(n3, n4);
577 898

	
578
  node_filter[n1] = node_filter[n2] = node_filter[n3] = node_filter[n4] = true;
579 899
  edge_filter[e1] = edge_filter[e2] = edge_filter[e3] = edge_filter[e4] = true;
580 900

	
581 901
  checkGraphNodeList(adaptor, 4);
582 902
  checkGraphArcList(adaptor, 8);
583 903
  checkGraphEdgeList(adaptor, 4);
584 904
  checkGraphConArcList(adaptor, 8);
585 905
  checkGraphConEdgeList(adaptor, 4);
586 906

	
587
  checkGraphOutArcList(adaptor, n1, 2);
588
  checkGraphOutArcList(adaptor, n2, 2);
589
  checkGraphOutArcList(adaptor, n3, 3);
590
  checkGraphOutArcList(adaptor, n4, 1);
591

	
592
  checkGraphInArcList(adaptor, n1, 2);
593
  checkGraphInArcList(adaptor, n2, 2);
594
  checkGraphInArcList(adaptor, n3, 3);
595
  checkGraphInArcList(adaptor, n4, 1);
596

	
597
  checkGraphIncEdgeList(adaptor, n1, 2);
598
  checkGraphIncEdgeList(adaptor, n2, 2);
599
  checkGraphIncEdgeList(adaptor, n3, 3);
600
  checkGraphIncEdgeList(adaptor, n4, 1);
907
  checkGraphIncEdgeArcLists(adaptor, n1, 2);
908
  checkGraphIncEdgeArcLists(adaptor, n2, 2);
909
  checkGraphIncEdgeArcLists(adaptor, n3, 3);
910
  checkGraphIncEdgeArcLists(adaptor, n4, 1);
601 911

	
602 912
  checkNodeIds(adaptor);
603 913
  checkArcIds(adaptor);
604 914
  checkEdgeIds(adaptor);
605 915

	
606 916
  checkGraphNodeMap(adaptor);
607 917
  checkGraphArcMap(adaptor);
608 918
  checkGraphEdgeMap(adaptor);
609 919

	
610
  edge_filter[e2] = false;
920
  // Hide an edge
921
  adaptor.status(e2, false);
922
  adaptor.disable(e3);
923
  if (!adaptor.status(e3)) adaptor.enable(e3);
611 924

	
612 925
  checkGraphNodeList(adaptor, 4);
613 926
  checkGraphArcList(adaptor, 6);
614 927
  checkGraphEdgeList(adaptor, 3);
615 928
  checkGraphConArcList(adaptor, 6);
616 929
  checkGraphConEdgeList(adaptor, 3);
617 930

	
618
  checkGraphOutArcList(adaptor, n1, 1);
619
  checkGraphOutArcList(adaptor, n2, 2);
620
  checkGraphOutArcList(adaptor, n3, 2);
621
  checkGraphOutArcList(adaptor, n4, 1);
622

	
623
  checkGraphInArcList(adaptor, n1, 1);
624
  checkGraphInArcList(adaptor, n2, 2);
625
  checkGraphInArcList(adaptor, n3, 2);
626
  checkGraphInArcList(adaptor, n4, 1);
627

	
628
  checkGraphIncEdgeList(adaptor, n1, 1);
629
  checkGraphIncEdgeList(adaptor, n2, 2);
630
  checkGraphIncEdgeList(adaptor, n3, 2);
631
  checkGraphIncEdgeList(adaptor, n4, 1);
931
  checkGraphIncEdgeArcLists(adaptor, n1, 1);
932
  checkGraphIncEdgeArcLists(adaptor, n2, 2);
933
  checkGraphIncEdgeArcLists(adaptor, n3, 2);
934
  checkGraphIncEdgeArcLists(adaptor, n4, 1);
632 935

	
633 936
  checkNodeIds(adaptor);
634 937
  checkArcIds(adaptor);
635 938
  checkEdgeIds(adaptor);
636 939

	
637 940
  checkGraphNodeMap(adaptor);
638 941
  checkGraphArcMap(adaptor);
639 942
  checkGraphEdgeMap(adaptor);
640 943

	
641
  node_filter[n1] = false;
944
  // Hide a node
945
  adaptor.status(n1, false);
946
  adaptor.disable(n3);
947
  if (!adaptor.status(n3)) adaptor.enable(n3);
642 948

	
643 949
  checkGraphNodeList(adaptor, 3);
644 950
  checkGraphArcList(adaptor, 4);
645 951
  checkGraphEdgeList(adaptor, 2);
646 952
  checkGraphConArcList(adaptor, 4);
647 953
  checkGraphConEdgeList(adaptor, 2);
648 954

	
649
  checkGraphOutArcList(adaptor, n2, 1);
650
  checkGraphOutArcList(adaptor, n3, 2);
651
  checkGraphOutArcList(adaptor, n4, 1);
652

	
653
  checkGraphInArcList(adaptor, n2, 1);
654
  checkGraphInArcList(adaptor, n3, 2);
655
  checkGraphInArcList(adaptor, n4, 1);
656

	
657
  checkGraphIncEdgeList(adaptor, n2, 1);
658
  checkGraphIncEdgeList(adaptor, n3, 2);
659
  checkGraphIncEdgeList(adaptor, n4, 1);
955
  checkGraphIncEdgeArcLists(adaptor, n2, 1);
956
  checkGraphIncEdgeArcLists(adaptor, n3, 2);
957
  checkGraphIncEdgeArcLists(adaptor, n4, 1);
660 958

	
661 959
  checkNodeIds(adaptor);
662 960
  checkArcIds(adaptor);
663 961
  checkEdgeIds(adaptor);
664 962

	
665 963
  checkGraphNodeMap(adaptor);
666 964
  checkGraphArcMap(adaptor);
667 965
  checkGraphEdgeMap(adaptor);
668 966

	
967
  // Hide all nodes and edges
669 968
  node_filter[n1] = node_filter[n2] = node_filter[n3] = node_filter[n4] = false;
670 969
  edge_filter[e1] = edge_filter[e2] = edge_filter[e3] = edge_filter[e4] = false;
671 970

	
672 971
  checkGraphNodeList(adaptor, 0);
673 972
  checkGraphArcList(adaptor, 0);
674 973
  checkGraphEdgeList(adaptor, 0);
675 974
  checkGraphConArcList(adaptor, 0);
676 975
  checkGraphConEdgeList(adaptor, 0);
677 976

	
678 977
  checkNodeIds(adaptor);
679 978
  checkArcIds(adaptor);
680 979
  checkEdgeIds(adaptor);
681 980

	
682 981
  checkGraphNodeMap(adaptor);
683 982
  checkGraphArcMap(adaptor);
684 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;
685 994
}
686 995

	
687 996
void checkFilterNodes2() {
688
  checkConcept<concepts::Graph,
689
    FilterNodes<concepts::Graph,
690
      concepts::Graph::NodeMap<bool> > >();
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> >();
691 1008

	
1009
  // Create a graph and an adaptor
692 1010
  typedef ListGraph Graph;
693 1011
  typedef Graph::NodeMap<bool> NodeFilter;
694 1012
  typedef FilterNodes<Graph, NodeFilter> Adaptor;
695 1013

	
1014
  // Add nodes and edges to the original graph and the adaptor
696 1015
  Graph graph;
697 1016
  NodeFilter node_filter(graph);
698 1017
  Adaptor adaptor(graph, node_filter);
699 1018

	
700 1019
  Graph::Node n1 = graph.addNode();
701 1020
  Graph::Node n2 = graph.addNode();
702
  Graph::Node n3 = graph.addNode();
703
  Graph::Node n4 = 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;
704 1025

	
705 1026
  Graph::Edge e1 = graph.addEdge(n1, n2);
706 1027
  Graph::Edge e2 = graph.addEdge(n1, n3);
707
  Graph::Edge e3 = graph.addEdge(n2, n3);
708
  Graph::Edge e4 = graph.addEdge(n3, n4);
709

	
710
  node_filter[n1] = node_filter[n2] = node_filter[n3] = node_filter[n4] = true;
1028
  Adaptor::Edge e3 = adaptor.addEdge(n2, n3);
1029
  Adaptor::Edge e4 = adaptor.addEdge(n3, n4);
711 1030

	
712 1031
  checkGraphNodeList(adaptor, 4);
713 1032
  checkGraphArcList(adaptor, 8);
714 1033
  checkGraphEdgeList(adaptor, 4);
715 1034
  checkGraphConArcList(adaptor, 8);
716 1035
  checkGraphConEdgeList(adaptor, 4);
717 1036

	
718
  checkGraphOutArcList(adaptor, n1, 2);
719
  checkGraphOutArcList(adaptor, n2, 2);
720
  checkGraphOutArcList(adaptor, n3, 3);
721
  checkGraphOutArcList(adaptor, n4, 1);
722

	
723
  checkGraphInArcList(adaptor, n1, 2);
724
  checkGraphInArcList(adaptor, n2, 2);
725
  checkGraphInArcList(adaptor, n3, 3);
726
  checkGraphInArcList(adaptor, n4, 1);
727

	
728
  checkGraphIncEdgeList(adaptor, n1, 2);
729
  checkGraphIncEdgeList(adaptor, n2, 2);
730
  checkGraphIncEdgeList(adaptor, n3, 3);
731
  checkGraphIncEdgeList(adaptor, n4, 1);
1037
  checkGraphIncEdgeArcLists(adaptor, n1, 2);
1038
  checkGraphIncEdgeArcLists(adaptor, n2, 2);
1039
  checkGraphIncEdgeArcLists(adaptor, n3, 3);
1040
  checkGraphIncEdgeArcLists(adaptor, n4, 1);
732 1041

	
733 1042
  checkNodeIds(adaptor);
734 1043
  checkArcIds(adaptor);
735 1044
  checkEdgeIds(adaptor);
736 1045

	
737 1046
  checkGraphNodeMap(adaptor);
738 1047
  checkGraphArcMap(adaptor);
739 1048
  checkGraphEdgeMap(adaptor);
740 1049

	
741
  node_filter[n1] = false;
1050
  // Hide a node
1051
  adaptor.status(n1, false);
1052
  adaptor.disable(n3);
1053
  if (!adaptor.status(n3)) adaptor.enable(n3);
742 1054

	
743 1055
  checkGraphNodeList(adaptor, 3);
744 1056
  checkGraphArcList(adaptor, 4);
745 1057
  checkGraphEdgeList(adaptor, 2);
746 1058
  checkGraphConArcList(adaptor, 4);
747 1059
  checkGraphConEdgeList(adaptor, 2);
748 1060

	
749
  checkGraphOutArcList(adaptor, n2, 1);
750
  checkGraphOutArcList(adaptor, n3, 2);
751
  checkGraphOutArcList(adaptor, n4, 1);
752

	
753
  checkGraphInArcList(adaptor, n2, 1);
754
  checkGraphInArcList(adaptor, n3, 2);
755
  checkGraphInArcList(adaptor, n4, 1);
756

	
757
  checkGraphIncEdgeList(adaptor, n2, 1);
758
  checkGraphIncEdgeList(adaptor, n3, 2);
759
  checkGraphIncEdgeList(adaptor, n4, 1);
1061
  checkGraphIncEdgeArcLists(adaptor, n2, 1);
1062
  checkGraphIncEdgeArcLists(adaptor, n3, 2);
1063
  checkGraphIncEdgeArcLists(adaptor, n4, 1);
760 1064

	
761 1065
  checkNodeIds(adaptor);
762 1066
  checkArcIds(adaptor);
763 1067
  checkEdgeIds(adaptor);
764 1068

	
765 1069
  checkGraphNodeMap(adaptor);
766 1070
  checkGraphArcMap(adaptor);
767 1071
  checkGraphEdgeMap(adaptor);
768 1072

	
1073
  // Hide all nodes
769 1074
  node_filter[n1] = node_filter[n2] = node_filter[n3] = node_filter[n4] = false;
770 1075

	
771 1076
  checkGraphNodeList(adaptor, 0);
772 1077
  checkGraphArcList(adaptor, 0);
773 1078
  checkGraphEdgeList(adaptor, 0);
774 1079
  checkGraphConArcList(adaptor, 0);
775 1080
  checkGraphConEdgeList(adaptor, 0);
776 1081

	
777 1082
  checkNodeIds(adaptor);
778 1083
  checkArcIds(adaptor);
779 1084
  checkEdgeIds(adaptor);
780 1085

	
781 1086
  checkGraphNodeMap(adaptor);
782 1087
  checkGraphArcMap(adaptor);
783 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;
784 1099
}
785 1100

	
786 1101
void checkFilterEdges() {
787
  checkConcept<concepts::Graph,
788
    FilterEdges<concepts::Graph,
789
    concepts::Graph::EdgeMap<bool> > >();
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> >();
790 1113

	
1114
  // Create a graph and an adaptor
791 1115
  typedef ListGraph Graph;
792 1116
  typedef Graph::EdgeMap<bool> EdgeFilter;
793 1117
  typedef FilterEdges<Graph, EdgeFilter> Adaptor;
794 1118

	
795 1119
  Graph graph;
796 1120
  EdgeFilter edge_filter(graph);
797 1121
  Adaptor adaptor(graph, edge_filter);
798 1122

	
1123
  // Add nodes and edges to the original graph and the adaptor
799 1124
  Graph::Node n1 = graph.addNode();
800 1125
  Graph::Node n2 = graph.addNode();
801
  Graph::Node n3 = graph.addNode();
802
  Graph::Node n4 = graph.addNode();
1126
  Adaptor::Node n3 = adaptor.addNode();
1127
  Adaptor::Node n4 = adaptor.addNode();
803 1128

	
804 1129
  Graph::Edge e1 = graph.addEdge(n1, n2);
805 1130
  Graph::Edge e2 = graph.addEdge(n1, n3);
806
  Graph::Edge e3 = graph.addEdge(n2, n3);
807
  Graph::Edge e4 = graph.addEdge(n3, n4);
1131
  Adaptor::Edge e3 = adaptor.addEdge(n2, n3);
1132
  Adaptor::Edge e4 = adaptor.addEdge(n3, n4);
808 1133

	
809 1134
  edge_filter[e1] = edge_filter[e2] = edge_filter[e3] = edge_filter[e4] = true;
810 1135

	
811 1136
  checkGraphNodeList(adaptor, 4);
812 1137
  checkGraphArcList(adaptor, 8);
813 1138
  checkGraphEdgeList(adaptor, 4);
814 1139
  checkGraphConArcList(adaptor, 8);
815 1140
  checkGraphConEdgeList(adaptor, 4);
816 1141

	
817
  checkGraphOutArcList(adaptor, n1, 2);
818
  checkGraphOutArcList(adaptor, n2, 2);
819
  checkGraphOutArcList(adaptor, n3, 3);
820
  checkGraphOutArcList(adaptor, n4, 1);
821

	
822
  checkGraphInArcList(adaptor, n1, 2);
823
  checkGraphInArcList(adaptor, n2, 2);
824
  checkGraphInArcList(adaptor, n3, 3);
825
  checkGraphInArcList(adaptor, n4, 1);
826

	
827
  checkGraphIncEdgeList(adaptor, n1, 2);
828
  checkGraphIncEdgeList(adaptor, n2, 2);
829
  checkGraphIncEdgeList(adaptor, n3, 3);
830
  checkGraphIncEdgeList(adaptor, n4, 1);
1142
  checkGraphIncEdgeArcLists(adaptor, n1, 2);
1143
  checkGraphIncEdgeArcLists(adaptor, n2, 2);
1144
  checkGraphIncEdgeArcLists(adaptor, n3, 3);
1145
  checkGraphIncEdgeArcLists(adaptor, n4, 1);
831 1146

	
832 1147
  checkNodeIds(adaptor);
833 1148
  checkArcIds(adaptor);
834 1149
  checkEdgeIds(adaptor);
835 1150

	
836 1151
  checkGraphNodeMap(adaptor);
837 1152
  checkGraphArcMap(adaptor);
838 1153
  checkGraphEdgeMap(adaptor);
839 1154

	
840
  edge_filter[e2] = false;
1155
  // Hide an edge
1156
  adaptor.status(e2, false);
1157
  adaptor.disable(e3);
1158
  if (!adaptor.status(e3)) adaptor.enable(e3);
841 1159

	
842 1160
  checkGraphNodeList(adaptor, 4);
843 1161
  checkGraphArcList(adaptor, 6);
844 1162
  checkGraphEdgeList(adaptor, 3);
845 1163
  checkGraphConArcList(adaptor, 6);
846 1164
  checkGraphConEdgeList(adaptor, 3);
847 1165

	
848
  checkGraphOutArcList(adaptor, n1, 1);
849
  checkGraphOutArcList(adaptor, n2, 2);
850
  checkGraphOutArcList(adaptor, n3, 2);
851
  checkGraphOutArcList(adaptor, n4, 1);
852

	
853
  checkGraphInArcList(adaptor, n1, 1);
854
  checkGraphInArcList(adaptor, n2, 2);
855
  checkGraphInArcList(adaptor, n3, 2);
856
  checkGraphInArcList(adaptor, n4, 1);
857

	
858
  checkGraphIncEdgeList(adaptor, n1, 1);
859
  checkGraphIncEdgeList(adaptor, n2, 2);
860
  checkGraphIncEdgeList(adaptor, n3, 2);
861
  checkGraphIncEdgeList(adaptor, n4, 1);
1166
  checkGraphIncEdgeArcLists(adaptor, n1, 1);
1167
  checkGraphIncEdgeArcLists(adaptor, n2, 2);
1168
  checkGraphIncEdgeArcLists(adaptor, n3, 2);
1169
  checkGraphIncEdgeArcLists(adaptor, n4, 1);
862 1170

	
863 1171
  checkNodeIds(adaptor);
864 1172
  checkArcIds(adaptor);
865 1173
  checkEdgeIds(adaptor);
866 1174

	
867 1175
  checkGraphNodeMap(adaptor);
868 1176
  checkGraphArcMap(adaptor);
869 1177
  checkGraphEdgeMap(adaptor);
870 1178

	
1179
  // Hide all edges
871 1180
  edge_filter[e1] = edge_filter[e2] = edge_filter[e3] = edge_filter[e4] = false;
872 1181

	
873 1182
  checkGraphNodeList(adaptor, 4);
874 1183
  checkGraphArcList(adaptor, 0);
875 1184
  checkGraphEdgeList(adaptor, 0);
876 1185
  checkGraphConArcList(adaptor, 0);
877 1186
  checkGraphConEdgeList(adaptor, 0);
878 1187

	
879 1188
  checkNodeIds(adaptor);
880 1189
  checkArcIds(adaptor);
881 1190
  checkEdgeIds(adaptor);
882 1191

	
883 1192
  checkGraphNodeMap(adaptor);
884 1193
  checkGraphArcMap(adaptor);
885 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;
886 1205
}
887 1206

	
888 1207
void checkOrienter() {
889
  checkConcept<concepts::Digraph,
890
    Orienter<concepts::Graph, concepts::Graph::EdgeMap<bool> > >();
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> >();
891 1219

	
1220
  // Create a graph and an adaptor
892 1221
  typedef ListGraph Graph;
893 1222
  typedef ListGraph::EdgeMap<bool> DirMap;
894 1223
  typedef Orienter<Graph> Adaptor;
895 1224

	
896 1225
  Graph graph;
897
  DirMap dir(graph, true);
1226
  DirMap dir(graph);
898 1227
  Adaptor adaptor(graph, dir);
899 1228

	
1229
  // Add nodes and edges to the original graph and the adaptor
900 1230
  Graph::Node n1 = graph.addNode();
901 1231
  Graph::Node n2 = graph.addNode();
902
  Graph::Node n3 = graph.addNode();
1232
  Adaptor::Node n3 = adaptor.addNode();
903 1233

	
904 1234
  Graph::Edge e1 = graph.addEdge(n1, n2);
905 1235
  Graph::Edge e2 = graph.addEdge(n1, n3);
906
  Graph::Edge e3 = graph.addEdge(n2, n3);
1236
  Adaptor::Arc e3 = adaptor.addArc(n2, n3);
907 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
908 1260
  checkGraphNodeList(adaptor, 3);
909 1261
  checkGraphArcList(adaptor, 3);
910 1262
  checkGraphConArcList(adaptor, 3);
911 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
912 1279
  {
913 1280
    dir[e1] = true;
914 1281
    Adaptor::Node u = adaptor.source(e1);
915 1282
    Adaptor::Node v = adaptor.target(e1);
916 1283

	
917 1284
    dir[e1] = false;
918 1285
    check (u == adaptor.target(e1), "Wrong dir");
919 1286
    check (v == adaptor.source(e1), "Wrong dir");
920 1287

	
921 1288
    check ((u == n1 && v == n2) || (u == n2 && v == n1), "Wrong dir");
922 1289
    dir[e1] = n1 == u;
923 1290
  }
924 1291

	
925 1292
  {
926 1293
    dir[e2] = true;
927 1294
    Adaptor::Node u = adaptor.source(e2);
928 1295
    Adaptor::Node v = adaptor.target(e2);
929 1296

	
930 1297
    dir[e2] = false;
931 1298
    check (u == adaptor.target(e2), "Wrong dir");
932 1299
    check (v == adaptor.source(e2), "Wrong dir");
933 1300

	
934 1301
    check ((u == n1 && v == n3) || (u == n3 && v == n1), "Wrong dir");
935 1302
    dir[e2] = n3 == u;
936 1303
  }
937 1304

	
938 1305
  {
939 1306
    dir[e3] = true;
940 1307
    Adaptor::Node u = adaptor.source(e3);
941 1308
    Adaptor::Node v = adaptor.target(e3);
942 1309

	
943 1310
    dir[e3] = false;
944 1311
    check (u == adaptor.target(e3), "Wrong dir");
945 1312
    check (v == adaptor.source(e3), "Wrong dir");
946 1313

	
947 1314
    check ((u == n2 && v == n3) || (u == n3 && v == n2), "Wrong dir");
948 1315
    dir[e3] = n2 == u;
949 1316
  }
950 1317

	
1318
  // Check the adaptor again
1319
  checkGraphNodeList(adaptor, 3);
1320
  checkGraphArcList(adaptor, 3);
1321
  checkGraphConArcList(adaptor, 3);
1322

	
951 1323
  checkGraphOutArcList(adaptor, n1, 1);
952 1324
  checkGraphOutArcList(adaptor, n2, 1);
953 1325
  checkGraphOutArcList(adaptor, n3, 1);
954 1326

	
955 1327
  checkGraphInArcList(adaptor, n1, 1);
956 1328
  checkGraphInArcList(adaptor, n2, 1);
957 1329
  checkGraphInArcList(adaptor, n3, 1);
958 1330

	
959 1331
  checkNodeIds(adaptor);
960 1332
  checkArcIds(adaptor);
961 1333

	
962 1334
  checkGraphNodeMap(adaptor);
963 1335
  checkGraphArcMap(adaptor);
964 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;
965 1363
}
966 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< ReverseDigraph< const Orienter<
1381
            const GridGraph, GridGraph::EdgeMap<bool> > > >
1382
    RevSplitGridGraph;
1383
  typedef ReverseDigraph<const RevSplitGridGraph> SplitGridGraph;
1384
  typedef Undirector<const SplitGridGraph> USplitGridGraph;
1385
  typedef Undirector<const USplitGridGraph> UUSplitGridGraph;
1386
  checkConcept<concepts::Digraph, RevSplitGridGraph>();
1387
  checkConcept<concepts::Digraph, SplitGridGraph>();
1388
  checkConcept<concepts::Graph, USplitGridGraph>();
1389
  checkConcept<concepts::Graph, UUSplitGridGraph>();
1390

	
1391
  RevSplitGridGraph rev_adaptor =
1392
    splitNodes(reverseDigraph(orienter(graph, dir_map)));
1393
  SplitGridGraph adaptor = reverseDigraph(rev_adaptor);
1394
  USplitGridGraph uadaptor = undirector(adaptor);
1395
  UUSplitGridGraph uuadaptor = undirector(uadaptor);
1396

	
1397
  // Check adaptor
1398
  checkGraphNodeList(adaptor, 8);
1399
  checkGraphArcList(adaptor, 8);
1400
  checkGraphConArcList(adaptor, 8);
1401

	
1402
  checkGraphOutArcList(adaptor, rev_adaptor.inNode(n1), 1);
1403
  checkGraphOutArcList(adaptor, rev_adaptor.outNode(n1), 1);
1404
  checkGraphOutArcList(adaptor, rev_adaptor.inNode(n2), 2);
1405
  checkGraphOutArcList(adaptor, rev_adaptor.outNode(n2), 1);
1406
  checkGraphOutArcList(adaptor, rev_adaptor.inNode(n3), 1);
1407
  checkGraphOutArcList(adaptor, rev_adaptor.outNode(n3), 1);
1408
  checkGraphOutArcList(adaptor, rev_adaptor.inNode(n4), 0);
1409
  checkGraphOutArcList(adaptor, rev_adaptor.outNode(n4), 1);
1410

	
1411
  checkGraphInArcList(adaptor, rev_adaptor.inNode(n1), 1);
1412
  checkGraphInArcList(adaptor, rev_adaptor.outNode(n1), 1);
1413
  checkGraphInArcList(adaptor, rev_adaptor.inNode(n2), 1);
1414
  checkGraphInArcList(adaptor, rev_adaptor.outNode(n2), 0);
1415
  checkGraphInArcList(adaptor, rev_adaptor.inNode(n3), 1);
1416
  checkGraphInArcList(adaptor, rev_adaptor.outNode(n3), 1);
1417
  checkGraphInArcList(adaptor, rev_adaptor.inNode(n4), 1);
1418
  checkGraphInArcList(adaptor, rev_adaptor.outNode(n4), 2);
1419

	
1420
  checkNodeIds(adaptor);
1421
  checkArcIds(adaptor);
1422

	
1423
  checkGraphNodeMap(adaptor);
1424
  checkGraphArcMap(adaptor);
1425

	
1426
  // Check uadaptor
1427
  checkGraphNodeList(uadaptor, 8);
1428
  checkGraphEdgeList(uadaptor, 8);
1429
  checkGraphArcList(uadaptor, 16);
1430
  checkGraphConEdgeList(uadaptor, 8);
1431
  checkGraphConArcList(uadaptor, 16);
1432

	
1433
  checkNodeIds(uadaptor);
1434
  checkEdgeIds(uadaptor);
1435
  checkArcIds(uadaptor);
1436

	
1437
  checkGraphNodeMap(uadaptor);
1438
  checkGraphEdgeMap(uadaptor);
1439
  checkGraphArcMap(uadaptor);
1440

	
1441
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.inNode(n1), 2);
1442
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.outNode(n1), 2);
1443
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.inNode(n2), 3);
1444
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.outNode(n2), 1);
1445
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.inNode(n3), 2);
1446
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.outNode(n3), 2);
1447
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.inNode(n4), 1);
1448
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.outNode(n4), 3);
1449

	
1450
  // Check uuadaptor
1451
  checkGraphNodeList(uuadaptor, 8);
1452
  checkGraphEdgeList(uuadaptor, 16);
1453
  checkGraphArcList(uuadaptor, 32);
1454
  checkGraphConEdgeList(uuadaptor, 16);
1455
  checkGraphConArcList(uuadaptor, 32);
1456

	
1457
  checkNodeIds(uuadaptor);
1458
  checkEdgeIds(uuadaptor);
1459
  checkArcIds(uuadaptor);
1460

	
1461
  checkGraphNodeMap(uuadaptor);
1462
  checkGraphEdgeMap(uuadaptor);
1463
  checkGraphArcMap(uuadaptor);
1464
}
967 1465

	
968 1466
int main(int, const char **) {
969

	
1467
  // Check the digraph adaptors (using ListDigraph)
970 1468
  checkReverseDigraph();
971 1469
  checkSubDigraph();
972 1470
  checkFilterNodes1();
973 1471
  checkFilterArcs();
974 1472
  checkUndirector();
975
  checkResidual();
1473
  checkResidualDigraph();
976 1474
  checkSplitNodes();
977 1475

	
1476
  // Check the graph adaptors (using ListGraph)
978 1477
  checkSubGraph();
979 1478
  checkFilterNodes2();
980 1479
  checkFilterEdges();
981 1480
  checkOrienter();
982 1481

	
1482
  // Combine adaptors (using GridGraph)
1483
  checkCombiningAdaptors();
1484

	
983 1485
  return 0;
984 1486
}
Show white space 96 line context
... ...
@@ -47,51 +47,75 @@
47 47
        -e "s/A[Nn]ode/_Re_d_label_/g"\
48 48
        -e "s/B[Nn]ode/_Blu_e_label_/g"\
49 49
        -e "s/A-[Nn]ode/_Re_d_label_/g"\
50 50
        -e "s/B-[Nn]ode/_Blu_e_label_/g"\
51 51
        -e "s/a[Nn]ode/_re_d_label_/g"\
52 52
        -e "s/b[Nn]ode/_blu_e_label_/g"\
53 53
        -e "s/\<UGRAPH_TYPEDEFS\([ \t]*([ \t]*\)typename[ \t]/TEMPLATE__GR_APH_TY_PEDE_FS_label_\1/g"\
54 54
        -e "s/\<GRAPH_TYPEDEFS\([ \t]*([ \t]*\)typename[ \t]/TEMPLATE__DIGR_APH_TY_PEDE_FS_label_\1/g"\
55 55
        -e "s/\<UGRAPH_TYPEDEFS\>/_GR_APH_TY_PEDE_FS_label_/g"\
56 56
        -e "s/\<GRAPH_TYPEDEFS\>/_DIGR_APH_TY_PEDE_FS_label_/g"\
57 57
        -e "s/_Digr_aph_label_/Digraph/g"\
58 58
        -e "s/_digr_aph_label_/digraph/g"\
59 59
        -e "s/_Gr_aph_label_/Graph/g"\
60 60
        -e "s/_gr_aph_label_/graph/g"\
61 61
        -e "s/_Ar_c_label_/Arc/g"\
62 62
        -e "s/_ar_c_label_/arc/g"\
63 63
        -e "s/_Ed_ge_label_/Edge/g"\
64 64
        -e "s/_ed_ge_label_/edge/g"\
65 65
        -e "s/_In_cEd_geIt_label_/IncEdgeIt/g"\
66 66
        -e "s/_Re_d_label_/Red/g"\
67 67
        -e "s/_Blu_e_label_/Blue/g"\
68 68
        -e "s/_re_d_label_/red/g"\
69 69
        -e "s/_blu_e_label_/blue/g"\
70 70
        -e "s/_GR_APH_TY_PEDE_FS_label_/GRAPH_TYPEDEFS/g"\
71 71
        -e "s/_DIGR_APH_TY_PEDE_FS_label_/DIGRAPH_TYPEDEFS/g"\
72 72
        -e "s/DigraphToEps/GraphToEps/g"\
73 73
        -e "s/digraphToEps/graphToEps/g"\
74 74
        -e "s/\<DefPredMap\>/SetPredMap/g"\
75 75
        -e "s/\<DefDistMap\>/SetDistMap/g"\
76 76
        -e "s/\<DefReachedMap\>/SetReachedMap/g"\
77 77
        -e "s/\<DefProcessedMap\>/SetProcessedMap/g"\
78 78
        -e "s/\<DefHeap\>/SetHeap/g"\
79 79
        -e "s/\<DefStandardHeap\>/SetStandradHeap/g"\
80 80
        -e "s/\<DefOperationTraits\>/SetOperationTraits/g"\
81 81
        -e "s/\<DefProcessedMapToBeDefaultMap\>/SetStandardProcessedMap/g"\
82 82
        -e "s/\<copyGraph\>/graphCopy/g"\
83 83
        -e "s/\<copyDigraph\>/digraphCopy/g"\
84 84
        -e "s/\<HyperCubeDigraph\>/HypercubeGraph/g"\
85 85
        -e "s/\<IntegerMap\>/RangeMap/g"\
86 86
        -e "s/\<integerMap\>/rangeMap/g"\
87 87
        -e "s/\<\([sS]\)tdMap\>/\1parseMap/g"\
88 88
        -e "s/\<\([Ff]\)unctorMap\>/\1unctorToMap/g"\
89 89
        -e "s/\<\([Mm]\)apFunctor\>/\1apToFunctor/g"\
90 90
        -e "s/\<\([Ff]\)orkWriteMap\>/\1orkMap/g"\
91 91
        -e "s/\<StoreBoolMap\>/LoggerBoolMap/g"\
92 92
        -e "s/\<storeBoolMap\>/loggerBoolMap/g"\
93 93
        -e "s/\<BoundingBox\>/Box/g"\
94 94
        -e "s/\<readNauty\>/readNautyGraph/g"\
95
        -e "s/\<RevDigraphAdaptor\>/ReverseDigraph/g"\
96
        -e "s/\<revDigraphAdaptor\>/reverseDigraph/g"\
97
        -e "s/\<SubDigraphAdaptor\>/SubDigraph/g"\
98
        -e "s/\<subDigraphAdaptor\>/subDigraph/g"\
99
        -e "s/\<SubGraphAdaptor\>/SubGraph/g"\
100
        -e "s/\<subGraphAdaptor\>/subGraph/g"\
101
        -e "s/\<NodeSubDigraphAdaptor\>/FilterNodes/g"\
102
        -e "s/\<nodeSubDigraphAdaptor\>/filterNodes/g"\
103
        -e "s/\<ArcSubDigraphAdaptor\>/FilterArcs/g"\
104
        -e "s/\<arcSubDigraphAdaptor\>/filterArcs/g"\
105
        -e "s/\<UndirDigraphAdaptor\>/Undirector/g"\
106
        -e "s/\<undirDigraphAdaptor\>/undirector/g"\
107
        -e "s/\<ResDigraphAdaptor\>/ResidualDigraph/g"\
108
        -e "s/\<resDigraphAdaptor\>/residualDigraph/g"\
109
        -e "s/\<SplitDigraphAdaptor\>/SplitNodes/g"\
110
        -e "s/\<splitDigraphAdaptor\>/splitNodes/g"\
111
        -e "s/\<SubGraphAdaptor\>/SubGraph/g"\
112
        -e "s/\<subGraphAdaptor\>/subGraph/g"\
113
        -e "s/\<NodeSubGraphAdaptor\>/FilterNodes/g"\
114
        -e "s/\<nodeSubGraphAdaptor\>/filterNodes/g"\
115
        -e "s/\<ArcSubGraphAdaptor\>/FilterEdges/g"\
116
        -e "s/\<arcSubGraphAdaptor\>/filterEdges/g"\
117
        -e "s/\<DirGraphAdaptor\>/Orienter/g"\
118
        -e "s/\<dirGraphAdaptor\>/orienter/g"\
95 119
    <$i > $TMP
96 120
    mv $TMP $i
97 121
done
0 comments (0 inline)