1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
 
     3  * This file is a part of LEMON, a generic C++ optimization library.
 
     5  * Copyright (C) 2003-2008
 
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
 
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
 
     9  * Permission to use, modify and distribute this software is granted
 
    10  * provided that this copyright notice appears in all copies. For
 
    11  * precise terms see the accompanying LICENSE file.
 
    13  * This software is provided "AS IS" with no warranty of any kind,
 
    14  * express or implied, and with no claim as to its suitability for any
 
    19 #ifndef LEMON_CIRCULATION_H
 
    20 #define LEMON_CIRCULATION_H
 
    22 #include <lemon/tolerance.h>
 
    23 #include <lemon/elevator.h>
 
    27 ///\brief Push-relabel algorithm for finding a feasible circulation.
 
    31   /// \brief Default traits class of Circulation class.
 
    33   /// Default traits class of Circulation class.
 
    34   /// \tparam _Diraph Digraph type.
 
    35   /// \tparam _LCapMap Lower bound capacity map type.
 
    36   /// \tparam _UCapMap Upper bound capacity map type.
 
    37   /// \tparam _DeltaMap Delta map type.
 
    38   template <typename _Diraph, typename _LCapMap,
 
    39             typename _UCapMap, typename _DeltaMap>
 
    40   struct CirculationDefaultTraits {
 
    42     /// \brief The type of the digraph the algorithm runs on.
 
    43     typedef _Diraph Digraph;
 
    45     /// \brief The type of the map that stores the circulation lower
 
    48     /// The type of the map that stores the circulation lower bound.
 
    49     /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
 
    50     typedef _LCapMap LCapMap;
 
    52     /// \brief The type of the map that stores the circulation upper
 
    55     /// The type of the map that stores the circulation upper bound.
 
    56     /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
 
    57     typedef _UCapMap UCapMap;
 
    59     /// \brief The type of the map that stores the lower bound for
 
    60     /// the supply of the nodes.
 
    62     /// The type of the map that stores the lower bound for the supply
 
    63     /// of the nodes. It must meet the \ref concepts::ReadMap "ReadMap"
 
    65     typedef _DeltaMap DeltaMap;
 
    67     /// \brief The type of the flow values.
 
    68     typedef typename DeltaMap::Value Value;
 
    70     /// \brief The type of the map that stores the flow values.
 
    72     /// The type of the map that stores the flow values.
 
    73     /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
 
    74     typedef typename Digraph::template ArcMap<Value> FlowMap;
 
    76     /// \brief Instantiates a FlowMap.
 
    78     /// This function instantiates a \ref FlowMap.
 
    79     /// \param digraph The digraph, to which we would like to define
 
    81     static FlowMap* createFlowMap(const Digraph& digraph) {
 
    82       return new FlowMap(digraph);
 
    85     /// \brief The elevator type used by the algorithm.
 
    87     /// The elevator type used by the algorithm.
 
    90     /// \sa LinkedElevator
 
    91     typedef lemon::Elevator<Digraph, typename Digraph::Node> Elevator;
 
    93     /// \brief Instantiates an Elevator.
 
    95     /// This function instantiates an \ref Elevator.
 
    96     /// \param digraph The digraph, to which we would like to define
 
    98     /// \param max_level The maximum level of the elevator.
 
    99     static Elevator* createElevator(const Digraph& digraph, int max_level) {
 
   100       return new Elevator(digraph, max_level);
 
   103     /// \brief The tolerance used by the algorithm
 
   105     /// The tolerance used by the algorithm to handle inexact computation.
 
   106     typedef lemon::Tolerance<Value> Tolerance;
 
   111      \brief Push-relabel algorithm for the network circulation problem.
 
   114      This class implements a push-relabel algorithm for the network
 
   116      It is to find a feasible circulation when lower and upper bounds
 
   117      are given for the flow values on the arcs and lower bounds
 
   118      are given for the supply values of the nodes.
 
   120      The exact formulation of this problem is the following.
 
   121      Let \f$G=(V,A)\f$ be a digraph,
 
   122      \f$lower, upper: A\rightarrow\mathbf{R}^+_0\f$,
 
   123      \f$delta: V\rightarrow\mathbf{R}\f$. Find a feasible circulation
 
   124      \f$f: A\rightarrow\mathbf{R}^+_0\f$ so that
 
   125      \f[ \sum_{a\in\delta_{out}(v)} f(a) - \sum_{a\in\delta_{in}(v)} f(a)
 
   126      \geq delta(v) \quad \forall v\in V, \f]
 
   127      \f[ lower(a)\leq f(a) \leq upper(a) \quad \forall a\in A. \f]
 
   128      \note \f$delta(v)\f$ specifies a lower bound for the supply of node
 
   129      \f$v\f$. It can be either positive or negative, however note that
 
   130      \f$\sum_{v\in V}delta(v)\f$ should be zero or negative in order to
 
   131      have a feasible solution.
 
   133      \note A special case of this problem is when
 
   134      \f$\sum_{v\in V}delta(v) = 0\f$. Then the supply of each node \f$v\f$
 
   135      will be \e equal \e to \f$delta(v)\f$, if a circulation can be found.
 
   136      Thus a feasible solution for the
 
   137      \ref min_cost_flow "minimum cost flow" problem can be calculated
 
   140      \tparam _Digraph The type of the digraph the algorithm runs on.
 
   141      \tparam _LCapMap The type of the lower bound capacity map. The default
 
   142      map type is \ref concepts::Digraph::ArcMap "_Digraph::ArcMap<int>".
 
   143      \tparam _UCapMap The type of the upper bound capacity map. The default
 
   144      map type is \c _LCapMap.
 
   145      \tparam _DeltaMap The type of the map that stores the lower bound
 
   146      for the supply of the nodes. The default map type is
 
   147      \c _Digraph::ArcMap<_UCapMap::Value>.
 
   150 template< typename _Digraph,
 
   156 template< typename _Digraph,
 
   157           typename _LCapMap = typename _Digraph::template ArcMap<int>,
 
   158           typename _UCapMap = _LCapMap,
 
   159           typename _DeltaMap = typename _Digraph::
 
   160                                template NodeMap<typename _UCapMap::Value>,
 
   161           typename _Traits=CirculationDefaultTraits<_Digraph, _LCapMap,
 
   162                                                     _UCapMap, _DeltaMap> >
 
   167     ///The \ref CirculationDefaultTraits "traits class" of the algorithm.
 
   168     typedef _Traits Traits;
 
   169     ///The type of the digraph the algorithm runs on.
 
   170     typedef typename Traits::Digraph Digraph;
 
   171     ///The type of the flow values.
 
   172     typedef typename Traits::Value Value;
 
   174     /// The type of the lower bound capacity map.
 
   175     typedef typename Traits::LCapMap LCapMap;
 
   176     /// The type of the upper bound capacity map.
 
   177     typedef typename Traits::UCapMap UCapMap;
 
   178     /// \brief The type of the map that stores the lower bound for
 
   179     /// the supply of the nodes.
 
   180     typedef typename Traits::DeltaMap DeltaMap;
 
   181     ///The type of the flow map.
 
   182     typedef typename Traits::FlowMap FlowMap;
 
   184     ///The type of the elevator.
 
   185     typedef typename Traits::Elevator Elevator;
 
   186     ///The type of the tolerance.
 
   187     typedef typename Traits::Tolerance Tolerance;
 
   191     TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
 
   198     const DeltaMap *_delta;
 
   206     typedef typename Digraph::template NodeMap<Value> ExcessMap;
 
   214     typedef Circulation Create;
 
   216     ///\name Named Template Parameters
 
   220     template <typename _FlowMap>
 
   221     struct SetFlowMapTraits : public Traits {
 
   222       typedef _FlowMap FlowMap;
 
   223       static FlowMap *createFlowMap(const Digraph&) {
 
   224         LEMON_ASSERT(false, "FlowMap is not initialized");
 
   225         return 0; // ignore warnings
 
   229     /// \brief \ref named-templ-param "Named parameter" for setting
 
   232     /// \ref named-templ-param "Named parameter" for setting FlowMap
 
   234     template <typename _FlowMap>
 
   236       : public Circulation<Digraph, LCapMap, UCapMap, DeltaMap,
 
   237                            SetFlowMapTraits<_FlowMap> > {
 
   238       typedef Circulation<Digraph, LCapMap, UCapMap, DeltaMap,
 
   239                           SetFlowMapTraits<_FlowMap> > Create;
 
   242     template <typename _Elevator>
 
   243     struct SetElevatorTraits : public Traits {
 
   244       typedef _Elevator Elevator;
 
   245       static Elevator *createElevator(const Digraph&, int) {
 
   246         LEMON_ASSERT(false, "Elevator is not initialized");
 
   247         return 0; // ignore warnings
 
   251     /// \brief \ref named-templ-param "Named parameter" for setting
 
   254     /// \ref named-templ-param "Named parameter" for setting Elevator
 
   255     /// type. If this named parameter is used, then an external
 
   256     /// elevator object must be passed to the algorithm using the
 
   257     /// \ref elevator(Elevator&) "elevator()" function before calling
 
   258     /// \ref run() or \ref init().
 
   259     /// \sa SetStandardElevator
 
   260     template <typename _Elevator>
 
   262       : public Circulation<Digraph, LCapMap, UCapMap, DeltaMap,
 
   263                            SetElevatorTraits<_Elevator> > {
 
   264       typedef Circulation<Digraph, LCapMap, UCapMap, DeltaMap,
 
   265                           SetElevatorTraits<_Elevator> > Create;
 
   268     template <typename _Elevator>
 
   269     struct SetStandardElevatorTraits : public Traits {
 
   270       typedef _Elevator Elevator;
 
   271       static Elevator *createElevator(const Digraph& digraph, int max_level) {
 
   272         return new Elevator(digraph, max_level);
 
   276     /// \brief \ref named-templ-param "Named parameter" for setting
 
   277     /// Elevator type with automatic allocation
 
   279     /// \ref named-templ-param "Named parameter" for setting Elevator
 
   280     /// type with automatic allocation.
 
   281     /// The Elevator should have standard constructor interface to be
 
   282     /// able to automatically created by the algorithm (i.e. the
 
   283     /// digraph and the maximum level should be passed to it).
 
   284     /// However an external elevator object could also be passed to the
 
   285     /// algorithm with the \ref elevator(Elevator&) "elevator()" function
 
   286     /// before calling \ref run() or \ref init().
 
   288     template <typename _Elevator>
 
   289     struct SetStandardElevator
 
   290       : public Circulation<Digraph, LCapMap, UCapMap, DeltaMap,
 
   291                        SetStandardElevatorTraits<_Elevator> > {
 
   292       typedef Circulation<Digraph, LCapMap, UCapMap, DeltaMap,
 
   293                       SetStandardElevatorTraits<_Elevator> > Create;
 
   304     /// The constructor of the class.
 
   306     /// The constructor of the class.
 
   307     /// \param g The digraph the algorithm runs on.
 
   308     /// \param lo The lower bound capacity of the arcs.
 
   309     /// \param up The upper bound capacity of the arcs.
 
   310     /// \param delta The lower bound for the supply of the nodes.
 
   311     Circulation(const Digraph &g,const LCapMap &lo,
 
   312                 const UCapMap &up,const DeltaMap &delta)
 
   313       : _g(g), _node_num(),
 
   314         _lo(&lo),_up(&up),_delta(&delta),_flow(0),_local_flow(false),
 
   315         _level(0), _local_level(false), _excess(0), _el() {}
 
   325     void createStructures() {
 
   326       _node_num = _el = countNodes(_g);
 
   329         _flow = Traits::createFlowMap(_g);
 
   333         _level = Traits::createElevator(_g, _node_num);
 
   337         _excess = new ExcessMap(_g);
 
   341     void destroyStructures() {
 
   355     /// Sets the lower bound capacity map.
 
   357     /// Sets the lower bound capacity map.
 
   358     /// \return <tt>(*this)</tt>
 
   359     Circulation& lowerCapMap(const LCapMap& map) {
 
   364     /// Sets the upper bound capacity map.
 
   366     /// Sets the upper bound capacity map.
 
   367     /// \return <tt>(*this)</tt>
 
   368     Circulation& upperCapMap(const LCapMap& map) {
 
   373     /// Sets the lower bound map for the supply of the nodes.
 
   375     /// Sets the lower bound map for the supply of the nodes.
 
   376     /// \return <tt>(*this)</tt>
 
   377     Circulation& deltaMap(const DeltaMap& map) {
 
   382     /// \brief Sets the flow map.
 
   384     /// Sets the flow map.
 
   385     /// If you don't use this function before calling \ref run() or
 
   386     /// \ref init(), an instance will be allocated automatically.
 
   387     /// The destructor deallocates this automatically allocated map,
 
   389     /// \return <tt>(*this)</tt>
 
   390     Circulation& flowMap(FlowMap& map) {
 
   399     /// \brief Sets the elevator used by algorithm.
 
   401     /// Sets the elevator used by algorithm.
 
   402     /// If you don't use this function before calling \ref run() or
 
   403     /// \ref init(), an instance will be allocated automatically.
 
   404     /// The destructor deallocates this automatically allocated elevator,
 
   406     /// \return <tt>(*this)</tt>
 
   407     Circulation& elevator(Elevator& elevator) {
 
   410         _local_level = false;
 
   416     /// \brief Returns a const reference to the elevator.
 
   418     /// Returns a const reference to the elevator.
 
   420     /// \pre Either \ref run() or \ref init() must be called before
 
   421     /// using this function.
 
   422     const Elevator& elevator() {
 
   426     /// \brief Sets the tolerance used by algorithm.
 
   428     /// Sets the tolerance used by algorithm.
 
   429     Circulation& tolerance(const Tolerance& tolerance) const {
 
   434     /// \brief Returns a const reference to the tolerance.
 
   436     /// Returns a const reference to the tolerance.
 
   437     const Tolerance& tolerance() const {
 
   441     /// \name Execution Control
 
   442     /// The simplest way to execute the algorithm is to call \ref run().\n
 
   443     /// If you need more control on the initial solution or the execution,
 
   444     /// first you have to call one of the \ref init() functions, then
 
   445     /// the \ref start() function.
 
   449     /// Initializes the internal data structures.
 
   451     /// Initializes the internal data structures and sets all flow values
 
   452     /// to the lower bound.
 
   457       for(NodeIt n(_g);n!=INVALID;++n) {
 
   458         _excess->set(n, (*_delta)[n]);
 
   461       for (ArcIt e(_g);e!=INVALID;++e) {
 
   462         _flow->set(e, (*_lo)[e]);
 
   463         _excess->set(_g.target(e), (*_excess)[_g.target(e)] + (*_flow)[e]);
 
   464         _excess->set(_g.source(e), (*_excess)[_g.source(e)] - (*_flow)[e]);
 
   467       // global relabeling tested, but in general case it provides
 
   468       // worse performance for random digraphs
 
   470       for(NodeIt n(_g);n!=INVALID;++n)
 
   471         _level->initAddItem(n);
 
   472       _level->initFinish();
 
   473       for(NodeIt n(_g);n!=INVALID;++n)
 
   474         if(_tol.positive((*_excess)[n]))
 
   478     /// Initializes the internal data structures using a greedy approach.
 
   480     /// Initializes the internal data structures using a greedy approach
 
   481     /// to construct the initial solution.
 
   486       for(NodeIt n(_g);n!=INVALID;++n) {
 
   487         _excess->set(n, (*_delta)[n]);
 
   490       for (ArcIt e(_g);e!=INVALID;++e) {
 
   491         if (!_tol.positive((*_excess)[_g.target(e)] + (*_up)[e])) {
 
   492           _flow->set(e, (*_up)[e]);
 
   493           _excess->set(_g.target(e), (*_excess)[_g.target(e)] + (*_up)[e]);
 
   494           _excess->set(_g.source(e), (*_excess)[_g.source(e)] - (*_up)[e]);
 
   495         } else if (_tol.positive((*_excess)[_g.target(e)] + (*_lo)[e])) {
 
   496           _flow->set(e, (*_lo)[e]);
 
   497           _excess->set(_g.target(e), (*_excess)[_g.target(e)] + (*_lo)[e]);
 
   498           _excess->set(_g.source(e), (*_excess)[_g.source(e)] - (*_lo)[e]);
 
   500           Value fc = -(*_excess)[_g.target(e)];
 
   502           _excess->set(_g.target(e), 0);
 
   503           _excess->set(_g.source(e), (*_excess)[_g.source(e)] - fc);
 
   508       for(NodeIt n(_g);n!=INVALID;++n)
 
   509         _level->initAddItem(n);
 
   510       _level->initFinish();
 
   511       for(NodeIt n(_g);n!=INVALID;++n)
 
   512         if(_tol.positive((*_excess)[n]))
 
   516     ///Executes the algorithm
 
   518     ///This function executes the algorithm.
 
   520     ///\return \c true if a feasible circulation is found.
 
   529       Node last_activated=INVALID;
 
   530       while((act=_level->highestActive())!=INVALID) {
 
   531         int actlevel=(*_level)[act];
 
   532         int mlevel=_node_num;
 
   533         Value exc=(*_excess)[act];
 
   535         for(OutArcIt e(_g,act);e!=INVALID; ++e) {
 
   536           Node v = _g.target(e);
 
   537           Value fc=(*_up)[e]-(*_flow)[e];
 
   538           if(!_tol.positive(fc)) continue;
 
   539           if((*_level)[v]<actlevel) {
 
   540             if(!_tol.less(fc, exc)) {
 
   541               _flow->set(e, (*_flow)[e] + exc);
 
   542               _excess->set(v, (*_excess)[v] + exc);
 
   543               if(!_level->active(v) && _tol.positive((*_excess)[v]))
 
   546               _level->deactivate(act);
 
   550               _flow->set(e, (*_up)[e]);
 
   551               _excess->set(v, (*_excess)[v] + fc);
 
   552               if(!_level->active(v) && _tol.positive((*_excess)[v]))
 
   557           else if((*_level)[v]<mlevel) mlevel=(*_level)[v];
 
   559         for(InArcIt e(_g,act);e!=INVALID; ++e) {
 
   560           Node v = _g.source(e);
 
   561           Value fc=(*_flow)[e]-(*_lo)[e];
 
   562           if(!_tol.positive(fc)) continue;
 
   563           if((*_level)[v]<actlevel) {
 
   564             if(!_tol.less(fc, exc)) {
 
   565               _flow->set(e, (*_flow)[e] - exc);
 
   566               _excess->set(v, (*_excess)[v] + exc);
 
   567               if(!_level->active(v) && _tol.positive((*_excess)[v]))
 
   570               _level->deactivate(act);
 
   574               _flow->set(e, (*_lo)[e]);
 
   575               _excess->set(v, (*_excess)[v] + fc);
 
   576               if(!_level->active(v) && _tol.positive((*_excess)[v]))
 
   581           else if((*_level)[v]<mlevel) mlevel=(*_level)[v];
 
   584         _excess->set(act, exc);
 
   585         if(!_tol.positive(exc)) _level->deactivate(act);
 
   586         else if(mlevel==_node_num) {
 
   587           _level->liftHighestActiveToTop();
 
   592           _level->liftHighestActive(mlevel+1);
 
   593           if(_level->onLevel(actlevel)==0) {
 
   604     /// Runs the algorithm.
 
   606     /// This function runs the algorithm.
 
   608     /// \return \c true if a feasible circulation is found.
 
   610     /// \note Apart from the return value, c.run() is just a shortcut of
 
   611     /// the following code.
 
   623     /// \name Query Functions
 
   624     /// The results of the circulation algorithm can be obtained using
 
   625     /// these functions.\n
 
   626     /// Either \ref run() or \ref start() should be called before
 
   631     /// \brief Returns the flow on the given arc.
 
   633     /// Returns the flow on the given arc.
 
   635     /// \pre Either \ref run() or \ref init() must be called before
 
   636     /// using this function.
 
   637     Value flow(const Arc& arc) const {
 
   638       return (*_flow)[arc];
 
   641     /// \brief Returns a const reference to the flow map.
 
   643     /// Returns a const reference to the arc map storing the found flow.
 
   645     /// \pre Either \ref run() or \ref init() must be called before
 
   646     /// using this function.
 
   647     const FlowMap& flowMap() {
 
   652        \brief Returns \c true if the given node is in a barrier.
 
   654        Barrier is a set \e B of nodes for which
 
   656        \f[ \sum_{a\in\delta_{out}(B)} upper(a) -
 
   657            \sum_{a\in\delta_{in}(B)} lower(a) < \sum_{v\in B}delta(v) \f]
 
   659        holds. The existence of a set with this property prooves that a
 
   660        feasible circualtion cannot exist.
 
   662        This function returns \c true if the given node is in the found
 
   663        barrier. If a feasible circulation is found, the function
 
   664        gives back \c false for every node.
 
   666        \pre Either \ref run() or \ref init() must be called before
 
   672     bool barrier(const Node& node)
 
   674       return (*_level)[node] >= _el;
 
   677     /// \brief Gives back a barrier.
 
   679     /// This function sets \c bar to the characteristic vector of the
 
   680     /// found barrier. \c bar should be a \ref concepts::WriteMap "writable"
 
   681     /// node map with \c bool (or convertible) value type.
 
   683     /// If a feasible circulation is found, the function gives back an
 
   684     /// empty set, so \c bar[v] will be \c false for all nodes \c v.
 
   686     /// \note This function calls \ref barrier() for each node,
 
   687     /// so it runs in \f$O(n)\f$ time.
 
   689     /// \pre Either \ref run() or \ref init() must be called before
 
   690     /// using this function.
 
   693     /// \sa checkBarrier()
 
   694     template<class BarrierMap>
 
   695     void barrierMap(BarrierMap &bar)
 
   697       for(NodeIt n(_g);n!=INVALID;++n)
 
   698         bar.set(n, (*_level)[n] >= _el);
 
   703     /// \name Checker Functions
 
   704     /// The feasibility of the results can be checked using
 
   705     /// these functions.\n
 
   706     /// Either \ref run() or \ref start() should be called before
 
   711     ///Check if the found flow is a feasible circulation
 
   713     ///Check if the found flow is a feasible circulation,
 
   716       for(ArcIt e(_g);e!=INVALID;++e)
 
   717         if((*_flow)[e]<(*_lo)[e]||(*_flow)[e]>(*_up)[e]) return false;
 
   718       for(NodeIt n(_g);n!=INVALID;++n)
 
   720           Value dif=-(*_delta)[n];
 
   721           for(InArcIt e(_g,n);e!=INVALID;++e) dif-=(*_flow)[e];
 
   722           for(OutArcIt e(_g,n);e!=INVALID;++e) dif+=(*_flow)[e];
 
   723           if(_tol.negative(dif)) return false;
 
   728     ///Check whether or not the last execution provides a barrier
 
   730     ///Check whether or not the last execution provides a barrier.
 
   736       for(NodeIt n(_g);n!=INVALID;++n)
 
   739       for(ArcIt e(_g);e!=INVALID;++e)
 
   743           if(barrier(s)&&!barrier(t)) delta+=(*_up)[e];
 
   744           else if(barrier(t)&&!barrier(s)) delta-=(*_lo)[e];
 
   746       return _tol.negative(delta);