lemon/cycle_canceling.h
author Peter Kovacs <kpeter@inf.elte.hu>
Tue, 15 Mar 2011 19:32:21 +0100
changeset 936 ddd3c0d3d9bf
parent 921 140c953ad5d1
parent 919 e0cef67fe565
child 1003 16f55008c863
permissions -rw-r--r--
Implement the scaling Price Refinement heuristic in CostScaling (#417)
instead of Early Termination.

These two heuristics are similar, but the newer one is faster
and not only makes it possible to skip some epsilon phases, but
it can improve the performance of the other phases, as well.
alpar@877
     1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
kpeter@814
     2
 *
alpar@877
     3
 * This file is a part of LEMON, a generic C++ optimization library.
kpeter@814
     4
 *
alpar@877
     5
 * Copyright (C) 2003-2010
kpeter@814
     6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
kpeter@814
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
kpeter@814
     8
 *
kpeter@814
     9
 * Permission to use, modify and distribute this software is granted
kpeter@814
    10
 * provided that this copyright notice appears in all copies. For
kpeter@814
    11
 * precise terms see the accompanying LICENSE file.
kpeter@814
    12
 *
kpeter@814
    13
 * This software is provided "AS IS" with no warranty of any kind,
kpeter@814
    14
 * express or implied, and with no claim as to its suitability for any
kpeter@814
    15
 * purpose.
kpeter@814
    16
 *
kpeter@814
    17
 */
kpeter@814
    18
kpeter@814
    19
#ifndef LEMON_CYCLE_CANCELING_H
kpeter@814
    20
#define LEMON_CYCLE_CANCELING_H
kpeter@814
    21
kpeter@815
    22
/// \ingroup min_cost_flow_algs
kpeter@814
    23
/// \file
kpeter@815
    24
/// \brief Cycle-canceling algorithms for finding a minimum cost flow.
kpeter@814
    25
kpeter@814
    26
#include <vector>
kpeter@815
    27
#include <limits>
kpeter@815
    28
kpeter@815
    29
#include <lemon/core.h>
kpeter@815
    30
#include <lemon/maps.h>
kpeter@815
    31
#include <lemon/path.h>
kpeter@815
    32
#include <lemon/math.h>
kpeter@815
    33
#include <lemon/static_graph.h>
kpeter@814
    34
#include <lemon/adaptors.h>
kpeter@814
    35
#include <lemon/circulation.h>
kpeter@814
    36
#include <lemon/bellman_ford.h>
kpeter@864
    37
#include <lemon/howard_mmc.h>
kpeter@814
    38
kpeter@814
    39
namespace lemon {
kpeter@814
    40
kpeter@815
    41
  /// \addtogroup min_cost_flow_algs
kpeter@814
    42
  /// @{
kpeter@814
    43
kpeter@815
    44
  /// \brief Implementation of cycle-canceling algorithms for
kpeter@815
    45
  /// finding a \ref min_cost_flow "minimum cost flow".
kpeter@814
    46
  ///
kpeter@815
    47
  /// \ref CycleCanceling implements three different cycle-canceling
kpeter@816
    48
  /// algorithms for finding a \ref min_cost_flow "minimum cost flow"
kpeter@816
    49
  /// \ref amo93networkflows, \ref klein67primal,
kpeter@816
    50
  /// \ref goldberg89cyclecanceling.
kpeter@815
    51
  /// The most efficent one (both theoretically and practically)
kpeter@815
    52
  /// is the \ref CANCEL_AND_TIGHTEN "Cancel and Tighten" algorithm,
kpeter@815
    53
  /// thus it is the default method.
kpeter@815
    54
  /// It is strongly polynomial, but in practice, it is typically much
kpeter@815
    55
  /// slower than the scaling algorithms and NetworkSimplex.
kpeter@814
    56
  ///
kpeter@815
    57
  /// Most of the parameters of the problem (except for the digraph)
kpeter@815
    58
  /// can be given using separate functions, and the algorithm can be
kpeter@815
    59
  /// executed using the \ref run() function. If some parameters are not
kpeter@815
    60
  /// specified, then default values will be used.
kpeter@814
    61
  ///
kpeter@815
    62
  /// \tparam GR The digraph type the algorithm runs on.
kpeter@815
    63
  /// \tparam V The number type used for flow amounts, capacity bounds
kpeter@815
    64
  /// and supply values in the algorithm. By default, it is \c int.
kpeter@815
    65
  /// \tparam C The number type used for costs and potentials in the
kpeter@815
    66
  /// algorithm. By default, it is the same as \c V.
kpeter@814
    67
  ///
kpeter@921
    68
  /// \warning Both \c V and \c C must be signed number types.
kpeter@921
    69
  /// \warning All input data (capacities, supply values, and costs) must
kpeter@815
    70
  /// be integer.
kpeter@919
    71
  /// \warning This algorithm does not support negative costs for
kpeter@919
    72
  /// arcs having infinite upper bound.
kpeter@814
    73
  ///
kpeter@815
    74
  /// \note For more information about the three available methods,
kpeter@815
    75
  /// see \ref Method.
kpeter@815
    76
#ifdef DOXYGEN
kpeter@815
    77
  template <typename GR, typename V, typename C>
kpeter@815
    78
#else
kpeter@815
    79
  template <typename GR, typename V = int, typename C = V>
kpeter@815
    80
#endif
kpeter@814
    81
  class CycleCanceling
kpeter@814
    82
  {
kpeter@815
    83
  public:
kpeter@814
    84
kpeter@815
    85
    /// The type of the digraph
kpeter@815
    86
    typedef GR Digraph;
kpeter@815
    87
    /// The type of the flow amounts, capacity bounds and supply values
kpeter@815
    88
    typedef V Value;
kpeter@815
    89
    /// The type of the arc costs
kpeter@815
    90
    typedef C Cost;
kpeter@814
    91
kpeter@814
    92
  public:
kpeter@814
    93
kpeter@815
    94
    /// \brief Problem type constants for the \c run() function.
kpeter@815
    95
    ///
kpeter@815
    96
    /// Enum type containing the problem type constants that can be
kpeter@815
    97
    /// returned by the \ref run() function of the algorithm.
kpeter@815
    98
    enum ProblemType {
kpeter@815
    99
      /// The problem has no feasible solution (flow).
kpeter@815
   100
      INFEASIBLE,
kpeter@815
   101
      /// The problem has optimal solution (i.e. it is feasible and
kpeter@815
   102
      /// bounded), and the algorithm has found optimal flow and node
kpeter@815
   103
      /// potentials (primal and dual solutions).
kpeter@815
   104
      OPTIMAL,
kpeter@815
   105
      /// The digraph contains an arc of negative cost and infinite
kpeter@815
   106
      /// upper bound. It means that the objective function is unbounded
kpeter@815
   107
      /// on that arc, however, note that it could actually be bounded
kpeter@815
   108
      /// over the feasible flows, but this algroithm cannot handle
kpeter@815
   109
      /// these cases.
kpeter@815
   110
      UNBOUNDED
kpeter@815
   111
    };
kpeter@815
   112
kpeter@815
   113
    /// \brief Constants for selecting the used method.
kpeter@815
   114
    ///
kpeter@815
   115
    /// Enum type containing constants for selecting the used method
kpeter@815
   116
    /// for the \ref run() function.
kpeter@815
   117
    ///
kpeter@815
   118
    /// \ref CycleCanceling provides three different cycle-canceling
kpeter@815
   119
    /// methods. By default, \ref CANCEL_AND_TIGHTEN "Cancel and Tighten"
kpeter@919
   120
    /// is used, which is by far the most efficient and the most robust.
kpeter@815
   121
    /// However, the other methods can be selected using the \ref run()
kpeter@815
   122
    /// function with the proper parameter.
kpeter@815
   123
    enum Method {
kpeter@815
   124
      /// A simple cycle-canceling method, which uses the
kpeter@815
   125
      /// \ref BellmanFord "Bellman-Ford" algorithm with limited iteration
kpeter@815
   126
      /// number for detecting negative cycles in the residual network.
kpeter@815
   127
      SIMPLE_CYCLE_CANCELING,
kpeter@815
   128
      /// The "Minimum Mean Cycle-Canceling" algorithm, which is a
kpeter@816
   129
      /// well-known strongly polynomial method
kpeter@816
   130
      /// \ref goldberg89cyclecanceling. It improves along a
kpeter@815
   131
      /// \ref min_mean_cycle "minimum mean cycle" in each iteration.
kpeter@815
   132
      /// Its running time complexity is O(n<sup>2</sup>m<sup>3</sup>log(n)).
kpeter@815
   133
      MINIMUM_MEAN_CYCLE_CANCELING,
kpeter@815
   134
      /// The "Cancel And Tighten" algorithm, which can be viewed as an
kpeter@816
   135
      /// improved version of the previous method
kpeter@816
   136
      /// \ref goldberg89cyclecanceling.
kpeter@815
   137
      /// It is faster both in theory and in practice, its running time
kpeter@815
   138
      /// complexity is O(n<sup>2</sup>m<sup>2</sup>log(n)).
kpeter@815
   139
      CANCEL_AND_TIGHTEN
kpeter@815
   140
    };
kpeter@814
   141
kpeter@814
   142
  private:
kpeter@814
   143
kpeter@815
   144
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
alpar@877
   145
kpeter@815
   146
    typedef std::vector<int> IntVector;
kpeter@815
   147
    typedef std::vector<double> DoubleVector;
kpeter@815
   148
    typedef std::vector<Value> ValueVector;
kpeter@815
   149
    typedef std::vector<Cost> CostVector;
kpeter@839
   150
    typedef std::vector<char> BoolVector;
kpeter@839
   151
    // Note: vector<char> is used instead of vector<bool> for efficiency reasons
kpeter@814
   152
kpeter@815
   153
  private:
alpar@877
   154
kpeter@815
   155
    template <typename KT, typename VT>
kpeter@820
   156
    class StaticVectorMap {
kpeter@814
   157
    public:
kpeter@815
   158
      typedef KT Key;
kpeter@815
   159
      typedef VT Value;
alpar@877
   160
kpeter@820
   161
      StaticVectorMap(std::vector<Value>& v) : _v(v) {}
alpar@877
   162
kpeter@815
   163
      const Value& operator[](const Key& key) const {
kpeter@815
   164
        return _v[StaticDigraph::id(key)];
kpeter@814
   165
      }
kpeter@814
   166
kpeter@815
   167
      Value& operator[](const Key& key) {
kpeter@815
   168
        return _v[StaticDigraph::id(key)];
kpeter@815
   169
      }
alpar@877
   170
kpeter@815
   171
      void set(const Key& key, const Value& val) {
kpeter@815
   172
        _v[StaticDigraph::id(key)] = val;
kpeter@815
   173
      }
kpeter@815
   174
kpeter@815
   175
    private:
kpeter@815
   176
      std::vector<Value>& _v;
kpeter@815
   177
    };
kpeter@815
   178
kpeter@820
   179
    typedef StaticVectorMap<StaticDigraph::Node, Cost> CostNodeMap;
kpeter@820
   180
    typedef StaticVectorMap<StaticDigraph::Arc, Cost> CostArcMap;
kpeter@814
   181
kpeter@814
   182
  private:
kpeter@814
   183
kpeter@814
   184
kpeter@815
   185
    // Data related to the underlying digraph
kpeter@815
   186
    const GR &_graph;
kpeter@815
   187
    int _node_num;
kpeter@815
   188
    int _arc_num;
kpeter@815
   189
    int _res_node_num;
kpeter@815
   190
    int _res_arc_num;
kpeter@815
   191
    int _root;
kpeter@814
   192
kpeter@815
   193
    // Parameters of the problem
kpeter@815
   194
    bool _have_lower;
kpeter@815
   195
    Value _sum_supply;
kpeter@814
   196
kpeter@815
   197
    // Data structures for storing the digraph
kpeter@815
   198
    IntNodeMap _node_id;
kpeter@815
   199
    IntArcMap _arc_idf;
kpeter@815
   200
    IntArcMap _arc_idb;
kpeter@815
   201
    IntVector _first_out;
kpeter@839
   202
    BoolVector _forward;
kpeter@815
   203
    IntVector _source;
kpeter@815
   204
    IntVector _target;
kpeter@815
   205
    IntVector _reverse;
kpeter@814
   206
kpeter@815
   207
    // Node and arc data
kpeter@815
   208
    ValueVector _lower;
kpeter@815
   209
    ValueVector _upper;
kpeter@815
   210
    CostVector _cost;
kpeter@815
   211
    ValueVector _supply;
kpeter@815
   212
kpeter@815
   213
    ValueVector _res_cap;
kpeter@815
   214
    CostVector _pi;
kpeter@815
   215
kpeter@815
   216
    // Data for a StaticDigraph structure
kpeter@815
   217
    typedef std::pair<int, int> IntPair;
kpeter@815
   218
    StaticDigraph _sgr;
kpeter@815
   219
    std::vector<IntPair> _arc_vec;
kpeter@815
   220
    std::vector<Cost> _cost_vec;
kpeter@815
   221
    IntVector _id_vec;
kpeter@815
   222
    CostArcMap _cost_map;
kpeter@815
   223
    CostNodeMap _pi_map;
alpar@877
   224
kpeter@815
   225
  public:
alpar@877
   226
kpeter@815
   227
    /// \brief Constant for infinite upper bounds (capacities).
kpeter@815
   228
    ///
kpeter@815
   229
    /// Constant for infinite upper bounds (capacities).
kpeter@815
   230
    /// It is \c std::numeric_limits<Value>::infinity() if available,
kpeter@815
   231
    /// \c std::numeric_limits<Value>::max() otherwise.
kpeter@815
   232
    const Value INF;
kpeter@814
   233
kpeter@814
   234
  public:
kpeter@814
   235
kpeter@815
   236
    /// \brief Constructor.
kpeter@814
   237
    ///
kpeter@815
   238
    /// The constructor of the class.
kpeter@814
   239
    ///
kpeter@815
   240
    /// \param graph The digraph the algorithm runs on.
kpeter@815
   241
    CycleCanceling(const GR& graph) :
kpeter@815
   242
      _graph(graph), _node_id(graph), _arc_idf(graph), _arc_idb(graph),
kpeter@815
   243
      _cost_map(_cost_vec), _pi_map(_pi),
kpeter@815
   244
      INF(std::numeric_limits<Value>::has_infinity ?
kpeter@815
   245
          std::numeric_limits<Value>::infinity() :
kpeter@815
   246
          std::numeric_limits<Value>::max())
kpeter@814
   247
    {
kpeter@815
   248
      // Check the number types
kpeter@815
   249
      LEMON_ASSERT(std::numeric_limits<Value>::is_signed,
kpeter@815
   250
        "The flow type of CycleCanceling must be signed");
kpeter@815
   251
      LEMON_ASSERT(std::numeric_limits<Cost>::is_signed,
kpeter@815
   252
        "The cost type of CycleCanceling must be signed");
kpeter@815
   253
kpeter@830
   254
      // Reset data structures
kpeter@815
   255
      reset();
kpeter@814
   256
    }
kpeter@814
   257
kpeter@815
   258
    /// \name Parameters
kpeter@815
   259
    /// The parameters of the algorithm can be specified using these
kpeter@815
   260
    /// functions.
kpeter@815
   261
kpeter@815
   262
    /// @{
kpeter@815
   263
kpeter@815
   264
    /// \brief Set the lower bounds on the arcs.
kpeter@814
   265
    ///
kpeter@815
   266
    /// This function sets the lower bounds on the arcs.
kpeter@815
   267
    /// If it is not used before calling \ref run(), the lower bounds
kpeter@815
   268
    /// will be set to zero on all arcs.
kpeter@814
   269
    ///
kpeter@815
   270
    /// \param map An arc map storing the lower bounds.
kpeter@815
   271
    /// Its \c Value type must be convertible to the \c Value type
kpeter@815
   272
    /// of the algorithm.
kpeter@815
   273
    ///
kpeter@815
   274
    /// \return <tt>(*this)</tt>
kpeter@815
   275
    template <typename LowerMap>
kpeter@815
   276
    CycleCanceling& lowerMap(const LowerMap& map) {
kpeter@815
   277
      _have_lower = true;
kpeter@815
   278
      for (ArcIt a(_graph); a != INVALID; ++a) {
kpeter@815
   279
        _lower[_arc_idf[a]] = map[a];
kpeter@815
   280
        _lower[_arc_idb[a]] = map[a];
kpeter@814
   281
      }
kpeter@814
   282
      return *this;
kpeter@814
   283
    }
kpeter@814
   284
kpeter@815
   285
    /// \brief Set the upper bounds (capacities) on the arcs.
kpeter@814
   286
    ///
kpeter@815
   287
    /// This function sets the upper bounds (capacities) on the arcs.
kpeter@815
   288
    /// If it is not used before calling \ref run(), the upper bounds
kpeter@815
   289
    /// will be set to \ref INF on all arcs (i.e. the flow value will be
kpeter@815
   290
    /// unbounded from above).
kpeter@814
   291
    ///
kpeter@815
   292
    /// \param map An arc map storing the upper bounds.
kpeter@815
   293
    /// Its \c Value type must be convertible to the \c Value type
kpeter@815
   294
    /// of the algorithm.
kpeter@815
   295
    ///
kpeter@815
   296
    /// \return <tt>(*this)</tt>
kpeter@815
   297
    template<typename UpperMap>
kpeter@815
   298
    CycleCanceling& upperMap(const UpperMap& map) {
kpeter@815
   299
      for (ArcIt a(_graph); a != INVALID; ++a) {
kpeter@815
   300
        _upper[_arc_idf[a]] = map[a];
kpeter@814
   301
      }
kpeter@814
   302
      return *this;
kpeter@814
   303
    }
kpeter@814
   304
kpeter@815
   305
    /// \brief Set the costs of the arcs.
kpeter@815
   306
    ///
kpeter@815
   307
    /// This function sets the costs of the arcs.
kpeter@815
   308
    /// If it is not used before calling \ref run(), the costs
kpeter@815
   309
    /// will be set to \c 1 on all arcs.
kpeter@815
   310
    ///
kpeter@815
   311
    /// \param map An arc map storing the costs.
kpeter@815
   312
    /// Its \c Value type must be convertible to the \c Cost type
kpeter@815
   313
    /// of the algorithm.
kpeter@815
   314
    ///
kpeter@815
   315
    /// \return <tt>(*this)</tt>
kpeter@815
   316
    template<typename CostMap>
kpeter@815
   317
    CycleCanceling& costMap(const CostMap& map) {
kpeter@815
   318
      for (ArcIt a(_graph); a != INVALID; ++a) {
kpeter@815
   319
        _cost[_arc_idf[a]] =  map[a];
kpeter@815
   320
        _cost[_arc_idb[a]] = -map[a];
kpeter@815
   321
      }
kpeter@815
   322
      return *this;
kpeter@815
   323
    }
kpeter@815
   324
kpeter@815
   325
    /// \brief Set the supply values of the nodes.
kpeter@815
   326
    ///
kpeter@815
   327
    /// This function sets the supply values of the nodes.
kpeter@815
   328
    /// If neither this function nor \ref stSupply() is used before
kpeter@815
   329
    /// calling \ref run(), the supply of each node will be set to zero.
kpeter@815
   330
    ///
kpeter@815
   331
    /// \param map A node map storing the supply values.
kpeter@815
   332
    /// Its \c Value type must be convertible to the \c Value type
kpeter@815
   333
    /// of the algorithm.
kpeter@815
   334
    ///
kpeter@815
   335
    /// \return <tt>(*this)</tt>
kpeter@815
   336
    template<typename SupplyMap>
kpeter@815
   337
    CycleCanceling& supplyMap(const SupplyMap& map) {
kpeter@815
   338
      for (NodeIt n(_graph); n != INVALID; ++n) {
kpeter@815
   339
        _supply[_node_id[n]] = map[n];
kpeter@815
   340
      }
kpeter@815
   341
      return *this;
kpeter@815
   342
    }
kpeter@815
   343
kpeter@815
   344
    /// \brief Set single source and target nodes and a supply value.
kpeter@815
   345
    ///
kpeter@815
   346
    /// This function sets a single source node and a single target node
kpeter@815
   347
    /// and the required flow value.
kpeter@815
   348
    /// If neither this function nor \ref supplyMap() is used before
kpeter@815
   349
    /// calling \ref run(), the supply of each node will be set to zero.
kpeter@815
   350
    ///
kpeter@815
   351
    /// Using this function has the same effect as using \ref supplyMap()
kpeter@919
   352
    /// with a map in which \c k is assigned to \c s, \c -k is
kpeter@815
   353
    /// assigned to \c t and all other nodes have zero supply value.
kpeter@815
   354
    ///
kpeter@815
   355
    /// \param s The source node.
kpeter@815
   356
    /// \param t The target node.
kpeter@815
   357
    /// \param k The required amount of flow from node \c s to node \c t
kpeter@815
   358
    /// (i.e. the supply of \c s and the demand of \c t).
kpeter@815
   359
    ///
kpeter@815
   360
    /// \return <tt>(*this)</tt>
kpeter@815
   361
    CycleCanceling& stSupply(const Node& s, const Node& t, Value k) {
kpeter@815
   362
      for (int i = 0; i != _res_node_num; ++i) {
kpeter@815
   363
        _supply[i] = 0;
kpeter@815
   364
      }
kpeter@815
   365
      _supply[_node_id[s]] =  k;
kpeter@815
   366
      _supply[_node_id[t]] = -k;
kpeter@815
   367
      return *this;
kpeter@815
   368
    }
alpar@877
   369
kpeter@815
   370
    /// @}
kpeter@815
   371
kpeter@814
   372
    /// \name Execution control
kpeter@815
   373
    /// The algorithm can be executed using \ref run().
kpeter@814
   374
kpeter@814
   375
    /// @{
kpeter@814
   376
kpeter@814
   377
    /// \brief Run the algorithm.
kpeter@814
   378
    ///
kpeter@815
   379
    /// This function runs the algorithm.
kpeter@815
   380
    /// The paramters can be specified using functions \ref lowerMap(),
kpeter@815
   381
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
kpeter@815
   382
    /// For example,
kpeter@815
   383
    /// \code
kpeter@815
   384
    ///   CycleCanceling<ListDigraph> cc(graph);
kpeter@815
   385
    ///   cc.lowerMap(lower).upperMap(upper).costMap(cost)
kpeter@815
   386
    ///     .supplyMap(sup).run();
kpeter@815
   387
    /// \endcode
kpeter@814
   388
    ///
kpeter@830
   389
    /// This function can be called more than once. All the given parameters
kpeter@830
   390
    /// are kept for the next call, unless \ref resetParams() or \ref reset()
kpeter@830
   391
    /// is used, thus only the modified parameters have to be set again.
kpeter@830
   392
    /// If the underlying digraph was also modified after the construction
kpeter@830
   393
    /// of the class (or the last \ref reset() call), then the \ref reset()
kpeter@830
   394
    /// function must be called.
kpeter@814
   395
    ///
kpeter@815
   396
    /// \param method The cycle-canceling method that will be used.
kpeter@815
   397
    /// For more information, see \ref Method.
kpeter@815
   398
    ///
kpeter@815
   399
    /// \return \c INFEASIBLE if no feasible flow exists,
kpeter@815
   400
    /// \n \c OPTIMAL if the problem has optimal solution
kpeter@815
   401
    /// (i.e. it is feasible and bounded), and the algorithm has found
kpeter@815
   402
    /// optimal flow and node potentials (primal and dual solutions),
kpeter@815
   403
    /// \n \c UNBOUNDED if the digraph contains an arc of negative cost
kpeter@815
   404
    /// and infinite upper bound. It means that the objective function
kpeter@815
   405
    /// is unbounded on that arc, however, note that it could actually be
kpeter@815
   406
    /// bounded over the feasible flows, but this algroithm cannot handle
kpeter@815
   407
    /// these cases.
kpeter@815
   408
    ///
kpeter@815
   409
    /// \see ProblemType, Method
kpeter@830
   410
    /// \see resetParams(), reset()
kpeter@815
   411
    ProblemType run(Method method = CANCEL_AND_TIGHTEN) {
kpeter@815
   412
      ProblemType pt = init();
kpeter@815
   413
      if (pt != OPTIMAL) return pt;
kpeter@815
   414
      start(method);
kpeter@815
   415
      return OPTIMAL;
kpeter@815
   416
    }
kpeter@815
   417
kpeter@815
   418
    /// \brief Reset all the parameters that have been given before.
kpeter@815
   419
    ///
kpeter@815
   420
    /// This function resets all the paramaters that have been given
kpeter@815
   421
    /// before using functions \ref lowerMap(), \ref upperMap(),
kpeter@815
   422
    /// \ref costMap(), \ref supplyMap(), \ref stSupply().
kpeter@815
   423
    ///
kpeter@830
   424
    /// It is useful for multiple \ref run() calls. Basically, all the given
kpeter@830
   425
    /// parameters are kept for the next \ref run() call, unless
kpeter@830
   426
    /// \ref resetParams() or \ref reset() is used.
kpeter@830
   427
    /// If the underlying digraph was also modified after the construction
kpeter@830
   428
    /// of the class or the last \ref reset() call, then the \ref reset()
kpeter@830
   429
    /// function must be used, otherwise \ref resetParams() is sufficient.
kpeter@815
   430
    ///
kpeter@815
   431
    /// For example,
kpeter@815
   432
    /// \code
kpeter@815
   433
    ///   CycleCanceling<ListDigraph> cs(graph);
kpeter@815
   434
    ///
kpeter@815
   435
    ///   // First run
kpeter@815
   436
    ///   cc.lowerMap(lower).upperMap(upper).costMap(cost)
kpeter@815
   437
    ///     .supplyMap(sup).run();
kpeter@815
   438
    ///
kpeter@830
   439
    ///   // Run again with modified cost map (resetParams() is not called,
kpeter@815
   440
    ///   // so only the cost map have to be set again)
kpeter@815
   441
    ///   cost[e] += 100;
kpeter@815
   442
    ///   cc.costMap(cost).run();
kpeter@815
   443
    ///
kpeter@830
   444
    ///   // Run again from scratch using resetParams()
kpeter@815
   445
    ///   // (the lower bounds will be set to zero on all arcs)
kpeter@830
   446
    ///   cc.resetParams();
kpeter@815
   447
    ///   cc.upperMap(capacity).costMap(cost)
kpeter@815
   448
    ///     .supplyMap(sup).run();
kpeter@815
   449
    /// \endcode
kpeter@815
   450
    ///
kpeter@815
   451
    /// \return <tt>(*this)</tt>
kpeter@830
   452
    ///
kpeter@830
   453
    /// \see reset(), run()
kpeter@830
   454
    CycleCanceling& resetParams() {
kpeter@815
   455
      for (int i = 0; i != _res_node_num; ++i) {
kpeter@815
   456
        _supply[i] = 0;
kpeter@815
   457
      }
kpeter@815
   458
      int limit = _first_out[_root];
kpeter@815
   459
      for (int j = 0; j != limit; ++j) {
kpeter@815
   460
        _lower[j] = 0;
kpeter@815
   461
        _upper[j] = INF;
kpeter@815
   462
        _cost[j] = _forward[j] ? 1 : -1;
kpeter@815
   463
      }
kpeter@815
   464
      for (int j = limit; j != _res_arc_num; ++j) {
kpeter@815
   465
        _lower[j] = 0;
kpeter@815
   466
        _upper[j] = INF;
kpeter@815
   467
        _cost[j] = 0;
kpeter@815
   468
        _cost[_reverse[j]] = 0;
alpar@877
   469
      }
kpeter@815
   470
      _have_lower = false;
kpeter@815
   471
      return *this;
kpeter@814
   472
    }
kpeter@814
   473
kpeter@830
   474
    /// \brief Reset the internal data structures and all the parameters
kpeter@830
   475
    /// that have been given before.
kpeter@830
   476
    ///
kpeter@830
   477
    /// This function resets the internal data structures and all the
kpeter@830
   478
    /// paramaters that have been given before using functions \ref lowerMap(),
kpeter@830
   479
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
kpeter@830
   480
    ///
kpeter@830
   481
    /// It is useful for multiple \ref run() calls. Basically, all the given
kpeter@830
   482
    /// parameters are kept for the next \ref run() call, unless
kpeter@830
   483
    /// \ref resetParams() or \ref reset() is used.
kpeter@830
   484
    /// If the underlying digraph was also modified after the construction
kpeter@830
   485
    /// of the class or the last \ref reset() call, then the \ref reset()
kpeter@830
   486
    /// function must be used, otherwise \ref resetParams() is sufficient.
kpeter@830
   487
    ///
kpeter@830
   488
    /// See \ref resetParams() for examples.
kpeter@830
   489
    ///
kpeter@830
   490
    /// \return <tt>(*this)</tt>
kpeter@830
   491
    ///
kpeter@830
   492
    /// \see resetParams(), run()
kpeter@830
   493
    CycleCanceling& reset() {
kpeter@830
   494
      // Resize vectors
kpeter@830
   495
      _node_num = countNodes(_graph);
kpeter@830
   496
      _arc_num = countArcs(_graph);
kpeter@830
   497
      _res_node_num = _node_num + 1;
kpeter@830
   498
      _res_arc_num = 2 * (_arc_num + _node_num);
kpeter@830
   499
      _root = _node_num;
kpeter@830
   500
kpeter@830
   501
      _first_out.resize(_res_node_num + 1);
kpeter@830
   502
      _forward.resize(_res_arc_num);
kpeter@830
   503
      _source.resize(_res_arc_num);
kpeter@830
   504
      _target.resize(_res_arc_num);
kpeter@830
   505
      _reverse.resize(_res_arc_num);
kpeter@830
   506
kpeter@830
   507
      _lower.resize(_res_arc_num);
kpeter@830
   508
      _upper.resize(_res_arc_num);
kpeter@830
   509
      _cost.resize(_res_arc_num);
kpeter@830
   510
      _supply.resize(_res_node_num);
alpar@877
   511
kpeter@830
   512
      _res_cap.resize(_res_arc_num);
kpeter@830
   513
      _pi.resize(_res_node_num);
kpeter@830
   514
kpeter@830
   515
      _arc_vec.reserve(_res_arc_num);
kpeter@830
   516
      _cost_vec.reserve(_res_arc_num);
kpeter@830
   517
      _id_vec.reserve(_res_arc_num);
kpeter@830
   518
kpeter@830
   519
      // Copy the graph
kpeter@830
   520
      int i = 0, j = 0, k = 2 * _arc_num + _node_num;
kpeter@830
   521
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
kpeter@830
   522
        _node_id[n] = i;
kpeter@830
   523
      }
kpeter@830
   524
      i = 0;
kpeter@830
   525
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
kpeter@830
   526
        _first_out[i] = j;
kpeter@830
   527
        for (OutArcIt a(_graph, n); a != INVALID; ++a, ++j) {
kpeter@830
   528
          _arc_idf[a] = j;
kpeter@830
   529
          _forward[j] = true;
kpeter@830
   530
          _source[j] = i;
kpeter@830
   531
          _target[j] = _node_id[_graph.runningNode(a)];
kpeter@830
   532
        }
kpeter@830
   533
        for (InArcIt a(_graph, n); a != INVALID; ++a, ++j) {
kpeter@830
   534
          _arc_idb[a] = j;
kpeter@830
   535
          _forward[j] = false;
kpeter@830
   536
          _source[j] = i;
kpeter@830
   537
          _target[j] = _node_id[_graph.runningNode(a)];
kpeter@830
   538
        }
kpeter@830
   539
        _forward[j] = false;
kpeter@830
   540
        _source[j] = i;
kpeter@830
   541
        _target[j] = _root;
kpeter@830
   542
        _reverse[j] = k;
kpeter@830
   543
        _forward[k] = true;
kpeter@830
   544
        _source[k] = _root;
kpeter@830
   545
        _target[k] = i;
kpeter@830
   546
        _reverse[k] = j;
kpeter@830
   547
        ++j; ++k;
kpeter@830
   548
      }
kpeter@830
   549
      _first_out[i] = j;
kpeter@830
   550
      _first_out[_res_node_num] = k;
kpeter@830
   551
      for (ArcIt a(_graph); a != INVALID; ++a) {
kpeter@830
   552
        int fi = _arc_idf[a];
kpeter@830
   553
        int bi = _arc_idb[a];
kpeter@830
   554
        _reverse[fi] = bi;
kpeter@830
   555
        _reverse[bi] = fi;
kpeter@830
   556
      }
alpar@877
   557
kpeter@830
   558
      // Reset parameters
kpeter@830
   559
      resetParams();
kpeter@830
   560
      return *this;
kpeter@830
   561
    }
kpeter@830
   562
kpeter@814
   563
    /// @}
kpeter@814
   564
kpeter@814
   565
    /// \name Query Functions
kpeter@815
   566
    /// The results of the algorithm can be obtained using these
kpeter@814
   567
    /// functions.\n
kpeter@815
   568
    /// The \ref run() function must be called before using them.
kpeter@814
   569
kpeter@814
   570
    /// @{
kpeter@814
   571
kpeter@815
   572
    /// \brief Return the total cost of the found flow.
kpeter@814
   573
    ///
kpeter@815
   574
    /// This function returns the total cost of the found flow.
kpeter@815
   575
    /// Its complexity is O(e).
kpeter@815
   576
    ///
kpeter@815
   577
    /// \note The return type of the function can be specified as a
kpeter@815
   578
    /// template parameter. For example,
kpeter@815
   579
    /// \code
kpeter@815
   580
    ///   cc.totalCost<double>();
kpeter@815
   581
    /// \endcode
kpeter@815
   582
    /// It is useful if the total cost cannot be stored in the \c Cost
kpeter@815
   583
    /// type of the algorithm, which is the default return type of the
kpeter@815
   584
    /// function.
kpeter@814
   585
    ///
kpeter@814
   586
    /// \pre \ref run() must be called before using this function.
kpeter@815
   587
    template <typename Number>
kpeter@815
   588
    Number totalCost() const {
kpeter@815
   589
      Number c = 0;
kpeter@815
   590
      for (ArcIt a(_graph); a != INVALID; ++a) {
kpeter@815
   591
        int i = _arc_idb[a];
kpeter@815
   592
        c += static_cast<Number>(_res_cap[i]) *
kpeter@815
   593
             (-static_cast<Number>(_cost[i]));
kpeter@815
   594
      }
kpeter@815
   595
      return c;
kpeter@814
   596
    }
kpeter@814
   597
kpeter@815
   598
#ifndef DOXYGEN
kpeter@815
   599
    Cost totalCost() const {
kpeter@815
   600
      return totalCost<Cost>();
kpeter@814
   601
    }
kpeter@815
   602
#endif
kpeter@814
   603
kpeter@814
   604
    /// \brief Return the flow on the given arc.
kpeter@814
   605
    ///
kpeter@815
   606
    /// This function returns the flow on the given arc.
kpeter@814
   607
    ///
kpeter@814
   608
    /// \pre \ref run() must be called before using this function.
kpeter@815
   609
    Value flow(const Arc& a) const {
kpeter@815
   610
      return _res_cap[_arc_idb[a]];
kpeter@814
   611
    }
kpeter@814
   612
kpeter@815
   613
    /// \brief Return the flow map (the primal solution).
kpeter@814
   614
    ///
kpeter@815
   615
    /// This function copies the flow value on each arc into the given
kpeter@815
   616
    /// map. The \c Value type of the algorithm must be convertible to
kpeter@815
   617
    /// the \c Value type of the map.
kpeter@814
   618
    ///
kpeter@814
   619
    /// \pre \ref run() must be called before using this function.
kpeter@815
   620
    template <typename FlowMap>
kpeter@815
   621
    void flowMap(FlowMap &map) const {
kpeter@815
   622
      for (ArcIt a(_graph); a != INVALID; ++a) {
kpeter@815
   623
        map.set(a, _res_cap[_arc_idb[a]]);
kpeter@815
   624
      }
kpeter@814
   625
    }
kpeter@814
   626
kpeter@815
   627
    /// \brief Return the potential (dual value) of the given node.
kpeter@814
   628
    ///
kpeter@815
   629
    /// This function returns the potential (dual value) of the
kpeter@815
   630
    /// given node.
kpeter@814
   631
    ///
kpeter@814
   632
    /// \pre \ref run() must be called before using this function.
kpeter@815
   633
    Cost potential(const Node& n) const {
kpeter@815
   634
      return static_cast<Cost>(_pi[_node_id[n]]);
kpeter@815
   635
    }
kpeter@815
   636
kpeter@815
   637
    /// \brief Return the potential map (the dual solution).
kpeter@815
   638
    ///
kpeter@815
   639
    /// This function copies the potential (dual value) of each node
kpeter@815
   640
    /// into the given map.
kpeter@815
   641
    /// The \c Cost type of the algorithm must be convertible to the
kpeter@815
   642
    /// \c Value type of the map.
kpeter@815
   643
    ///
kpeter@815
   644
    /// \pre \ref run() must be called before using this function.
kpeter@815
   645
    template <typename PotentialMap>
kpeter@815
   646
    void potentialMap(PotentialMap &map) const {
kpeter@815
   647
      for (NodeIt n(_graph); n != INVALID; ++n) {
kpeter@815
   648
        map.set(n, static_cast<Cost>(_pi[_node_id[n]]));
kpeter@815
   649
      }
kpeter@814
   650
    }
kpeter@814
   651
kpeter@814
   652
    /// @}
kpeter@814
   653
kpeter@814
   654
  private:
kpeter@814
   655
kpeter@815
   656
    // Initialize the algorithm
kpeter@815
   657
    ProblemType init() {
kpeter@815
   658
      if (_res_node_num <= 1) return INFEASIBLE;
kpeter@814
   659
kpeter@815
   660
      // Check the sum of supply values
kpeter@815
   661
      _sum_supply = 0;
kpeter@815
   662
      for (int i = 0; i != _root; ++i) {
kpeter@815
   663
        _sum_supply += _supply[i];
kpeter@814
   664
      }
kpeter@815
   665
      if (_sum_supply > 0) return INFEASIBLE;
alpar@877
   666
kpeter@815
   667
kpeter@815
   668
      // Initialize vectors
kpeter@815
   669
      for (int i = 0; i != _res_node_num; ++i) {
kpeter@815
   670
        _pi[i] = 0;
kpeter@815
   671
      }
kpeter@815
   672
      ValueVector excess(_supply);
alpar@877
   673
kpeter@815
   674
      // Remove infinite upper bounds and check negative arcs
kpeter@815
   675
      const Value MAX = std::numeric_limits<Value>::max();
kpeter@815
   676
      int last_out;
kpeter@815
   677
      if (_have_lower) {
kpeter@815
   678
        for (int i = 0; i != _root; ++i) {
kpeter@815
   679
          last_out = _first_out[i+1];
kpeter@815
   680
          for (int j = _first_out[i]; j != last_out; ++j) {
kpeter@815
   681
            if (_forward[j]) {
kpeter@815
   682
              Value c = _cost[j] < 0 ? _upper[j] : _lower[j];
kpeter@815
   683
              if (c >= MAX) return UNBOUNDED;
kpeter@815
   684
              excess[i] -= c;
kpeter@815
   685
              excess[_target[j]] += c;
kpeter@815
   686
            }
kpeter@815
   687
          }
kpeter@815
   688
        }
kpeter@815
   689
      } else {
kpeter@815
   690
        for (int i = 0; i != _root; ++i) {
kpeter@815
   691
          last_out = _first_out[i+1];
kpeter@815
   692
          for (int j = _first_out[i]; j != last_out; ++j) {
kpeter@815
   693
            if (_forward[j] && _cost[j] < 0) {
kpeter@815
   694
              Value c = _upper[j];
kpeter@815
   695
              if (c >= MAX) return UNBOUNDED;
kpeter@815
   696
              excess[i] -= c;
kpeter@815
   697
              excess[_target[j]] += c;
kpeter@815
   698
            }
kpeter@815
   699
          }
kpeter@815
   700
        }
kpeter@815
   701
      }
kpeter@815
   702
      Value ex, max_cap = 0;
kpeter@815
   703
      for (int i = 0; i != _res_node_num; ++i) {
kpeter@815
   704
        ex = excess[i];
kpeter@815
   705
        if (ex < 0) max_cap -= ex;
kpeter@815
   706
      }
kpeter@815
   707
      for (int j = 0; j != _res_arc_num; ++j) {
kpeter@815
   708
        if (_upper[j] >= MAX) _upper[j] = max_cap;
kpeter@814
   709
      }
kpeter@814
   710
kpeter@815
   711
      // Initialize maps for Circulation and remove non-zero lower bounds
kpeter@815
   712
      ConstMap<Arc, Value> low(0);
kpeter@815
   713
      typedef typename Digraph::template ArcMap<Value> ValueArcMap;
kpeter@815
   714
      typedef typename Digraph::template NodeMap<Value> ValueNodeMap;
kpeter@815
   715
      ValueArcMap cap(_graph), flow(_graph);
kpeter@815
   716
      ValueNodeMap sup(_graph);
kpeter@815
   717
      for (NodeIt n(_graph); n != INVALID; ++n) {
kpeter@815
   718
        sup[n] = _supply[_node_id[n]];
kpeter@815
   719
      }
kpeter@815
   720
      if (_have_lower) {
kpeter@815
   721
        for (ArcIt a(_graph); a != INVALID; ++a) {
kpeter@815
   722
          int j = _arc_idf[a];
kpeter@815
   723
          Value c = _lower[j];
kpeter@815
   724
          cap[a] = _upper[j] - c;
kpeter@815
   725
          sup[_graph.source(a)] -= c;
kpeter@815
   726
          sup[_graph.target(a)] += c;
kpeter@815
   727
        }
kpeter@815
   728
      } else {
kpeter@815
   729
        for (ArcIt a(_graph); a != INVALID; ++a) {
kpeter@815
   730
          cap[a] = _upper[_arc_idf[a]];
kpeter@815
   731
        }
kpeter@815
   732
      }
kpeter@814
   733
kpeter@815
   734
      // Find a feasible flow using Circulation
kpeter@815
   735
      Circulation<Digraph, ConstMap<Arc, Value>, ValueArcMap, ValueNodeMap>
kpeter@815
   736
        circ(_graph, low, cap, sup);
kpeter@815
   737
      if (!circ.flowMap(flow).run()) return INFEASIBLE;
kpeter@815
   738
kpeter@815
   739
      // Set residual capacities and handle GEQ supply type
kpeter@815
   740
      if (_sum_supply < 0) {
kpeter@815
   741
        for (ArcIt a(_graph); a != INVALID; ++a) {
kpeter@815
   742
          Value fa = flow[a];
kpeter@815
   743
          _res_cap[_arc_idf[a]] = cap[a] - fa;
kpeter@815
   744
          _res_cap[_arc_idb[a]] = fa;
kpeter@815
   745
          sup[_graph.source(a)] -= fa;
kpeter@815
   746
          sup[_graph.target(a)] += fa;
kpeter@815
   747
        }
kpeter@815
   748
        for (NodeIt n(_graph); n != INVALID; ++n) {
kpeter@815
   749
          excess[_node_id[n]] = sup[n];
kpeter@815
   750
        }
kpeter@815
   751
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
kpeter@815
   752
          int u = _target[a];
kpeter@815
   753
          int ra = _reverse[a];
kpeter@815
   754
          _res_cap[a] = -_sum_supply + 1;
kpeter@815
   755
          _res_cap[ra] = -excess[u];
kpeter@815
   756
          _cost[a] = 0;
kpeter@815
   757
          _cost[ra] = 0;
kpeter@815
   758
        }
kpeter@815
   759
      } else {
kpeter@815
   760
        for (ArcIt a(_graph); a != INVALID; ++a) {
kpeter@815
   761
          Value fa = flow[a];
kpeter@815
   762
          _res_cap[_arc_idf[a]] = cap[a] - fa;
kpeter@815
   763
          _res_cap[_arc_idb[a]] = fa;
kpeter@815
   764
        }
kpeter@815
   765
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
kpeter@815
   766
          int ra = _reverse[a];
kpeter@815
   767
          _res_cap[a] = 1;
kpeter@815
   768
          _res_cap[ra] = 0;
kpeter@815
   769
          _cost[a] = 0;
kpeter@815
   770
          _cost[ra] = 0;
kpeter@815
   771
        }
kpeter@815
   772
      }
alpar@877
   773
kpeter@815
   774
      return OPTIMAL;
kpeter@815
   775
    }
alpar@877
   776
kpeter@815
   777
    // Build a StaticDigraph structure containing the current
kpeter@815
   778
    // residual network
kpeter@815
   779
    void buildResidualNetwork() {
kpeter@815
   780
      _arc_vec.clear();
kpeter@815
   781
      _cost_vec.clear();
kpeter@815
   782
      _id_vec.clear();
kpeter@815
   783
      for (int j = 0; j != _res_arc_num; ++j) {
kpeter@815
   784
        if (_res_cap[j] > 0) {
kpeter@815
   785
          _arc_vec.push_back(IntPair(_source[j], _target[j]));
kpeter@815
   786
          _cost_vec.push_back(_cost[j]);
kpeter@815
   787
          _id_vec.push_back(j);
kpeter@815
   788
        }
kpeter@815
   789
      }
kpeter@815
   790
      _sgr.build(_res_node_num, _arc_vec.begin(), _arc_vec.end());
kpeter@814
   791
    }
kpeter@814
   792
kpeter@815
   793
    // Execute the algorithm and transform the results
kpeter@815
   794
    void start(Method method) {
kpeter@815
   795
      // Execute the algorithm
kpeter@815
   796
      switch (method) {
kpeter@815
   797
        case SIMPLE_CYCLE_CANCELING:
kpeter@815
   798
          startSimpleCycleCanceling();
kpeter@815
   799
          break;
kpeter@815
   800
        case MINIMUM_MEAN_CYCLE_CANCELING:
kpeter@815
   801
          startMinMeanCycleCanceling();
kpeter@815
   802
          break;
kpeter@815
   803
        case CANCEL_AND_TIGHTEN:
kpeter@815
   804
          startCancelAndTighten();
kpeter@815
   805
          break;
kpeter@815
   806
      }
kpeter@814
   807
kpeter@815
   808
      // Compute node potentials
kpeter@815
   809
      if (method != SIMPLE_CYCLE_CANCELING) {
kpeter@815
   810
        buildResidualNetwork();
kpeter@815
   811
        typename BellmanFord<StaticDigraph, CostArcMap>
kpeter@815
   812
          ::template SetDistMap<CostNodeMap>::Create bf(_sgr, _cost_map);
kpeter@815
   813
        bf.distMap(_pi_map);
kpeter@815
   814
        bf.init(0);
kpeter@815
   815
        bf.start();
kpeter@814
   816
      }
kpeter@815
   817
kpeter@815
   818
      // Handle non-zero lower bounds
kpeter@815
   819
      if (_have_lower) {
kpeter@815
   820
        int limit = _first_out[_root];
kpeter@815
   821
        for (int j = 0; j != limit; ++j) {
kpeter@815
   822
          if (!_forward[j]) _res_cap[j] += _lower[j];
kpeter@815
   823
        }
kpeter@815
   824
      }
kpeter@814
   825
    }
kpeter@814
   826
kpeter@815
   827
    // Execute the "Simple Cycle Canceling" method
kpeter@815
   828
    void startSimpleCycleCanceling() {
kpeter@815
   829
      // Constants for computing the iteration limits
kpeter@815
   830
      const int BF_FIRST_LIMIT  = 2;
kpeter@815
   831
      const double BF_LIMIT_FACTOR = 1.5;
alpar@877
   832
kpeter@820
   833
      typedef StaticVectorMap<StaticDigraph::Arc, Value> FilterMap;
kpeter@815
   834
      typedef FilterArcs<StaticDigraph, FilterMap> ResDigraph;
kpeter@820
   835
      typedef StaticVectorMap<StaticDigraph::Node, StaticDigraph::Arc> PredMap;
kpeter@815
   836
      typedef typename BellmanFord<ResDigraph, CostArcMap>
kpeter@815
   837
        ::template SetDistMap<CostNodeMap>
kpeter@815
   838
        ::template SetPredMap<PredMap>::Create BF;
alpar@877
   839
kpeter@815
   840
      // Build the residual network
kpeter@815
   841
      _arc_vec.clear();
kpeter@815
   842
      _cost_vec.clear();
kpeter@815
   843
      for (int j = 0; j != _res_arc_num; ++j) {
kpeter@815
   844
        _arc_vec.push_back(IntPair(_source[j], _target[j]));
kpeter@815
   845
        _cost_vec.push_back(_cost[j]);
kpeter@815
   846
      }
kpeter@815
   847
      _sgr.build(_res_node_num, _arc_vec.begin(), _arc_vec.end());
kpeter@815
   848
kpeter@815
   849
      FilterMap filter_map(_res_cap);
kpeter@815
   850
      ResDigraph rgr(_sgr, filter_map);
kpeter@815
   851
      std::vector<int> cycle;
kpeter@815
   852
      std::vector<StaticDigraph::Arc> pred(_res_arc_num);
kpeter@815
   853
      PredMap pred_map(pred);
kpeter@815
   854
      BF bf(rgr, _cost_map);
kpeter@815
   855
      bf.distMap(_pi_map).predMap(pred_map);
kpeter@814
   856
kpeter@814
   857
      int length_bound = BF_FIRST_LIMIT;
kpeter@814
   858
      bool optimal = false;
kpeter@814
   859
      while (!optimal) {
kpeter@814
   860
        bf.init(0);
kpeter@814
   861
        int iter_num = 0;
kpeter@814
   862
        bool cycle_found = false;
kpeter@814
   863
        while (!cycle_found) {
kpeter@815
   864
          // Perform some iterations of the Bellman-Ford algorithm
kpeter@815
   865
          int curr_iter_num = iter_num + length_bound <= _node_num ?
kpeter@815
   866
            length_bound : _node_num - iter_num;
kpeter@814
   867
          iter_num += curr_iter_num;
kpeter@814
   868
          int real_iter_num = curr_iter_num;
kpeter@814
   869
          for (int i = 0; i < curr_iter_num; ++i) {
kpeter@814
   870
            if (bf.processNextWeakRound()) {
kpeter@814
   871
              real_iter_num = i;
kpeter@814
   872
              break;
kpeter@814
   873
            }
kpeter@814
   874
          }
kpeter@814
   875
          if (real_iter_num < curr_iter_num) {
kpeter@814
   876
            // Optimal flow is found
kpeter@814
   877
            optimal = true;
kpeter@814
   878
            break;
kpeter@814
   879
          } else {
kpeter@815
   880
            // Search for node disjoint negative cycles
kpeter@815
   881
            std::vector<int> state(_res_node_num, 0);
kpeter@814
   882
            int id = 0;
kpeter@815
   883
            for (int u = 0; u != _res_node_num; ++u) {
kpeter@815
   884
              if (state[u] != 0) continue;
kpeter@815
   885
              ++id;
kpeter@815
   886
              int v = u;
kpeter@815
   887
              for (; v != -1 && state[v] == 0; v = pred[v] == INVALID ?
kpeter@815
   888
                   -1 : rgr.id(rgr.source(pred[v]))) {
kpeter@815
   889
                state[v] = id;
kpeter@814
   890
              }
kpeter@815
   891
              if (v != -1 && state[v] == id) {
kpeter@815
   892
                // A negative cycle is found
kpeter@814
   893
                cycle_found = true;
kpeter@814
   894
                cycle.clear();
kpeter@815
   895
                StaticDigraph::Arc a = pred[v];
kpeter@815
   896
                Value d, delta = _res_cap[rgr.id(a)];
kpeter@815
   897
                cycle.push_back(rgr.id(a));
kpeter@815
   898
                while (rgr.id(rgr.source(a)) != v) {
kpeter@815
   899
                  a = pred_map[rgr.source(a)];
kpeter@815
   900
                  d = _res_cap[rgr.id(a)];
kpeter@815
   901
                  if (d < delta) delta = d;
kpeter@815
   902
                  cycle.push_back(rgr.id(a));
kpeter@814
   903
                }
kpeter@814
   904
kpeter@815
   905
                // Augment along the cycle
kpeter@815
   906
                for (int i = 0; i < int(cycle.size()); ++i) {
kpeter@815
   907
                  int j = cycle[i];
kpeter@815
   908
                  _res_cap[j] -= delta;
kpeter@815
   909
                  _res_cap[_reverse[j]] += delta;
kpeter@815
   910
                }
kpeter@814
   911
              }
kpeter@814
   912
            }
kpeter@814
   913
          }
kpeter@814
   914
kpeter@815
   915
          // Increase iteration limit if no cycle is found
kpeter@815
   916
          if (!cycle_found) {
kpeter@815
   917
            length_bound = static_cast<int>(length_bound * BF_LIMIT_FACTOR);
kpeter@815
   918
          }
kpeter@814
   919
        }
kpeter@814
   920
      }
kpeter@814
   921
    }
kpeter@814
   922
kpeter@815
   923
    // Execute the "Minimum Mean Cycle Canceling" method
kpeter@815
   924
    void startMinMeanCycleCanceling() {
kpeter@815
   925
      typedef SimplePath<StaticDigraph> SPath;
kpeter@815
   926
      typedef typename SPath::ArcIt SPathArcIt;
kpeter@864
   927
      typedef typename HowardMmc<StaticDigraph, CostArcMap>
kpeter@815
   928
        ::template SetPath<SPath>::Create MMC;
alpar@877
   929
kpeter@815
   930
      SPath cycle;
kpeter@815
   931
      MMC mmc(_sgr, _cost_map);
kpeter@815
   932
      mmc.cycle(cycle);
kpeter@815
   933
      buildResidualNetwork();
kpeter@864
   934
      while (mmc.findCycleMean() && mmc.cycleCost() < 0) {
kpeter@815
   935
        // Find the cycle
kpeter@815
   936
        mmc.findCycle();
kpeter@814
   937
kpeter@815
   938
        // Compute delta value
kpeter@815
   939
        Value delta = INF;
kpeter@815
   940
        for (SPathArcIt a(cycle); a != INVALID; ++a) {
kpeter@815
   941
          Value d = _res_cap[_id_vec[_sgr.id(a)]];
kpeter@815
   942
          if (d < delta) delta = d;
kpeter@815
   943
        }
kpeter@814
   944
kpeter@815
   945
        // Augment along the cycle
kpeter@815
   946
        for (SPathArcIt a(cycle); a != INVALID; ++a) {
kpeter@815
   947
          int j = _id_vec[_sgr.id(a)];
kpeter@815
   948
          _res_cap[j] -= delta;
kpeter@815
   949
          _res_cap[_reverse[j]] += delta;
kpeter@815
   950
        }
kpeter@815
   951
alpar@877
   952
        // Rebuild the residual network
kpeter@815
   953
        buildResidualNetwork();
kpeter@815
   954
      }
kpeter@815
   955
    }
kpeter@815
   956
kpeter@815
   957
    // Execute the "Cancel And Tighten" method
kpeter@815
   958
    void startCancelAndTighten() {
kpeter@815
   959
      // Constants for the min mean cycle computations
kpeter@815
   960
      const double LIMIT_FACTOR = 1.0;
kpeter@815
   961
      const int MIN_LIMIT = 5;
kpeter@815
   962
kpeter@815
   963
      // Contruct auxiliary data vectors
kpeter@815
   964
      DoubleVector pi(_res_node_num, 0.0);
kpeter@815
   965
      IntVector level(_res_node_num);
kpeter@839
   966
      BoolVector reached(_res_node_num);
kpeter@839
   967
      BoolVector processed(_res_node_num);
kpeter@815
   968
      IntVector pred_node(_res_node_num);
kpeter@815
   969
      IntVector pred_arc(_res_node_num);
kpeter@815
   970
      std::vector<int> stack(_res_node_num);
kpeter@815
   971
      std::vector<int> proc_vector(_res_node_num);
kpeter@815
   972
kpeter@815
   973
      // Initialize epsilon
kpeter@815
   974
      double epsilon = 0;
kpeter@815
   975
      for (int a = 0; a != _res_arc_num; ++a) {
kpeter@815
   976
        if (_res_cap[a] > 0 && -_cost[a] > epsilon)
kpeter@815
   977
          epsilon = -_cost[a];
kpeter@815
   978
      }
kpeter@815
   979
kpeter@815
   980
      // Start phases
kpeter@815
   981
      Tolerance<double> tol;
kpeter@815
   982
      tol.epsilon(1e-6);
kpeter@815
   983
      int limit = int(LIMIT_FACTOR * std::sqrt(double(_res_node_num)));
kpeter@815
   984
      if (limit < MIN_LIMIT) limit = MIN_LIMIT;
kpeter@815
   985
      int iter = limit;
kpeter@815
   986
      while (epsilon * _res_node_num >= 1) {
kpeter@815
   987
        // Find and cancel cycles in the admissible network using DFS
kpeter@815
   988
        for (int u = 0; u != _res_node_num; ++u) {
kpeter@815
   989
          reached[u] = false;
kpeter@815
   990
          processed[u] = false;
kpeter@815
   991
        }
kpeter@815
   992
        int stack_head = -1;
kpeter@815
   993
        int proc_head = -1;
kpeter@815
   994
        for (int start = 0; start != _res_node_num; ++start) {
kpeter@815
   995
          if (reached[start]) continue;
kpeter@815
   996
kpeter@815
   997
          // New start node
kpeter@815
   998
          reached[start] = true;
kpeter@815
   999
          pred_arc[start] = -1;
kpeter@815
  1000
          pred_node[start] = -1;
kpeter@815
  1001
kpeter@815
  1002
          // Find the first admissible outgoing arc
kpeter@815
  1003
          double p = pi[start];
kpeter@815
  1004
          int a = _first_out[start];
kpeter@815
  1005
          int last_out = _first_out[start+1];
kpeter@815
  1006
          for (; a != last_out && (_res_cap[a] == 0 ||
kpeter@815
  1007
               !tol.negative(_cost[a] + p - pi[_target[a]])); ++a) ;
kpeter@815
  1008
          if (a == last_out) {
kpeter@815
  1009
            processed[start] = true;
kpeter@815
  1010
            proc_vector[++proc_head] = start;
kpeter@815
  1011
            continue;
kpeter@815
  1012
          }
kpeter@815
  1013
          stack[++stack_head] = a;
kpeter@815
  1014
kpeter@815
  1015
          while (stack_head >= 0) {
kpeter@815
  1016
            int sa = stack[stack_head];
kpeter@815
  1017
            int u = _source[sa];
kpeter@815
  1018
            int v = _target[sa];
kpeter@815
  1019
kpeter@815
  1020
            if (!reached[v]) {
kpeter@815
  1021
              // A new node is reached
kpeter@815
  1022
              reached[v] = true;
kpeter@815
  1023
              pred_node[v] = u;
kpeter@815
  1024
              pred_arc[v] = sa;
kpeter@815
  1025
              p = pi[v];
kpeter@815
  1026
              a = _first_out[v];
kpeter@815
  1027
              last_out = _first_out[v+1];
kpeter@815
  1028
              for (; a != last_out && (_res_cap[a] == 0 ||
kpeter@815
  1029
                   !tol.negative(_cost[a] + p - pi[_target[a]])); ++a) ;
kpeter@815
  1030
              stack[++stack_head] = a == last_out ? -1 : a;
kpeter@815
  1031
            } else {
kpeter@815
  1032
              if (!processed[v]) {
kpeter@815
  1033
                // A cycle is found
kpeter@815
  1034
                int n, w = u;
kpeter@815
  1035
                Value d, delta = _res_cap[sa];
kpeter@815
  1036
                for (n = u; n != v; n = pred_node[n]) {
kpeter@815
  1037
                  d = _res_cap[pred_arc[n]];
kpeter@815
  1038
                  if (d <= delta) {
kpeter@815
  1039
                    delta = d;
kpeter@815
  1040
                    w = pred_node[n];
kpeter@815
  1041
                  }
kpeter@815
  1042
                }
kpeter@815
  1043
kpeter@815
  1044
                // Augment along the cycle
kpeter@815
  1045
                _res_cap[sa] -= delta;
kpeter@815
  1046
                _res_cap[_reverse[sa]] += delta;
kpeter@815
  1047
                for (n = u; n != v; n = pred_node[n]) {
kpeter@815
  1048
                  int pa = pred_arc[n];
kpeter@815
  1049
                  _res_cap[pa] -= delta;
kpeter@815
  1050
                  _res_cap[_reverse[pa]] += delta;
kpeter@815
  1051
                }
kpeter@815
  1052
                for (n = u; stack_head > 0 && n != w; n = pred_node[n]) {
kpeter@815
  1053
                  --stack_head;
kpeter@815
  1054
                  reached[n] = false;
kpeter@815
  1055
                }
kpeter@815
  1056
                u = w;
kpeter@815
  1057
              }
kpeter@815
  1058
              v = u;
kpeter@815
  1059
kpeter@815
  1060
              // Find the next admissible outgoing arc
kpeter@815
  1061
              p = pi[v];
kpeter@815
  1062
              a = stack[stack_head] + 1;
kpeter@815
  1063
              last_out = _first_out[v+1];
kpeter@815
  1064
              for (; a != last_out && (_res_cap[a] == 0 ||
kpeter@815
  1065
                   !tol.negative(_cost[a] + p - pi[_target[a]])); ++a) ;
kpeter@815
  1066
              stack[stack_head] = a == last_out ? -1 : a;
kpeter@815
  1067
            }
kpeter@815
  1068
kpeter@815
  1069
            while (stack_head >= 0 && stack[stack_head] == -1) {
kpeter@815
  1070
              processed[v] = true;
kpeter@815
  1071
              proc_vector[++proc_head] = v;
kpeter@815
  1072
              if (--stack_head >= 0) {
kpeter@815
  1073
                // Find the next admissible outgoing arc
kpeter@815
  1074
                v = _source[stack[stack_head]];
kpeter@815
  1075
                p = pi[v];
kpeter@815
  1076
                a = stack[stack_head] + 1;
kpeter@815
  1077
                last_out = _first_out[v+1];
kpeter@815
  1078
                for (; a != last_out && (_res_cap[a] == 0 ||
kpeter@815
  1079
                     !tol.negative(_cost[a] + p - pi[_target[a]])); ++a) ;
kpeter@815
  1080
                stack[stack_head] = a == last_out ? -1 : a;
kpeter@815
  1081
              }
kpeter@815
  1082
            }
kpeter@815
  1083
          }
kpeter@815
  1084
        }
kpeter@815
  1085
kpeter@815
  1086
        // Tighten potentials and epsilon
kpeter@815
  1087
        if (--iter > 0) {
kpeter@815
  1088
          for (int u = 0; u != _res_node_num; ++u) {
kpeter@815
  1089
            level[u] = 0;
kpeter@815
  1090
          }
kpeter@815
  1091
          for (int i = proc_head; i > 0; --i) {
kpeter@815
  1092
            int u = proc_vector[i];
kpeter@815
  1093
            double p = pi[u];
kpeter@815
  1094
            int l = level[u] + 1;
kpeter@815
  1095
            int last_out = _first_out[u+1];
kpeter@815
  1096
            for (int a = _first_out[u]; a != last_out; ++a) {
kpeter@815
  1097
              int v = _target[a];
kpeter@815
  1098
              if (_res_cap[a] > 0 && tol.negative(_cost[a] + p - pi[v]) &&
kpeter@815
  1099
                  l > level[v]) level[v] = l;
kpeter@815
  1100
            }
kpeter@814
  1101
          }
kpeter@814
  1102
kpeter@815
  1103
          // Modify potentials
kpeter@815
  1104
          double q = std::numeric_limits<double>::max();
kpeter@815
  1105
          for (int u = 0; u != _res_node_num; ++u) {
kpeter@815
  1106
            int lu = level[u];
kpeter@815
  1107
            double p, pu = pi[u];
kpeter@815
  1108
            int last_out = _first_out[u+1];
kpeter@815
  1109
            for (int a = _first_out[u]; a != last_out; ++a) {
kpeter@815
  1110
              if (_res_cap[a] == 0) continue;
kpeter@815
  1111
              int v = _target[a];
kpeter@815
  1112
              int ld = lu - level[v];
kpeter@815
  1113
              if (ld > 0) {
kpeter@815
  1114
                p = (_cost[a] + pu - pi[v] + epsilon) / (ld + 1);
kpeter@815
  1115
                if (p < q) q = p;
kpeter@815
  1116
              }
kpeter@815
  1117
            }
kpeter@815
  1118
          }
kpeter@815
  1119
          for (int u = 0; u != _res_node_num; ++u) {
kpeter@815
  1120
            pi[u] -= q * level[u];
kpeter@815
  1121
          }
kpeter@814
  1122
kpeter@815
  1123
          // Modify epsilon
kpeter@815
  1124
          epsilon = 0;
kpeter@815
  1125
          for (int u = 0; u != _res_node_num; ++u) {
kpeter@815
  1126
            double curr, pu = pi[u];
kpeter@815
  1127
            int last_out = _first_out[u+1];
kpeter@815
  1128
            for (int a = _first_out[u]; a != last_out; ++a) {
kpeter@815
  1129
              if (_res_cap[a] == 0) continue;
kpeter@815
  1130
              curr = _cost[a] + pu - pi[_target[a]];
kpeter@815
  1131
              if (-curr > epsilon) epsilon = -curr;
kpeter@815
  1132
            }
kpeter@815
  1133
          }
kpeter@815
  1134
        } else {
kpeter@864
  1135
          typedef HowardMmc<StaticDigraph, CostArcMap> MMC;
kpeter@815
  1136
          typedef typename BellmanFord<StaticDigraph, CostArcMap>
kpeter@815
  1137
            ::template SetDistMap<CostNodeMap>::Create BF;
kpeter@815
  1138
kpeter@815
  1139
          // Set epsilon to the minimum cycle mean
kpeter@815
  1140
          buildResidualNetwork();
kpeter@815
  1141
          MMC mmc(_sgr, _cost_map);
kpeter@864
  1142
          mmc.findCycleMean();
kpeter@815
  1143
          epsilon = -mmc.cycleMean();
kpeter@864
  1144
          Cost cycle_cost = mmc.cycleCost();
kpeter@864
  1145
          int cycle_size = mmc.cycleSize();
alpar@877
  1146
kpeter@815
  1147
          // Compute feasible potentials for the current epsilon
kpeter@815
  1148
          for (int i = 0; i != int(_cost_vec.size()); ++i) {
kpeter@815
  1149
            _cost_vec[i] = cycle_size * _cost_vec[i] - cycle_cost;
kpeter@815
  1150
          }
kpeter@815
  1151
          BF bf(_sgr, _cost_map);
kpeter@815
  1152
          bf.distMap(_pi_map);
kpeter@815
  1153
          bf.init(0);
kpeter@815
  1154
          bf.start();
kpeter@815
  1155
          for (int u = 0; u != _res_node_num; ++u) {
kpeter@815
  1156
            pi[u] = static_cast<double>(_pi[u]) / cycle_size;
kpeter@815
  1157
          }
alpar@877
  1158
kpeter@815
  1159
          iter = limit;
kpeter@814
  1160
        }
kpeter@814
  1161
      }
kpeter@814
  1162
    }
kpeter@814
  1163
kpeter@814
  1164
  }; //class CycleCanceling
kpeter@814
  1165
kpeter@814
  1166
  ///@}
kpeter@814
  1167
kpeter@814
  1168
} //namespace lemon
kpeter@814
  1169
kpeter@814
  1170
#endif //LEMON_CYCLE_CANCELING_H