lemon/max_cardinality_search.h
author Antal Nemes <thoneyvazul@gmail.com>
Mon, 15 Nov 2010 22:23:35 +0100
changeset 1020 70bee017b584
child 1129 9a3187204242
permissions -rw-r--r--
Port max. card. search alg. from svn -r3512 (#397) and (#56)
thoneyvazul@1020
     1
/* -*- C++ -*-
thoneyvazul@1020
     2
 *
thoneyvazul@1020
     3
 * This file is a part of LEMON, a generic C++ optimization library
thoneyvazul@1020
     4
 *
thoneyvazul@1020
     5
 * Copyright (C) 2003-2010
thoneyvazul@1020
     6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
thoneyvazul@1020
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
thoneyvazul@1020
     8
 *
thoneyvazul@1020
     9
 * Permission to use, modify and distribute this software is granted
thoneyvazul@1020
    10
 * provided that this copyright notice appears in all copies. For
thoneyvazul@1020
    11
 * precise terms see the accompanying LICENSE file.
thoneyvazul@1020
    12
 *
thoneyvazul@1020
    13
 * This software is provided "AS IS" with no warranty of any kind,
thoneyvazul@1020
    14
 * express or implied, and with no claim as to its suitability for any
thoneyvazul@1020
    15
 * purpose.
thoneyvazul@1020
    16
 *
thoneyvazul@1020
    17
 */
thoneyvazul@1020
    18
thoneyvazul@1020
    19
#ifndef LEMON_MAX_CARDINALITY_SEARCH_H
thoneyvazul@1020
    20
#define LEMON_MAX_CARDINALITY_SEARCH_H
thoneyvazul@1020
    21
thoneyvazul@1020
    22
thoneyvazul@1020
    23
/// \ingroup search
thoneyvazul@1020
    24
/// \file 
thoneyvazul@1020
    25
/// \brief Maximum cardinality search in undirected digraphs.
thoneyvazul@1020
    26
thoneyvazul@1020
    27
#include <lemon/bin_heap.h>
thoneyvazul@1020
    28
#include <lemon/bucket_heap.h>
thoneyvazul@1020
    29
thoneyvazul@1020
    30
#include <lemon/error.h>
thoneyvazul@1020
    31
#include <lemon/maps.h>
thoneyvazul@1020
    32
thoneyvazul@1020
    33
#include <functional>
thoneyvazul@1020
    34
thoneyvazul@1020
    35
namespace lemon {
thoneyvazul@1020
    36
thoneyvazul@1020
    37
  /// \brief Default traits class of MaxCardinalitySearch class.
thoneyvazul@1020
    38
  ///
thoneyvazul@1020
    39
  /// Default traits class of MaxCardinalitySearch class.
thoneyvazul@1020
    40
  /// \param Digraph Digraph type.
thoneyvazul@1020
    41
  /// \param CapacityMap Type of capacity map.
thoneyvazul@1020
    42
  template <typename GR, typename CAP>
thoneyvazul@1020
    43
  struct MaxCardinalitySearchDefaultTraits {
thoneyvazul@1020
    44
    /// The digraph type the algorithm runs on. 
thoneyvazul@1020
    45
    typedef GR Digraph;
thoneyvazul@1020
    46
thoneyvazul@1020
    47
    template <typename CM>
thoneyvazul@1020
    48
    struct CapMapSelector {
thoneyvazul@1020
    49
thoneyvazul@1020
    50
      typedef CM CapacityMap;
thoneyvazul@1020
    51
thoneyvazul@1020
    52
      static CapacityMap *createCapacityMap(const Digraph& g) {
thoneyvazul@1020
    53
	return new CapacityMap(g);
thoneyvazul@1020
    54
      }
thoneyvazul@1020
    55
    };
thoneyvazul@1020
    56
thoneyvazul@1020
    57
    template <typename CM>
thoneyvazul@1020
    58
    struct CapMapSelector<ConstMap<CM, Const<int, 1> > > {
thoneyvazul@1020
    59
thoneyvazul@1020
    60
      typedef ConstMap<CM, Const<int, 1> > CapacityMap;
thoneyvazul@1020
    61
thoneyvazul@1020
    62
      static CapacityMap *createCapacityMap(const Digraph&) {
thoneyvazul@1020
    63
	return new CapacityMap;
thoneyvazul@1020
    64
      }
thoneyvazul@1020
    65
    };
thoneyvazul@1020
    66
thoneyvazul@1020
    67
    /// \brief The type of the map that stores the arc capacities.
thoneyvazul@1020
    68
    ///
thoneyvazul@1020
    69
    /// The type of the map that stores the arc capacities.
thoneyvazul@1020
    70
    /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
thoneyvazul@1020
    71
    typedef typename CapMapSelector<CAP>::CapacityMap CapacityMap;
thoneyvazul@1020
    72
thoneyvazul@1020
    73
    /// \brief The type of the capacity of the arcs.
thoneyvazul@1020
    74
    typedef typename CapacityMap::Value Value;
thoneyvazul@1020
    75
thoneyvazul@1020
    76
    /// \brief Instantiates a CapacityMap.
thoneyvazul@1020
    77
    ///
thoneyvazul@1020
    78
    /// This function instantiates a \ref CapacityMap.
thoneyvazul@1020
    79
    /// \param digraph is the digraph, to which we would like to define
thoneyvazul@1020
    80
    /// the CapacityMap.
thoneyvazul@1020
    81
    static CapacityMap *createCapacityMap(const Digraph& digraph) {
thoneyvazul@1020
    82
      return CapMapSelector<CapacityMap>::createCapacityMap(digraph);
thoneyvazul@1020
    83
    }
thoneyvazul@1020
    84
thoneyvazul@1020
    85
    /// \brief The cross reference type used by heap.
thoneyvazul@1020
    86
    ///
thoneyvazul@1020
    87
    /// The cross reference type used by heap.
thoneyvazul@1020
    88
    /// Usually it is \c Digraph::NodeMap<int>.
thoneyvazul@1020
    89
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
thoneyvazul@1020
    90
thoneyvazul@1020
    91
    /// \brief Instantiates a HeapCrossRef.
thoneyvazul@1020
    92
    ///
thoneyvazul@1020
    93
    /// This function instantiates a \ref HeapCrossRef. 
thoneyvazul@1020
    94
    /// \param digraph is the digraph, to which we would like to define the 
thoneyvazul@1020
    95
    /// HeapCrossRef.
thoneyvazul@1020
    96
    static HeapCrossRef *createHeapCrossRef(const Digraph &digraph) {
thoneyvazul@1020
    97
      return new HeapCrossRef(digraph);
thoneyvazul@1020
    98
    }
thoneyvazul@1020
    99
    
thoneyvazul@1020
   100
    template <typename CapacityMap>
thoneyvazul@1020
   101
    struct HeapSelector {
thoneyvazul@1020
   102
      template <typename Value, typename Ref>
thoneyvazul@1020
   103
      struct Selector { 
thoneyvazul@1020
   104
        typedef BinHeap<Value, Ref, std::greater<Value> > Heap;
thoneyvazul@1020
   105
      };
thoneyvazul@1020
   106
    };
thoneyvazul@1020
   107
thoneyvazul@1020
   108
    template <typename CapacityKey>
thoneyvazul@1020
   109
    struct HeapSelector<ConstMap<CapacityKey, Const<int, 1> > > {
thoneyvazul@1020
   110
      template <typename Value, typename Ref>
thoneyvazul@1020
   111
      struct Selector {
thoneyvazul@1020
   112
        typedef BucketHeap<Ref, false > Heap;
thoneyvazul@1020
   113
      };
thoneyvazul@1020
   114
    };
thoneyvazul@1020
   115
thoneyvazul@1020
   116
    /// \brief The heap type used by MaxCardinalitySearch algorithm.
thoneyvazul@1020
   117
    ///
thoneyvazul@1020
   118
    /// The heap type used by MaxCardinalitySearch algorithm. It should
thoneyvazul@1020
   119
    /// maximalize the priorities. The default heap type is
thoneyvazul@1020
   120
    /// the \ref BinHeap, but it is specialized when the
thoneyvazul@1020
   121
    /// CapacityMap is ConstMap<Digraph::Node, Const<int, 1> >
thoneyvazul@1020
   122
    /// to BucketHeap.
thoneyvazul@1020
   123
    ///
thoneyvazul@1020
   124
    /// \sa MaxCardinalitySearch
thoneyvazul@1020
   125
    typedef typename HeapSelector<CapacityMap>
thoneyvazul@1020
   126
    ::template Selector<Value, HeapCrossRef>
thoneyvazul@1020
   127
    ::Heap Heap;
thoneyvazul@1020
   128
thoneyvazul@1020
   129
    /// \brief Instantiates a Heap.
thoneyvazul@1020
   130
    ///
thoneyvazul@1020
   131
    /// This function instantiates a \ref Heap. 
thoneyvazul@1020
   132
    /// \param crossref The cross reference of the heap.
thoneyvazul@1020
   133
    static Heap *createHeap(HeapCrossRef& crossref) {
thoneyvazul@1020
   134
      return new Heap(crossref);
thoneyvazul@1020
   135
    }
thoneyvazul@1020
   136
thoneyvazul@1020
   137
    /// \brief The type of the map that stores whether a node is processed.
thoneyvazul@1020
   138
    ///
thoneyvazul@1020
   139
    /// The type of the map that stores whether a node is processed.
thoneyvazul@1020
   140
    /// It must meet the \ref concepts::WriteMap "WriteMap" concept.
thoneyvazul@1020
   141
    /// By default it is a NullMap.
thoneyvazul@1020
   142
    typedef NullMap<typename Digraph::Node, bool> ProcessedMap;
thoneyvazul@1020
   143
thoneyvazul@1020
   144
    /// \brief Instantiates a ProcessedMap.
thoneyvazul@1020
   145
    ///
thoneyvazul@1020
   146
    /// This function instantiates a \ref ProcessedMap. 
thoneyvazul@1020
   147
    /// \param digraph is the digraph, to which
thoneyvazul@1020
   148
    /// we would like to define the \ref ProcessedMap
thoneyvazul@1020
   149
#ifdef DOXYGEN
thoneyvazul@1020
   150
    static ProcessedMap *createProcessedMap(const Digraph &digraph)
thoneyvazul@1020
   151
#else
thoneyvazul@1020
   152
    static ProcessedMap *createProcessedMap(const Digraph &)
thoneyvazul@1020
   153
#endif
thoneyvazul@1020
   154
    {
thoneyvazul@1020
   155
      return new ProcessedMap();
thoneyvazul@1020
   156
    }
thoneyvazul@1020
   157
thoneyvazul@1020
   158
    /// \brief The type of the map that stores the cardinalities of the nodes.
thoneyvazul@1020
   159
    /// 
thoneyvazul@1020
   160
    /// The type of the map that stores the cardinalities of the nodes.
thoneyvazul@1020
   161
    /// It must meet the \ref concepts::WriteMap "WriteMap" concept.
thoneyvazul@1020
   162
    typedef typename Digraph::template NodeMap<Value> CardinalityMap;
thoneyvazul@1020
   163
thoneyvazul@1020
   164
    /// \brief Instantiates a CardinalityMap.
thoneyvazul@1020
   165
    ///
thoneyvazul@1020
   166
    /// This function instantiates a \ref CardinalityMap. 
thoneyvazul@1020
   167
    /// \param digraph is the digraph, to which we would like to define the \ref 
thoneyvazul@1020
   168
    /// CardinalityMap
thoneyvazul@1020
   169
    static CardinalityMap *createCardinalityMap(const Digraph &digraph) {
thoneyvazul@1020
   170
      return new CardinalityMap(digraph);
thoneyvazul@1020
   171
    }
thoneyvazul@1020
   172
thoneyvazul@1020
   173
thoneyvazul@1020
   174
  };
thoneyvazul@1020
   175
  
thoneyvazul@1020
   176
  /// \ingroup search
thoneyvazul@1020
   177
  ///
thoneyvazul@1020
   178
  /// \brief Maximum Cardinality Search algorithm class.
thoneyvazul@1020
   179
  ///
thoneyvazul@1020
   180
  /// This class provides an efficient implementation of Maximum Cardinality 
thoneyvazul@1020
   181
  /// Search algorithm. The maximum cardinality search first chooses any 
thoneyvazul@1020
   182
  /// node of the digraph. Then every time it chooses one unprocessed node
thoneyvazul@1020
   183
  /// with maximum cardinality, i.e the sum of capacities on out arcs to the nodes
thoneyvazul@1020
   184
  /// which were previusly processed.
thoneyvazul@1020
   185
  /// If there is a cut in the digraph the algorithm should choose
thoneyvazul@1020
   186
  /// again any unprocessed node of the digraph.
thoneyvazul@1020
   187
thoneyvazul@1020
   188
  /// The arc capacities are passed to the algorithm using a
thoneyvazul@1020
   189
  /// \ref concepts::ReadMap "ReadMap", so it is easy to change it to any 
thoneyvazul@1020
   190
  /// kind of capacity.
thoneyvazul@1020
   191
  ///
thoneyvazul@1020
   192
  /// The type of the capacity is determined by the \ref 
thoneyvazul@1020
   193
  /// concepts::ReadMap::Value "Value" of the capacity map.
thoneyvazul@1020
   194
  ///
thoneyvazul@1020
   195
  /// It is also possible to change the underlying priority heap.
thoneyvazul@1020
   196
  ///
thoneyvazul@1020
   197
  ///
thoneyvazul@1020
   198
  /// \param GR The digraph type the algorithm runs on. The value of
thoneyvazul@1020
   199
  /// Digraph is not used directly by the search algorithm, it 
thoneyvazul@1020
   200
  /// is only passed to \ref MaxCardinalitySearchDefaultTraits.
thoneyvazul@1020
   201
  /// \param CAP This read-only ArcMap determines the capacities of 
thoneyvazul@1020
   202
  /// the arcs. It is read once for each arc, so the map may involve in
thoneyvazul@1020
   203
  /// relatively time consuming process to compute the arc capacity if
thoneyvazul@1020
   204
  /// it is necessary. The default map type is \ref
thoneyvazul@1020
   205
  /// ConstMap "ConstMap<concepts::Digraph::Arc, Const<int,1> >". The value
thoneyvazul@1020
   206
  /// of CapacityMap is not used directly by search algorithm, it is only 
thoneyvazul@1020
   207
  /// passed to \ref MaxCardinalitySearchDefaultTraits.  
thoneyvazul@1020
   208
  /// \param TR Traits class to set various data types used by the 
thoneyvazul@1020
   209
  /// algorithm.  The default traits class is 
thoneyvazul@1020
   210
  /// \ref MaxCardinalitySearchDefaultTraits 
thoneyvazul@1020
   211
  /// "MaxCardinalitySearchDefaultTraits<GR, CAP>".  
thoneyvazul@1020
   212
  /// See \ref MaxCardinalitySearchDefaultTraits 
thoneyvazul@1020
   213
  /// for the documentation of a MaxCardinalitySearch traits class.
thoneyvazul@1020
   214
thoneyvazul@1020
   215
#ifdef DOXYGEN
thoneyvazul@1020
   216
  template <typename GR, typename CAP, typename TR>
thoneyvazul@1020
   217
#else
thoneyvazul@1020
   218
  template <typename GR, typename CAP = 
thoneyvazul@1020
   219
	    ConstMap<typename GR::Arc, Const<int,1> >,
thoneyvazul@1020
   220
	    typename TR = 
thoneyvazul@1020
   221
            MaxCardinalitySearchDefaultTraits<GR, CAP> >
thoneyvazul@1020
   222
#endif
thoneyvazul@1020
   223
  class MaxCardinalitySearch {
thoneyvazul@1020
   224
  public:
thoneyvazul@1020
   225
thoneyvazul@1020
   226
    typedef TR Traits;
thoneyvazul@1020
   227
    ///The type of the underlying digraph.
thoneyvazul@1020
   228
    typedef typename Traits::Digraph Digraph;
thoneyvazul@1020
   229
    
thoneyvazul@1020
   230
    ///The type of the capacity of the arcs.
thoneyvazul@1020
   231
    typedef typename Traits::CapacityMap::Value Value;
thoneyvazul@1020
   232
    ///The type of the map that stores the arc capacities.
thoneyvazul@1020
   233
    typedef typename Traits::CapacityMap CapacityMap;
thoneyvazul@1020
   234
    ///The type of the map indicating if a node is processed.
thoneyvazul@1020
   235
    typedef typename Traits::ProcessedMap ProcessedMap;
thoneyvazul@1020
   236
    ///The type of the map that stores the cardinalities of the nodes.
thoneyvazul@1020
   237
    typedef typename Traits::CardinalityMap CardinalityMap;
thoneyvazul@1020
   238
    ///The cross reference type used for the current heap.
thoneyvazul@1020
   239
    typedef typename Traits::HeapCrossRef HeapCrossRef;
thoneyvazul@1020
   240
    ///The heap type used by the algorithm. It maximizes the priorities.
thoneyvazul@1020
   241
    typedef typename Traits::Heap Heap;
thoneyvazul@1020
   242
  private:
thoneyvazul@1020
   243
    // Pointer to the underlying digraph.
thoneyvazul@1020
   244
    const Digraph *_graph;
thoneyvazul@1020
   245
    // Pointer to the capacity map
thoneyvazul@1020
   246
    const CapacityMap *_capacity;
thoneyvazul@1020
   247
    // Indicates if \ref _capacity is locally allocated (\c true) or not.
thoneyvazul@1020
   248
    bool local_capacity;
thoneyvazul@1020
   249
    // Pointer to the map of cardinality.
thoneyvazul@1020
   250
    CardinalityMap *_cardinality;
thoneyvazul@1020
   251
    // Indicates if \ref _cardinality is locally allocated (\c true) or not.
thoneyvazul@1020
   252
    bool local_cardinality;
thoneyvazul@1020
   253
    // Pointer to the map of processed status of the nodes.
thoneyvazul@1020
   254
    ProcessedMap *_processed;
thoneyvazul@1020
   255
    // Indicates if \ref _processed is locally allocated (\c true) or not.
thoneyvazul@1020
   256
    bool local_processed;
thoneyvazul@1020
   257
    // Pointer to the heap cross references.
thoneyvazul@1020
   258
    HeapCrossRef *_heap_cross_ref;
thoneyvazul@1020
   259
    // Indicates if \ref _heap_cross_ref is locally allocated (\c true) or not.
thoneyvazul@1020
   260
    bool local_heap_cross_ref;
thoneyvazul@1020
   261
    // Pointer to the heap.
thoneyvazul@1020
   262
    Heap *_heap;
thoneyvazul@1020
   263
    // Indicates if \ref _heap is locally allocated (\c true) or not.
thoneyvazul@1020
   264
    bool local_heap;
thoneyvazul@1020
   265
thoneyvazul@1020
   266
  public :
thoneyvazul@1020
   267
thoneyvazul@1020
   268
    typedef MaxCardinalitySearch Create;
thoneyvazul@1020
   269
 
thoneyvazul@1020
   270
    ///\name Named template parameters
thoneyvazul@1020
   271
thoneyvazul@1020
   272
    ///@{
thoneyvazul@1020
   273
thoneyvazul@1020
   274
    template <class T>
thoneyvazul@1020
   275
    struct DefCapacityMapTraits : public Traits {
thoneyvazul@1020
   276
      typedef T CapacityMap;
thoneyvazul@1020
   277
      static CapacityMap *createCapacityMap(const Digraph &) {
thoneyvazul@1020
   278
       	LEMON_ASSERT(false,"Uninitialized parameter.");
thoneyvazul@1020
   279
	return 0;
thoneyvazul@1020
   280
      }
thoneyvazul@1020
   281
    };
thoneyvazul@1020
   282
    /// \brief \ref named-templ-param "Named parameter" for setting 
thoneyvazul@1020
   283
    /// CapacityMap type
thoneyvazul@1020
   284
    ///
thoneyvazul@1020
   285
    /// \ref named-templ-param "Named parameter" for setting CapacityMap type
thoneyvazul@1020
   286
    /// for the algorithm.
thoneyvazul@1020
   287
    template <class T>
thoneyvazul@1020
   288
    struct SetCapacityMap 
thoneyvazul@1020
   289
      : public MaxCardinalitySearch<Digraph, CapacityMap, 
thoneyvazul@1020
   290
                                    DefCapacityMapTraits<T> > { 
thoneyvazul@1020
   291
      typedef MaxCardinalitySearch<Digraph, CapacityMap, 
thoneyvazul@1020
   292
                                   DefCapacityMapTraits<T> > Create;
thoneyvazul@1020
   293
    };
thoneyvazul@1020
   294
thoneyvazul@1020
   295
    template <class T>
thoneyvazul@1020
   296
    struct DefCardinalityMapTraits : public Traits {
thoneyvazul@1020
   297
      typedef T CardinalityMap;
thoneyvazul@1020
   298
      static CardinalityMap *createCardinalityMap(const Digraph &) 
thoneyvazul@1020
   299
      {
thoneyvazul@1020
   300
	LEMON_ASSERT(false,"Uninitialized parameter.");
thoneyvazul@1020
   301
	return 0;
thoneyvazul@1020
   302
      }
thoneyvazul@1020
   303
    };
thoneyvazul@1020
   304
    /// \brief \ref named-templ-param "Named parameter" for setting 
thoneyvazul@1020
   305
    /// CardinalityMap type
thoneyvazul@1020
   306
    ///
thoneyvazul@1020
   307
    /// \ref named-templ-param "Named parameter" for setting CardinalityMap 
thoneyvazul@1020
   308
    /// type for the algorithm.
thoneyvazul@1020
   309
    template <class T>
thoneyvazul@1020
   310
    struct SetCardinalityMap 
thoneyvazul@1020
   311
      : public MaxCardinalitySearch<Digraph, CapacityMap, 
thoneyvazul@1020
   312
                                    DefCardinalityMapTraits<T> > { 
thoneyvazul@1020
   313
      typedef MaxCardinalitySearch<Digraph, CapacityMap, 
thoneyvazul@1020
   314
                                   DefCardinalityMapTraits<T> > Create;
thoneyvazul@1020
   315
    };
thoneyvazul@1020
   316
    
thoneyvazul@1020
   317
    template <class T>
thoneyvazul@1020
   318
    struct DefProcessedMapTraits : public Traits {
thoneyvazul@1020
   319
      typedef T ProcessedMap;
thoneyvazul@1020
   320
      static ProcessedMap *createProcessedMap(const Digraph &) {
thoneyvazul@1020
   321
       	LEMON_ASSERT(false,"Uninitialized parameter.");
thoneyvazul@1020
   322
	return 0;
thoneyvazul@1020
   323
      }
thoneyvazul@1020
   324
    };
thoneyvazul@1020
   325
    /// \brief \ref named-templ-param "Named parameter" for setting 
thoneyvazul@1020
   326
    /// ProcessedMap type
thoneyvazul@1020
   327
    ///
thoneyvazul@1020
   328
    /// \ref named-templ-param "Named parameter" for setting ProcessedMap type
thoneyvazul@1020
   329
    /// for the algorithm.
thoneyvazul@1020
   330
    template <class T>
thoneyvazul@1020
   331
    struct SetProcessedMap 
thoneyvazul@1020
   332
      : public MaxCardinalitySearch<Digraph, CapacityMap, 
thoneyvazul@1020
   333
                                    DefProcessedMapTraits<T> > { 
thoneyvazul@1020
   334
      typedef MaxCardinalitySearch<Digraph, CapacityMap, 
thoneyvazul@1020
   335
                                   DefProcessedMapTraits<T> > Create;
thoneyvazul@1020
   336
    };
thoneyvazul@1020
   337
    
thoneyvazul@1020
   338
    template <class H, class CR>
thoneyvazul@1020
   339
    struct DefHeapTraits : public Traits {
thoneyvazul@1020
   340
      typedef CR HeapCrossRef;
thoneyvazul@1020
   341
      typedef H Heap;
thoneyvazul@1020
   342
      static HeapCrossRef *createHeapCrossRef(const Digraph &) {
thoneyvazul@1020
   343
     	LEMON_ASSERT(false,"Uninitialized parameter.");
thoneyvazul@1020
   344
	return 0;
thoneyvazul@1020
   345
      }
thoneyvazul@1020
   346
      static Heap *createHeap(HeapCrossRef &) {
thoneyvazul@1020
   347
       	LEMON_ASSERT(false,"Uninitialized parameter.");
thoneyvazul@1020
   348
	return 0;
thoneyvazul@1020
   349
      }
thoneyvazul@1020
   350
    };
thoneyvazul@1020
   351
    /// \brief \ref named-templ-param "Named parameter" for setting heap 
thoneyvazul@1020
   352
    /// and cross reference type
thoneyvazul@1020
   353
    ///
thoneyvazul@1020
   354
    /// \ref named-templ-param "Named parameter" for setting heap and cross 
thoneyvazul@1020
   355
    /// reference type for the algorithm.
thoneyvazul@1020
   356
    template <class H, class CR = typename Digraph::template NodeMap<int> >
thoneyvazul@1020
   357
    struct SetHeap
thoneyvazul@1020
   358
      : public MaxCardinalitySearch<Digraph, CapacityMap, 
thoneyvazul@1020
   359
                                    DefHeapTraits<H, CR> > { 
thoneyvazul@1020
   360
      typedef MaxCardinalitySearch< Digraph, CapacityMap, 
thoneyvazul@1020
   361
                                    DefHeapTraits<H, CR> > Create;
thoneyvazul@1020
   362
    };
thoneyvazul@1020
   363
thoneyvazul@1020
   364
    template <class H, class CR>
thoneyvazul@1020
   365
    struct DefStandardHeapTraits : public Traits {
thoneyvazul@1020
   366
      typedef CR HeapCrossRef;
thoneyvazul@1020
   367
      typedef H Heap;
thoneyvazul@1020
   368
      static HeapCrossRef *createHeapCrossRef(const Digraph &digraph) {
thoneyvazul@1020
   369
	return new HeapCrossRef(digraph);
thoneyvazul@1020
   370
      }
thoneyvazul@1020
   371
      static Heap *createHeap(HeapCrossRef &crossref) {
thoneyvazul@1020
   372
	return new Heap(crossref);
thoneyvazul@1020
   373
      }
thoneyvazul@1020
   374
    };
thoneyvazul@1020
   375
thoneyvazul@1020
   376
    /// \brief \ref named-templ-param "Named parameter" for setting heap and 
thoneyvazul@1020
   377
    /// cross reference type with automatic allocation
thoneyvazul@1020
   378
    ///
thoneyvazul@1020
   379
    /// \ref named-templ-param "Named parameter" for setting heap and cross 
thoneyvazul@1020
   380
    /// reference type. It can allocate the heap and the cross reference 
thoneyvazul@1020
   381
    /// object if the cross reference's constructor waits for the digraph as 
thoneyvazul@1020
   382
    /// parameter and the heap's constructor waits for the cross reference.
thoneyvazul@1020
   383
    template <class H, class CR = typename Digraph::template NodeMap<int> >
thoneyvazul@1020
   384
    struct SetStandardHeap
thoneyvazul@1020
   385
      : public MaxCardinalitySearch<Digraph, CapacityMap, 
thoneyvazul@1020
   386
                                    DefStandardHeapTraits<H, CR> > { 
thoneyvazul@1020
   387
      typedef MaxCardinalitySearch<Digraph, CapacityMap, 
thoneyvazul@1020
   388
                                   DefStandardHeapTraits<H, CR> > 
thoneyvazul@1020
   389
      Create;
thoneyvazul@1020
   390
    };
thoneyvazul@1020
   391
    
thoneyvazul@1020
   392
    ///@}
thoneyvazul@1020
   393
thoneyvazul@1020
   394
thoneyvazul@1020
   395
  protected:
thoneyvazul@1020
   396
thoneyvazul@1020
   397
    MaxCardinalitySearch() {}
thoneyvazul@1020
   398
thoneyvazul@1020
   399
  public:      
thoneyvazul@1020
   400
    
thoneyvazul@1020
   401
    /// \brief Constructor.
thoneyvazul@1020
   402
    ///
thoneyvazul@1020
   403
    ///\param digraph the digraph the algorithm will run on.
thoneyvazul@1020
   404
    ///\param capacity the capacity map used by the algorithm.
thoneyvazul@1020
   405
    ///When no capacity map given, a constant 1 capacity map will
thoneyvazul@1020
   406
    ///be allocated.
thoneyvazul@1020
   407
#ifdef DOXYGEN
thoneyvazul@1020
   408
    MaxCardinalitySearch(const Digraph& digraph,
thoneyvazul@1020
   409
			 const CapacityMap& capacity=0 ) :
thoneyvazul@1020
   410
#else
thoneyvazul@1020
   411
    MaxCardinalitySearch(const Digraph& digraph,
thoneyvazul@1020
   412
			 const CapacityMap& capacity=*static_cast<const CapacityMap*>(0) ) :
thoneyvazul@1020
   413
#endif
thoneyvazul@1020
   414
      _graph(&digraph),
thoneyvazul@1020
   415
      _capacity(&capacity), local_capacity(false),
thoneyvazul@1020
   416
      _cardinality(0), local_cardinality(false),
thoneyvazul@1020
   417
      _processed(0), local_processed(false),
thoneyvazul@1020
   418
      _heap_cross_ref(0), local_heap_cross_ref(false),
thoneyvazul@1020
   419
      _heap(0), local_heap(false)
thoneyvazul@1020
   420
    { }
thoneyvazul@1020
   421
thoneyvazul@1020
   422
    /// \brief Destructor.
thoneyvazul@1020
   423
    ~MaxCardinalitySearch() {
thoneyvazul@1020
   424
      if(local_capacity) delete _capacity;
thoneyvazul@1020
   425
      if(local_cardinality) delete _cardinality;
thoneyvazul@1020
   426
      if(local_processed) delete _processed;
thoneyvazul@1020
   427
      if(local_heap_cross_ref) delete _heap_cross_ref;
thoneyvazul@1020
   428
      if(local_heap) delete _heap;
thoneyvazul@1020
   429
    }
thoneyvazul@1020
   430
thoneyvazul@1020
   431
    /// \brief Sets the capacity map.
thoneyvazul@1020
   432
    ///
thoneyvazul@1020
   433
    /// Sets the capacity map.
thoneyvazul@1020
   434
    /// \return <tt> (*this) </tt>
thoneyvazul@1020
   435
    MaxCardinalitySearch &capacityMap(const CapacityMap &m) {
thoneyvazul@1020
   436
      if (local_capacity) {
thoneyvazul@1020
   437
	delete _capacity;
thoneyvazul@1020
   438
	local_capacity=false;
thoneyvazul@1020
   439
      }
thoneyvazul@1020
   440
      _capacity=&m;
thoneyvazul@1020
   441
      return *this;
thoneyvazul@1020
   442
    }
thoneyvazul@1020
   443
thoneyvazul@1020
   444
    /// \brief Returns a const reference to the capacity map.
thoneyvazul@1020
   445
    ///
thoneyvazul@1020
   446
    /// Returns a const reference to the capacity map used by
thoneyvazul@1020
   447
    /// the algorithm.
thoneyvazul@1020
   448
    const CapacityMap &capacityMap() const {
thoneyvazul@1020
   449
      return *_capacity;
thoneyvazul@1020
   450
    }
thoneyvazul@1020
   451
thoneyvazul@1020
   452
    /// \brief Sets the map storing the cardinalities calculated by the 
thoneyvazul@1020
   453
    /// algorithm.
thoneyvazul@1020
   454
    ///
thoneyvazul@1020
   455
    /// Sets the map storing the cardinalities calculated by the algorithm.
thoneyvazul@1020
   456
    /// If you don't use this function before calling \ref run(),
thoneyvazul@1020
   457
    /// it will allocate one. The destuctor deallocates this
thoneyvazul@1020
   458
    /// automatically allocated map, of course.
thoneyvazul@1020
   459
    /// \return <tt> (*this) </tt>
thoneyvazul@1020
   460
    MaxCardinalitySearch &cardinalityMap(CardinalityMap &m) {
thoneyvazul@1020
   461
      if(local_cardinality) {
thoneyvazul@1020
   462
	delete _cardinality;
thoneyvazul@1020
   463
	local_cardinality=false;
thoneyvazul@1020
   464
      }
thoneyvazul@1020
   465
      _cardinality = &m;
thoneyvazul@1020
   466
      return *this;
thoneyvazul@1020
   467
    }
thoneyvazul@1020
   468
thoneyvazul@1020
   469
    /// \brief Sets the map storing the processed nodes.
thoneyvazul@1020
   470
    ///
thoneyvazul@1020
   471
    /// Sets the map storing the processed nodes.
thoneyvazul@1020
   472
    /// If you don't use this function before calling \ref run(),
thoneyvazul@1020
   473
    /// it will allocate one. The destuctor deallocates this
thoneyvazul@1020
   474
    /// automatically allocated map, of course.
thoneyvazul@1020
   475
    /// \return <tt> (*this) </tt>
thoneyvazul@1020
   476
    MaxCardinalitySearch &processedMap(ProcessedMap &m) 
thoneyvazul@1020
   477
    {
thoneyvazul@1020
   478
      if(local_processed) {
thoneyvazul@1020
   479
	delete _processed;
thoneyvazul@1020
   480
	local_processed=false;
thoneyvazul@1020
   481
      }
thoneyvazul@1020
   482
      _processed = &m;
thoneyvazul@1020
   483
      return *this;
thoneyvazul@1020
   484
    }
thoneyvazul@1020
   485
thoneyvazul@1020
   486
    /// \brief Returns a const reference to the cardinality map.
thoneyvazul@1020
   487
    ///
thoneyvazul@1020
   488
    /// Returns a const reference to the cardinality map used by
thoneyvazul@1020
   489
    /// the algorithm.
thoneyvazul@1020
   490
    const ProcessedMap &processedMap() const {
thoneyvazul@1020
   491
      return *_processed;
thoneyvazul@1020
   492
    }
thoneyvazul@1020
   493
thoneyvazul@1020
   494
    /// \brief Sets the heap and the cross reference used by algorithm.
thoneyvazul@1020
   495
    ///
thoneyvazul@1020
   496
    /// Sets the heap and the cross reference used by algorithm.
thoneyvazul@1020
   497
    /// If you don't use this function before calling \ref run(),
thoneyvazul@1020
   498
    /// it will allocate one. The destuctor deallocates this
thoneyvazul@1020
   499
    /// automatically allocated map, of course.
thoneyvazul@1020
   500
    /// \return <tt> (*this) </tt>
thoneyvazul@1020
   501
    MaxCardinalitySearch &heap(Heap& hp, HeapCrossRef &cr) {
thoneyvazul@1020
   502
      if(local_heap_cross_ref) {
thoneyvazul@1020
   503
	delete _heap_cross_ref;
thoneyvazul@1020
   504
	local_heap_cross_ref = false;
thoneyvazul@1020
   505
      }
thoneyvazul@1020
   506
      _heap_cross_ref = &cr;
thoneyvazul@1020
   507
      if(local_heap) {
thoneyvazul@1020
   508
	delete _heap;
thoneyvazul@1020
   509
	local_heap = false;
thoneyvazul@1020
   510
      }
thoneyvazul@1020
   511
      _heap = &hp;
thoneyvazul@1020
   512
      return *this;
thoneyvazul@1020
   513
    }
thoneyvazul@1020
   514
thoneyvazul@1020
   515
    /// \brief Returns a const reference to the heap.
thoneyvazul@1020
   516
    ///
thoneyvazul@1020
   517
    /// Returns a const reference to the heap used by
thoneyvazul@1020
   518
    /// the algorithm.
thoneyvazul@1020
   519
    const Heap &heap() const {
thoneyvazul@1020
   520
      return *_heap;
thoneyvazul@1020
   521
    }
thoneyvazul@1020
   522
thoneyvazul@1020
   523
    /// \brief Returns a const reference to the cross reference.
thoneyvazul@1020
   524
    ///
thoneyvazul@1020
   525
    /// Returns a const reference to the cross reference
thoneyvazul@1020
   526
    /// of the heap.
thoneyvazul@1020
   527
    const HeapCrossRef &heapCrossRef() const {
thoneyvazul@1020
   528
      return *_heap_cross_ref;
thoneyvazul@1020
   529
    }
thoneyvazul@1020
   530
thoneyvazul@1020
   531
  private:
thoneyvazul@1020
   532
thoneyvazul@1020
   533
    typedef typename Digraph::Node Node;
thoneyvazul@1020
   534
    typedef typename Digraph::NodeIt NodeIt;
thoneyvazul@1020
   535
    typedef typename Digraph::Arc Arc;
thoneyvazul@1020
   536
    typedef typename Digraph::InArcIt InArcIt;
thoneyvazul@1020
   537
thoneyvazul@1020
   538
    void create_maps() {
thoneyvazul@1020
   539
      if(!_capacity) {
thoneyvazul@1020
   540
	local_capacity = true;
thoneyvazul@1020
   541
	_capacity = Traits::createCapacityMap(*_graph);
thoneyvazul@1020
   542
      }
thoneyvazul@1020
   543
      if(!_cardinality) {
thoneyvazul@1020
   544
	local_cardinality = true;
thoneyvazul@1020
   545
	_cardinality = Traits::createCardinalityMap(*_graph);
thoneyvazul@1020
   546
      }
thoneyvazul@1020
   547
      if(!_processed) {
thoneyvazul@1020
   548
	local_processed = true;
thoneyvazul@1020
   549
	_processed = Traits::createProcessedMap(*_graph);
thoneyvazul@1020
   550
      }
thoneyvazul@1020
   551
      if (!_heap_cross_ref) {
thoneyvazul@1020
   552
	local_heap_cross_ref = true;
thoneyvazul@1020
   553
	_heap_cross_ref = Traits::createHeapCrossRef(*_graph);
thoneyvazul@1020
   554
      }
thoneyvazul@1020
   555
      if (!_heap) {
thoneyvazul@1020
   556
	local_heap = true;
thoneyvazul@1020
   557
	_heap = Traits::createHeap(*_heap_cross_ref);
thoneyvazul@1020
   558
      }
thoneyvazul@1020
   559
    }
thoneyvazul@1020
   560
    
thoneyvazul@1020
   561
    void finalizeNodeData(Node node, Value capacity) {
thoneyvazul@1020
   562
      _processed->set(node, true);
thoneyvazul@1020
   563
      _cardinality->set(node, capacity);
thoneyvazul@1020
   564
    }
thoneyvazul@1020
   565
thoneyvazul@1020
   566
  public:
thoneyvazul@1020
   567
    /// \name Execution control
thoneyvazul@1020
   568
    /// The simplest way to execute the algorithm is to use
thoneyvazul@1020
   569
    /// one of the member functions called \ref run().
thoneyvazul@1020
   570
    /// \n
thoneyvazul@1020
   571
    /// If you need more control on the execution,
thoneyvazul@1020
   572
    /// first you must call \ref init(), then you can add several source nodes
thoneyvazul@1020
   573
    /// with \ref addSource().
thoneyvazul@1020
   574
    /// Finally \ref start() will perform the computation.
thoneyvazul@1020
   575
thoneyvazul@1020
   576
    ///@{
thoneyvazul@1020
   577
thoneyvazul@1020
   578
    /// \brief Initializes the internal data structures.
thoneyvazul@1020
   579
    ///
thoneyvazul@1020
   580
    /// Initializes the internal data structures, and clears the heap.
thoneyvazul@1020
   581
    void init() {
thoneyvazul@1020
   582
      create_maps();
thoneyvazul@1020
   583
      _heap->clear();
thoneyvazul@1020
   584
      for (NodeIt it(*_graph) ; it != INVALID ; ++it) {
thoneyvazul@1020
   585
	_processed->set(it, false);
thoneyvazul@1020
   586
	_heap_cross_ref->set(it, Heap::PRE_HEAP);
thoneyvazul@1020
   587
      }
thoneyvazul@1020
   588
    }
thoneyvazul@1020
   589
    
thoneyvazul@1020
   590
    /// \brief Adds a new source node.
thoneyvazul@1020
   591
    /// 
thoneyvazul@1020
   592
    /// Adds a new source node to the priority heap.
thoneyvazul@1020
   593
    ///
thoneyvazul@1020
   594
    /// It checks if the node has not yet been added to the heap.
thoneyvazul@1020
   595
    void addSource(Node source, Value capacity = 0) {
thoneyvazul@1020
   596
      if(_heap->state(source) == Heap::PRE_HEAP) {
thoneyvazul@1020
   597
	_heap->push(source, capacity);
thoneyvazul@1020
   598
      } 
thoneyvazul@1020
   599
    }
thoneyvazul@1020
   600
    
thoneyvazul@1020
   601
    /// \brief Processes the next node in the priority heap
thoneyvazul@1020
   602
    ///
thoneyvazul@1020
   603
    /// Processes the next node in the priority heap.
thoneyvazul@1020
   604
    ///
thoneyvazul@1020
   605
    /// \return The processed node.
thoneyvazul@1020
   606
    ///
thoneyvazul@1020
   607
    /// \warning The priority heap must not be empty!
thoneyvazul@1020
   608
    Node processNextNode() {
thoneyvazul@1020
   609
      Node node = _heap->top(); 
thoneyvazul@1020
   610
      finalizeNodeData(node, _heap->prio());
thoneyvazul@1020
   611
      _heap->pop();
thoneyvazul@1020
   612
      
thoneyvazul@1020
   613
      for (InArcIt it(*_graph, node); it != INVALID; ++it) {
thoneyvazul@1020
   614
	Node source = _graph->source(it);
thoneyvazul@1020
   615
	switch (_heap->state(source)) {
thoneyvazul@1020
   616
	case Heap::PRE_HEAP:
thoneyvazul@1020
   617
	  _heap->push(source, (*_capacity)[it]);
thoneyvazul@1020
   618
	  break;
thoneyvazul@1020
   619
	case Heap::IN_HEAP:
thoneyvazul@1020
   620
	  _heap->decrease(source, (*_heap)[source] + (*_capacity)[it]);
thoneyvazul@1020
   621
	  break;
thoneyvazul@1020
   622
	case Heap::POST_HEAP:
thoneyvazul@1020
   623
	  break;
thoneyvazul@1020
   624
	}
thoneyvazul@1020
   625
      }
thoneyvazul@1020
   626
      return node;
thoneyvazul@1020
   627
    }
thoneyvazul@1020
   628
thoneyvazul@1020
   629
    /// \brief Next node to be processed.
thoneyvazul@1020
   630
    ///
thoneyvazul@1020
   631
    /// Next node to be processed.
thoneyvazul@1020
   632
    ///
thoneyvazul@1020
   633
    /// \return The next node to be processed or INVALID if the 
thoneyvazul@1020
   634
    /// priority heap is empty.
thoneyvazul@1020
   635
    Node nextNode() { 
thoneyvazul@1020
   636
      return !_heap->empty() ? _heap->top() : INVALID;
thoneyvazul@1020
   637
    }
thoneyvazul@1020
   638
 
thoneyvazul@1020
   639
    /// \brief Returns \c false if there are nodes
thoneyvazul@1020
   640
    /// to be processed in the priority heap
thoneyvazul@1020
   641
    ///
thoneyvazul@1020
   642
    /// Returns \c false if there are nodes
thoneyvazul@1020
   643
    /// to be processed in the priority heap
thoneyvazul@1020
   644
    bool emptyQueue() { return _heap->empty(); }
thoneyvazul@1020
   645
    /// \brief Returns the number of the nodes to be processed 
thoneyvazul@1020
   646
    /// in the priority heap
thoneyvazul@1020
   647
    ///
thoneyvazul@1020
   648
    /// Returns the number of the nodes to be processed in the priority heap
thoneyvazul@1020
   649
    int emptySize() { return _heap->size(); }
thoneyvazul@1020
   650
    
thoneyvazul@1020
   651
    /// \brief Executes the algorithm.
thoneyvazul@1020
   652
    ///
thoneyvazul@1020
   653
    /// Executes the algorithm.
thoneyvazul@1020
   654
    ///
thoneyvazul@1020
   655
    ///\pre init() must be called and at least one node should be added
thoneyvazul@1020
   656
    /// with addSource() before using this function.
thoneyvazul@1020
   657
    ///
thoneyvazul@1020
   658
    /// This method runs the Maximum Cardinality Search algorithm from the 
thoneyvazul@1020
   659
    /// source node(s).
thoneyvazul@1020
   660
    void start() {
thoneyvazul@1020
   661
      while ( !_heap->empty() ) processNextNode();
thoneyvazul@1020
   662
    }
thoneyvazul@1020
   663
    
thoneyvazul@1020
   664
    /// \brief Executes the algorithm until \c dest is reached.
thoneyvazul@1020
   665
    ///
thoneyvazul@1020
   666
    /// Executes the algorithm until \c dest is reached.
thoneyvazul@1020
   667
    ///
thoneyvazul@1020
   668
    /// \pre init() must be called and at least one node should be added
thoneyvazul@1020
   669
    /// with addSource() before using this function.
thoneyvazul@1020
   670
    ///
thoneyvazul@1020
   671
    /// This method runs the %MaxCardinalitySearch algorithm from the source 
thoneyvazul@1020
   672
    /// nodes.
thoneyvazul@1020
   673
    void start(Node dest) {
thoneyvazul@1020
   674
      while ( !_heap->empty() && _heap->top()!=dest ) processNextNode();
thoneyvazul@1020
   675
      if ( !_heap->empty() ) finalizeNodeData(_heap->top(), _heap->prio());
thoneyvazul@1020
   676
    }
thoneyvazul@1020
   677
    
thoneyvazul@1020
   678
    /// \brief Executes the algorithm until a condition is met.
thoneyvazul@1020
   679
    ///
thoneyvazul@1020
   680
    /// Executes the algorithm until a condition is met.
thoneyvazul@1020
   681
    ///
thoneyvazul@1020
   682
    /// \pre init() must be called and at least one node should be added
thoneyvazul@1020
   683
    /// with addSource() before using this function.
thoneyvazul@1020
   684
    ///
thoneyvazul@1020
   685
    /// \param nm must be a bool (or convertible) node map. The algorithm
thoneyvazul@1020
   686
    /// will stop when it reaches a node \c v with <tt>nm[v]==true</tt>.
thoneyvazul@1020
   687
    template <typename NodeBoolMap>
thoneyvazul@1020
   688
    void start(const NodeBoolMap &nm) {
thoneyvazul@1020
   689
      while ( !_heap->empty() && !nm[_heap->top()] ) processNextNode();
thoneyvazul@1020
   690
      if ( !_heap->empty() ) finalizeNodeData(_heap->top(),_heap->prio());
thoneyvazul@1020
   691
    }
thoneyvazul@1020
   692
    
thoneyvazul@1020
   693
    /// \brief Runs the maximum cardinality search algorithm from node \c s.
thoneyvazul@1020
   694
    ///
thoneyvazul@1020
   695
    /// This method runs the %MaxCardinalitySearch algorithm from a root 
thoneyvazul@1020
   696
    /// node \c s.
thoneyvazul@1020
   697
    ///
thoneyvazul@1020
   698
    ///\note d.run(s) is just a shortcut of the following code.
thoneyvazul@1020
   699
    ///\code
thoneyvazul@1020
   700
    ///  d.init();
thoneyvazul@1020
   701
    ///  d.addSource(s);
thoneyvazul@1020
   702
    ///  d.start();
thoneyvazul@1020
   703
    ///\endcode
thoneyvazul@1020
   704
    void run(Node s) {
thoneyvazul@1020
   705
      init();
thoneyvazul@1020
   706
      addSource(s);
thoneyvazul@1020
   707
      start();
thoneyvazul@1020
   708
    }
thoneyvazul@1020
   709
thoneyvazul@1020
   710
    /// \brief Runs the maximum cardinality search algorithm for the 
thoneyvazul@1020
   711
    /// whole digraph.
thoneyvazul@1020
   712
    ///
thoneyvazul@1020
   713
    /// This method runs the %MaxCardinalitySearch algorithm from all 
thoneyvazul@1020
   714
    /// unprocessed node of the digraph.
thoneyvazul@1020
   715
    ///
thoneyvazul@1020
   716
    ///\note d.run(s) is just a shortcut of the following code.
thoneyvazul@1020
   717
    ///\code
thoneyvazul@1020
   718
    ///  d.init();
thoneyvazul@1020
   719
    ///  for (NodeIt it(digraph); it != INVALID; ++it) {
thoneyvazul@1020
   720
    ///    if (!d.reached(it)) {
thoneyvazul@1020
   721
    ///      d.addSource(s);
thoneyvazul@1020
   722
    ///      d.start();
thoneyvazul@1020
   723
    ///    }
thoneyvazul@1020
   724
    ///  }
thoneyvazul@1020
   725
    ///\endcode
thoneyvazul@1020
   726
    void run() {
thoneyvazul@1020
   727
      init();
thoneyvazul@1020
   728
      for (NodeIt it(*_graph); it != INVALID; ++it) {
thoneyvazul@1020
   729
        if (!reached(it)) {
thoneyvazul@1020
   730
          addSource(it);
thoneyvazul@1020
   731
          start();
thoneyvazul@1020
   732
        }
thoneyvazul@1020
   733
      }
thoneyvazul@1020
   734
    }
thoneyvazul@1020
   735
    
thoneyvazul@1020
   736
    ///@}
thoneyvazul@1020
   737
thoneyvazul@1020
   738
    /// \name Query Functions
thoneyvazul@1020
   739
    /// The results of the maximum cardinality search algorithm can be 
thoneyvazul@1020
   740
    /// obtained using these functions.
thoneyvazul@1020
   741
    /// \n
thoneyvazul@1020
   742
    /// Before the use of these functions, either run() or start() must be 
thoneyvazul@1020
   743
    /// called.
thoneyvazul@1020
   744
    
thoneyvazul@1020
   745
    ///@{
thoneyvazul@1020
   746
thoneyvazul@1020
   747
    /// \brief The cardinality of a node.
thoneyvazul@1020
   748
    ///
thoneyvazul@1020
   749
    /// Returns the cardinality of a node.
thoneyvazul@1020
   750
    /// \pre \ref run() must be called before using this function.
thoneyvazul@1020
   751
    /// \warning If node \c v in unreachable from the root the return value
thoneyvazul@1020
   752
    /// of this funcion is undefined.
thoneyvazul@1020
   753
    Value cardinality(Node node) const { return (*_cardinality)[node]; }
thoneyvazul@1020
   754
thoneyvazul@1020
   755
    /// \brief The current cardinality of a node.
thoneyvazul@1020
   756
    ///
thoneyvazul@1020
   757
    /// Returns the current cardinality of a node.
thoneyvazul@1020
   758
    /// \pre the given node should be reached but not processed
thoneyvazul@1020
   759
    Value currentCardinality(Node node) const { return (*_heap)[node]; }
thoneyvazul@1020
   760
thoneyvazul@1020
   761
    /// \brief Returns a reference to the NodeMap of cardinalities.
thoneyvazul@1020
   762
    ///
thoneyvazul@1020
   763
    /// Returns a reference to the NodeMap of cardinalities. \pre \ref run() 
thoneyvazul@1020
   764
    /// must be called before using this function.
thoneyvazul@1020
   765
    const CardinalityMap &cardinalityMap() const { return *_cardinality;}
thoneyvazul@1020
   766
 
thoneyvazul@1020
   767
    /// \brief Checks if a node is reachable from the root.
thoneyvazul@1020
   768
    ///
thoneyvazul@1020
   769
    /// Returns \c true if \c v is reachable from the root.
thoneyvazul@1020
   770
    /// \warning The source nodes are initated as unreached.
thoneyvazul@1020
   771
    /// \pre \ref run() must be called before using this function.
thoneyvazul@1020
   772
    bool reached(Node v) { return (*_heap_cross_ref)[v] != Heap::PRE_HEAP; }
thoneyvazul@1020
   773
thoneyvazul@1020
   774
    /// \brief Checks if a node is processed.
thoneyvazul@1020
   775
    ///
thoneyvazul@1020
   776
    /// Returns \c true if \c v is processed, i.e. the shortest
thoneyvazul@1020
   777
    /// path to \c v has already found.
thoneyvazul@1020
   778
    /// \pre \ref run() must be called before using this function.
thoneyvazul@1020
   779
    bool processed(Node v) { return (*_heap_cross_ref)[v] == Heap::POST_HEAP; }
thoneyvazul@1020
   780
    
thoneyvazul@1020
   781
    ///@}
thoneyvazul@1020
   782
  };
thoneyvazul@1020
   783
thoneyvazul@1020
   784
}
thoneyvazul@1020
   785
thoneyvazul@1020
   786
#endif