COIN-OR::LEMON - Graph Library

Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • lemon/max_cardinality_search.h

    r1129 r1271  
    1 /* -*- C++ -*-
     1/* -*- mode: C++; indent-tabs-mode: nil; -*-
    22 *
    3  * This file is a part of LEMON, a generic C++ optimization library
     3 * This file is a part of LEMON, a generic C++ optimization library.
    44 *
    5  * Copyright (C) 2003-2010
     5 * Copyright (C) 2003-2013
    66 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
    77 * (Egervary Research Group on Combinatorial Optimization, EGRES).
     
    2222
    2323/// \ingroup search
    24 /// \file 
     24/// \file
    2525/// \brief Maximum cardinality search in undirected digraphs.
    2626
     
    4242  template <typename GR, typename CAP>
    4343  struct MaxCardinalitySearchDefaultTraits {
    44     /// The digraph type the algorithm runs on. 
     44    /// The digraph type the algorithm runs on.
    4545    typedef GR Digraph;
    4646
     
    5151
    5252      static CapacityMap *createCapacityMap(const Digraph& g) {
    53         return new CapacityMap(g);
     53        return new CapacityMap(g);
    5454      }
    5555    };
     
    6161
    6262      static CapacityMap *createCapacityMap(const Digraph&) {
    63         return new CapacityMap;
     63        return new CapacityMap;
    6464      }
    6565    };
     
    9191    /// \brief Instantiates a HeapCrossRef.
    9292    ///
    93     /// This function instantiates a \ref HeapCrossRef. 
    94     /// \param digraph is the digraph, to which we would like to define the 
     93    /// This function instantiates a \ref HeapCrossRef.
     94    /// \param digraph is the digraph, to which we would like to define the
    9595    /// HeapCrossRef.
    9696    static HeapCrossRef *createHeapCrossRef(const Digraph &digraph) {
    9797      return new HeapCrossRef(digraph);
    9898    }
    99    
     99
    100100    template <typename CapacityMap>
    101101    struct HeapSelector {
    102102      template <typename Value, typename Ref>
    103       struct Selector { 
     103      struct Selector {
    104104        typedef BinHeap<Value, Ref, std::greater<Value> > Heap;
    105105      };
     
    129129    /// \brief Instantiates a Heap.
    130130    ///
    131     /// This function instantiates a \ref Heap. 
     131    /// This function instantiates a \ref Heap.
    132132    /// \param crossref The cross reference of the heap.
    133133    static Heap *createHeap(HeapCrossRef& crossref) {
     
    144144    /// \brief Instantiates a ProcessedMap.
    145145    ///
    146     /// This function instantiates a \ref ProcessedMap. 
     146    /// This function instantiates a \ref ProcessedMap.
    147147    /// \param digraph is the digraph, to which
    148148    /// we would like to define the \ref ProcessedMap
     
    157157
    158158    /// \brief The type of the map that stores the cardinalities of the nodes.
    159     /// 
     159    ///
    160160    /// The type of the map that stores the cardinalities of the nodes.
    161161    /// It must meet the \ref concepts::WriteMap "WriteMap" concept.
     
    164164    /// \brief Instantiates a CardinalityMap.
    165165    ///
    166     /// This function instantiates a \ref CardinalityMap. 
    167     /// \param digraph is the digraph, to which we would like to define the \ref
    168     /// CardinalityMap
     166    /// This function instantiates a \ref CardinalityMap.
     167    /// \param digraph is the digraph, to which we would like to
     168    /// define the \ref CardinalityMap
    169169    static CardinalityMap *createCardinalityMap(const Digraph &digraph) {
    170170      return new CardinalityMap(digraph);
     
    173173
    174174  };
    175  
     175
    176176  /// \ingroup search
    177177  ///
    178178  /// \brief Maximum Cardinality Search algorithm class.
    179179  ///
    180   /// This class provides an efficient implementation of Maximum Cardinality 
    181   /// Search algorithm. The maximum cardinality search first chooses any 
     180  /// This class provides an efficient implementation of Maximum Cardinality
     181  /// Search algorithm. The maximum cardinality search first chooses any
    182182  /// node of the digraph. Then every time it chooses one unprocessed node
    183   /// with maximum cardinality, i.e the sum of capacities on out arcs to the nodes
     183  /// with maximum cardinality, i.e the sum of capacities on out arcs
     184  /// to the nodes
    184185  /// which were previusly processed.
    185186  /// If there is a cut in the digraph the algorithm should choose
     
    187188
    188189  /// The arc capacities are passed to the algorithm using a
    189   /// \ref concepts::ReadMap "ReadMap", so it is easy to change it to any 
     190  /// \ref concepts::ReadMap "ReadMap", so it is easy to change it to any
    190191  /// kind of capacity.
    191192  ///
    192   /// The type of the capacity is determined by the \ref 
     193  /// The type of the capacity is determined by the \ref
    193194  /// concepts::ReadMap::Value "Value" of the capacity map.
    194195  ///
     
    197198  ///
    198199  /// \param GR The digraph type the algorithm runs on. The value of
    199   /// Digraph is not used directly by the search algorithm, it 
     200  /// Digraph is not used directly by the search algorithm, it
    200201  /// is only passed to \ref MaxCardinalitySearchDefaultTraits.
    201   /// \param CAP This read-only ArcMap determines the capacities of 
     202  /// \param CAP This read-only ArcMap determines the capacities of
    202203  /// the arcs. It is read once for each arc, so the map may involve in
    203204  /// relatively time consuming process to compute the arc capacity if
    204205  /// it is necessary. The default map type is \ref
    205206  /// ConstMap "ConstMap<concepts::Digraph::Arc, Const<int,1> >". The value
    206   /// of CapacityMap is not used directly by search algorithm, it is only 
    207   /// passed to \ref MaxCardinalitySearchDefaultTraits. 
    208   /// \param TR Traits class to set various data types used by the 
    209   /// algorithm.  The default traits class is 
    210   /// \ref MaxCardinalitySearchDefaultTraits 
    211   /// "MaxCardinalitySearchDefaultTraits<GR, CAP>". 
    212   /// See \ref MaxCardinalitySearchDefaultTraits 
     207  /// of CapacityMap is not used directly by search algorithm, it is only
     208  /// passed to \ref MaxCardinalitySearchDefaultTraits.
     209  /// \param TR Traits class to set various data types used by the
     210  /// algorithm.  The default traits class is
     211  /// \ref MaxCardinalitySearchDefaultTraits
     212  /// "MaxCardinalitySearchDefaultTraits<GR, CAP>".
     213  /// See \ref MaxCardinalitySearchDefaultTraits
    213214  /// for the documentation of a MaxCardinalitySearch traits class.
    214215
     
    216217  template <typename GR, typename CAP, typename TR>
    217218#else
    218   template <typename GR, typename CAP = 
    219             ConstMap<typename GR::Arc, Const<int,1> >,
    220             typename TR =
     219  template <typename GR, typename CAP =
     220            ConstMap<typename GR::Arc, Const<int,1> >,
     221            typename TR =
    221222            MaxCardinalitySearchDefaultTraits<GR, CAP> >
    222223#endif
     
    227228    ///The type of the underlying digraph.
    228229    typedef typename Traits::Digraph Digraph;
    229    
     230
    230231    ///The type of the capacity of the arcs.
    231232    typedef typename Traits::CapacityMap::Value Value;
     
    267268
    268269    typedef MaxCardinalitySearch Create;
    269  
     270
    270271    ///\name Named template parameters
    271272
     
    276277      typedef T CapacityMap;
    277278      static CapacityMap *createCapacityMap(const Digraph &) {
    278         LEMON_ASSERT(false,"Uninitialized parameter.");
    279         return 0;
    280       }
    281     };
    282     /// \brief \ref named-templ-param "Named parameter" for setting 
     279               LEMON_ASSERT(false,"Uninitialized parameter.");
     280        return 0;
     281      }
     282    };
     283    /// \brief \ref named-templ-param "Named parameter" for setting
    283284    /// CapacityMap type
    284285    ///
     
    286287    /// for the algorithm.
    287288    template <class T>
    288     struct SetCapacityMap 
    289       : public MaxCardinalitySearch<Digraph, CapacityMap, 
    290                                     DefCapacityMapTraits<T> > { 
    291       typedef MaxCardinalitySearch<Digraph, CapacityMap, 
     289    struct SetCapacityMap
     290      : public MaxCardinalitySearch<Digraph, CapacityMap,
     291                                    DefCapacityMapTraits<T> > {
     292      typedef MaxCardinalitySearch<Digraph, CapacityMap,
    292293                                   DefCapacityMapTraits<T> > Create;
    293294    };
     
    296297    struct DefCardinalityMapTraits : public Traits {
    297298      typedef T CardinalityMap;
    298       static CardinalityMap *createCardinalityMap(const Digraph &) 
     299      static CardinalityMap *createCardinalityMap(const Digraph &)
    299300      {
    300         LEMON_ASSERT(false,"Uninitialized parameter.");
    301         return 0;
    302       }
    303     };
    304     /// \brief \ref named-templ-param "Named parameter" for setting 
     301        LEMON_ASSERT(false,"Uninitialized parameter.");
     302        return 0;
     303      }
     304    };
     305    /// \brief \ref named-templ-param "Named parameter" for setting
    305306    /// CardinalityMap type
    306307    ///
    307     /// \ref named-templ-param "Named parameter" for setting CardinalityMap 
     308    /// \ref named-templ-param "Named parameter" for setting CardinalityMap
    308309    /// type for the algorithm.
    309310    template <class T>
    310     struct SetCardinalityMap 
    311       : public MaxCardinalitySearch<Digraph, CapacityMap, 
    312                                     DefCardinalityMapTraits<T> > { 
    313       typedef MaxCardinalitySearch<Digraph, CapacityMap, 
     311    struct SetCardinalityMap
     312      : public MaxCardinalitySearch<Digraph, CapacityMap,
     313                                    DefCardinalityMapTraits<T> > {
     314      typedef MaxCardinalitySearch<Digraph, CapacityMap,
    314315                                   DefCardinalityMapTraits<T> > Create;
    315316    };
    316    
     317
    317318    template <class T>
    318319    struct DefProcessedMapTraits : public Traits {
    319320      typedef T ProcessedMap;
    320321      static ProcessedMap *createProcessedMap(const Digraph &) {
    321         LEMON_ASSERT(false,"Uninitialized parameter.");
    322         return 0;
    323       }
    324     };
    325     /// \brief \ref named-templ-param "Named parameter" for setting 
     322               LEMON_ASSERT(false,"Uninitialized parameter.");
     323        return 0;
     324      }
     325    };
     326    /// \brief \ref named-templ-param "Named parameter" for setting
    326327    /// ProcessedMap type
    327328    ///
     
    329330    /// for the algorithm.
    330331    template <class T>
    331     struct SetProcessedMap 
    332       : public MaxCardinalitySearch<Digraph, CapacityMap, 
    333                                     DefProcessedMapTraits<T> > { 
    334       typedef MaxCardinalitySearch<Digraph, CapacityMap, 
     332    struct SetProcessedMap
     333      : public MaxCardinalitySearch<Digraph, CapacityMap,
     334                                    DefProcessedMapTraits<T> > {
     335      typedef MaxCardinalitySearch<Digraph, CapacityMap,
    335336                                   DefProcessedMapTraits<T> > Create;
    336337    };
    337    
     338
    338339    template <class H, class CR>
    339340    struct DefHeapTraits : public Traits {
     
    341342      typedef H Heap;
    342343      static HeapCrossRef *createHeapCrossRef(const Digraph &) {
    343         LEMON_ASSERT(false,"Uninitialized parameter.");
    344         return 0;
     344             LEMON_ASSERT(false,"Uninitialized parameter.");
     345        return 0;
    345346      }
    346347      static Heap *createHeap(HeapCrossRef &) {
    347         LEMON_ASSERT(false,"Uninitialized parameter.");
    348         return 0;
    349       }
    350     };
    351     /// \brief \ref named-templ-param "Named parameter" for setting heap 
     348               LEMON_ASSERT(false,"Uninitialized parameter.");
     349        return 0;
     350      }
     351    };
     352    /// \brief \ref named-templ-param "Named parameter" for setting heap
    352353    /// and cross reference type
    353354    ///
    354     /// \ref named-templ-param "Named parameter" for setting heap and cross 
     355    /// \ref named-templ-param "Named parameter" for setting heap and cross
    355356    /// reference type for the algorithm.
    356357    template <class H, class CR = typename Digraph::template NodeMap<int> >
    357358    struct SetHeap
    358       : public MaxCardinalitySearch<Digraph, CapacityMap, 
    359                                     DefHeapTraits<H, CR> > { 
    360       typedef MaxCardinalitySearch< Digraph, CapacityMap, 
     359      : public MaxCardinalitySearch<Digraph, CapacityMap,
     360                                    DefHeapTraits<H, CR> > {
     361      typedef MaxCardinalitySearch< Digraph, CapacityMap,
    361362                                    DefHeapTraits<H, CR> > Create;
    362363    };
     
    367368      typedef H Heap;
    368369      static HeapCrossRef *createHeapCrossRef(const Digraph &digraph) {
    369         return new HeapCrossRef(digraph);
     370        return new HeapCrossRef(digraph);
    370371      }
    371372      static Heap *createHeap(HeapCrossRef &crossref) {
    372         return new Heap(crossref);
    373       }
    374     };
    375 
    376     /// \brief \ref named-templ-param "Named parameter" for setting heap and 
     373        return new Heap(crossref);
     374      }
     375    };
     376
     377    /// \brief \ref named-templ-param "Named parameter" for setting heap and
    377378    /// cross reference type with automatic allocation
    378379    ///
    379     /// \ref named-templ-param "Named parameter" for setting heap and cross 
    380     /// reference type. It can allocate the heap and the cross reference 
    381     /// object if the cross reference's constructor waits for the digraph as 
     380    /// \ref named-templ-param "Named parameter" for setting heap and cross
     381    /// reference type. It can allocate the heap and the cross reference
     382    /// object if the cross reference's constructor waits for the digraph as
    382383    /// parameter and the heap's constructor waits for the cross reference.
    383384    template <class H, class CR = typename Digraph::template NodeMap<int> >
    384385    struct SetStandardHeap
    385       : public MaxCardinalitySearch<Digraph, CapacityMap, 
    386                                     DefStandardHeapTraits<H, CR> > { 
    387       typedef MaxCardinalitySearch<Digraph, CapacityMap, 
    388                                    DefStandardHeapTraits<H, CR> > 
     386      : public MaxCardinalitySearch<Digraph, CapacityMap,
     387                                    DefStandardHeapTraits<H, CR> > {
     388      typedef MaxCardinalitySearch<Digraph, CapacityMap,
     389                                   DefStandardHeapTraits<H, CR> >
    389390      Create;
    390391    };
    391    
     392
    392393    ///@}
    393394
     
    397398    MaxCardinalitySearch() {}
    398399
    399   public:     
    400    
     400  public:
     401
    401402    /// \brief Constructor.
    402403    ///
     
    404405    ///\param capacity the capacity map used by the algorithm.
    405406    MaxCardinalitySearch(const Digraph& digraph,
    406                         const CapacityMap& capacity) :
     407                        const CapacityMap& capacity) :
    407408      _graph(&digraph),
    408409      _capacity(&capacity), local_capacity(false),
     
    442443    MaxCardinalitySearch &capacityMap(const CapacityMap &m) {
    443444      if (local_capacity) {
    444         delete _capacity;
    445         local_capacity=false;
     445        delete _capacity;
     446        local_capacity=false;
    446447      }
    447448      _capacity=&m;
     
    457458    }
    458459
    459     /// \brief Sets the map storing the cardinalities calculated by the 
     460    /// \brief Sets the map storing the cardinalities calculated by the
    460461    /// algorithm.
    461462    ///
     
    467468    MaxCardinalitySearch &cardinalityMap(CardinalityMap &m) {
    468469      if(local_cardinality) {
    469         delete _cardinality;
    470         local_cardinality=false;
     470        delete _cardinality;
     471        local_cardinality=false;
    471472      }
    472473      _cardinality = &m;
     
    481482    /// automatically allocated map, of course.
    482483    /// \return <tt> (*this) </tt>
    483     MaxCardinalitySearch &processedMap(ProcessedMap &m) 
     484    MaxCardinalitySearch &processedMap(ProcessedMap &m)
    484485    {
    485486      if(local_processed) {
    486         delete _processed;
    487         local_processed=false;
     487        delete _processed;
     488        local_processed=false;
    488489      }
    489490      _processed = &m;
     
    508509    MaxCardinalitySearch &heap(Heap& hp, HeapCrossRef &cr) {
    509510      if(local_heap_cross_ref) {
    510         delete _heap_cross_ref;
    511         local_heap_cross_ref = false;
     511        delete _heap_cross_ref;
     512        local_heap_cross_ref = false;
    512513      }
    513514      _heap_cross_ref = &cr;
    514515      if(local_heap) {
    515         delete _heap;
    516         local_heap = false;
     516        delete _heap;
     517        local_heap = false;
    517518      }
    518519      _heap = &hp;
     
    545546    void create_maps() {
    546547      if(!_capacity) {
    547         local_capacity = true;
    548         _capacity = Traits::createCapacityMap(*_graph);
     548        local_capacity = true;
     549        _capacity = Traits::createCapacityMap(*_graph);
    549550      }
    550551      if(!_cardinality) {
    551         local_cardinality = true;
    552         _cardinality = Traits::createCardinalityMap(*_graph);
     552        local_cardinality = true;
     553        _cardinality = Traits::createCardinalityMap(*_graph);
    553554      }
    554555      if(!_processed) {
    555         local_processed = true;
    556         _processed = Traits::createProcessedMap(*_graph);
     556        local_processed = true;
     557        _processed = Traits::createProcessedMap(*_graph);
    557558      }
    558559      if (!_heap_cross_ref) {
    559         local_heap_cross_ref = true;
    560         _heap_cross_ref = Traits::createHeapCrossRef(*_graph);
     560        local_heap_cross_ref = true;
     561        _heap_cross_ref = Traits::createHeapCrossRef(*_graph);
    561562      }
    562563      if (!_heap) {
    563         local_heap = true;
    564         _heap = Traits::createHeap(*_heap_cross_ref);
    565       }
    566     }
    567    
     564        local_heap = true;
     565        _heap = Traits::createHeap(*_heap_cross_ref);
     566      }
     567    }
     568
    568569    void finalizeNodeData(Node node, Value capacity) {
    569570      _processed->set(node, true);
     
    590591      _heap->clear();
    591592      for (NodeIt it(*_graph) ; it != INVALID ; ++it) {
    592         _processed->set(it, false);
    593         _heap_cross_ref->set(it, Heap::PRE_HEAP);
    594       }
    595     }
    596    
     593        _processed->set(it, false);
     594        _heap_cross_ref->set(it, Heap::PRE_HEAP);
     595      }
     596    }
     597
    597598    /// \brief Adds a new source node.
    598     /// 
     599    ///
    599600    /// Adds a new source node to the priority heap.
    600601    ///
     
    602603    void addSource(Node source, Value capacity = 0) {
    603604      if(_heap->state(source) == Heap::PRE_HEAP) {
    604         _heap->push(source, capacity);
    605       } 
    606     }
    607    
     605        _heap->push(source, capacity);
     606      }
     607    }
     608
    608609    /// \brief Processes the next node in the priority heap
    609610    ///
     
    614615    /// \warning The priority heap must not be empty!
    615616    Node processNextNode() {
    616       Node node = _heap->top(); 
     617      Node node = _heap->top();
    617618      finalizeNodeData(node, _heap->prio());
    618619      _heap->pop();
    619      
     620
    620621      for (InArcIt it(*_graph, node); it != INVALID; ++it) {
    621         Node source = _graph->source(it);
    622         switch (_heap->state(source)) {
    623         case Heap::PRE_HEAP:
    624           _heap->push(source, (*_capacity)[it]);
    625           break;
    626         case Heap::IN_HEAP:
    627           _heap->decrease(source, (*_heap)[source] + (*_capacity)[it]);
    628           break;
    629         case Heap::POST_HEAP:
    630           break;
    631         }
     622        Node source = _graph->source(it);
     623        switch (_heap->state(source)) {
     624        case Heap::PRE_HEAP:
     625          _heap->push(source, (*_capacity)[it]);
     626          break;
     627        case Heap::IN_HEAP:
     628          _heap->decrease(source, (*_heap)[source] + (*_capacity)[it]);
     629          break;
     630        case Heap::POST_HEAP:
     631          break;
     632        }
    632633      }
    633634      return node;
     
    638639    /// Next node to be processed.
    639640    ///
    640     /// \return The next node to be processed or INVALID if the 
     641    /// \return The next node to be processed or INVALID if the
    641642    /// priority heap is empty.
    642     Node nextNode() { 
     643    Node nextNode() {
    643644      return !_heap->empty() ? _heap->top() : INVALID;
    644645    }
    645  
     646
    646647    /// \brief Returns \c false if there are nodes
    647648    /// to be processed in the priority heap
     
    650651    /// to be processed in the priority heap
    651652    bool emptyQueue() { return _heap->empty(); }
    652     /// \brief Returns the number of the nodes to be processed 
     653    /// \brief Returns the number of the nodes to be processed
    653654    /// in the priority heap
    654655    ///
    655656    /// Returns the number of the nodes to be processed in the priority heap
    656657    int emptySize() { return _heap->size(); }
    657    
     658
    658659    /// \brief Executes the algorithm.
    659660    ///
     
    663664    /// with addSource() before using this function.
    664665    ///
    665     /// This method runs the Maximum Cardinality Search algorithm from the 
     666    /// This method runs the Maximum Cardinality Search algorithm from the
    666667    /// source node(s).
    667668    void start() {
    668669      while ( !_heap->empty() ) processNextNode();
    669670    }
    670    
     671
    671672    /// \brief Executes the algorithm until \c dest is reached.
    672673    ///
     
    676677    /// with addSource() before using this function.
    677678    ///
    678     /// This method runs the %MaxCardinalitySearch algorithm from the source 
     679    /// This method runs the %MaxCardinalitySearch algorithm from the source
    679680    /// nodes.
    680681    void start(Node dest) {
     
    682683      if ( !_heap->empty() ) finalizeNodeData(_heap->top(), _heap->prio());
    683684    }
    684    
     685
    685686    /// \brief Executes the algorithm until a condition is met.
    686687    ///
     
    697698      if ( !_heap->empty() ) finalizeNodeData(_heap->top(),_heap->prio());
    698699    }
    699    
     700
    700701    /// \brief Runs the maximum cardinality search algorithm from node \c s.
    701702    ///
    702     /// This method runs the %MaxCardinalitySearch algorithm from a root 
     703    /// This method runs the %MaxCardinalitySearch algorithm from a root
    703704    /// node \c s.
    704705    ///
     
    715716    }
    716717
    717     /// \brief Runs the maximum cardinality search algorithm for the 
     718    /// \brief Runs the maximum cardinality search algorithm for the
    718719    /// whole digraph.
    719720    ///
    720     /// This method runs the %MaxCardinalitySearch algorithm from all 
     721    /// This method runs the %MaxCardinalitySearch algorithm from all
    721722    /// unprocessed node of the digraph.
    722723    ///
     
    740741      }
    741742    }
    742    
     743
    743744    ///@}
    744745
    745746    /// \name Query Functions
    746     /// The results of the maximum cardinality search algorithm can be 
     747    /// The results of the maximum cardinality search algorithm can be
    747748    /// obtained using these functions.
    748749    /// \n
    749     /// Before the use of these functions, either run() or start() must be 
     750    /// Before the use of these functions, either run() or start() must be
    750751    /// called.
    751    
     752
    752753    ///@{
    753754
     
    768769    /// \brief Returns a reference to the NodeMap of cardinalities.
    769770    ///
    770     /// Returns a reference to the NodeMap of cardinalities. \pre \ref run() 
     771    /// Returns a reference to the NodeMap of cardinalities. \pre \ref run()
    771772    /// must be called before using this function.
    772773    const CardinalityMap &cardinalityMap() const { return *_cardinality;}
    773  
     774
    774775    /// \brief Checks if a node is reachable from the root.
    775776    ///
     
    785786    /// \pre \ref run() must be called before using this function.
    786787    bool processed(Node v) { return (*_heap_cross_ref)[v] == Heap::POST_HEAP; }
    787    
     788
    788789    ///@}
    789790  };
Note: See TracChangeset for help on using the changeset viewer.