gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Change the default scaling factor in CostScaling (#417)
0 1 0
default
1 file changed with 3 insertions and 2 deletions:
↑ Collapse diff ↑
Show white space 32768 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_COST_SCALING_H
20 20
#define LEMON_COST_SCALING_H
21 21

	
22 22
/// \ingroup min_cost_flow_algs
23 23
/// \file
24 24
/// \brief Cost scaling algorithm for finding a minimum cost flow.
25 25

	
26 26
#include <vector>
27 27
#include <deque>
28 28
#include <limits>
29 29

	
30 30
#include <lemon/core.h>
31 31
#include <lemon/maps.h>
32 32
#include <lemon/math.h>
33 33
#include <lemon/static_graph.h>
34 34
#include <lemon/circulation.h>
35 35
#include <lemon/bellman_ford.h>
36 36

	
37 37
namespace lemon {
38 38

	
39 39
  /// \brief Default traits class of CostScaling algorithm.
40 40
  ///
41 41
  /// Default traits class of CostScaling algorithm.
42 42
  /// \tparam GR Digraph type.
43 43
  /// \tparam V The number type used for flow amounts, capacity bounds
44 44
  /// and supply values. By default it is \c int.
45 45
  /// \tparam C The number type used for costs and potentials.
46 46
  /// By default it is the same as \c V.
47 47
#ifdef DOXYGEN
48 48
  template <typename GR, typename V = int, typename C = V>
49 49
#else
50 50
  template < typename GR, typename V = int, typename C = V,
51 51
             bool integer = std::numeric_limits<C>::is_integer >
52 52
#endif
53 53
  struct CostScalingDefaultTraits
54 54
  {
55 55
    /// The type of the digraph
56 56
    typedef GR Digraph;
57 57
    /// The type of the flow amounts, capacity bounds and supply values
58 58
    typedef V Value;
59 59
    /// The type of the arc costs
60 60
    typedef C Cost;
61 61

	
62 62
    /// \brief The large cost type used for internal computations
63 63
    ///
64 64
    /// The large cost type used for internal computations.
65 65
    /// It is \c long \c long if the \c Cost type is integer,
66 66
    /// otherwise it is \c double.
67 67
    /// \c Cost must be convertible to \c LargeCost.
68 68
    typedef double LargeCost;
69 69
  };
70 70

	
71 71
  // Default traits class for integer cost types
72 72
  template <typename GR, typename V, typename C>
73 73
  struct CostScalingDefaultTraits<GR, V, C, true>
74 74
  {
75 75
    typedef GR Digraph;
76 76
    typedef V Value;
77 77
    typedef C Cost;
78 78
#ifdef LEMON_HAVE_LONG_LONG
79 79
    typedef long long LargeCost;
80 80
#else
81 81
    typedef long LargeCost;
82 82
#endif
83 83
  };
84 84

	
85 85

	
86 86
  /// \addtogroup min_cost_flow_algs
87 87
  /// @{
88 88

	
89 89
  /// \brief Implementation of the Cost Scaling algorithm for
90 90
  /// finding a \ref min_cost_flow "minimum cost flow".
91 91
  ///
92 92
  /// \ref CostScaling implements a cost scaling algorithm that performs
93 93
  /// push/augment and relabel operations for finding a \ref min_cost_flow
94 94
  /// "minimum cost flow" \ref amo93networkflows, \ref goldberg90approximation,
95 95
  /// \ref goldberg97efficient, \ref bunnagel98efficient.
96 96
  /// It is a highly efficient primal-dual solution method, which
97 97
  /// can be viewed as the generalization of the \ref Preflow
98 98
  /// "preflow push-relabel" algorithm for the maximum flow problem.
99 99
  ///
100 100
  /// In general, \ref NetworkSimplex and \ref CostScaling are the fastest
101 101
  /// implementations available in LEMON for this problem.
102 102
  ///
103 103
  /// Most of the parameters of the problem (except for the digraph)
104 104
  /// can be given using separate functions, and the algorithm can be
105 105
  /// executed using the \ref run() function. If some parameters are not
106 106
  /// specified, then default values will be used.
107 107
  ///
108 108
  /// \tparam GR The digraph type the algorithm runs on.
109 109
  /// \tparam V The number type used for flow amounts, capacity bounds
110 110
  /// and supply values in the algorithm. By default, it is \c int.
111 111
  /// \tparam C The number type used for costs and potentials in the
112 112
  /// algorithm. By default, it is the same as \c V.
113 113
  /// \tparam TR The traits class that defines various types used by the
114 114
  /// algorithm. By default, it is \ref CostScalingDefaultTraits
115 115
  /// "CostScalingDefaultTraits<GR, V, C>".
116 116
  /// In most cases, this parameter should not be set directly,
117 117
  /// consider to use the named template parameters instead.
118 118
  ///
119 119
  /// \warning Both \c V and \c C must be signed number types.
120 120
  /// \warning All input data (capacities, supply values, and costs) must
121 121
  /// be integer.
122 122
  /// \warning This algorithm does not support negative costs for
123 123
  /// arcs having infinite upper bound.
124 124
  ///
125 125
  /// \note %CostScaling provides three different internal methods,
126 126
  /// from which the most efficient one is used by default.
127 127
  /// For more information, see \ref Method.
128 128
#ifdef DOXYGEN
129 129
  template <typename GR, typename V, typename C, typename TR>
130 130
#else
131 131
  template < typename GR, typename V = int, typename C = V,
132 132
             typename TR = CostScalingDefaultTraits<GR, V, C> >
133 133
#endif
134 134
  class CostScaling
135 135
  {
136 136
  public:
137 137

	
138 138
    /// The type of the digraph
139 139
    typedef typename TR::Digraph Digraph;
140 140
    /// The type of the flow amounts, capacity bounds and supply values
141 141
    typedef typename TR::Value Value;
142 142
    /// The type of the arc costs
143 143
    typedef typename TR::Cost Cost;
144 144

	
145 145
    /// \brief The large cost type
146 146
    ///
147 147
    /// The large cost type used for internal computations.
148 148
    /// By default, it is \c long \c long if the \c Cost type is integer,
149 149
    /// otherwise it is \c double.
150 150
    typedef typename TR::LargeCost LargeCost;
151 151

	
152 152
    /// The \ref CostScalingDefaultTraits "traits class" of the algorithm
153 153
    typedef TR Traits;
154 154

	
155 155
  public:
156 156

	
157 157
    /// \brief Problem type constants for the \c run() function.
158 158
    ///
159 159
    /// Enum type containing the problem type constants that can be
160 160
    /// returned by the \ref run() function of the algorithm.
161 161
    enum ProblemType {
162 162
      /// The problem has no feasible solution (flow).
163 163
      INFEASIBLE,
164 164
      /// The problem has optimal solution (i.e. it is feasible and
165 165
      /// bounded), and the algorithm has found optimal flow and node
166 166
      /// potentials (primal and dual solutions).
167 167
      OPTIMAL,
168 168
      /// The digraph contains an arc of negative cost and infinite
169 169
      /// upper bound. It means that the objective function is unbounded
170 170
      /// on that arc, however, note that it could actually be bounded
171 171
      /// over the feasible flows, but this algroithm cannot handle
172 172
      /// these cases.
173 173
      UNBOUNDED
174 174
    };
175 175

	
176 176
    /// \brief Constants for selecting the internal method.
177 177
    ///
178 178
    /// Enum type containing constants for selecting the internal method
179 179
    /// for the \ref run() function.
180 180
    ///
181 181
    /// \ref CostScaling provides three internal methods that differ mainly
182 182
    /// in their base operations, which are used in conjunction with the
183 183
    /// relabel operation.
184 184
    /// By default, the so called \ref PARTIAL_AUGMENT
185 185
    /// "Partial Augment-Relabel" method is used, which turned out to be
186 186
    /// the most efficient and the most robust on various test inputs.
187 187
    /// However, the other methods can be selected using the \ref run()
188 188
    /// function with the proper parameter.
189 189
    enum Method {
190 190
      /// Local push operations are used, i.e. flow is moved only on one
191 191
      /// admissible arc at once.
192 192
      PUSH,
193 193
      /// Augment operations are used, i.e. flow is moved on admissible
194 194
      /// paths from a node with excess to a node with deficit.
195 195
      AUGMENT,
196 196
      /// Partial augment operations are used, i.e. flow is moved on
197 197
      /// admissible paths started from a node with excess, but the
198 198
      /// lengths of these paths are limited. This method can be viewed
199 199
      /// as a combined version of the previous two operations.
200 200
      PARTIAL_AUGMENT
201 201
    };
202 202

	
203 203
  private:
204 204

	
205 205
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
206 206

	
207 207
    typedef std::vector<int> IntVector;
208 208
    typedef std::vector<Value> ValueVector;
209 209
    typedef std::vector<Cost> CostVector;
210 210
    typedef std::vector<LargeCost> LargeCostVector;
211 211
    typedef std::vector<char> BoolVector;
212 212
    // Note: vector<char> is used instead of vector<bool> for efficiency reasons
213 213

	
214 214
  private:
215 215

	
216 216
    template <typename KT, typename VT>
217 217
    class StaticVectorMap {
218 218
    public:
219 219
      typedef KT Key;
220 220
      typedef VT Value;
221 221

	
222 222
      StaticVectorMap(std::vector<Value>& v) : _v(v) {}
223 223

	
224 224
      const Value& operator[](const Key& key) const {
225 225
        return _v[StaticDigraph::id(key)];
226 226
      }
227 227

	
228 228
      Value& operator[](const Key& key) {
229 229
        return _v[StaticDigraph::id(key)];
230 230
      }
231 231

	
232 232
      void set(const Key& key, const Value& val) {
233 233
        _v[StaticDigraph::id(key)] = val;
234 234
      }
235 235

	
236 236
    private:
237 237
      std::vector<Value>& _v;
238 238
    };
239 239

	
240 240
    typedef StaticVectorMap<StaticDigraph::Arc, LargeCost> LargeCostArcMap;
241 241

	
242 242
  private:
243 243

	
244 244
    // Data related to the underlying digraph
245 245
    const GR &_graph;
246 246
    int _node_num;
247 247
    int _arc_num;
248 248
    int _res_node_num;
249 249
    int _res_arc_num;
250 250
    int _root;
251 251

	
252 252
    // Parameters of the problem
253 253
    bool _have_lower;
254 254
    Value _sum_supply;
255 255
    int _sup_node_num;
256 256

	
257 257
    // Data structures for storing the digraph
258 258
    IntNodeMap _node_id;
259 259
    IntArcMap _arc_idf;
260 260
    IntArcMap _arc_idb;
261 261
    IntVector _first_out;
262 262
    BoolVector _forward;
263 263
    IntVector _source;
264 264
    IntVector _target;
265 265
    IntVector _reverse;
266 266

	
267 267
    // Node and arc data
268 268
    ValueVector _lower;
269 269
    ValueVector _upper;
270 270
    CostVector _scost;
271 271
    ValueVector _supply;
272 272

	
273 273
    ValueVector _res_cap;
274 274
    LargeCostVector _cost;
275 275
    LargeCostVector _pi;
276 276
    ValueVector _excess;
277 277
    IntVector _next_out;
278 278
    std::deque<int> _active_nodes;
279 279

	
280 280
    // Data for scaling
281 281
    LargeCost _epsilon;
282 282
    int _alpha;
283 283

	
284 284
    IntVector _buckets;
285 285
    IntVector _bucket_next;
286 286
    IntVector _bucket_prev;
287 287
    IntVector _rank;
288 288
    int _max_rank;
289 289

	
290 290
  public:
291 291

	
292 292
    /// \brief Constant for infinite upper bounds (capacities).
293 293
    ///
294 294
    /// Constant for infinite upper bounds (capacities).
295 295
    /// It is \c std::numeric_limits<Value>::infinity() if available,
296 296
    /// \c std::numeric_limits<Value>::max() otherwise.
297 297
    const Value INF;
298 298

	
299 299
  public:
300 300

	
301 301
    /// \name Named Template Parameters
302 302
    /// @{
303 303

	
304 304
    template <typename T>
305 305
    struct SetLargeCostTraits : public Traits {
306 306
      typedef T LargeCost;
307 307
    };
308 308

	
309 309
    /// \brief \ref named-templ-param "Named parameter" for setting
310 310
    /// \c LargeCost type.
311 311
    ///
312 312
    /// \ref named-templ-param "Named parameter" for setting \c LargeCost
313 313
    /// type, which is used for internal computations in the algorithm.
314 314
    /// \c Cost must be convertible to \c LargeCost.
315 315
    template <typename T>
316 316
    struct SetLargeCost
317 317
      : public CostScaling<GR, V, C, SetLargeCostTraits<T> > {
318 318
      typedef  CostScaling<GR, V, C, SetLargeCostTraits<T> > Create;
319 319
    };
320 320

	
321 321
    /// @}
322 322

	
323 323
  protected:
324 324

	
325 325
    CostScaling() {}
326 326

	
327 327
  public:
328 328

	
329 329
    /// \brief Constructor.
330 330
    ///
331 331
    /// The constructor of the class.
332 332
    ///
333 333
    /// \param graph The digraph the algorithm runs on.
334 334
    CostScaling(const GR& graph) :
335 335
      _graph(graph), _node_id(graph), _arc_idf(graph), _arc_idb(graph),
336 336
      INF(std::numeric_limits<Value>::has_infinity ?
337 337
          std::numeric_limits<Value>::infinity() :
338 338
          std::numeric_limits<Value>::max())
339 339
    {
340 340
      // Check the number types
341 341
      LEMON_ASSERT(std::numeric_limits<Value>::is_signed,
342 342
        "The flow type of CostScaling must be signed");
343 343
      LEMON_ASSERT(std::numeric_limits<Cost>::is_signed,
344 344
        "The cost type of CostScaling must be signed");
345 345

	
346 346
      // Reset data structures
347 347
      reset();
348 348
    }
349 349

	
350 350
    /// \name Parameters
351 351
    /// The parameters of the algorithm can be specified using these
352 352
    /// functions.
353 353

	
354 354
    /// @{
355 355

	
356 356
    /// \brief Set the lower bounds on the arcs.
357 357
    ///
358 358
    /// This function sets the lower bounds on the arcs.
359 359
    /// If it is not used before calling \ref run(), the lower bounds
360 360
    /// will be set to zero on all arcs.
361 361
    ///
362 362
    /// \param map An arc map storing the lower bounds.
363 363
    /// Its \c Value type must be convertible to the \c Value type
364 364
    /// of the algorithm.
365 365
    ///
366 366
    /// \return <tt>(*this)</tt>
367 367
    template <typename LowerMap>
368 368
    CostScaling& lowerMap(const LowerMap& map) {
369 369
      _have_lower = true;
370 370
      for (ArcIt a(_graph); a != INVALID; ++a) {
371 371
        _lower[_arc_idf[a]] = map[a];
372 372
        _lower[_arc_idb[a]] = map[a];
373 373
      }
374 374
      return *this;
375 375
    }
376 376

	
377 377
    /// \brief Set the upper bounds (capacities) on the arcs.
378 378
    ///
379 379
    /// This function sets the upper bounds (capacities) on the arcs.
380 380
    /// If it is not used before calling \ref run(), the upper bounds
381 381
    /// will be set to \ref INF on all arcs (i.e. the flow value will be
382 382
    /// unbounded from above).
383 383
    ///
384 384
    /// \param map An arc map storing the upper bounds.
385 385
    /// Its \c Value type must be convertible to the \c Value type
386 386
    /// of the algorithm.
387 387
    ///
388 388
    /// \return <tt>(*this)</tt>
389 389
    template<typename UpperMap>
390 390
    CostScaling& upperMap(const UpperMap& map) {
391 391
      for (ArcIt a(_graph); a != INVALID; ++a) {
392 392
        _upper[_arc_idf[a]] = map[a];
393 393
      }
394 394
      return *this;
395 395
    }
396 396

	
397 397
    /// \brief Set the costs of the arcs.
398 398
    ///
399 399
    /// This function sets the costs of the arcs.
400 400
    /// If it is not used before calling \ref run(), the costs
401 401
    /// will be set to \c 1 on all arcs.
402 402
    ///
403 403
    /// \param map An arc map storing the costs.
404 404
    /// Its \c Value type must be convertible to the \c Cost type
405 405
    /// of the algorithm.
406 406
    ///
407 407
    /// \return <tt>(*this)</tt>
408 408
    template<typename CostMap>
409 409
    CostScaling& costMap(const CostMap& map) {
410 410
      for (ArcIt a(_graph); a != INVALID; ++a) {
411 411
        _scost[_arc_idf[a]] =  map[a];
412 412
        _scost[_arc_idb[a]] = -map[a];
413 413
      }
414 414
      return *this;
415 415
    }
416 416

	
417 417
    /// \brief Set the supply values of the nodes.
418 418
    ///
419 419
    /// This function sets the supply values of the nodes.
420 420
    /// If neither this function nor \ref stSupply() is used before
421 421
    /// calling \ref run(), the supply of each node will be set to zero.
422 422
    ///
423 423
    /// \param map A node map storing the supply values.
424 424
    /// Its \c Value type must be convertible to the \c Value type
425 425
    /// of the algorithm.
426 426
    ///
427 427
    /// \return <tt>(*this)</tt>
428 428
    template<typename SupplyMap>
429 429
    CostScaling& supplyMap(const SupplyMap& map) {
430 430
      for (NodeIt n(_graph); n != INVALID; ++n) {
431 431
        _supply[_node_id[n]] = map[n];
432 432
      }
433 433
      return *this;
434 434
    }
435 435

	
436 436
    /// \brief Set single source and target nodes and a supply value.
437 437
    ///
438 438
    /// This function sets a single source node and a single target node
439 439
    /// and the required flow value.
440 440
    /// If neither this function nor \ref supplyMap() is used before
441 441
    /// calling \ref run(), the supply of each node will be set to zero.
442 442
    ///
443 443
    /// Using this function has the same effect as using \ref supplyMap()
444 444
    /// with a map in which \c k is assigned to \c s, \c -k is
445 445
    /// assigned to \c t and all other nodes have zero supply value.
446 446
    ///
447 447
    /// \param s The source node.
448 448
    /// \param t The target node.
449 449
    /// \param k The required amount of flow from node \c s to node \c t
450 450
    /// (i.e. the supply of \c s and the demand of \c t).
451 451
    ///
452 452
    /// \return <tt>(*this)</tt>
453 453
    CostScaling& stSupply(const Node& s, const Node& t, Value k) {
454 454
      for (int i = 0; i != _res_node_num; ++i) {
455 455
        _supply[i] = 0;
456 456
      }
457 457
      _supply[_node_id[s]] =  k;
458 458
      _supply[_node_id[t]] = -k;
459 459
      return *this;
460 460
    }
461 461

	
462 462
    /// @}
463 463

	
464 464
    /// \name Execution control
465 465
    /// The algorithm can be executed using \ref run().
466 466

	
467 467
    /// @{
468 468

	
469 469
    /// \brief Run the algorithm.
470 470
    ///
471 471
    /// This function runs the algorithm.
472 472
    /// The paramters can be specified using functions \ref lowerMap(),
473 473
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
474 474
    /// For example,
475 475
    /// \code
476 476
    ///   CostScaling<ListDigraph> cs(graph);
477 477
    ///   cs.lowerMap(lower).upperMap(upper).costMap(cost)
478 478
    ///     .supplyMap(sup).run();
479 479
    /// \endcode
480 480
    ///
481 481
    /// This function can be called more than once. All the given parameters
482 482
    /// are kept for the next call, unless \ref resetParams() or \ref reset()
483 483
    /// is used, thus only the modified parameters have to be set again.
484 484
    /// If the underlying digraph was also modified after the construction
485 485
    /// of the class (or the last \ref reset() call), then the \ref reset()
486 486
    /// function must be called.
487 487
    ///
488 488
    /// \param method The internal method that will be used in the
489 489
    /// algorithm. For more information, see \ref Method.
490
    /// \param factor The cost scaling factor. It must be larger than one.
490
    /// \param factor The cost scaling factor. It must be at least two.
491 491
    ///
492 492
    /// \return \c INFEASIBLE if no feasible flow exists,
493 493
    /// \n \c OPTIMAL if the problem has optimal solution
494 494
    /// (i.e. it is feasible and bounded), and the algorithm has found
495 495
    /// optimal flow and node potentials (primal and dual solutions),
496 496
    /// \n \c UNBOUNDED if the digraph contains an arc of negative cost
497 497
    /// and infinite upper bound. It means that the objective function
498 498
    /// is unbounded on that arc, however, note that it could actually be
499 499
    /// bounded over the feasible flows, but this algroithm cannot handle
500 500
    /// these cases.
501 501
    ///
502 502
    /// \see ProblemType, Method
503 503
    /// \see resetParams(), reset()
504
    ProblemType run(Method method = PARTIAL_AUGMENT, int factor = 8) {
504
    ProblemType run(Method method = PARTIAL_AUGMENT, int factor = 16) {
505
      LEMON_ASSERT(factor >= 2, "The scaling factor must be at least 2");
505 506
      _alpha = factor;
506 507
      ProblemType pt = init();
507 508
      if (pt != OPTIMAL) return pt;
508 509
      start(method);
509 510
      return OPTIMAL;
510 511
    }
511 512

	
512 513
    /// \brief Reset all the parameters that have been given before.
513 514
    ///
514 515
    /// This function resets all the paramaters that have been given
515 516
    /// before using functions \ref lowerMap(), \ref upperMap(),
516 517
    /// \ref costMap(), \ref supplyMap(), \ref stSupply().
517 518
    ///
518 519
    /// It is useful for multiple \ref run() calls. Basically, all the given
519 520
    /// parameters are kept for the next \ref run() call, unless
520 521
    /// \ref resetParams() or \ref reset() is used.
521 522
    /// If the underlying digraph was also modified after the construction
522 523
    /// of the class or the last \ref reset() call, then the \ref reset()
523 524
    /// function must be used, otherwise \ref resetParams() is sufficient.
524 525
    ///
525 526
    /// For example,
526 527
    /// \code
527 528
    ///   CostScaling<ListDigraph> cs(graph);
528 529
    ///
529 530
    ///   // First run
530 531
    ///   cs.lowerMap(lower).upperMap(upper).costMap(cost)
531 532
    ///     .supplyMap(sup).run();
532 533
    ///
533 534
    ///   // Run again with modified cost map (resetParams() is not called,
534 535
    ///   // so only the cost map have to be set again)
535 536
    ///   cost[e] += 100;
536 537
    ///   cs.costMap(cost).run();
537 538
    ///
538 539
    ///   // Run again from scratch using resetParams()
539 540
    ///   // (the lower bounds will be set to zero on all arcs)
540 541
    ///   cs.resetParams();
541 542
    ///   cs.upperMap(capacity).costMap(cost)
542 543
    ///     .supplyMap(sup).run();
543 544
    /// \endcode
544 545
    ///
545 546
    /// \return <tt>(*this)</tt>
546 547
    ///
547 548
    /// \see reset(), run()
548 549
    CostScaling& resetParams() {
549 550
      for (int i = 0; i != _res_node_num; ++i) {
550 551
        _supply[i] = 0;
551 552
      }
552 553
      int limit = _first_out[_root];
553 554
      for (int j = 0; j != limit; ++j) {
554 555
        _lower[j] = 0;
555 556
        _upper[j] = INF;
556 557
        _scost[j] = _forward[j] ? 1 : -1;
557 558
      }
558 559
      for (int j = limit; j != _res_arc_num; ++j) {
559 560
        _lower[j] = 0;
560 561
        _upper[j] = INF;
561 562
        _scost[j] = 0;
562 563
        _scost[_reverse[j]] = 0;
563 564
      }
564 565
      _have_lower = false;
565 566
      return *this;
566 567
    }
567 568

	
568 569
    /// \brief Reset the internal data structures and all the parameters
569 570
    /// that have been given before.
570 571
    ///
571 572
    /// This function resets the internal data structures and all the
572 573
    /// paramaters that have been given before using functions \ref lowerMap(),
573 574
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
574 575
    ///
575 576
    /// It is useful for multiple \ref run() calls. By default, all the given
576 577
    /// parameters are kept for the next \ref run() call, unless
577 578
    /// \ref resetParams() or \ref reset() is used.
578 579
    /// If the underlying digraph was also modified after the construction
579 580
    /// of the class or the last \ref reset() call, then the \ref reset()
580 581
    /// function must be used, otherwise \ref resetParams() is sufficient.
581 582
    ///
582 583
    /// See \ref resetParams() for examples.
583 584
    ///
584 585
    /// \return <tt>(*this)</tt>
585 586
    ///
586 587
    /// \see resetParams(), run()
587 588
    CostScaling& reset() {
588 589
      // Resize vectors
589 590
      _node_num = countNodes(_graph);
590 591
      _arc_num = countArcs(_graph);
591 592
      _res_node_num = _node_num + 1;
592 593
      _res_arc_num = 2 * (_arc_num + _node_num);
593 594
      _root = _node_num;
594 595

	
595 596
      _first_out.resize(_res_node_num + 1);
596 597
      _forward.resize(_res_arc_num);
597 598
      _source.resize(_res_arc_num);
598 599
      _target.resize(_res_arc_num);
599 600
      _reverse.resize(_res_arc_num);
600 601

	
601 602
      _lower.resize(_res_arc_num);
602 603
      _upper.resize(_res_arc_num);
603 604
      _scost.resize(_res_arc_num);
604 605
      _supply.resize(_res_node_num);
605 606

	
606 607
      _res_cap.resize(_res_arc_num);
607 608
      _cost.resize(_res_arc_num);
608 609
      _pi.resize(_res_node_num);
609 610
      _excess.resize(_res_node_num);
610 611
      _next_out.resize(_res_node_num);
611 612

	
612 613
      // Copy the graph
613 614
      int i = 0, j = 0, k = 2 * _arc_num + _node_num;
614 615
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
615 616
        _node_id[n] = i;
616 617
      }
617 618
      i = 0;
618 619
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
619 620
        _first_out[i] = j;
620 621
        for (OutArcIt a(_graph, n); a != INVALID; ++a, ++j) {
621 622
          _arc_idf[a] = j;
622 623
          _forward[j] = true;
623 624
          _source[j] = i;
624 625
          _target[j] = _node_id[_graph.runningNode(a)];
625 626
        }
626 627
        for (InArcIt a(_graph, n); a != INVALID; ++a, ++j) {
627 628
          _arc_idb[a] = j;
628 629
          _forward[j] = false;
629 630
          _source[j] = i;
630 631
          _target[j] = _node_id[_graph.runningNode(a)];
631 632
        }
632 633
        _forward[j] = false;
633 634
        _source[j] = i;
634 635
        _target[j] = _root;
635 636
        _reverse[j] = k;
636 637
        _forward[k] = true;
637 638
        _source[k] = _root;
638 639
        _target[k] = i;
639 640
        _reverse[k] = j;
640 641
        ++j; ++k;
641 642
      }
642 643
      _first_out[i] = j;
643 644
      _first_out[_res_node_num] = k;
644 645
      for (ArcIt a(_graph); a != INVALID; ++a) {
645 646
        int fi = _arc_idf[a];
646 647
        int bi = _arc_idb[a];
647 648
        _reverse[fi] = bi;
648 649
        _reverse[bi] = fi;
649 650
      }
650 651

	
651 652
      // Reset parameters
652 653
      resetParams();
653 654
      return *this;
654 655
    }
655 656

	
656 657
    /// @}
657 658

	
658 659
    /// \name Query Functions
659 660
    /// The results of the algorithm can be obtained using these
660 661
    /// functions.\n
661 662
    /// The \ref run() function must be called before using them.
662 663

	
663 664
    /// @{
664 665

	
665 666
    /// \brief Return the total cost of the found flow.
666 667
    ///
667 668
    /// This function returns the total cost of the found flow.
668 669
    /// Its complexity is O(e).
669 670
    ///
670 671
    /// \note The return type of the function can be specified as a
671 672
    /// template parameter. For example,
672 673
    /// \code
673 674
    ///   cs.totalCost<double>();
674 675
    /// \endcode
675 676
    /// It is useful if the total cost cannot be stored in the \c Cost
676 677
    /// type of the algorithm, which is the default return type of the
677 678
    /// function.
678 679
    ///
679 680
    /// \pre \ref run() must be called before using this function.
680 681
    template <typename Number>
681 682
    Number totalCost() const {
682 683
      Number c = 0;
683 684
      for (ArcIt a(_graph); a != INVALID; ++a) {
684 685
        int i = _arc_idb[a];
685 686
        c += static_cast<Number>(_res_cap[i]) *
686 687
             (-static_cast<Number>(_scost[i]));
687 688
      }
688 689
      return c;
689 690
    }
690 691

	
691 692
#ifndef DOXYGEN
692 693
    Cost totalCost() const {
693 694
      return totalCost<Cost>();
694 695
    }
695 696
#endif
696 697

	
697 698
    /// \brief Return the flow on the given arc.
698 699
    ///
699 700
    /// This function returns the flow on the given arc.
700 701
    ///
701 702
    /// \pre \ref run() must be called before using this function.
702 703
    Value flow(const Arc& a) const {
703 704
      return _res_cap[_arc_idb[a]];
704 705
    }
705 706

	
706 707
    /// \brief Return the flow map (the primal solution).
707 708
    ///
708 709
    /// This function copies the flow value on each arc into the given
709 710
    /// map. The \c Value type of the algorithm must be convertible to
710 711
    /// the \c Value type of the map.
711 712
    ///
712 713
    /// \pre \ref run() must be called before using this function.
713 714
    template <typename FlowMap>
714 715
    void flowMap(FlowMap &map) const {
715 716
      for (ArcIt a(_graph); a != INVALID; ++a) {
716 717
        map.set(a, _res_cap[_arc_idb[a]]);
717 718
      }
718 719
    }
719 720

	
720 721
    /// \brief Return the potential (dual value) of the given node.
721 722
    ///
722 723
    /// This function returns the potential (dual value) of the
723 724
    /// given node.
724 725
    ///
725 726
    /// \pre \ref run() must be called before using this function.
726 727
    Cost potential(const Node& n) const {
727 728
      return static_cast<Cost>(_pi[_node_id[n]]);
728 729
    }
729 730

	
730 731
    /// \brief Return the potential map (the dual solution).
731 732
    ///
732 733
    /// This function copies the potential (dual value) of each node
733 734
    /// into the given map.
734 735
    /// The \c Cost type of the algorithm must be convertible to the
735 736
    /// \c Value type of the map.
736 737
    ///
737 738
    /// \pre \ref run() must be called before using this function.
738 739
    template <typename PotentialMap>
739 740
    void potentialMap(PotentialMap &map) const {
740 741
      for (NodeIt n(_graph); n != INVALID; ++n) {
741 742
        map.set(n, static_cast<Cost>(_pi[_node_id[n]]));
742 743
      }
743 744
    }
744 745

	
745 746
    /// @}
746 747

	
747 748
  private:
748 749

	
749 750
    // Initialize the algorithm
750 751
    ProblemType init() {
751 752
      if (_res_node_num <= 1) return INFEASIBLE;
752 753

	
753 754
      // Check the sum of supply values
754 755
      _sum_supply = 0;
755 756
      for (int i = 0; i != _root; ++i) {
756 757
        _sum_supply += _supply[i];
757 758
      }
758 759
      if (_sum_supply > 0) return INFEASIBLE;
759 760

	
760 761

	
761 762
      // Initialize vectors
762 763
      for (int i = 0; i != _res_node_num; ++i) {
763 764
        _pi[i] = 0;
764 765
        _excess[i] = _supply[i];
765 766
      }
766 767

	
767 768
      // Remove infinite upper bounds and check negative arcs
768 769
      const Value MAX = std::numeric_limits<Value>::max();
769 770
      int last_out;
770 771
      if (_have_lower) {
771 772
        for (int i = 0; i != _root; ++i) {
772 773
          last_out = _first_out[i+1];
773 774
          for (int j = _first_out[i]; j != last_out; ++j) {
774 775
            if (_forward[j]) {
775 776
              Value c = _scost[j] < 0 ? _upper[j] : _lower[j];
776 777
              if (c >= MAX) return UNBOUNDED;
777 778
              _excess[i] -= c;
778 779
              _excess[_target[j]] += c;
779 780
            }
780 781
          }
781 782
        }
782 783
      } else {
783 784
        for (int i = 0; i != _root; ++i) {
784 785
          last_out = _first_out[i+1];
785 786
          for (int j = _first_out[i]; j != last_out; ++j) {
786 787
            if (_forward[j] && _scost[j] < 0) {
787 788
              Value c = _upper[j];
788 789
              if (c >= MAX) return UNBOUNDED;
789 790
              _excess[i] -= c;
790 791
              _excess[_target[j]] += c;
791 792
            }
792 793
          }
793 794
        }
794 795
      }
795 796
      Value ex, max_cap = 0;
796 797
      for (int i = 0; i != _res_node_num; ++i) {
797 798
        ex = _excess[i];
798 799
        _excess[i] = 0;
799 800
        if (ex < 0) max_cap -= ex;
800 801
      }
801 802
      for (int j = 0; j != _res_arc_num; ++j) {
802 803
        if (_upper[j] >= MAX) _upper[j] = max_cap;
803 804
      }
804 805

	
805 806
      // Initialize the large cost vector and the epsilon parameter
806 807
      _epsilon = 0;
807 808
      LargeCost lc;
808 809
      for (int i = 0; i != _root; ++i) {
809 810
        last_out = _first_out[i+1];
810 811
        for (int j = _first_out[i]; j != last_out; ++j) {
811 812
          lc = static_cast<LargeCost>(_scost[j]) * _res_node_num * _alpha;
812 813
          _cost[j] = lc;
813 814
          if (lc > _epsilon) _epsilon = lc;
814 815
        }
815 816
      }
816 817
      _epsilon /= _alpha;
817 818

	
818 819
      // Initialize maps for Circulation and remove non-zero lower bounds
819 820
      ConstMap<Arc, Value> low(0);
820 821
      typedef typename Digraph::template ArcMap<Value> ValueArcMap;
821 822
      typedef typename Digraph::template NodeMap<Value> ValueNodeMap;
822 823
      ValueArcMap cap(_graph), flow(_graph);
823 824
      ValueNodeMap sup(_graph);
824 825
      for (NodeIt n(_graph); n != INVALID; ++n) {
825 826
        sup[n] = _supply[_node_id[n]];
826 827
      }
827 828
      if (_have_lower) {
828 829
        for (ArcIt a(_graph); a != INVALID; ++a) {
829 830
          int j = _arc_idf[a];
830 831
          Value c = _lower[j];
831 832
          cap[a] = _upper[j] - c;
832 833
          sup[_graph.source(a)] -= c;
833 834
          sup[_graph.target(a)] += c;
834 835
        }
835 836
      } else {
836 837
        for (ArcIt a(_graph); a != INVALID; ++a) {
837 838
          cap[a] = _upper[_arc_idf[a]];
838 839
        }
839 840
      }
840 841

	
841 842
      _sup_node_num = 0;
842 843
      for (NodeIt n(_graph); n != INVALID; ++n) {
843 844
        if (sup[n] > 0) ++_sup_node_num;
844 845
      }
845 846

	
846 847
      // Find a feasible flow using Circulation
847 848
      Circulation<Digraph, ConstMap<Arc, Value>, ValueArcMap, ValueNodeMap>
848 849
        circ(_graph, low, cap, sup);
849 850
      if (!circ.flowMap(flow).run()) return INFEASIBLE;
850 851

	
851 852
      // Set residual capacities and handle GEQ supply type
852 853
      if (_sum_supply < 0) {
853 854
        for (ArcIt a(_graph); a != INVALID; ++a) {
854 855
          Value fa = flow[a];
855 856
          _res_cap[_arc_idf[a]] = cap[a] - fa;
856 857
          _res_cap[_arc_idb[a]] = fa;
857 858
          sup[_graph.source(a)] -= fa;
858 859
          sup[_graph.target(a)] += fa;
859 860
        }
860 861
        for (NodeIt n(_graph); n != INVALID; ++n) {
861 862
          _excess[_node_id[n]] = sup[n];
862 863
        }
863 864
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
864 865
          int u = _target[a];
865 866
          int ra = _reverse[a];
866 867
          _res_cap[a] = -_sum_supply + 1;
867 868
          _res_cap[ra] = -_excess[u];
868 869
          _cost[a] = 0;
869 870
          _cost[ra] = 0;
870 871
          _excess[u] = 0;
871 872
        }
872 873
      } else {
873 874
        for (ArcIt a(_graph); a != INVALID; ++a) {
874 875
          Value fa = flow[a];
875 876
          _res_cap[_arc_idf[a]] = cap[a] - fa;
876 877
          _res_cap[_arc_idb[a]] = fa;
877 878
        }
878 879
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
879 880
          int ra = _reverse[a];
880 881
          _res_cap[a] = 0;
881 882
          _res_cap[ra] = 0;
882 883
          _cost[a] = 0;
883 884
          _cost[ra] = 0;
884 885
        }
885 886
      }
886 887

	
887 888
      // Initialize data structures for buckets
888 889
      _max_rank = _alpha * _res_node_num;
889 890
      _buckets.resize(_max_rank);
890 891
      _bucket_next.resize(_res_node_num + 1);
891 892
      _bucket_prev.resize(_res_node_num + 1);
892 893
      _rank.resize(_res_node_num + 1);
893 894

	
894 895
      return OPTIMAL;
895 896
    }
896 897

	
897 898
    // Execute the algorithm and transform the results
898 899
    void start(Method method) {
899 900
      const int MAX_PARTIAL_PATH_LENGTH = 4;
900 901

	
901 902
      switch (method) {
902 903
        case PUSH:
903 904
          startPush();
904 905
          break;
905 906
        case AUGMENT:
906 907
          startAugment(_res_node_num - 1);
907 908
          break;
908 909
        case PARTIAL_AUGMENT:
909 910
          startAugment(MAX_PARTIAL_PATH_LENGTH);
910 911
          break;
911 912
      }
912 913

	
913 914
      // Compute node potentials (dual solution)
914 915
      for (int i = 0; i != _res_node_num; ++i) {
915 916
        _pi[i] = static_cast<Cost>(_pi[i] / (_res_node_num * _alpha));
916 917
      }
917 918
      bool optimal = true;
918 919
      for (int i = 0; optimal && i != _res_node_num; ++i) {
919 920
        LargeCost pi_i = _pi[i];
920 921
        int last_out = _first_out[i+1];
921 922
        for (int j = _first_out[i]; j != last_out; ++j) {
922 923
          if (_res_cap[j] > 0 && _scost[j] + pi_i - _pi[_target[j]] < 0) {
923 924
            optimal = false;
924 925
            break;
925 926
          }
926 927
        }
927 928
      }
928 929

	
929 930
      if (!optimal) {
930 931
        // Compute node potentials for the original costs with BellmanFord
931 932
        // (if it is necessary)
932 933
        typedef std::pair<int, int> IntPair;
933 934
        StaticDigraph sgr;
934 935
        std::vector<IntPair> arc_vec;
935 936
        std::vector<LargeCost> cost_vec;
936 937
        LargeCostArcMap cost_map(cost_vec);
937 938

	
938 939
        arc_vec.clear();
939 940
        cost_vec.clear();
940 941
        for (int j = 0; j != _res_arc_num; ++j) {
941 942
          if (_res_cap[j] > 0) {
942 943
            int u = _source[j], v = _target[j];
943 944
            arc_vec.push_back(IntPair(u, v));
944 945
            cost_vec.push_back(_scost[j] + _pi[u] - _pi[v]);
945 946
          }
946 947
        }
947 948
        sgr.build(_res_node_num, arc_vec.begin(), arc_vec.end());
948 949

	
949 950
        typename BellmanFord<StaticDigraph, LargeCostArcMap>::Create
950 951
          bf(sgr, cost_map);
951 952
        bf.init(0);
952 953
        bf.start();
953 954

	
954 955
        for (int i = 0; i != _res_node_num; ++i) {
955 956
          _pi[i] += bf.dist(sgr.node(i));
956 957
        }
957 958
      }
958 959

	
959 960
      // Shift potentials to meet the requirements of the GEQ type
960 961
      // optimality conditions
961 962
      LargeCost max_pot = _pi[_root];
962 963
      for (int i = 0; i != _res_node_num; ++i) {
963 964
        if (_pi[i] > max_pot) max_pot = _pi[i];
964 965
      }
965 966
      if (max_pot != 0) {
966 967
        for (int i = 0; i != _res_node_num; ++i) {
967 968
          _pi[i] -= max_pot;
968 969
        }
969 970
      }
970 971

	
971 972
      // Handle non-zero lower bounds
972 973
      if (_have_lower) {
973 974
        int limit = _first_out[_root];
974 975
        for (int j = 0; j != limit; ++j) {
975 976
          if (!_forward[j]) _res_cap[j] += _lower[j];
976 977
        }
977 978
      }
978 979
    }
979 980

	
980 981
    // Initialize a cost scaling phase
981 982
    void initPhase() {
982 983
      // Saturate arcs not satisfying the optimality condition
983 984
      for (int u = 0; u != _res_node_num; ++u) {
984 985
        int last_out = _first_out[u+1];
985 986
        LargeCost pi_u = _pi[u];
986 987
        for (int a = _first_out[u]; a != last_out; ++a) {
987 988
          Value delta = _res_cap[a];
988 989
          if (delta > 0) {
989 990
            int v = _target[a];
990 991
            if (_cost[a] + pi_u - _pi[v] < 0) {
991 992
              _excess[u] -= delta;
992 993
              _excess[v] += delta;
993 994
              _res_cap[a] = 0;
994 995
              _res_cap[_reverse[a]] += delta;
995 996
            }
996 997
          }
997 998
        }
998 999
      }
999 1000

	
1000 1001
      // Find active nodes (i.e. nodes with positive excess)
1001 1002
      for (int u = 0; u != _res_node_num; ++u) {
1002 1003
        if (_excess[u] > 0) _active_nodes.push_back(u);
1003 1004
      }
1004 1005

	
1005 1006
      // Initialize the next arcs
1006 1007
      for (int u = 0; u != _res_node_num; ++u) {
1007 1008
        _next_out[u] = _first_out[u];
1008 1009
      }
1009 1010
    }
1010 1011

	
1011 1012
    // Price (potential) refinement heuristic
1012 1013
    bool priceRefinement() {
1013 1014

	
1014 1015
      // Stack for stroing the topological order
1015 1016
      IntVector stack(_res_node_num);
1016 1017
      int stack_top;
1017 1018

	
1018 1019
      // Perform phases
1019 1020
      while (topologicalSort(stack, stack_top)) {
1020 1021

	
1021 1022
        // Compute node ranks in the acyclic admissible network and
1022 1023
        // store the nodes in buckets
1023 1024
        for (int i = 0; i != _res_node_num; ++i) {
1024 1025
          _rank[i] = 0;
1025 1026
        }
1026 1027
        const int bucket_end = _root + 1;
1027 1028
        for (int r = 0; r != _max_rank; ++r) {
1028 1029
          _buckets[r] = bucket_end;
1029 1030
        }
1030 1031
        int top_rank = 0;
1031 1032
        for ( ; stack_top >= 0; --stack_top) {
1032 1033
          int u = stack[stack_top], v;
1033 1034
          int rank_u = _rank[u];
1034 1035

	
1035 1036
          LargeCost rc, pi_u = _pi[u];
1036 1037
          int last_out = _first_out[u+1];
1037 1038
          for (int a = _first_out[u]; a != last_out; ++a) {
1038 1039
            if (_res_cap[a] > 0) {
1039 1040
              v = _target[a];
1040 1041
              rc = _cost[a] + pi_u - _pi[v];
1041 1042
              if (rc < 0) {
1042 1043
                LargeCost nrc = static_cast<LargeCost>((-rc - 0.5) / _epsilon);
1043 1044
                if (nrc < LargeCost(_max_rank)) {
1044 1045
                  int new_rank_v = rank_u + static_cast<int>(nrc);
1045 1046
                  if (new_rank_v > _rank[v]) {
1046 1047
                    _rank[v] = new_rank_v;
1047 1048
                  }
1048 1049
                }
1049 1050
              }
1050 1051
            }
1051 1052
          }
1052 1053

	
1053 1054
          if (rank_u > 0) {
1054 1055
            top_rank = std::max(top_rank, rank_u);
1055 1056
            int bfirst = _buckets[rank_u];
1056 1057
            _bucket_next[u] = bfirst;
1057 1058
            _bucket_prev[bfirst] = u;
1058 1059
            _buckets[rank_u] = u;
1059 1060
          }
1060 1061
        }
1061 1062

	
1062 1063
        // Check if the current flow is epsilon-optimal
1063 1064
        if (top_rank == 0) {
1064 1065
          return true;
1065 1066
        }
1066 1067

	
1067 1068
        // Process buckets in top-down order
1068 1069
        for (int rank = top_rank; rank > 0; --rank) {
1069 1070
          while (_buckets[rank] != bucket_end) {
1070 1071
            // Remove the first node from the current bucket
1071 1072
            int u = _buckets[rank];
1072 1073
            _buckets[rank] = _bucket_next[u];
1073 1074

	
1074 1075
            // Search the outgoing arcs of u
1075 1076
            LargeCost rc, pi_u = _pi[u];
1076 1077
            int last_out = _first_out[u+1];
1077 1078
            int v, old_rank_v, new_rank_v;
1078 1079
            for (int a = _first_out[u]; a != last_out; ++a) {
1079 1080
              if (_res_cap[a] > 0) {
1080 1081
                v = _target[a];
1081 1082
                old_rank_v = _rank[v];
1082 1083

	
1083 1084
                if (old_rank_v < rank) {
1084 1085

	
1085 1086
                  // Compute the new rank of node v
1086 1087
                  rc = _cost[a] + pi_u - _pi[v];
1087 1088
                  if (rc < 0) {
1088 1089
                    new_rank_v = rank;
1089 1090
                  } else {
1090 1091
                    LargeCost nrc = rc / _epsilon;
1091 1092
                    new_rank_v = 0;
1092 1093
                    if (nrc < LargeCost(_max_rank)) {
1093 1094
                      new_rank_v = rank - 1 - static_cast<int>(nrc);
1094 1095
                    }
1095 1096
                  }
1096 1097

	
1097 1098
                  // Change the rank of node v
1098 1099
                  if (new_rank_v > old_rank_v) {
1099 1100
                    _rank[v] = new_rank_v;
1100 1101

	
1101 1102
                    // Remove v from its old bucket
1102 1103
                    if (old_rank_v > 0) {
1103 1104
                      if (_buckets[old_rank_v] == v) {
1104 1105
                        _buckets[old_rank_v] = _bucket_next[v];
1105 1106
                      } else {
1106 1107
                        int pv = _bucket_prev[v], nv = _bucket_next[v];
1107 1108
                        _bucket_next[pv] = nv;
1108 1109
                        _bucket_prev[nv] = pv;
1109 1110
                      }
1110 1111
                    }
1111 1112

	
1112 1113
                    // Insert v into its new bucket
1113 1114
                    int nv = _buckets[new_rank_v];
1114 1115
                    _bucket_next[v] = nv;
1115 1116
                    _bucket_prev[nv] = v;
1116 1117
                    _buckets[new_rank_v] = v;
1117 1118
                  }
1118 1119
                }
1119 1120
              }
1120 1121
            }
1121 1122

	
1122 1123
            // Refine potential of node u
1123 1124
            _pi[u] -= rank * _epsilon;
1124 1125
          }
1125 1126
        }
1126 1127

	
1127 1128
      }
1128 1129

	
1129 1130
      return false;
1130 1131
    }
1131 1132

	
1132 1133
    // Find and cancel cycles in the admissible network and
1133 1134
    // determine topological order using DFS
1134 1135
    bool topologicalSort(IntVector &stack, int &stack_top) {
1135 1136
      const int MAX_CYCLE_CANCEL = 1;
1136 1137

	
1137 1138
      BoolVector reached(_res_node_num, false);
1138 1139
      BoolVector processed(_res_node_num, false);
1139 1140
      IntVector pred(_res_node_num);
1140 1141
      for (int i = 0; i != _res_node_num; ++i) {
1141 1142
        _next_out[i] = _first_out[i];
1142 1143
      }
1143 1144
      stack_top = -1;
1144 1145

	
1145 1146
      int cycle_cnt = 0;
1146 1147
      for (int start = 0; start != _res_node_num; ++start) {
1147 1148
        if (reached[start]) continue;
1148 1149

	
1149 1150
        // Start DFS search from this start node
1150 1151
        pred[start] = -1;
1151 1152
        int tip = start, v;
1152 1153
        while (true) {
1153 1154
          // Check the outgoing arcs of the current tip node
1154 1155
          reached[tip] = true;
1155 1156
          LargeCost pi_tip = _pi[tip];
1156 1157
          int a, last_out = _first_out[tip+1];
1157 1158
          for (a = _next_out[tip]; a != last_out; ++a) {
1158 1159
            if (_res_cap[a] > 0) {
1159 1160
              v = _target[a];
1160 1161
              if (_cost[a] + pi_tip - _pi[v] < 0) {
1161 1162
                if (!reached[v]) {
1162 1163
                  // A new node is reached
1163 1164
                  reached[v] = true;
1164 1165
                  pred[v] = tip;
1165 1166
                  _next_out[tip] = a;
1166 1167
                  tip = v;
1167 1168
                  a = _next_out[tip];
1168 1169
                  last_out = _first_out[tip+1];
1169 1170
                  break;
1170 1171
                }
1171 1172
                else if (!processed[v]) {
1172 1173
                  // A cycle is found
1173 1174
                  ++cycle_cnt;
1174 1175
                  _next_out[tip] = a;
1175 1176

	
1176 1177
                  // Find the minimum residual capacity along the cycle
1177 1178
                  Value d, delta = _res_cap[a];
1178 1179
                  int u, delta_node = tip;
1179 1180
                  for (u = tip; u != v; ) {
1180 1181
                    u = pred[u];
1181 1182
                    d = _res_cap[_next_out[u]];
1182 1183
                    if (d <= delta) {
1183 1184
                      delta = d;
1184 1185
                      delta_node = u;
1185 1186
                    }
1186 1187
                  }
1187 1188

	
1188 1189
                  // Augment along the cycle
1189 1190
                  _res_cap[a] -= delta;
1190 1191
                  _res_cap[_reverse[a]] += delta;
1191 1192
                  for (u = tip; u != v; ) {
1192 1193
                    u = pred[u];
1193 1194
                    int ca = _next_out[u];
1194 1195
                    _res_cap[ca] -= delta;
1195 1196
                    _res_cap[_reverse[ca]] += delta;
1196 1197
                  }
1197 1198

	
1198 1199
                  // Check the maximum number of cycle canceling
1199 1200
                  if (cycle_cnt >= MAX_CYCLE_CANCEL) {
1200 1201
                    return false;
1201 1202
                  }
1202 1203

	
1203 1204
                  // Roll back search to delta_node
1204 1205
                  if (delta_node != tip) {
1205 1206
                    for (u = tip; u != delta_node; u = pred[u]) {
1206 1207
                      reached[u] = false;
1207 1208
                    }
1208 1209
                    tip = delta_node;
1209 1210
                    a = _next_out[tip] + 1;
1210 1211
                    last_out = _first_out[tip+1];
1211 1212
                    break;
1212 1213
                  }
1213 1214
                }
1214 1215
              }
1215 1216
            }
1216 1217
          }
1217 1218

	
1218 1219
          // Step back to the previous node
1219 1220
          if (a == last_out) {
1220 1221
            processed[tip] = true;
1221 1222
            stack[++stack_top] = tip;
1222 1223
            tip = pred[tip];
1223 1224
            if (tip < 0) {
1224 1225
              // Finish DFS from the current start node
1225 1226
              break;
1226 1227
            }
1227 1228
            ++_next_out[tip];
1228 1229
          }
1229 1230
        }
1230 1231

	
1231 1232
      }
1232 1233

	
1233 1234
      return (cycle_cnt == 0);
1234 1235
    }
1235 1236

	
1236 1237
    // Global potential update heuristic
1237 1238
    void globalUpdate() {
1238 1239
      const int bucket_end = _root + 1;
1239 1240

	
1240 1241
      // Initialize buckets
1241 1242
      for (int r = 0; r != _max_rank; ++r) {
1242 1243
        _buckets[r] = bucket_end;
1243 1244
      }
1244 1245
      Value total_excess = 0;
1245 1246
      int b0 = bucket_end;
1246 1247
      for (int i = 0; i != _res_node_num; ++i) {
1247 1248
        if (_excess[i] < 0) {
1248 1249
          _rank[i] = 0;
1249 1250
          _bucket_next[i] = b0;
1250 1251
          _bucket_prev[b0] = i;
1251 1252
          b0 = i;
1252 1253
        } else {
1253 1254
          total_excess += _excess[i];
1254 1255
          _rank[i] = _max_rank;
1255 1256
        }
1256 1257
      }
1257 1258
      if (total_excess == 0) return;
1258 1259
      _buckets[0] = b0;
1259 1260

	
1260 1261
      // Search the buckets
1261 1262
      int r = 0;
1262 1263
      for ( ; r != _max_rank; ++r) {
1263 1264
        while (_buckets[r] != bucket_end) {
1264 1265
          // Remove the first node from the current bucket
1265 1266
          int u = _buckets[r];
1266 1267
          _buckets[r] = _bucket_next[u];
1267 1268

	
1268 1269
          // Search the incomming arcs of u
1269 1270
          LargeCost pi_u = _pi[u];
1270 1271
          int last_out = _first_out[u+1];
1271 1272
          for (int a = _first_out[u]; a != last_out; ++a) {
1272 1273
            int ra = _reverse[a];
1273 1274
            if (_res_cap[ra] > 0) {
1274 1275
              int v = _source[ra];
1275 1276
              int old_rank_v = _rank[v];
1276 1277
              if (r < old_rank_v) {
1277 1278
                // Compute the new rank of v
1278 1279
                LargeCost nrc = (_cost[ra] + _pi[v] - pi_u) / _epsilon;
1279 1280
                int new_rank_v = old_rank_v;
1280 1281
                if (nrc < LargeCost(_max_rank)) {
1281 1282
                  new_rank_v = r + 1 + static_cast<int>(nrc);
1282 1283
                }
1283 1284

	
1284 1285
                // Change the rank of v
1285 1286
                if (new_rank_v < old_rank_v) {
1286 1287
                  _rank[v] = new_rank_v;
1287 1288
                  _next_out[v] = _first_out[v];
1288 1289

	
1289 1290
                  // Remove v from its old bucket
1290 1291
                  if (old_rank_v < _max_rank) {
1291 1292
                    if (_buckets[old_rank_v] == v) {
1292 1293
                      _buckets[old_rank_v] = _bucket_next[v];
1293 1294
                    } else {
1294 1295
                      int pv = _bucket_prev[v], nv = _bucket_next[v];
1295 1296
                      _bucket_next[pv] = nv;
1296 1297
                      _bucket_prev[nv] = pv;
1297 1298
                    }
1298 1299
                  }
1299 1300

	
1300 1301
                  // Insert v into its new bucket
1301 1302
                  int nv = _buckets[new_rank_v];
1302 1303
                  _bucket_next[v] = nv;
1303 1304
                  _bucket_prev[nv] = v;
1304 1305
                  _buckets[new_rank_v] = v;
1305 1306
                }
1306 1307
              }
1307 1308
            }
1308 1309
          }
1309 1310

	
1310 1311
          // Finish search if there are no more active nodes
1311 1312
          if (_excess[u] > 0) {
1312 1313
            total_excess -= _excess[u];
1313 1314
            if (total_excess <= 0) break;
1314 1315
          }
1315 1316
        }
1316 1317
        if (total_excess <= 0) break;
1317 1318
      }
1318 1319

	
1319 1320
      // Relabel nodes
1320 1321
      for (int u = 0; u != _res_node_num; ++u) {
1321 1322
        int k = std::min(_rank[u], r);
1322 1323
        if (k > 0) {
1323 1324
          _pi[u] -= _epsilon * k;
1324 1325
          _next_out[u] = _first_out[u];
1325 1326
        }
1326 1327
      }
1327 1328
    }
1328 1329

	
1329 1330
    /// Execute the algorithm performing augment and relabel operations
1330 1331
    void startAugment(int max_length) {
1331 1332
      // Paramters for heuristics
1332 1333
      const int PRICE_REFINEMENT_LIMIT = 2;
1333 1334
      const double GLOBAL_UPDATE_FACTOR = 1.0;
1334 1335
      const int global_update_skip = static_cast<int>(GLOBAL_UPDATE_FACTOR *
1335 1336
        (_res_node_num + _sup_node_num * _sup_node_num));
1336 1337
      int next_global_update_limit = global_update_skip;
1337 1338

	
1338 1339
      // Perform cost scaling phases
1339 1340
      IntVector path;
1340 1341
      BoolVector path_arc(_res_arc_num, false);
1341 1342
      int relabel_cnt = 0;
1342 1343
      int eps_phase_cnt = 0;
1343 1344
      for ( ; _epsilon >= 1; _epsilon = _epsilon < _alpha && _epsilon > 1 ?
1344 1345
                                        1 : _epsilon / _alpha )
1345 1346
      {
1346 1347
        ++eps_phase_cnt;
1347 1348

	
1348 1349
        // Price refinement heuristic
1349 1350
        if (eps_phase_cnt >= PRICE_REFINEMENT_LIMIT) {
1350 1351
          if (priceRefinement()) continue;
1351 1352
        }
1352 1353

	
1353 1354
        // Initialize current phase
1354 1355
        initPhase();
1355 1356

	
1356 1357
        // Perform partial augment and relabel operations
1357 1358
        while (true) {
1358 1359
          // Select an active node (FIFO selection)
1359 1360
          while (_active_nodes.size() > 0 &&
1360 1361
                 _excess[_active_nodes.front()] <= 0) {
1361 1362
            _active_nodes.pop_front();
1362 1363
          }
1363 1364
          if (_active_nodes.size() == 0) break;
1364 1365
          int start = _active_nodes.front();
1365 1366

	
1366 1367
          // Find an augmenting path from the start node
1367 1368
          int tip = start;
1368 1369
          while (int(path.size()) < max_length && _excess[tip] >= 0) {
1369 1370
            int u;
1370 1371
            LargeCost rc, min_red_cost = std::numeric_limits<LargeCost>::max();
1371 1372
            LargeCost pi_tip = _pi[tip];
1372 1373
            int last_out = _first_out[tip+1];
1373 1374
            for (int a = _next_out[tip]; a != last_out; ++a) {
1374 1375
              if (_res_cap[a] > 0) {
1375 1376
                u = _target[a];
1376 1377
                rc = _cost[a] + pi_tip - _pi[u];
1377 1378
                if (rc < 0) {
1378 1379
                  path.push_back(a);
1379 1380
                  _next_out[tip] = a;
1380 1381
                  if (path_arc[a]) {
1381 1382
                    goto augment;   // a cycle is found, stop path search
1382 1383
                  }
1383 1384
                  tip = u;
1384 1385
                  path_arc[a] = true;
1385 1386
                  goto next_step;
1386 1387
                }
1387 1388
                else if (rc < min_red_cost) {
1388 1389
                  min_red_cost = rc;
1389 1390
                }
1390 1391
              }
1391 1392
            }
1392 1393

	
1393 1394
            // Relabel tip node
1394 1395
            if (tip != start) {
1395 1396
              int ra = _reverse[path.back()];
1396 1397
              min_red_cost =
1397 1398
                std::min(min_red_cost, _cost[ra] + pi_tip - _pi[_target[ra]]);
1398 1399
            }
1399 1400
            last_out = _next_out[tip];
1400 1401
            for (int a = _first_out[tip]; a != last_out; ++a) {
1401 1402
              if (_res_cap[a] > 0) {
1402 1403
                rc = _cost[a] + pi_tip - _pi[_target[a]];
1403 1404
                if (rc < min_red_cost) {
1404 1405
                  min_red_cost = rc;
1405 1406
                }
1406 1407
              }
1407 1408
            }
1408 1409
            _pi[tip] -= min_red_cost + _epsilon;
1409 1410
            _next_out[tip] = _first_out[tip];
1410 1411
            ++relabel_cnt;
1411 1412

	
1412 1413
            // Step back
1413 1414
            if (tip != start) {
1414 1415
              int pa = path.back();
1415 1416
              path_arc[pa] = false;
1416 1417
              tip = _source[pa];
1417 1418
              path.pop_back();
1418 1419
            }
1419 1420

	
1420 1421
          next_step: ;
1421 1422
          }
1422 1423

	
1423 1424
          // Augment along the found path (as much flow as possible)
1424 1425
        augment:
1425 1426
          Value delta;
1426 1427
          int pa, u, v = start;
1427 1428
          for (int i = 0; i != int(path.size()); ++i) {
1428 1429
            pa = path[i];
1429 1430
            u = v;
1430 1431
            v = _target[pa];
1431 1432
            path_arc[pa] = false;
1432 1433
            delta = std::min(_res_cap[pa], _excess[u]);
1433 1434
            _res_cap[pa] -= delta;
1434 1435
            _res_cap[_reverse[pa]] += delta;
1435 1436
            _excess[u] -= delta;
1436 1437
            _excess[v] += delta;
1437 1438
            if (_excess[v] > 0 && _excess[v] <= delta) {
1438 1439
              _active_nodes.push_back(v);
1439 1440
            }
1440 1441
          }
1441 1442
          path.clear();
1442 1443

	
1443 1444
          // Global update heuristic
1444 1445
          if (relabel_cnt >= next_global_update_limit) {
1445 1446
            globalUpdate();
1446 1447
            next_global_update_limit += global_update_skip;
1447 1448
          }
1448 1449
        }
1449 1450

	
1450 1451
      }
1451 1452

	
1452 1453
    }
1453 1454

	
1454 1455
    /// Execute the algorithm performing push and relabel operations
1455 1456
    void startPush() {
1456 1457
      // Paramters for heuristics
1457 1458
      const int PRICE_REFINEMENT_LIMIT = 2;
1458 1459
      const double GLOBAL_UPDATE_FACTOR = 2.0;
1459 1460

	
1460 1461
      const int global_update_skip = static_cast<int>(GLOBAL_UPDATE_FACTOR *
1461 1462
        (_res_node_num + _sup_node_num * _sup_node_num));
1462 1463
      int next_global_update_limit = global_update_skip;
1463 1464

	
1464 1465
      // Perform cost scaling phases
1465 1466
      BoolVector hyper(_res_node_num, false);
1466 1467
      LargeCostVector hyper_cost(_res_node_num);
1467 1468
      int relabel_cnt = 0;
1468 1469
      int eps_phase_cnt = 0;
1469 1470
      for ( ; _epsilon >= 1; _epsilon = _epsilon < _alpha && _epsilon > 1 ?
1470 1471
                                        1 : _epsilon / _alpha )
1471 1472
      {
1472 1473
        ++eps_phase_cnt;
1473 1474

	
1474 1475
        // Price refinement heuristic
1475 1476
        if (eps_phase_cnt >= PRICE_REFINEMENT_LIMIT) {
1476 1477
          if (priceRefinement()) continue;
1477 1478
        }
1478 1479

	
1479 1480
        // Initialize current phase
1480 1481
        initPhase();
1481 1482

	
1482 1483
        // Perform push and relabel operations
1483 1484
        while (_active_nodes.size() > 0) {
1484 1485
          LargeCost min_red_cost, rc, pi_n;
1485 1486
          Value delta;
1486 1487
          int n, t, a, last_out = _res_arc_num;
1487 1488

	
1488 1489
        next_node:
1489 1490
          // Select an active node (FIFO selection)
1490 1491
          n = _active_nodes.front();
1491 1492
          last_out = _first_out[n+1];
1492 1493
          pi_n = _pi[n];
1493 1494

	
1494 1495
          // Perform push operations if there are admissible arcs
1495 1496
          if (_excess[n] > 0) {
1496 1497
            for (a = _next_out[n]; a != last_out; ++a) {
1497 1498
              if (_res_cap[a] > 0 &&
1498 1499
                  _cost[a] + pi_n - _pi[_target[a]] < 0) {
1499 1500
                delta = std::min(_res_cap[a], _excess[n]);
1500 1501
                t = _target[a];
1501 1502

	
1502 1503
                // Push-look-ahead heuristic
1503 1504
                Value ahead = -_excess[t];
1504 1505
                int last_out_t = _first_out[t+1];
1505 1506
                LargeCost pi_t = _pi[t];
1506 1507
                for (int ta = _next_out[t]; ta != last_out_t; ++ta) {
1507 1508
                  if (_res_cap[ta] > 0 &&
1508 1509
                      _cost[ta] + pi_t - _pi[_target[ta]] < 0)
1509 1510
                    ahead += _res_cap[ta];
1510 1511
                  if (ahead >= delta) break;
1511 1512
                }
1512 1513
                if (ahead < 0) ahead = 0;
1513 1514

	
1514 1515
                // Push flow along the arc
1515 1516
                if (ahead < delta && !hyper[t]) {
1516 1517
                  _res_cap[a] -= ahead;
1517 1518
                  _res_cap[_reverse[a]] += ahead;
1518 1519
                  _excess[n] -= ahead;
1519 1520
                  _excess[t] += ahead;
1520 1521
                  _active_nodes.push_front(t);
1521 1522
                  hyper[t] = true;
1522 1523
                  hyper_cost[t] = _cost[a] + pi_n - pi_t;
1523 1524
                  _next_out[n] = a;
1524 1525
                  goto next_node;
1525 1526
                } else {
1526 1527
                  _res_cap[a] -= delta;
1527 1528
                  _res_cap[_reverse[a]] += delta;
1528 1529
                  _excess[n] -= delta;
1529 1530
                  _excess[t] += delta;
1530 1531
                  if (_excess[t] > 0 && _excess[t] <= delta)
1531 1532
                    _active_nodes.push_back(t);
1532 1533
                }
1533 1534

	
1534 1535
                if (_excess[n] == 0) {
1535 1536
                  _next_out[n] = a;
1536 1537
                  goto remove_nodes;
1537 1538
                }
1538 1539
              }
1539 1540
            }
1540 1541
            _next_out[n] = a;
1541 1542
          }
1542 1543

	
1543 1544
          // Relabel the node if it is still active (or hyper)
1544 1545
          if (_excess[n] > 0 || hyper[n]) {
1545 1546
             min_red_cost = hyper[n] ? -hyper_cost[n] :
1546 1547
               std::numeric_limits<LargeCost>::max();
1547 1548
            for (int a = _first_out[n]; a != last_out; ++a) {
1548 1549
              if (_res_cap[a] > 0) {
1549 1550
                rc = _cost[a] + pi_n - _pi[_target[a]];
1550 1551
                if (rc < min_red_cost) {
1551 1552
                  min_red_cost = rc;
1552 1553
                }
1553 1554
              }
1554 1555
            }
1555 1556
            _pi[n] -= min_red_cost + _epsilon;
1556 1557
            _next_out[n] = _first_out[n];
1557 1558
            hyper[n] = false;
1558 1559
            ++relabel_cnt;
1559 1560
          }
1560 1561

	
1561 1562
          // Remove nodes that are not active nor hyper
1562 1563
        remove_nodes:
1563 1564
          while ( _active_nodes.size() > 0 &&
1564 1565
                  _excess[_active_nodes.front()] <= 0 &&
1565 1566
                  !hyper[_active_nodes.front()] ) {
1566 1567
            _active_nodes.pop_front();
1567 1568
          }
1568 1569

	
1569 1570
          // Global update heuristic
1570 1571
          if (relabel_cnt >= next_global_update_limit) {
1571 1572
            globalUpdate();
1572 1573
            for (int u = 0; u != _res_node_num; ++u)
1573 1574
              hyper[u] = false;
1574 1575
            next_global_update_limit += global_update_skip;
1575 1576
          }
1576 1577
        }
1577 1578
      }
1578 1579
    }
1579 1580

	
1580 1581
  }; //class CostScaling
1581 1582

	
1582 1583
  ///@}
1583 1584

	
1584 1585
} //namespace lemon
1585 1586

	
1586 1587
#endif //LEMON_COST_SCALING_H
0 comments (0 inline)