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

	
19
#ifndef LEMON_NETWORK_SIMPLEX_H
20
#define LEMON_NETWORK_SIMPLEX_H
21

	
22
/// \ingroup min_cost_flow
23
///
24
/// \file
25
/// \brief Network Simplex algorithm for finding a minimum cost flow.
26

	
27
#include <vector>
28
#include <limits>
29
#include <algorithm>
30

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

	
37
namespace lemon {
38

	
39
  /// \addtogroup min_cost_flow
40
  /// @{
41

	
42
  /// \brief Implementation of the primal Network Simplex algorithm
43
  /// for finding a \ref min_cost_flow "minimum cost flow".
44
  ///
45
  /// \ref NetworkSimplex implements the primal Network Simplex algorithm
46
  /// for finding a \ref min_cost_flow "minimum cost flow".
47
  /// This algorithm is a specialized version of the linear programming
48
  /// simplex method directly for the minimum cost flow problem.
49
  /// It is one of the most efficient solution methods.
50
  ///
51
  /// In general this class is the fastest implementation available
52
  /// in LEMON for the minimum cost flow problem.
53
  /// Moreover it supports both direction of the supply/demand inequality
54
  /// constraints. For more information see \ref ProblemType.
55
  ///
56
  /// \tparam GR The digraph type the algorithm runs on.
57
  /// \tparam F The value type used for flow amounts, capacity bounds
58
  /// and supply values in the algorithm. By default it is \c int.
59
  /// \tparam C The value type used for costs and potentials in the
60
  /// algorithm. By default it is the same as \c F.
61
  ///
62
  /// \warning Both value types must be signed and all input data must
63
  /// be integer.
64
  ///
65
  /// \note %NetworkSimplex provides five different pivot rule
66
  /// implementations, from which the most efficient one is used
67
  /// by default. For more information see \ref PivotRule.
68
  template <typename GR, typename F = int, typename C = F>
69
  class NetworkSimplex
70
  {
71
  public:
72

	
73
    /// The flow type of the algorithm
74
    typedef F Flow;
75
    /// The cost type of the algorithm
76
    typedef C Cost;
77
#ifdef DOXYGEN
78
    /// The type of the flow map
79
    typedef GR::ArcMap<Flow> FlowMap;
80
    /// The type of the potential map
81
    typedef GR::NodeMap<Cost> PotentialMap;
82
#else
83
    /// The type of the flow map
84
    typedef typename GR::template ArcMap<Flow> FlowMap;
85
    /// The type of the potential map
86
    typedef typename GR::template NodeMap<Cost> PotentialMap;
87
#endif
88

	
89
  public:
90

	
91
    /// \brief Enum type for selecting the pivot rule.
92
    ///
93
    /// Enum type for selecting the pivot rule for the \ref run()
94
    /// function.
95
    ///
96
    /// \ref NetworkSimplex provides five different pivot rule
97
    /// implementations that significantly affect the running time
98
    /// of the algorithm.
99
    /// By default \ref BLOCK_SEARCH "Block Search" is used, which
100
    /// proved to be the most efficient and the most robust on various
101
    /// test inputs according to our benchmark tests.
102
    /// However another pivot rule can be selected using the \ref run()
103
    /// function with the proper parameter.
104
    enum PivotRule {
105

	
106
      /// The First Eligible pivot rule.
107
      /// The next eligible arc is selected in a wraparound fashion
108
      /// in every iteration.
109
      FIRST_ELIGIBLE,
110

	
111
      /// The Best Eligible pivot rule.
112
      /// The best eligible arc is selected in every iteration.
113
      BEST_ELIGIBLE,
114

	
115
      /// The Block Search pivot rule.
116
      /// A specified number of arcs are examined in every iteration
117
      /// in a wraparound fashion and the best eligible arc is selected
118
      /// from this block.
119
      BLOCK_SEARCH,
120

	
121
      /// The Candidate List pivot rule.
122
      /// In a major iteration a candidate list is built from eligible arcs
123
      /// in a wraparound fashion and in the following minor iterations
124
      /// the best eligible arc is selected from this list.
125
      CANDIDATE_LIST,
126

	
127
      /// The Altering Candidate List pivot rule.
128
      /// It is a modified version of the Candidate List method.
129
      /// It keeps only the several best eligible arcs from the former
130
      /// candidate list and extends this list in every iteration.
131
      ALTERING_LIST
132
    };
133
    
134
    /// \brief Enum type for selecting the problem type.
135
    ///
136
    /// Enum type for selecting the problem type, i.e. the direction of
137
    /// the inequalities in the supply/demand constraints of the
138
    /// \ref min_cost_flow "minimum cost flow problem".
139
    ///
140
    /// The default problem type is \c GEQ, since this form is supported
141
    /// by other minimum cost flow algorithms and the \ref Circulation
142
    /// algorithm as well.
143
    /// The \c LEQ problem type can be selected using the \ref problemType()
144
    /// function.
145
    ///
146
    /// Note that the equality form is a special case of both problem type.
147
    enum ProblemType {
148

	
149
      /// This option means that there are "<em>greater or equal</em>"
150
      /// constraints in the defintion, i.e. the exact formulation of the
151
      /// problem is the following.
152
      /**
153
          \f[ \min\sum_{uv\in A} f(uv) \cdot cost(uv) \f]
154
          \f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \geq
155
              sup(u) \quad \forall u\in V \f]
156
          \f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A \f]
157
      */
158
      /// It means that the total demand must be greater or equal to the 
159
      /// total supply (i.e. \f$\sum_{u\in V} sup(u)\f$ must be zero or
160
      /// negative) and all the supplies have to be carried out from 
161
      /// the supply nodes, but there could be demands that are not 
162
      /// satisfied.
163
      GEQ,
164
      /// It is just an alias for the \c GEQ option.
165
      CARRY_SUPPLIES = GEQ,
166

	
167
      /// This option means that there are "<em>less or equal</em>"
168
      /// constraints in the defintion, i.e. the exact formulation of the
169
      /// problem is the following.
170
      /**
171
          \f[ \min\sum_{uv\in A} f(uv) \cdot cost(uv) \f]
172
          \f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \leq
173
              sup(u) \quad \forall u\in V \f]
174
          \f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A \f]
175
      */
176
      /// It means that the total demand must be less or equal to the 
177
      /// total supply (i.e. \f$\sum_{u\in V} sup(u)\f$ must be zero or
178
      /// positive) and all the demands have to be satisfied, but there
179
      /// could be supplies that are not carried out from the supply
180
      /// nodes.
181
      LEQ,
182
      /// It is just an alias for the \c LEQ option.
183
      SATISFY_DEMANDS = LEQ
184
    };
185

	
186
  private:
187

	
188
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
189

	
190
    typedef typename GR::template ArcMap<Flow> FlowArcMap;
191
    typedef typename GR::template ArcMap<Cost> CostArcMap;
192
    typedef typename GR::template NodeMap<Flow> FlowNodeMap;
193

	
194
    typedef std::vector<Arc> ArcVector;
195
    typedef std::vector<Node> NodeVector;
196
    typedef std::vector<int> IntVector;
197
    typedef std::vector<bool> BoolVector;
198
    typedef std::vector<Flow> FlowVector;
199
    typedef std::vector<Cost> CostVector;
200

	
201
    // State constants for arcs
202
    enum ArcStateEnum {
203
      STATE_UPPER = -1,
204
      STATE_TREE  =  0,
205
      STATE_LOWER =  1
206
    };
207

	
208
  private:
209

	
210
    // Data related to the underlying digraph
211
    const GR &_graph;
212
    int _node_num;
213
    int _arc_num;
214

	
215
    // Parameters of the problem
216
    FlowArcMap *_plower;
217
    FlowArcMap *_pupper;
218
    CostArcMap *_pcost;
219
    FlowNodeMap *_psupply;
220
    bool _pstsup;
221
    Node _psource, _ptarget;
222
    Flow _pstflow;
223
    ProblemType _ptype;
224

	
225
    // Result maps
226
    FlowMap *_flow_map;
227
    PotentialMap *_potential_map;
228
    bool _local_flow;
229
    bool _local_potential;
230

	
231
    // Data structures for storing the digraph
232
    IntNodeMap _node_id;
233
    ArcVector _arc_ref;
234
    IntVector _source;
235
    IntVector _target;
236

	
237
    // Node and arc data
238
    FlowVector _cap;
239
    CostVector _cost;
240
    FlowVector _supply;
241
    FlowVector _flow;
242
    CostVector _pi;
243

	
244
    // Data for storing the spanning tree structure
245
    IntVector _parent;
246
    IntVector _pred;
247
    IntVector _thread;
248
    IntVector _rev_thread;
249
    IntVector _succ_num;
250
    IntVector _last_succ;
251
    IntVector _dirty_revs;
252
    BoolVector _forward;
253
    IntVector _state;
254
    int _root;
255

	
256
    // Temporary data used in the current pivot iteration
257
    int in_arc, join, u_in, v_in, u_out, v_out;
258
    int first, second, right, last;
259
    int stem, par_stem, new_stem;
260
    Flow delta;
261

	
262
  private:
263

	
264
    // Implementation of the First Eligible pivot rule
265
    class FirstEligiblePivotRule
266
    {
267
    private:
268

	
269
      // References to the NetworkSimplex class
270
      const IntVector  &_source;
271
      const IntVector  &_target;
272
      const CostVector &_cost;
273
      const IntVector  &_state;
274
      const CostVector &_pi;
275
      int &_in_arc;
276
      int _arc_num;
277

	
278
      // Pivot rule data
279
      int _next_arc;
280

	
281
    public:
282

	
283
      // Constructor
284
      FirstEligiblePivotRule(NetworkSimplex &ns) :
285
        _source(ns._source), _target(ns._target),
286
        _cost(ns._cost), _state(ns._state), _pi(ns._pi),
287
        _in_arc(ns.in_arc), _arc_num(ns._arc_num), _next_arc(0)
288
      {}
289

	
290
      // Find next entering arc
291
      bool findEnteringArc() {
292
        Cost c;
293
        for (int e = _next_arc; e < _arc_num; ++e) {
294
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
295
          if (c < 0) {
296
            _in_arc = e;
297
            _next_arc = e + 1;
298
            return true;
299
          }
300
        }
301
        for (int e = 0; e < _next_arc; ++e) {
302
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
303
          if (c < 0) {
304
            _in_arc = e;
305
            _next_arc = e + 1;
306
            return true;
307
          }
308
        }
309
        return false;
310
      }
311

	
312
    }; //class FirstEligiblePivotRule
313

	
314

	
315
    // Implementation of the Best Eligible pivot rule
316
    class BestEligiblePivotRule
317
    {
318
    private:
319

	
320
      // References to the NetworkSimplex class
321
      const IntVector  &_source;
322
      const IntVector  &_target;
323
      const CostVector &_cost;
324
      const IntVector  &_state;
325
      const CostVector &_pi;
326
      int &_in_arc;
327
      int _arc_num;
328

	
329
    public:
330

	
331
      // Constructor
332
      BestEligiblePivotRule(NetworkSimplex &ns) :
333
        _source(ns._source), _target(ns._target),
334
        _cost(ns._cost), _state(ns._state), _pi(ns._pi),
335
        _in_arc(ns.in_arc), _arc_num(ns._arc_num)
336
      {}
337

	
338
      // Find next entering arc
339
      bool findEnteringArc() {
340
        Cost c, min = 0;
341
        for (int e = 0; e < _arc_num; ++e) {
342
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
343
          if (c < min) {
344
            min = c;
345
            _in_arc = e;
346
          }
347
        }
348
        return min < 0;
349
      }
350

	
351
    }; //class BestEligiblePivotRule
352

	
353

	
354
    // Implementation of the Block Search pivot rule
355
    class BlockSearchPivotRule
356
    {
357
    private:
358

	
359
      // References to the NetworkSimplex class
360
      const IntVector  &_source;
361
      const IntVector  &_target;
362
      const CostVector &_cost;
363
      const IntVector  &_state;
364
      const CostVector &_pi;
365
      int &_in_arc;
366
      int _arc_num;
367

	
368
      // Pivot rule data
369
      int _block_size;
370
      int _next_arc;
371

	
372
    public:
373

	
374
      // Constructor
375
      BlockSearchPivotRule(NetworkSimplex &ns) :
376
        _source(ns._source), _target(ns._target),
377
        _cost(ns._cost), _state(ns._state), _pi(ns._pi),
378
        _in_arc(ns.in_arc), _arc_num(ns._arc_num), _next_arc(0)
379
      {
380
        // The main parameters of the pivot rule
381
        const double BLOCK_SIZE_FACTOR = 2.0;
382
        const int MIN_BLOCK_SIZE = 10;
383

	
384
        _block_size = std::max( int(BLOCK_SIZE_FACTOR * sqrt(_arc_num)),
385
                                MIN_BLOCK_SIZE );
386
      }
387

	
388
      // Find next entering arc
389
      bool findEnteringArc() {
390
        Cost c, min = 0;
391
        int cnt = _block_size;
392
        int e, min_arc = _next_arc;
393
        for (e = _next_arc; e < _arc_num; ++e) {
394
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
395
          if (c < min) {
396
            min = c;
397
            min_arc = e;
398
          }
399
          if (--cnt == 0) {
400
            if (min < 0) break;
401
            cnt = _block_size;
402
          }
403
        }
404
        if (min == 0 || cnt > 0) {
405
          for (e = 0; e < _next_arc; ++e) {
406
            c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
407
            if (c < min) {
408
              min = c;
409
              min_arc = e;
410
            }
411
            if (--cnt == 0) {
412
              if (min < 0) break;
413
              cnt = _block_size;
414
            }
415
          }
416
        }
417
        if (min >= 0) return false;
418
        _in_arc = min_arc;
419
        _next_arc = e;
420
        return true;
421
      }
422

	
423
    }; //class BlockSearchPivotRule
424

	
425

	
426
    // Implementation of the Candidate List pivot rule
427
    class CandidateListPivotRule
428
    {
429
    private:
430

	
431
      // References to the NetworkSimplex class
432
      const IntVector  &_source;
433
      const IntVector  &_target;
434
      const CostVector &_cost;
435
      const IntVector  &_state;
436
      const CostVector &_pi;
437
      int &_in_arc;
438
      int _arc_num;
439

	
440
      // Pivot rule data
441
      IntVector _candidates;
442
      int _list_length, _minor_limit;
443
      int _curr_length, _minor_count;
444
      int _next_arc;
445

	
446
    public:
447

	
448
      /// Constructor
449
      CandidateListPivotRule(NetworkSimplex &ns) :
450
        _source(ns._source), _target(ns._target),
451
        _cost(ns._cost), _state(ns._state), _pi(ns._pi),
452
        _in_arc(ns.in_arc), _arc_num(ns._arc_num), _next_arc(0)
453
      {
454
        // The main parameters of the pivot rule
455
        const double LIST_LENGTH_FACTOR = 1.0;
456
        const int MIN_LIST_LENGTH = 10;
457
        const double MINOR_LIMIT_FACTOR = 0.1;
458
        const int MIN_MINOR_LIMIT = 3;
459

	
460
        _list_length = std::max( int(LIST_LENGTH_FACTOR * sqrt(_arc_num)),
461
                                 MIN_LIST_LENGTH );
462
        _minor_limit = std::max( int(MINOR_LIMIT_FACTOR * _list_length),
463
                                 MIN_MINOR_LIMIT );
464
        _curr_length = _minor_count = 0;
465
        _candidates.resize(_list_length);
466
      }
467

	
468
      /// Find next entering arc
469
      bool findEnteringArc() {
470
        Cost min, c;
471
        int e, min_arc = _next_arc;
472
        if (_curr_length > 0 && _minor_count < _minor_limit) {
473
          // Minor iteration: select the best eligible arc from the
474
          // current candidate list
475
          ++_minor_count;
476
          min = 0;
477
          for (int i = 0; i < _curr_length; ++i) {
478
            e = _candidates[i];
479
            c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
480
            if (c < min) {
481
              min = c;
482
              min_arc = e;
483
            }
484
            if (c >= 0) {
485
              _candidates[i--] = _candidates[--_curr_length];
486
            }
487
          }
488
          if (min < 0) {
489
            _in_arc = min_arc;
490
            return true;
491
          }
492
        }
493

	
494
        // Major iteration: build a new candidate list
495
        min = 0;
496
        _curr_length = 0;
497
        for (e = _next_arc; e < _arc_num; ++e) {
498
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
499
          if (c < 0) {
500
            _candidates[_curr_length++] = e;
501
            if (c < min) {
502
              min = c;
503
              min_arc = e;
504
            }
505
            if (_curr_length == _list_length) break;
506
          }
507
        }
508
        if (_curr_length < _list_length) {
509
          for (e = 0; e < _next_arc; ++e) {
510
            c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
511
            if (c < 0) {
512
              _candidates[_curr_length++] = e;
513
              if (c < min) {
514
                min = c;
515
                min_arc = e;
516
              }
517
              if (_curr_length == _list_length) break;
518
            }
519
          }
520
        }
521
        if (_curr_length == 0) return false;
522
        _minor_count = 1;
523
        _in_arc = min_arc;
524
        _next_arc = e;
525
        return true;
526
      }
527

	
528
    }; //class CandidateListPivotRule
529

	
530

	
531
    // Implementation of the Altering Candidate List pivot rule
532
    class AlteringListPivotRule
533
    {
534
    private:
535

	
536
      // References to the NetworkSimplex class
537
      const IntVector  &_source;
538
      const IntVector  &_target;
539
      const CostVector &_cost;
540
      const IntVector  &_state;
541
      const CostVector &_pi;
542
      int &_in_arc;
543
      int _arc_num;
544

	
545
      // Pivot rule data
546
      int _block_size, _head_length, _curr_length;
547
      int _next_arc;
548
      IntVector _candidates;
549
      CostVector _cand_cost;
550

	
551
      // Functor class to compare arcs during sort of the candidate list
552
      class SortFunc
553
      {
554
      private:
555
        const CostVector &_map;
556
      public:
557
        SortFunc(const CostVector &map) : _map(map) {}
558
        bool operator()(int left, int right) {
559
          return _map[left] > _map[right];
560
        }
561
      };
562

	
563
      SortFunc _sort_func;
564

	
565
    public:
566

	
567
      // Constructor
568
      AlteringListPivotRule(NetworkSimplex &ns) :
569
        _source(ns._source), _target(ns._target),
570
        _cost(ns._cost), _state(ns._state), _pi(ns._pi),
571
        _in_arc(ns.in_arc), _arc_num(ns._arc_num),
572
        _next_arc(0), _cand_cost(ns._arc_num), _sort_func(_cand_cost)
573
      {
574
        // The main parameters of the pivot rule
575
        const double BLOCK_SIZE_FACTOR = 1.5;
576
        const int MIN_BLOCK_SIZE = 10;
577
        const double HEAD_LENGTH_FACTOR = 0.1;
578
        const int MIN_HEAD_LENGTH = 3;
579

	
580
        _block_size = std::max( int(BLOCK_SIZE_FACTOR * sqrt(_arc_num)),
581
                                MIN_BLOCK_SIZE );
582
        _head_length = std::max( int(HEAD_LENGTH_FACTOR * _block_size),
583
                                 MIN_HEAD_LENGTH );
584
        _candidates.resize(_head_length + _block_size);
585
        _curr_length = 0;
586
      }
587

	
588
      // Find next entering arc
589
      bool findEnteringArc() {
590
        // Check the current candidate list
591
        int e;
592
        for (int i = 0; i < _curr_length; ++i) {
593
          e = _candidates[i];
594
          _cand_cost[e] = _state[e] *
595
            (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
596
          if (_cand_cost[e] >= 0) {
597
            _candidates[i--] = _candidates[--_curr_length];
598
          }
599
        }
600

	
601
        // Extend the list
602
        int cnt = _block_size;
603
        int last_arc = 0;
604
        int limit = _head_length;
605

	
606
        for (int e = _next_arc; e < _arc_num; ++e) {
607
          _cand_cost[e] = _state[e] *
608
            (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
609
          if (_cand_cost[e] < 0) {
610
            _candidates[_curr_length++] = e;
611
            last_arc = e;
612
          }
613
          if (--cnt == 0) {
614
            if (_curr_length > limit) break;
615
            limit = 0;
616
            cnt = _block_size;
617
          }
618
        }
619
        if (_curr_length <= limit) {
620
          for (int e = 0; e < _next_arc; ++e) {
621
            _cand_cost[e] = _state[e] *
622
              (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
623
            if (_cand_cost[e] < 0) {
624
              _candidates[_curr_length++] = e;
625
              last_arc = e;
626
            }
627
            if (--cnt == 0) {
628
              if (_curr_length > limit) break;
629
              limit = 0;
630
              cnt = _block_size;
631
            }
632
          }
633
        }
634
        if (_curr_length == 0) return false;
635
        _next_arc = last_arc + 1;
636

	
637
        // Make heap of the candidate list (approximating a partial sort)
638
        make_heap( _candidates.begin(), _candidates.begin() + _curr_length,
639
                   _sort_func );
640

	
641
        // Pop the first element of the heap
642
        _in_arc = _candidates[0];
643
        pop_heap( _candidates.begin(), _candidates.begin() + _curr_length,
644
                  _sort_func );
645
        _curr_length = std::min(_head_length, _curr_length - 1);
646
        return true;
647
      }
648

	
649
    }; //class AlteringListPivotRule
650

	
651
  public:
652

	
653
    /// \brief Constructor.
654
    ///
655
    /// The constructor of the class.
656
    ///
657
    /// \param graph The digraph the algorithm runs on.
658
    NetworkSimplex(const GR& graph) :
659
      _graph(graph),
660
      _plower(NULL), _pupper(NULL), _pcost(NULL),
661
      _psupply(NULL), _pstsup(false), _ptype(GEQ),
662
      _flow_map(NULL), _potential_map(NULL),
663
      _local_flow(false), _local_potential(false),
664
      _node_id(graph)
665
    {
666
      LEMON_ASSERT(std::numeric_limits<Flow>::is_integer &&
667
                   std::numeric_limits<Flow>::is_signed,
668
        "The flow type of NetworkSimplex must be signed integer");
669
      LEMON_ASSERT(std::numeric_limits<Cost>::is_integer &&
670
                   std::numeric_limits<Cost>::is_signed,
671
        "The cost type of NetworkSimplex must be signed integer");
672
    }
673

	
674
    /// Destructor.
675
    ~NetworkSimplex() {
676
      if (_local_flow) delete _flow_map;
677
      if (_local_potential) delete _potential_map;
678
    }
679

	
680
    /// \name Parameters
681
    /// The parameters of the algorithm can be specified using these
682
    /// functions.
683

	
684
    /// @{
685

	
686
    /// \brief Set the lower bounds on the arcs.
687
    ///
688
    /// This function sets the lower bounds on the arcs.
689
    /// If neither this function nor \ref boundMaps() is used before
690
    /// calling \ref run(), the lower bounds will be set to zero
691
    /// on all arcs.
692
    ///
693
    /// \param map An arc map storing the lower bounds.
694
    /// Its \c Value type must be convertible to the \c Flow type
695
    /// of the algorithm.
696
    ///
697
    /// \return <tt>(*this)</tt>
698
    template <typename LOWER>
699
    NetworkSimplex& lowerMap(const LOWER& map) {
700
      delete _plower;
701
      _plower = new FlowArcMap(_graph);
702
      for (ArcIt a(_graph); a != INVALID; ++a) {
703
        (*_plower)[a] = map[a];
704
      }
705
      return *this;
706
    }
707

	
708
    /// \brief Set the upper bounds (capacities) on the arcs.
709
    ///
710
    /// This function sets the upper bounds (capacities) on the arcs.
711
    /// If none of the functions \ref upperMap(), \ref capacityMap()
712
    /// and \ref boundMaps() is used before calling \ref run(),
713
    /// the upper bounds (capacities) will be set to
714
    /// \c std::numeric_limits<Flow>::max() on all arcs.
715
    ///
716
    /// \param map An arc map storing the upper bounds.
717
    /// Its \c Value type must be convertible to the \c Flow type
718
    /// of the algorithm.
719
    ///
720
    /// \return <tt>(*this)</tt>
721
    template<typename UPPER>
722
    NetworkSimplex& upperMap(const UPPER& map) {
723
      delete _pupper;
724
      _pupper = new FlowArcMap(_graph);
725
      for (ArcIt a(_graph); a != INVALID; ++a) {
726
        (*_pupper)[a] = map[a];
727
      }
728
      return *this;
729
    }
730

	
731
    /// \brief Set the upper bounds (capacities) on the arcs.
732
    ///
733
    /// This function sets the upper bounds (capacities) on the arcs.
734
    /// It is just an alias for \ref upperMap().
735
    ///
736
    /// \return <tt>(*this)</tt>
737
    template<typename CAP>
738
    NetworkSimplex& capacityMap(const CAP& map) {
739
      return upperMap(map);
740
    }
741

	
742
    /// \brief Set the lower and upper bounds on the arcs.
743
    ///
744
    /// This function sets the lower and upper bounds on the arcs.
745
    /// If neither this function nor \ref lowerMap() is used before
746
    /// calling \ref run(), the lower bounds will be set to zero
747
    /// on all arcs.
748
    /// If none of the functions \ref upperMap(), \ref capacityMap()
749
    /// and \ref boundMaps() is used before calling \ref run(),
750
    /// the upper bounds (capacities) will be set to
751
    /// \c std::numeric_limits<Flow>::max() on all arcs.
752
    ///
753
    /// \param lower An arc map storing the lower bounds.
754
    /// \param upper An arc map storing the upper bounds.
755
    ///
756
    /// The \c Value type of the maps must be convertible to the
757
    /// \c Flow type of the algorithm.
758
    ///
759
    /// \note This function is just a shortcut of calling \ref lowerMap()
760
    /// and \ref upperMap() separately.
761
    ///
762
    /// \return <tt>(*this)</tt>
763
    template <typename LOWER, typename UPPER>
764
    NetworkSimplex& boundMaps(const LOWER& lower, const UPPER& upper) {
765
      return lowerMap(lower).upperMap(upper);
766
    }
767

	
768
    /// \brief Set the costs of the arcs.
769
    ///
770
    /// This function sets the costs of the arcs.
771
    /// If it is not used before calling \ref run(), the costs
772
    /// will be set to \c 1 on all arcs.
773
    ///
774
    /// \param map An arc map storing the costs.
775
    /// Its \c Value type must be convertible to the \c Cost type
776
    /// of the algorithm.
777
    ///
778
    /// \return <tt>(*this)</tt>
779
    template<typename COST>
780
    NetworkSimplex& costMap(const COST& map) {
781
      delete _pcost;
782
      _pcost = new CostArcMap(_graph);
783
      for (ArcIt a(_graph); a != INVALID; ++a) {
784
        (*_pcost)[a] = map[a];
785
      }
786
      return *this;
787
    }
788

	
789
    /// \brief Set the supply values of the nodes.
790
    ///
791
    /// This function sets the supply values of the nodes.
792
    /// If neither this function nor \ref stSupply() is used before
793
    /// calling \ref run(), the supply of each node will be set to zero.
794
    /// (It makes sense only if non-zero lower bounds are given.)
795
    ///
796
    /// \param map A node map storing the supply values.
797
    /// Its \c Value type must be convertible to the \c Flow type
798
    /// of the algorithm.
799
    ///
800
    /// \return <tt>(*this)</tt>
801
    template<typename SUP>
802
    NetworkSimplex& supplyMap(const SUP& map) {
803
      delete _psupply;
804
      _pstsup = false;
805
      _psupply = new FlowNodeMap(_graph);
806
      for (NodeIt n(_graph); n != INVALID; ++n) {
807
        (*_psupply)[n] = map[n];
808
      }
809
      return *this;
810
    }
811

	
812
    /// \brief Set single source and target nodes and a supply value.
813
    ///
814
    /// This function sets a single source node and a single target node
815
    /// and the required flow value.
816
    /// If neither this function nor \ref supplyMap() is used before
817
    /// calling \ref run(), the supply of each node will be set to zero.
818
    /// (It makes sense only if non-zero lower bounds are given.)
819
    ///
820
    /// \param s The source node.
821
    /// \param t The target node.
822
    /// \param k The required amount of flow from node \c s to node \c t
823
    /// (i.e. the supply of \c s and the demand of \c t).
824
    ///
825
    /// \return <tt>(*this)</tt>
826
    NetworkSimplex& stSupply(const Node& s, const Node& t, Flow k) {
827
      delete _psupply;
828
      _psupply = NULL;
829
      _pstsup = true;
830
      _psource = s;
831
      _ptarget = t;
832
      _pstflow = k;
833
      return *this;
834
    }
835
    
836
    /// \brief Set the problem type.
837
    ///
838
    /// This function sets the problem type for the algorithm.
839
    /// If it is not used before calling \ref run(), the \ref GEQ problem
840
    /// type will be used.
841
    ///
842
    /// For more information see \ref ProblemType.
843
    ///
844
    /// \return <tt>(*this)</tt>
845
    NetworkSimplex& problemType(ProblemType problem_type) {
846
      _ptype = problem_type;
847
      return *this;
848
    }
849

	
850
    /// \brief Set the flow map.
851
    ///
852
    /// This function sets the flow map.
853
    /// If it is not used before calling \ref run(), an instance will
854
    /// be allocated automatically. The destructor deallocates this
855
    /// automatically allocated map, of course.
856
    ///
857
    /// \return <tt>(*this)</tt>
858
    NetworkSimplex& flowMap(FlowMap& map) {
859
      if (_local_flow) {
860
        delete _flow_map;
861
        _local_flow = false;
862
      }
863
      _flow_map = &map;
864
      return *this;
865
    }
866

	
867
    /// \brief Set the potential map.
868
    ///
869
    /// This function sets the potential map, which is used for storing
870
    /// the dual solution.
871
    /// If it is not used before calling \ref run(), an instance will
872
    /// be allocated automatically. The destructor deallocates this
873
    /// automatically allocated map, of course.
874
    ///
875
    /// \return <tt>(*this)</tt>
876
    NetworkSimplex& potentialMap(PotentialMap& map) {
877
      if (_local_potential) {
878
        delete _potential_map;
879
        _local_potential = false;
880
      }
881
      _potential_map = &map;
882
      return *this;
883
    }
884
    
885
    /// @}
886

	
887
    /// \name Execution Control
888
    /// The algorithm can be executed using \ref run().
889

	
890
    /// @{
891

	
892
    /// \brief Run the algorithm.
893
    ///
894
    /// This function runs the algorithm.
895
    /// The paramters can be specified using functions \ref lowerMap(),
896
    /// \ref upperMap(), \ref capacityMap(), \ref boundMaps(),
897
    /// \ref costMap(), \ref supplyMap(), \ref stSupply(), 
898
    /// \ref problemType(), \ref flowMap() and \ref potentialMap().
899
    /// For example,
900
    /// \code
901
    ///   NetworkSimplex<ListDigraph> ns(graph);
902
    ///   ns.boundMaps(lower, upper).costMap(cost)
903
    ///     .supplyMap(sup).run();
904
    /// \endcode
905
    ///
906
    /// This function can be called more than once. All the parameters
907
    /// that have been given are kept for the next call, unless
908
    /// \ref reset() is called, thus only the modified parameters
909
    /// have to be set again. See \ref reset() for examples.
910
    ///
911
    /// \param pivot_rule The pivot rule that will be used during the
912
    /// algorithm. For more information see \ref PivotRule.
913
    ///
914
    /// \return \c true if a feasible flow can be found.
915
    bool run(PivotRule pivot_rule = BLOCK_SEARCH) {
916
      return init() && start(pivot_rule);
917
    }
918

	
919
    /// \brief Reset all the parameters that have been given before.
920
    ///
921
    /// This function resets all the paramaters that have been given
922
    /// before using functions \ref lowerMap(), \ref upperMap(),
923
    /// \ref capacityMap(), \ref boundMaps(), \ref costMap(),
924
    /// \ref supplyMap(), \ref stSupply(), \ref problemType(), 
925
    /// \ref flowMap() and \ref potentialMap().
926
    ///
927
    /// It is useful for multiple run() calls. If this function is not
928
    /// used, all the parameters given before are kept for the next
929
    /// \ref run() call.
930
    ///
931
    /// For example,
932
    /// \code
933
    ///   NetworkSimplex<ListDigraph> ns(graph);
934
    ///
935
    ///   // First run
936
    ///   ns.lowerMap(lower).capacityMap(cap).costMap(cost)
937
    ///     .supplyMap(sup).run();
938
    ///
939
    ///   // Run again with modified cost map (reset() is not called,
940
    ///   // so only the cost map have to be set again)
941
    ///   cost[e] += 100;
942
    ///   ns.costMap(cost).run();
943
    ///
944
    ///   // Run again from scratch using reset()
945
    ///   // (the lower bounds will be set to zero on all arcs)
946
    ///   ns.reset();
947
    ///   ns.capacityMap(cap).costMap(cost)
948
    ///     .supplyMap(sup).run();
949
    /// \endcode
950
    ///
951
    /// \return <tt>(*this)</tt>
952
    NetworkSimplex& reset() {
953
      delete _plower;
954
      delete _pupper;
955
      delete _pcost;
956
      delete _psupply;
957
      _plower = NULL;
958
      _pupper = NULL;
959
      _pcost = NULL;
960
      _psupply = NULL;
961
      _pstsup = false;
962
      _ptype = GEQ;
963
      if (_local_flow) delete _flow_map;
964
      if (_local_potential) delete _potential_map;
965
      _flow_map = NULL;
966
      _potential_map = NULL;
967
      _local_flow = false;
968
      _local_potential = false;
969

	
970
      return *this;
971
    }
972

	
973
    /// @}
974

	
975
    /// \name Query Functions
976
    /// The results of the algorithm can be obtained using these
977
    /// functions.\n
978
    /// The \ref run() function must be called before using them.
979

	
980
    /// @{
981

	
982
    /// \brief Return the total cost of the found flow.
983
    ///
984
    /// This function returns the total cost of the found flow.
985
    /// The complexity of the function is O(e).
986
    ///
987
    /// \note The return type of the function can be specified as a
988
    /// template parameter. For example,
989
    /// \code
990
    ///   ns.totalCost<double>();
991
    /// \endcode
992
    /// It is useful if the total cost cannot be stored in the \c Cost
993
    /// type of the algorithm, which is the default return type of the
994
    /// function.
995
    ///
996
    /// \pre \ref run() must be called before using this function.
997
    template <typename Num>
998
    Num totalCost() const {
999
      Num c = 0;
1000
      if (_pcost) {
1001
        for (ArcIt e(_graph); e != INVALID; ++e)
1002
          c += (*_flow_map)[e] * (*_pcost)[e];
1003
      } else {
1004
        for (ArcIt e(_graph); e != INVALID; ++e)
1005
          c += (*_flow_map)[e];
1006
      }
1007
      return c;
1008
    }
1009

	
1010
#ifndef DOXYGEN
1011
    Cost totalCost() const {
1012
      return totalCost<Cost>();
1013
    }
1014
#endif
1015

	
1016
    /// \brief Return the flow on the given arc.
1017
    ///
1018
    /// This function returns the flow on the given arc.
1019
    ///
1020
    /// \pre \ref run() must be called before using this function.
1021
    Flow flow(const Arc& a) const {
1022
      return (*_flow_map)[a];
1023
    }
1024

	
1025
    /// \brief Return a const reference to the flow map.
1026
    ///
1027
    /// This function returns a const reference to an arc map storing
1028
    /// the found flow.
1029
    ///
1030
    /// \pre \ref run() must be called before using this function.
1031
    const FlowMap& flowMap() const {
1032
      return *_flow_map;
1033
    }
1034

	
1035
    /// \brief Return the potential (dual value) of the given node.
1036
    ///
1037
    /// This function returns the potential (dual value) of the
1038
    /// given node.
1039
    ///
1040
    /// \pre \ref run() must be called before using this function.
1041
    Cost potential(const Node& n) const {
1042
      return (*_potential_map)[n];
1043
    }
1044

	
1045
    /// \brief Return a const reference to the potential map
1046
    /// (the dual solution).
1047
    ///
1048
    /// This function returns a const reference to a node map storing
1049
    /// the found potentials, which form the dual solution of the
1050
    /// \ref min_cost_flow "minimum cost flow" problem.
1051
    ///
1052
    /// \pre \ref run() must be called before using this function.
1053
    const PotentialMap& potentialMap() const {
1054
      return *_potential_map;
1055
    }
1056

	
1057
    /// @}
1058

	
1059
  private:
1060

	
1061
    // Initialize internal data structures
1062
    bool init() {
1063
      // Initialize result maps
1064
      if (!_flow_map) {
1065
        _flow_map = new FlowMap(_graph);
1066
        _local_flow = true;
1067
      }
1068
      if (!_potential_map) {
1069
        _potential_map = new PotentialMap(_graph);
1070
        _local_potential = true;
1071
      }
1072

	
1073
      // Initialize vectors
1074
      _node_num = countNodes(_graph);
1075
      _arc_num = countArcs(_graph);
1076
      int all_node_num = _node_num + 1;
1077
      int all_arc_num = _arc_num + _node_num;
1078
      if (_node_num == 0) return false;
1079

	
1080
      _arc_ref.resize(_arc_num);
1081
      _source.resize(all_arc_num);
1082
      _target.resize(all_arc_num);
1083

	
1084
      _cap.resize(all_arc_num);
1085
      _cost.resize(all_arc_num);
1086
      _supply.resize(all_node_num);
1087
      _flow.resize(all_arc_num);
1088
      _pi.resize(all_node_num);
1089

	
1090
      _parent.resize(all_node_num);
1091
      _pred.resize(all_node_num);
1092
      _forward.resize(all_node_num);
1093
      _thread.resize(all_node_num);
1094
      _rev_thread.resize(all_node_num);
1095
      _succ_num.resize(all_node_num);
1096
      _last_succ.resize(all_node_num);
1097
      _state.resize(all_arc_num);
1098

	
1099
      // Initialize node related data
1100
      bool valid_supply = true;
1101
      Flow sum_supply = 0;
1102
      if (!_pstsup && !_psupply) {
1103
        _pstsup = true;
1104
        _psource = _ptarget = NodeIt(_graph);
1105
        _pstflow = 0;
1106
      }
1107
      if (_psupply) {
1108
        int i = 0;
1109
        for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
1110
          _node_id[n] = i;
1111
          _supply[i] = (*_psupply)[n];
1112
          sum_supply += _supply[i];
1113
        }
1114
        valid_supply = (_ptype == GEQ && sum_supply <= 0) ||
1115
                       (_ptype == LEQ && sum_supply >= 0);
1116
      } else {
1117
        int i = 0;
1118
        for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
1119
          _node_id[n] = i;
1120
          _supply[i] = 0;
1121
        }
1122
        _supply[_node_id[_psource]] =  _pstflow;
1123
        _supply[_node_id[_ptarget]] = -_pstflow;
1124
      }
1125
      if (!valid_supply) return false;
1126

	
1127
      // Infinite capacity value
1128
      Flow inf_cap =
1129
        std::numeric_limits<Flow>::has_infinity ?
1130
        std::numeric_limits<Flow>::infinity() :
1131
        std::numeric_limits<Flow>::max();
1132

	
1133
      // Initialize artifical cost
1134
      Cost art_cost;
1135
      if (std::numeric_limits<Cost>::is_exact) {
1136
        art_cost = std::numeric_limits<Cost>::max() / 4 + 1;
1137
      } else {
1138
        art_cost = std::numeric_limits<Cost>::min();
1139
        for (int i = 0; i != _arc_num; ++i) {
1140
          if (_cost[i] > art_cost) art_cost = _cost[i];
1141
        }
1142
        art_cost = (art_cost + 1) * _node_num;
1143
      }
1144

	
1145
      // Run Circulation to check if a feasible solution exists
1146
      typedef ConstMap<Arc, Flow> ConstArcMap;
1147
      FlowNodeMap *csup = NULL;
1148
      bool local_csup = false;
1149
      if (_psupply) {
1150
        csup = _psupply;
1151
      } else {
1152
        csup = new FlowNodeMap(_graph, 0);
1153
        (*csup)[_psource] =  _pstflow;
1154
        (*csup)[_ptarget] = -_pstflow;
1155
        local_csup = true;
1156
      }
1157
      bool circ_result = false;
1158
      if (_ptype == GEQ || (_ptype == LEQ && sum_supply == 0)) {
1159
        // GEQ problem type
1160
        if (_plower) {
1161
          if (_pupper) {
1162
            Circulation<GR, FlowArcMap, FlowArcMap, FlowNodeMap>
1163
              circ(_graph, *_plower, *_pupper, *csup);
1164
            circ_result = circ.run();
1165
          } else {
1166
            Circulation<GR, FlowArcMap, ConstArcMap, FlowNodeMap>
1167
              circ(_graph, *_plower, ConstArcMap(inf_cap), *csup);
1168
            circ_result = circ.run();
1169
          }
1170
        } else {
1171
          if (_pupper) {
1172
            Circulation<GR, ConstArcMap, FlowArcMap, FlowNodeMap>
1173
              circ(_graph, ConstArcMap(0), *_pupper, *csup);
1174
            circ_result = circ.run();
1175
          } else {
1176
            Circulation<GR, ConstArcMap, ConstArcMap, FlowNodeMap>
1177
              circ(_graph, ConstArcMap(0), ConstArcMap(inf_cap), *csup);
1178
            circ_result = circ.run();
1179
          }
1180
        }
1181
      } else {
1182
        // LEQ problem type
1183
        typedef ReverseDigraph<const GR> RevGraph;
1184
        typedef NegMap<FlowNodeMap> NegNodeMap;
1185
        RevGraph rgraph(_graph);
1186
        NegNodeMap neg_csup(*csup);
1187
        if (_plower) {
1188
          if (_pupper) {
1189
            Circulation<RevGraph, FlowArcMap, FlowArcMap, NegNodeMap>
1190
              circ(rgraph, *_plower, *_pupper, neg_csup);
1191
            circ_result = circ.run();
1192
          } else {
1193
            Circulation<RevGraph, FlowArcMap, ConstArcMap, NegNodeMap>
1194
              circ(rgraph, *_plower, ConstArcMap(inf_cap), neg_csup);
1195
            circ_result = circ.run();
1196
          }
1197
        } else {
1198
          if (_pupper) {
1199
            Circulation<RevGraph, ConstArcMap, FlowArcMap, NegNodeMap>
1200
              circ(rgraph, ConstArcMap(0), *_pupper, neg_csup);
1201
            circ_result = circ.run();
1202
          } else {
1203
            Circulation<RevGraph, ConstArcMap, ConstArcMap, NegNodeMap>
1204
              circ(rgraph, ConstArcMap(0), ConstArcMap(inf_cap), neg_csup);
1205
            circ_result = circ.run();
1206
          }
1207
        }
1208
      }
1209
      if (local_csup) delete csup;
1210
      if (!circ_result) return false;
1211

	
1212
      // Set data for the artificial root node
1213
      _root = _node_num;
1214
      _parent[_root] = -1;
1215
      _pred[_root] = -1;
1216
      _thread[_root] = 0;
1217
      _rev_thread[0] = _root;
1218
      _succ_num[_root] = all_node_num;
1219
      _last_succ[_root] = _root - 1;
1220
      _supply[_root] = -sum_supply;
1221
      if (sum_supply < 0) {
1222
        _pi[_root] = -art_cost;
1223
      } else {
1224
        _pi[_root] = art_cost;
1225
      }
1226

	
1227
      // Store the arcs in a mixed order
1228
      int k = std::max(int(sqrt(_arc_num)), 10);
1229
      int i = 0;
1230
      for (ArcIt e(_graph); e != INVALID; ++e) {
1231
        _arc_ref[i] = e;
1232
        if ((i += k) >= _arc_num) i = (i % k) + 1;
1233
      }
1234

	
1235
      // Initialize arc maps
1236
      if (_pupper && _pcost) {
1237
        for (int i = 0; i != _arc_num; ++i) {
1238
          Arc e = _arc_ref[i];
1239
          _source[i] = _node_id[_graph.source(e)];
1240
          _target[i] = _node_id[_graph.target(e)];
1241
          _cap[i] = (*_pupper)[e];
1242
          _cost[i] = (*_pcost)[e];
1243
          _flow[i] = 0;
1244
          _state[i] = STATE_LOWER;
1245
        }
1246
      } else {
1247
        for (int i = 0; i != _arc_num; ++i) {
1248
          Arc e = _arc_ref[i];
1249
          _source[i] = _node_id[_graph.source(e)];
1250
          _target[i] = _node_id[_graph.target(e)];
1251
          _flow[i] = 0;
1252
          _state[i] = STATE_LOWER;
1253
        }
1254
        if (_pupper) {
1255
          for (int i = 0; i != _arc_num; ++i)
1256
            _cap[i] = (*_pupper)[_arc_ref[i]];
1257
        } else {
1258
          for (int i = 0; i != _arc_num; ++i)
1259
            _cap[i] = inf_cap;
1260
        }
1261
        if (_pcost) {
1262
          for (int i = 0; i != _arc_num; ++i)
1263
            _cost[i] = (*_pcost)[_arc_ref[i]];
1264
        } else {
1265
          for (int i = 0; i != _arc_num; ++i)
1266
            _cost[i] = 1;
1267
        }
1268
      }
1269
      
1270
      // Remove non-zero lower bounds
1271
      if (_plower) {
1272
        for (int i = 0; i != _arc_num; ++i) {
1273
          Flow c = (*_plower)[_arc_ref[i]];
1274
          if (c != 0) {
1275
            _cap[i] -= c;
1276
            _supply[_source[i]] -= c;
1277
            _supply[_target[i]] += c;
1278
          }
1279
        }
1280
      }
1281

	
1282
      // Add artificial arcs and initialize the spanning tree data structure
1283
      for (int u = 0, e = _arc_num; u != _node_num; ++u, ++e) {
1284
        _thread[u] = u + 1;
1285
        _rev_thread[u + 1] = u;
1286
        _succ_num[u] = 1;
1287
        _last_succ[u] = u;
1288
        _parent[u] = _root;
1289
        _pred[u] = e;
1290
        _cost[e] = art_cost;
1291
        _cap[e] = inf_cap;
1292
        _state[e] = STATE_TREE;
1293
        if (_supply[u] > 0 || (_supply[u] == 0 && sum_supply <= 0)) {
1294
          _flow[e] = _supply[u];
1295
          _forward[u] = true;
1296
          _pi[u] = -art_cost + _pi[_root];
1297
        } else {
1298
          _flow[e] = -_supply[u];
1299
          _forward[u] = false;
1300
          _pi[u] = art_cost + _pi[_root];
1301
        }
1302
      }
1303

	
1304
      return true;
1305
    }
1306

	
1307
    // Find the join node
1308
    void findJoinNode() {
1309
      int u = _source[in_arc];
1310
      int v = _target[in_arc];
1311
      while (u != v) {
1312
        if (_succ_num[u] < _succ_num[v]) {
1313
          u = _parent[u];
1314
        } else {
1315
          v = _parent[v];
1316
        }
1317
      }
1318
      join = u;
1319
    }
1320

	
1321
    // Find the leaving arc of the cycle and returns true if the
1322
    // leaving arc is not the same as the entering arc
1323
    bool findLeavingArc() {
1324
      // Initialize first and second nodes according to the direction
1325
      // of the cycle
1326
      if (_state[in_arc] == STATE_LOWER) {
1327
        first  = _source[in_arc];
1328
        second = _target[in_arc];
1329
      } else {
1330
        first  = _target[in_arc];
1331
        second = _source[in_arc];
1332
      }
1333
      delta = _cap[in_arc];
1334
      int result = 0;
1335
      Flow d;
1336
      int e;
1337

	
1338
      // Search the cycle along the path form the first node to the root
1339
      for (int u = first; u != join; u = _parent[u]) {
1340
        e = _pred[u];
1341
        d = _forward[u] ? _flow[e] : _cap[e] - _flow[e];
1342
        if (d < delta) {
1343
          delta = d;
1344
          u_out = u;
1345
          result = 1;
1346
        }
1347
      }
1348
      // Search the cycle along the path form the second node to the root
1349
      for (int u = second; u != join; u = _parent[u]) {
1350
        e = _pred[u];
1351
        d = _forward[u] ? _cap[e] - _flow[e] : _flow[e];
1352
        if (d <= delta) {
1353
          delta = d;
1354
          u_out = u;
1355
          result = 2;
1356
        }
1357
      }
1358

	
1359
      if (result == 1) {
1360
        u_in = first;
1361
        v_in = second;
1362
      } else {
1363
        u_in = second;
1364
        v_in = first;
1365
      }
1366
      return result != 0;
1367
    }
1368

	
1369
    // Change _flow and _state vectors
1370
    void changeFlow(bool change) {
1371
      // Augment along the cycle
1372
      if (delta > 0) {
1373
        Flow val = _state[in_arc] * delta;
1374
        _flow[in_arc] += val;
1375
        for (int u = _source[in_arc]; u != join; u = _parent[u]) {
1376
          _flow[_pred[u]] += _forward[u] ? -val : val;
1377
        }
1378
        for (int u = _target[in_arc]; u != join; u = _parent[u]) {
1379
          _flow[_pred[u]] += _forward[u] ? val : -val;
1380
        }
1381
      }
1382
      // Update the state of the entering and leaving arcs
1383
      if (change) {
1384
        _state[in_arc] = STATE_TREE;
1385
        _state[_pred[u_out]] =
1386
          (_flow[_pred[u_out]] == 0) ? STATE_LOWER : STATE_UPPER;
1387
      } else {
1388
        _state[in_arc] = -_state[in_arc];
1389
      }
1390
    }
1391

	
1392
    // Update the tree structure
1393
    void updateTreeStructure() {
1394
      int u, w;
1395
      int old_rev_thread = _rev_thread[u_out];
1396
      int old_succ_num = _succ_num[u_out];
1397
      int old_last_succ = _last_succ[u_out];
1398
      v_out = _parent[u_out];
1399

	
1400
      u = _last_succ[u_in];  // the last successor of u_in
1401
      right = _thread[u];    // the node after it
1402

	
1403
      // Handle the case when old_rev_thread equals to v_in
1404
      // (it also means that join and v_out coincide)
1405
      if (old_rev_thread == v_in) {
1406
        last = _thread[_last_succ[u_out]];
1407
      } else {
1408
        last = _thread[v_in];
1409
      }
1410

	
1411
      // Update _thread and _parent along the stem nodes (i.e. the nodes
1412
      // between u_in and u_out, whose parent have to be changed)
1413
      _thread[v_in] = stem = u_in;
1414
      _dirty_revs.clear();
1415
      _dirty_revs.push_back(v_in);
1416
      par_stem = v_in;
1417
      while (stem != u_out) {
1418
        // Insert the next stem node into the thread list
1419
        new_stem = _parent[stem];
1420
        _thread[u] = new_stem;
1421
        _dirty_revs.push_back(u);
1422

	
1423
        // Remove the subtree of stem from the thread list
1424
        w = _rev_thread[stem];
1425
        _thread[w] = right;
1426
        _rev_thread[right] = w;
1427

	
1428
        // Change the parent node and shift stem nodes
1429
        _parent[stem] = par_stem;
1430
        par_stem = stem;
1431
        stem = new_stem;
1432

	
1433
        // Update u and right
1434
        u = _last_succ[stem] == _last_succ[par_stem] ?
1435
          _rev_thread[par_stem] : _last_succ[stem];
1436
        right = _thread[u];
1437
      }
1438
      _parent[u_out] = par_stem;
1439
      _thread[u] = last;
1440
      _rev_thread[last] = u;
1441
      _last_succ[u_out] = u;
1442

	
1443
      // Remove the subtree of u_out from the thread list except for
1444
      // the case when old_rev_thread equals to v_in
1445
      // (it also means that join and v_out coincide)
1446
      if (old_rev_thread != v_in) {
1447
        _thread[old_rev_thread] = right;
1448
        _rev_thread[right] = old_rev_thread;
1449
      }
1450

	
1451
      // Update _rev_thread using the new _thread values
1452
      for (int i = 0; i < int(_dirty_revs.size()); ++i) {
1453
        u = _dirty_revs[i];
1454
        _rev_thread[_thread[u]] = u;
1455
      }
1456

	
1457
      // Update _pred, _forward, _last_succ and _succ_num for the
1458
      // stem nodes from u_out to u_in
1459
      int tmp_sc = 0, tmp_ls = _last_succ[u_out];
1460
      u = u_out;
1461
      while (u != u_in) {
1462
        w = _parent[u];
1463
        _pred[u] = _pred[w];
1464
        _forward[u] = !_forward[w];
1465
        tmp_sc += _succ_num[u] - _succ_num[w];
1466
        _succ_num[u] = tmp_sc;
1467
        _last_succ[w] = tmp_ls;
1468
        u = w;
1469
      }
1470
      _pred[u_in] = in_arc;
1471
      _forward[u_in] = (u_in == _source[in_arc]);
1472
      _succ_num[u_in] = old_succ_num;
1473

	
1474
      // Set limits for updating _last_succ form v_in and v_out
1475
      // towards the root
1476
      int up_limit_in = -1;
1477
      int up_limit_out = -1;
1478
      if (_last_succ[join] == v_in) {
1479
        up_limit_out = join;
1480
      } else {
1481
        up_limit_in = join;
1482
      }
1483

	
1484
      // Update _last_succ from v_in towards the root
1485
      for (u = v_in; u != up_limit_in && _last_succ[u] == v_in;
1486
           u = _parent[u]) {
1487
        _last_succ[u] = _last_succ[u_out];
1488
      }
1489
      // Update _last_succ from v_out towards the root
1490
      if (join != old_rev_thread && v_in != old_rev_thread) {
1491
        for (u = v_out; u != up_limit_out && _last_succ[u] == old_last_succ;
1492
             u = _parent[u]) {
1493
          _last_succ[u] = old_rev_thread;
1494
        }
1495
      } else {
1496
        for (u = v_out; u != up_limit_out && _last_succ[u] == old_last_succ;
1497
             u = _parent[u]) {
1498
          _last_succ[u] = _last_succ[u_out];
1499
        }
1500
      }
1501

	
1502
      // Update _succ_num from v_in to join
1503
      for (u = v_in; u != join; u = _parent[u]) {
1504
        _succ_num[u] += old_succ_num;
1505
      }
1506
      // Update _succ_num from v_out to join
1507
      for (u = v_out; u != join; u = _parent[u]) {
1508
        _succ_num[u] -= old_succ_num;
1509
      }
1510
    }
1511

	
1512
    // Update potentials
1513
    void updatePotential() {
1514
      Cost sigma = _forward[u_in] ?
1515
        _pi[v_in] - _pi[u_in] - _cost[_pred[u_in]] :
1516
        _pi[v_in] - _pi[u_in] + _cost[_pred[u_in]];
1517
      // Update potentials in the subtree, which has been moved
1518
      int end = _thread[_last_succ[u_in]];
1519
      for (int u = u_in; u != end; u = _thread[u]) {
1520
        _pi[u] += sigma;
1521
      }
1522
    }
1523

	
1524
    // Execute the algorithm
1525
    bool start(PivotRule pivot_rule) {
1526
      // Select the pivot rule implementation
1527
      switch (pivot_rule) {
1528
        case FIRST_ELIGIBLE:
1529
          return start<FirstEligiblePivotRule>();
1530
        case BEST_ELIGIBLE:
1531
          return start<BestEligiblePivotRule>();
1532
        case BLOCK_SEARCH:
1533
          return start<BlockSearchPivotRule>();
1534
        case CANDIDATE_LIST:
1535
          return start<CandidateListPivotRule>();
1536
        case ALTERING_LIST:
1537
          return start<AlteringListPivotRule>();
1538
      }
1539
      return false;
1540
    }
1541

	
1542
    template <typename PivotRuleImpl>
1543
    bool start() {
1544
      PivotRuleImpl pivot(*this);
1545

	
1546
      // Execute the Network Simplex algorithm
1547
      while (pivot.findEnteringArc()) {
1548
        findJoinNode();
1549
        bool change = findLeavingArc();
1550
        changeFlow(change);
1551
        if (change) {
1552
          updateTreeStructure();
1553
          updatePotential();
1554
        }
1555
      }
1556

	
1557
      // Copy flow values to _flow_map
1558
      if (_plower) {
1559
        for (int i = 0; i != _arc_num; ++i) {
1560
          Arc e = _arc_ref[i];
1561
          _flow_map->set(e, (*_plower)[e] + _flow[i]);
1562
        }
1563
      } else {
1564
        for (int i = 0; i != _arc_num; ++i) {
1565
          _flow_map->set(_arc_ref[i], _flow[i]);
1566
        }
1567
      }
1568
      // Copy potential values to _potential_map
1569
      for (NodeIt n(_graph); n != INVALID; ++n) {
1570
        _potential_map->set(n, _pi[_node_id[n]]);
1571
      }
1572

	
1573
      return true;
1574
    }
1575

	
1576
  }; //class NetworkSimplex
1577

	
1578
  ///@}
1579

	
1580
} //namespace lemon
1581

	
1582
#endif //LEMON_NETWORK_SIMPLEX_H
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2009
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#include <iostream>
20
#include <fstream>
21

	
22
#include <lemon/list_graph.h>
23
#include <lemon/lgf_reader.h>
24

	
25
#include <lemon/network_simplex.h>
26

	
27
#include <lemon/concepts/digraph.h>
28
#include <lemon/concept_check.h>
29

	
30
#include "test_tools.h"
31

	
32
using namespace lemon;
33

	
34
char test_lgf[] =
35
  "@nodes\n"
36
  "label  sup1 sup2 sup3 sup4 sup5\n"
37
  "    1    20   27    0   20   30\n"
38
  "    2    -4    0    0   -8   -3\n"
39
  "    3     0    0    0    0    0\n"
40
  "    4     0    0    0    0    0\n"
41
  "    5     9    0    0    6   11\n"
42
  "    6    -6    0    0   -5   -6\n"
43
  "    7     0    0    0    0    0\n"
44
  "    8     0    0    0    0    3\n"
45
  "    9     3    0    0    0    0\n"
46
  "   10    -2    0    0   -7   -2\n"
47
  "   11     0    0    0  -10    0\n"
48
  "   12   -20  -27    0  -30  -20\n"
49
  "\n"
50
  "@arcs\n"
51
  "       cost  cap low1 low2\n"
52
  " 1  2    70   11    0    8\n"
53
  " 1  3   150    3    0    1\n"
54
  " 1  4    80   15    0    2\n"
55
  " 2  8    80   12    0    0\n"
56
  " 3  5   140    5    0    3\n"
57
  " 4  6    60   10    0    1\n"
58
  " 4  7    80    2    0    0\n"
59
  " 4  8   110    3    0    0\n"
60
  " 5  7    60   14    0    0\n"
61
  " 5 11   120   12    0    0\n"
62
  " 6  3     0    3    0    0\n"
63
  " 6  9   140    4    0    0\n"
64
  " 6 10    90    8    0    0\n"
65
  " 7  1    30    5    0    0\n"
66
  " 8 12    60   16    0    4\n"
67
  " 9 12    50    6    0    0\n"
68
  "10 12    70   13    0    5\n"
69
  "10  2   100    7    0    0\n"
70
  "10  7    60   10    0    0\n"
71
  "11 10    20   14    0    6\n"
72
  "12 11    30   10    0    0\n"
73
  "\n"
74
  "@attributes\n"
75
  "source 1\n"
76
  "target 12\n";
77

	
78

	
79
enum ProblemType {
80
  EQ,
81
  GEQ,
82
  LEQ
83
};
84

	
85
// Check the interface of an MCF algorithm
86
template <typename GR, typename Flow, typename Cost>
87
class McfClassConcept
88
{
89
public:
90

	
91
  template <typename MCF>
92
  struct Constraints {
93
    void constraints() {
94
      checkConcept<concepts::Digraph, GR>();
95

	
96
      MCF mcf(g);
97

	
98
      b = mcf.reset()
99
             .lowerMap(lower)
100
             .upperMap(upper)
101
             .capacityMap(upper)
102
             .boundMaps(lower, upper)
103
             .costMap(cost)
104
             .supplyMap(sup)
105
             .stSupply(n, n, k)
106
             .flowMap(flow)
107
             .potentialMap(pot)
108
             .run();
109
      
110
      const MCF& const_mcf = mcf;
111

	
112
      const typename MCF::FlowMap &fm = const_mcf.flowMap();
113
      const typename MCF::PotentialMap &pm = const_mcf.potentialMap();
114

	
115
      v = const_mcf.totalCost();
116
      double x = const_mcf.template totalCost<double>();
117
      v = const_mcf.flow(a);
118
      v = const_mcf.potential(n);
119

	
120
      ignore_unused_variable_warning(fm);
121
      ignore_unused_variable_warning(pm);
122
      ignore_unused_variable_warning(x);
123
    }
124

	
125
    typedef typename GR::Node Node;
126
    typedef typename GR::Arc Arc;
127
    typedef concepts::ReadMap<Node, Flow> NM;
128
    typedef concepts::ReadMap<Arc, Flow> FAM;
129
    typedef concepts::ReadMap<Arc, Cost> CAM;
130

	
131
    const GR &g;
132
    const FAM &lower;
133
    const FAM &upper;
134
    const CAM &cost;
135
    const NM &sup;
136
    const Node &n;
137
    const Arc &a;
138
    const Flow &k;
139
    Flow v;
140
    bool b;
141

	
142
    typename MCF::FlowMap &flow;
143
    typename MCF::PotentialMap &pot;
144
  };
145

	
146
};
147

	
148

	
149
// Check the feasibility of the given flow (primal soluiton)
150
template < typename GR, typename LM, typename UM,
151
           typename SM, typename FM >
152
bool checkFlow( const GR& gr, const LM& lower, const UM& upper,
153
                const SM& supply, const FM& flow,
154
                ProblemType type = EQ )
155
{
156
  TEMPLATE_DIGRAPH_TYPEDEFS(GR);
157

	
158
  for (ArcIt e(gr); e != INVALID; ++e) {
159
    if (flow[e] < lower[e] || flow[e] > upper[e]) return false;
160
  }
161

	
162
  for (NodeIt n(gr); n != INVALID; ++n) {
163
    typename SM::Value sum = 0;
164
    for (OutArcIt e(gr, n); e != INVALID; ++e)
165
      sum += flow[e];
166
    for (InArcIt e(gr, n); e != INVALID; ++e)
167
      sum -= flow[e];
168
    bool b = (type ==  EQ && sum == supply[n]) ||
169
             (type == GEQ && sum >= supply[n]) ||
170
             (type == LEQ && sum <= supply[n]);
171
    if (!b) return false;
172
  }
173

	
174
  return true;
175
}
176

	
177
// Check the feasibility of the given potentials (dual soluiton)
178
// using the "Complementary Slackness" optimality condition
179
template < typename GR, typename LM, typename UM,
180
           typename CM, typename SM, typename FM, typename PM >
181
bool checkPotential( const GR& gr, const LM& lower, const UM& upper,
182
                     const CM& cost, const SM& supply, const FM& flow, 
183
                     const PM& pi )
184
{
185
  TEMPLATE_DIGRAPH_TYPEDEFS(GR);
186

	
187
  bool opt = true;
188
  for (ArcIt e(gr); opt && e != INVALID; ++e) {
189
    typename CM::Value red_cost =
190
      cost[e] + pi[gr.source(e)] - pi[gr.target(e)];
191
    opt = red_cost == 0 ||
192
          (red_cost > 0 && flow[e] == lower[e]) ||
193
          (red_cost < 0 && flow[e] == upper[e]);
194
  }
195
  
196
  for (NodeIt n(gr); opt && n != INVALID; ++n) {
197
    typename SM::Value sum = 0;
198
    for (OutArcIt e(gr, n); e != INVALID; ++e)
199
      sum += flow[e];
200
    for (InArcIt e(gr, n); e != INVALID; ++e)
201
      sum -= flow[e];
202
    opt = (sum == supply[n]) || (pi[n] == 0);
203
  }
204
  
205
  return opt;
206
}
207

	
208
// Run a minimum cost flow algorithm and check the results
209
template < typename MCF, typename GR,
210
           typename LM, typename UM,
211
           typename CM, typename SM >
212
void checkMcf( const MCF& mcf, bool mcf_result,
213
               const GR& gr, const LM& lower, const UM& upper,
214
               const CM& cost, const SM& supply,
215
               bool result, typename CM::Value total,
216
               const std::string &test_id = "",
217
               ProblemType type = EQ )
218
{
219
  check(mcf_result == result, "Wrong result " + test_id);
220
  if (result) {
221
    check(checkFlow(gr, lower, upper, supply, mcf.flowMap(), type),
222
          "The flow is not feasible " + test_id);
223
    check(mcf.totalCost() == total, "The flow is not optimal " + test_id);
224
    check(checkPotential(gr, lower, upper, cost, supply, mcf.flowMap(),
225
                         mcf.potentialMap()),
226
          "Wrong potentials " + test_id);
227
  }
228
}
229

	
230
int main()
231
{
232
  // Check the interfaces
233
  {
234
    typedef int Flow;
235
    typedef int Cost;
236
    // TODO: This typedef should be enabled if the standard maps are
237
    // reference maps in the graph concepts (See #190).
238
/**/
239
    //typedef concepts::Digraph GR;
240
    typedef ListDigraph GR;
241
/**/
242
    checkConcept< McfClassConcept<GR, Flow, Cost>,
243
                  NetworkSimplex<GR, Flow, Cost> >();
244
  }
245

	
246
  // Run various MCF tests
247
  typedef ListDigraph Digraph;
248
  DIGRAPH_TYPEDEFS(ListDigraph);
249

	
250
  // Read the test digraph
251
  Digraph gr;
252
  Digraph::ArcMap<int> c(gr), l1(gr), l2(gr), u(gr);
253
  Digraph::NodeMap<int> s1(gr), s2(gr), s3(gr), s4(gr), s5(gr);
254
  ConstMap<Arc, int> cc(1), cu(std::numeric_limits<int>::max());
255
  Node v, w;
256

	
257
  std::istringstream input(test_lgf);
258
  DigraphReader<Digraph>(gr, input)
259
    .arcMap("cost", c)
260
    .arcMap("cap", u)
261
    .arcMap("low1", l1)
262
    .arcMap("low2", l2)
263
    .nodeMap("sup1", s1)
264
    .nodeMap("sup2", s2)
265
    .nodeMap("sup3", s3)
266
    .nodeMap("sup4", s4)
267
    .nodeMap("sup5", s5)
268
    .node("source", v)
269
    .node("target", w)
270
    .run();
271

	
272
  // A. Test NetworkSimplex with the default pivot rule
273
  {
274
    NetworkSimplex<Digraph> mcf(gr);
275

	
276
    // Check the equality form
277
    mcf.upperMap(u).costMap(c);
278
    checkMcf(mcf, mcf.supplyMap(s1).run(),
279
             gr, l1, u, c, s1, true,  5240, "#A1");
280
    checkMcf(mcf, mcf.stSupply(v, w, 27).run(),
281
             gr, l1, u, c, s2, true,  7620, "#A2");
282
    mcf.lowerMap(l2);
283
    checkMcf(mcf, mcf.supplyMap(s1).run(),
284
             gr, l2, u, c, s1, true,  5970, "#A3");
285
    checkMcf(mcf, mcf.stSupply(v, w, 27).run(),
286
             gr, l2, u, c, s2, true,  8010, "#A4");
287
    mcf.reset();
288
    checkMcf(mcf, mcf.supplyMap(s1).run(),
289
             gr, l1, cu, cc, s1, true,  74, "#A5");
290
    checkMcf(mcf, mcf.lowerMap(l2).stSupply(v, w, 27).run(),
291
             gr, l2, cu, cc, s2, true,  94, "#A6");
292
    mcf.reset();
293
    checkMcf(mcf, mcf.run(),
294
             gr, l1, cu, cc, s3, true,   0, "#A7");
295
    checkMcf(mcf, mcf.boundMaps(l2, u).run(),
296
             gr, l2, u, cc, s3, false,   0, "#A8");
297

	
298
    // Check the GEQ form
299
    mcf.reset().upperMap(u).costMap(c).supplyMap(s4);
300
    checkMcf(mcf, mcf.run(),
301
             gr, l1, u, c, s4, true,  3530, "#A9", GEQ);
302
    mcf.problemType(mcf.GEQ);
303
    checkMcf(mcf, mcf.lowerMap(l2).run(),
304
             gr, l2, u, c, s4, true,  4540, "#A10", GEQ);
305
    mcf.problemType(mcf.CARRY_SUPPLIES).supplyMap(s5);
306
    checkMcf(mcf, mcf.run(),
307
             gr, l2, u, c, s5, false,    0, "#A11", GEQ);
308

	
309
    // Check the LEQ form
310
    mcf.reset().problemType(mcf.LEQ);
311
    mcf.upperMap(u).costMap(c).supplyMap(s5);
312
    checkMcf(mcf, mcf.run(),
313
             gr, l1, u, c, s5, true,  5080, "#A12", LEQ);
314
    checkMcf(mcf, mcf.lowerMap(l2).run(),
315
             gr, l2, u, c, s5, true,  5930, "#A13", LEQ);
316
    mcf.problemType(mcf.SATISFY_DEMANDS).supplyMap(s4);
317
    checkMcf(mcf, mcf.run(),
318
             gr, l2, u, c, s4, false,    0, "#A14", LEQ);
319
  }
320

	
321
  // B. Test NetworkSimplex with each pivot rule
322
  {
323
    NetworkSimplex<Digraph> mcf(gr);
324
    mcf.supplyMap(s1).costMap(c).capacityMap(u).lowerMap(l2);
325

	
326
    checkMcf(mcf, mcf.run(NetworkSimplex<Digraph>::FIRST_ELIGIBLE),
327
             gr, l2, u, c, s1, true,  5970, "#B1");
328
    checkMcf(mcf, mcf.run(NetworkSimplex<Digraph>::BEST_ELIGIBLE),
329
             gr, l2, u, c, s1, true,  5970, "#B2");
330
    checkMcf(mcf, mcf.run(NetworkSimplex<Digraph>::BLOCK_SEARCH),
331
             gr, l2, u, c, s1, true,  5970, "#B3");
332
    checkMcf(mcf, mcf.run(NetworkSimplex<Digraph>::CANDIDATE_LIST),
333
             gr, l2, u, c, s1, true,  5970, "#B4");
334
    checkMcf(mcf, mcf.run(NetworkSimplex<Digraph>::ALTERING_LIST),
335
             gr, l2, u, c, s1, true,  5970, "#B5");
336
  }
337

	
338
  return 0;
339
}
Ignore white space 6 line context
... ...
@@ -318,13 +318,13 @@
318 318
The \e maximum \e flow \e problem is to find a flow of maximum value between
319 319
a single source and a single target. Formally, there is a \f$G=(V,A)\f$
320
digraph, a \f$cap:A\rightarrow\mathbf{R}^+_0\f$ capacity function and
320
digraph, a \f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function and
321 321
\f$s, t \in V\f$ source and target nodes.
322
A maximum flow is an \f$f:A\rightarrow\mathbf{R}^+_0\f$ solution of the
322
A maximum flow is an \f$f: A\rightarrow\mathbf{R}^+_0\f$ solution of the
323 323
following optimization problem.
324 324

	
325
\f[ \max\sum_{a\in\delta_{out}(s)}f(a) - \sum_{a\in\delta_{in}(s)}f(a) \f]
326
\f[ \sum_{a\in\delta_{out}(v)} f(a) = \sum_{a\in\delta_{in}(v)} f(a)
327
    \qquad \forall v\in V\setminus\{s,t\} \f]
328
\f[ 0 \leq f(a) \leq cap(a) \qquad \forall a\in A \f]
325
\f[ \max\sum_{sv\in A} f(sv) - \sum_{vs\in A} f(vs) \f]
326
\f[ \sum_{uv\in A} f(uv) = \sum_{vu\in A} f(vu)
327
    \quad \forall u\in V\setminus\{s,t\} \f]
328
\f[ 0 \leq f(uv) \leq cap(uv) \quad \forall uv\in A \f]
329 329

	
330 330
LEMON contains several algorithms for solving maximum flow problems:
... ...
@@ -351,28 +351,96 @@
351 351
The \e minimum \e cost \e flow \e problem is to find a feasible flow of
352 352
minimum total cost from a set of supply nodes to a set of demand nodes
353
in a network with capacity constraints and arc costs.
353
in a network with capacity constraints (lower and upper bounds)
354
and arc costs.
354 355
Formally, let \f$G=(V,A)\f$ be a digraph,
355 356
\f$lower, upper: A\rightarrow\mathbf{Z}^+_0\f$ denote the lower and
356
upper bounds for the flow values on the arcs,
357
upper bounds for the flow values on the arcs, for which
358
\f$0 \leq lower(uv) \leq upper(uv)\f$ holds for all \f$uv\in A\f$.
357 359
\f$cost: A\rightarrow\mathbf{Z}^+_0\f$ denotes the cost per unit flow
358
on the arcs, and
359
\f$supply: V\rightarrow\mathbf{Z}\f$ denotes the supply/demand values
360
of the nodes.
361
A minimum cost flow is an \f$f:A\rightarrow\mathbf{R}^+_0\f$ solution of
362
the following optimization problem.
360
on the arcs, and \f$sup: V\rightarrow\mathbf{Z}\f$ denotes the
361
signed supply values of the nodes.
362
If \f$sup(u)>0\f$, then \f$u\f$ is a supply node with \f$sup(u)\f$
363
supply, if \f$sup(u)<0\f$, then \f$u\f$ is a demand node with
364
\f$-sup(u)\f$ demand.
365
A minimum cost flow is an \f$f: A\rightarrow\mathbf{Z}^+_0\f$ solution
366
of the following optimization problem.
363 367

	
364
\f[ \min\sum_{a\in A} f(a) cost(a) \f]
365
\f[ \sum_{a\in\delta_{out}(v)} f(a) - \sum_{a\in\delta_{in}(v)} f(a) =
366
    supply(v) \qquad \forall v\in V \f]
367
\f[ lower(a) \leq f(a) \leq upper(a) \qquad \forall a\in A \f]
368
\f[ \min\sum_{uv\in A} f(uv) \cdot cost(uv) \f]
369
\f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \geq
370
    sup(u) \quad \forall u\in V \f]
371
\f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A \f]
368 372

	
369
LEMON contains several algorithms for solving minimum cost flow problems:
370
 - \ref CycleCanceling Cycle-canceling algorithms.
371
 - \ref CapacityScaling Successive shortest path algorithm with optional
373
The sum of the supply values, i.e. \f$\sum_{u\in V} sup(u)\f$ must be
374
zero or negative in order to have a feasible solution (since the sum
375
of the expressions on the left-hand side of the inequalities is zero).
376
It means that the total demand must be greater or equal to the total
377
supply and all the supplies have to be carried out from the supply nodes,
378
but there could be demands that are not satisfied.
379
If \f$\sum_{u\in V} sup(u)\f$ is zero, then all the supply/demand
380
constraints have to be satisfied with equality, i.e. all demands
381
have to be satisfied and all supplies have to be used.
382

	
383
If you need the opposite inequalities in the supply/demand constraints
384
(i.e. the total demand is less than the total supply and all the demands
385
have to be satisfied while there could be supplies that are not used),
386
then you could easily transform the problem to the above form by reversing
387
the direction of the arcs and taking the negative of the supply values
388
(e.g. using \ref ReverseDigraph and \ref NegMap adaptors).
389
However \ref NetworkSimplex algorithm also supports this form directly
390
for the sake of convenience.
391

	
392
A feasible solution for this problem can be found using \ref Circulation.
393

	
394
Note that the above formulation is actually more general than the usual
395
definition of the minimum cost flow problem, in which strict equalities
396
are required in the supply/demand contraints, i.e.
397

	
398
\f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) =
399
    sup(u) \quad \forall u\in V. \f]
400

	
401
However if the sum of the supply values is zero, then these two problems
402
are equivalent. So if you need the equality form, you have to ensure this
403
additional contraint for the algorithms.
404

	
405
The dual solution of the minimum cost flow problem is represented by node 
406
potentials \f$\pi: V\rightarrow\mathbf{Z}\f$.
407
An \f$f: A\rightarrow\mathbf{Z}^+_0\f$ feasible solution of the problem
408
is optimal if and only if for some \f$\pi: V\rightarrow\mathbf{Z}\f$
409
node potentials the following \e complementary \e slackness optimality
410
conditions hold.
411

	
412
 - For all \f$uv\in A\f$ arcs:
413
   - if \f$cost^\pi(uv)>0\f$, then \f$f(uv)=lower(uv)\f$;
414
   - if \f$lower(uv)<f(uv)<upper(uv)\f$, then \f$cost^\pi(uv)=0\f$;
415
   - if \f$cost^\pi(uv)<0\f$, then \f$f(uv)=upper(uv)\f$.
416
 - For all \f$u\in V\f$:
417
   - if \f$\sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \neq sup(u)\f$,
418
     then \f$\pi(u)=0\f$.
419
 
420
Here \f$cost^\pi(uv)\f$ denotes the \e reduced \e cost of the arc
421
\f$uv\in A\f$ with respect to the node potentials \f$\pi\f$, i.e.
422
\f[ cost^\pi(uv) = cost(uv) + \pi(u) - \pi(v).\f]
423

	
424
All algorithms provide dual solution (node potentials) as well
425
if an optimal flow is found.
426

	
427
LEMON contains several algorithms for solving minimum cost flow problems.
428
 - \ref NetworkSimplex Primal Network Simplex algorithm with various
429
   pivot strategies.
430
 - \ref CostScaling Push-Relabel and Augment-Relabel algorithms based on
431
   cost scaling.
432
 - \ref CapacityScaling Successive Shortest %Path algorithm with optional
372 433
   capacity scaling.
373
 - \ref CostScaling Push-relabel and augment-relabel algorithms based on
374
   cost scaling.
375
 - \ref NetworkSimplex Primal network simplex algorithm with various
376
   pivot strategies.
434
 - \ref CancelAndTighten The Cancel and Tighten algorithm.
435
 - \ref CycleCanceling Cycle-Canceling algorithms.
436

	
437
Most of these implementations support the general inequality form of the
438
minimum cost flow problem, but CancelAndTighten and CycleCanceling
439
only support the equality form due to the primal method they use.
440

	
441
In general NetworkSimplex is the most efficient implementation,
442
but in special cases other algorithms could be faster.
443
For example, if the total supply and/or capacities are rather small,
444
CapacityScaling is usually the fastest algorithm (without effective scaling).
377 445
*/
378 446

	
Ignore white space 4 line context
... ...
@@ -94,4 +94,5 @@
94 94
	lemon/min_cost_arborescence.h \
95 95
	lemon/nauty_reader.h \
96
	lemon/network_simplex.h \
96 97
	lemon/path.h \
97 98
	lemon/preflow.h \
Ignore white space 6 line context
... ...
@@ -32,10 +32,11 @@
32 32
  ///
33 33
  /// Default traits class of Circulation class.
34
  /// \tparam GR Digraph type.
35
  /// \tparam LM Lower bound capacity map type.
36
  /// \tparam UM Upper bound capacity map type.
37
  /// \tparam DM Delta map type.
34
  ///
35
  /// \tparam GR Type of the digraph the algorithm runs on.
36
  /// \tparam LM The type of the lower bound map.
37
  /// \tparam UM The type of the upper bound (capacity) map.
38
  /// \tparam SM The type of the supply map.
38 39
  template <typename GR, typename LM,
39
            typename UM, typename DM>
40
            typename UM, typename SM>
40 41
  struct CirculationDefaultTraits {
41 42

	
... ...
@@ -43,39 +44,38 @@
43 44
    typedef GR Digraph;
44 45

	
45
    /// \brief The type of the map that stores the circulation lower
46
    /// bound.
46
    /// \brief The type of the lower bound map.
47 47
    ///
48
    /// The type of the map that stores the circulation lower bound.
49
    /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
50
    typedef LM LCapMap;
48
    /// The type of the map that stores the lower bounds on the arcs.
49
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
50
    typedef LM LowerMap;
51 51

	
52
    /// \brief The type of the map that stores the circulation upper
53
    /// bound.
52
    /// \brief The type of the upper bound (capacity) map.
54 53
    ///
55
    /// The type of the map that stores the circulation upper bound.
56
    /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
57
    typedef UM UCapMap;
54
    /// The type of the map that stores the upper bounds (capacities)
55
    /// on the arcs.
56
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
57
    typedef UM UpperMap;
58 58

	
59
    /// \brief The type of the map that stores the lower bound for
60
    /// the supply of the nodes.
59
    /// \brief The type of supply map.
61 60
    ///
62
    /// The type of the map that stores the lower bound for the supply
63
    /// of the nodes. It must meet the \ref concepts::ReadMap "ReadMap"
64
    /// concept.
65
    typedef DM DeltaMap;
61
    /// The type of the map that stores the signed supply values of the 
62
    /// nodes. 
63
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
64
    typedef SM SupplyMap;
66 65

	
67 66
    /// \brief The type of the flow values.
68
    typedef typename DeltaMap::Value Value;
67
    typedef typename SupplyMap::Value Flow;
69 68

	
70 69
    /// \brief The type of the map that stores the flow values.
71 70
    ///
72 71
    /// The type of the map that stores the flow values.
73
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
74
    typedef typename Digraph::template ArcMap<Value> FlowMap;
72
    /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap"
73
    /// concept.
74
    typedef typename Digraph::template ArcMap<Flow> FlowMap;
75 75

	
76 76
    /// \brief Instantiates a FlowMap.
77 77
    ///
78 78
    /// This function instantiates a \ref FlowMap.
79
    /// \param digraph The digraph, to which we would like to define
79
    /// \param digraph The digraph for which we would like to define
80 80
    /// the flow map.
81 81
    static FlowMap* createFlowMap(const Digraph& digraph) {
... ...
@@ -94,5 +94,5 @@
94 94
    ///
95 95
    /// This function instantiates an \ref Elevator.
96
    /// \param digraph The digraph, to which we would like to define
96
    /// \param digraph The digraph for which we would like to define
97 97
    /// the elevator.
98 98
    /// \param max_level The maximum level of the elevator.
... ...
@@ -104,5 +104,5 @@
104 104
    ///
105 105
    /// The tolerance used by the algorithm to handle inexact computation.
106
    typedef lemon::Tolerance<Value> Tolerance;
106
    typedef lemon::Tolerance<Flow> Tolerance;
107 107

	
108 108
  };
... ...
@@ -112,37 +112,53 @@
112 112

	
113 113
     \ingroup max_flow
114
     This class implements a push-relabel algorithm for the network
115
     circulation problem.
114
     This class implements a push-relabel algorithm for the \e network
115
     \e circulation problem.
116 116
     It is to find a feasible circulation when lower and upper bounds
117
     are given for the flow values on the arcs and lower bounds
118
     are given for the supply values of the nodes.
117
     are given for the flow values on the arcs and lower bounds are
118
     given for the difference between the outgoing and incoming flow
119
     at the nodes.
119 120

	
120 121
     The exact formulation of this problem is the following.
121 122
     Let \f$G=(V,A)\f$ be a digraph,
122
     \f$lower, upper: A\rightarrow\mathbf{R}^+_0\f$,
123
     \f$delta: V\rightarrow\mathbf{R}\f$. Find a feasible circulation
124
     \f$f: A\rightarrow\mathbf{R}^+_0\f$ so that
125
     \f[ \sum_{a\in\delta_{out}(v)} f(a) - \sum_{a\in\delta_{in}(v)} f(a)
126
     \geq delta(v) \quad \forall v\in V, \f]
127
     \f[ lower(a)\leq f(a) \leq upper(a) \quad \forall a\in A. \f]
128
     \note \f$delta(v)\f$ specifies a lower bound for the supply of node
129
     \f$v\f$. It can be either positive or negative, however note that
130
     \f$\sum_{v\in V}delta(v)\f$ should be zero or negative in order to
131
     have a feasible solution.
123
     \f$lower, upper: A\rightarrow\mathbf{R}^+_0\f$ denote the lower and
124
     upper bounds on the arcs, for which \f$0 \leq lower(uv) \leq upper(uv)\f$
125
     holds for all \f$uv\in A\f$, and \f$sup: V\rightarrow\mathbf{R}\f$
126
     denotes the signed supply values of the nodes.
127
     If \f$sup(u)>0\f$, then \f$u\f$ is a supply node with \f$sup(u)\f$
128
     supply, if \f$sup(u)<0\f$, then \f$u\f$ is a demand node with
129
     \f$-sup(u)\f$ demand.
130
     A feasible circulation is an \f$f: A\rightarrow\mathbf{R}^+_0\f$
131
     solution of the following problem.
132 132

	
133
     \note A special case of this problem is when
134
     \f$\sum_{v\in V}delta(v) = 0\f$. Then the supply of each node \f$v\f$
135
     will be \e equal \e to \f$delta(v)\f$, if a circulation can be found.
136
     Thus a feasible solution for the
137
     \ref min_cost_flow "minimum cost flow" problem can be calculated
138
     in this way.
133
     \f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu)
134
     \geq sup(u) \quad \forall u\in V, \f]
135
     \f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A. \f]
136
     
137
     The sum of the supply values, i.e. \f$\sum_{u\in V} sup(u)\f$ must be
138
     zero or negative in order to have a feasible solution (since the sum
139
     of the expressions on the left-hand side of the inequalities is zero).
140
     It means that the total demand must be greater or equal to the total
141
     supply and all the supplies have to be carried out from the supply nodes,
142
     but there could be demands that are not satisfied.
143
     If \f$\sum_{u\in V} sup(u)\f$ is zero, then all the supply/demand
144
     constraints have to be satisfied with equality, i.e. all demands
145
     have to be satisfied and all supplies have to be used.
146
     
147
     If you need the opposite inequalities in the supply/demand constraints
148
     (i.e. the total demand is less than the total supply and all the demands
149
     have to be satisfied while there could be supplies that are not used),
150
     then you could easily transform the problem to the above form by reversing
151
     the direction of the arcs and taking the negative of the supply values
152
     (e.g. using \ref ReverseDigraph and \ref NegMap adaptors).
153

	
154
     Note that this algorithm also provides a feasible solution for the
155
     \ref min_cost_flow "minimum cost flow problem".
139 156

	
140 157
     \tparam GR The type of the digraph the algorithm runs on.
141
     \tparam LM The type of the lower bound capacity map. The default
158
     \tparam LM The type of the lower bound map. The default
142 159
     map type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
143
     \tparam UM The type of the upper bound capacity map. The default
144
     map type is \c LM.
145
     \tparam DM The type of the map that stores the lower bound
146
     for the supply of the nodes. The default map type is
160
     \tparam UM The type of the upper bound (capacity) map.
161
     The default map type is \c LM.
162
     \tparam SM The type of the supply map. The default map type is
147 163
     \ref concepts::Digraph::NodeMap "GR::NodeMap<UM::Value>".
148 164
  */
... ...
@@ -151,5 +167,5 @@
151 167
          typename LM,
152 168
          typename UM,
153
          typename DM,
169
          typename SM,
154 170
          typename TR >
155 171
#else
... ...
@@ -157,6 +173,6 @@
157 173
          typename LM = typename GR::template ArcMap<int>,
158 174
          typename UM = LM,
159
          typename DM = typename GR::template NodeMap<typename UM::Value>,
160
          typename TR = CirculationDefaultTraits<GR, LM, UM, DM> >
175
          typename SM = typename GR::template NodeMap<typename UM::Value>,
176
          typename TR = CirculationDefaultTraits<GR, LM, UM, SM> >
161 177
#endif
162 178
  class Circulation {
... ...
@@ -168,13 +184,12 @@
168 184
    typedef typename Traits::Digraph Digraph;
169 185
    ///The type of the flow values.
170
    typedef typename Traits::Value Value;
186
    typedef typename Traits::Flow Flow;
171 187

	
172
    /// The type of the lower bound capacity map.
173
    typedef typename Traits::LCapMap LCapMap;
174
    /// The type of the upper bound capacity map.
175
    typedef typename Traits::UCapMap UCapMap;
176
    /// \brief The type of the map that stores the lower bound for
177
    /// the supply of the nodes.
178
    typedef typename Traits::DeltaMap DeltaMap;
188
    ///The type of the lower bound map.
189
    typedef typename Traits::LowerMap LowerMap;
190
    ///The type of the upper bound (capacity) map.
191
    typedef typename Traits::UpperMap UpperMap;
192
    ///The type of the supply map.
193
    typedef typename Traits::SupplyMap SupplyMap;
179 194
    ///The type of the flow map.
180 195
    typedef typename Traits::FlowMap FlowMap;
... ...
@@ -192,7 +207,7 @@
192 207
    int _node_num;
193 208

	
194
    const LCapMap *_lo;
195
    const UCapMap *_up;
196
    const DeltaMap *_delta;
209
    const LowerMap *_lo;
210
    const UpperMap *_up;
211
    const SupplyMap *_supply;
197 212

	
198 213
    FlowMap *_flow;
... ...
@@ -202,5 +217,5 @@
202 217
    bool _local_level;
203 218

	
204
    typedef typename Digraph::template NodeMap<Value> ExcessMap;
219
    typedef typename Digraph::template NodeMap<Flow> ExcessMap;
205 220
    ExcessMap* _excess;
206 221

	
... ...
@@ -232,7 +247,7 @@
232 247
    template <typename T>
233 248
    struct SetFlowMap
234
      : public Circulation<Digraph, LCapMap, UCapMap, DeltaMap,
249
      : public Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
235 250
                           SetFlowMapTraits<T> > {
236
      typedef Circulation<Digraph, LCapMap, UCapMap, DeltaMap,
251
      typedef Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
237 252
                          SetFlowMapTraits<T> > Create;
238 253
    };
... ...
@@ -258,7 +273,7 @@
258 273
    template <typename T>
259 274
    struct SetElevator
260
      : public Circulation<Digraph, LCapMap, UCapMap, DeltaMap,
275
      : public Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
261 276
                           SetElevatorTraits<T> > {
262
      typedef Circulation<Digraph, LCapMap, UCapMap, DeltaMap,
277
      typedef Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
263 278
                          SetElevatorTraits<T> > Create;
264 279
    };
... ...
@@ -286,7 +301,7 @@
286 301
    template <typename T>
287 302
    struct SetStandardElevator
288
      : public Circulation<Digraph, LCapMap, UCapMap, DeltaMap,
303
      : public Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
289 304
                       SetStandardElevatorTraits<T> > {
290
      typedef Circulation<Digraph, LCapMap, UCapMap, DeltaMap,
305
      typedef Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
291 306
                      SetStandardElevatorTraits<T> > Create;
292 307
    };
... ...
@@ -300,16 +315,18 @@
300 315
  public:
301 316

	
302
    /// The constructor of the class.
317
    /// Constructor.
303 318

	
304 319
    /// The constructor of the class.
305
    /// \param g The digraph the algorithm runs on.
306
    /// \param lo The lower bound capacity of the arcs.
307
    /// \param up The upper bound capacity of the arcs.
308
    /// \param delta The lower bound for the supply of the nodes.
309
    Circulation(const Digraph &g,const LCapMap &lo,
310
                const UCapMap &up,const DeltaMap &delta)
311
      : _g(g), _node_num(),
312
        _lo(&lo),_up(&up),_delta(&delta),_flow(0),_local_flow(false),
313
        _level(0), _local_level(false), _excess(0), _el() {}
320
    ///
321
    /// \param graph The digraph the algorithm runs on.
322
    /// \param lower The lower bounds for the flow values on the arcs.
323
    /// \param upper The upper bounds (capacities) for the flow values 
324
    /// on the arcs.
325
    /// \param supply The signed supply values of the nodes.
326
    Circulation(const Digraph &graph, const LowerMap &lower,
327
                const UpperMap &upper, const SupplyMap &supply)
328
      : _g(graph), _lo(&lower), _up(&upper), _supply(&supply),
329
        _flow(NULL), _local_flow(false), _level(NULL), _local_level(false),
330
        _excess(NULL) {}
314 331

	
315 332
    /// Destructor.
... ...
@@ -351,28 +368,28 @@
351 368
  public:
352 369

	
353
    /// Sets the lower bound capacity map.
370
    /// Sets the lower bound map.
354 371

	
355
    /// Sets the lower bound capacity map.
372
    /// Sets the lower bound map.
356 373
    /// \return <tt>(*this)</tt>
357
    Circulation& lowerCapMap(const LCapMap& map) {
374
    Circulation& lowerMap(const LowerMap& map) {
358 375
      _lo = &map;
359 376
      return *this;
360 377
    }
361 378

	
362
    /// Sets the upper bound capacity map.
379
    /// Sets the upper bound (capacity) map.
363 380

	
364
    /// Sets the upper bound capacity map.
381
    /// Sets the upper bound (capacity) map.
365 382
    /// \return <tt>(*this)</tt>
366
    Circulation& upperCapMap(const LCapMap& map) {
383
    Circulation& upperMap(const LowerMap& map) {
367 384
      _up = &map;
368 385
      return *this;
369 386
    }
370 387

	
371
    /// Sets the lower bound map for the supply of the nodes.
388
    /// Sets the supply map.
372 389

	
373
    /// Sets the lower bound map for the supply of the nodes.
390
    /// Sets the supply map.
374 391
    /// \return <tt>(*this)</tt>
375
    Circulation& deltaMap(const DeltaMap& map) {
376
      _delta = &map;
392
    Circulation& supplyMap(const SupplyMap& map) {
393
      _supply = &map;
377 394
      return *this;
378 395
    }
... ...
@@ -454,5 +471,5 @@
454 471

	
455 472
      for(NodeIt n(_g);n!=INVALID;++n) {
456
        (*_excess)[n] = (*_delta)[n];
473
        (*_excess)[n] = (*_supply)[n];
457 474
      }
458 475

	
... ...
@@ -483,5 +500,5 @@
483 500

	
484 501
      for(NodeIt n(_g);n!=INVALID;++n) {
485
        (*_excess)[n] = (*_delta)[n];
502
        (*_excess)[n] = (*_supply)[n];
486 503
      }
487 504

	
... ...
@@ -496,5 +513,5 @@
496 513
          (*_excess)[_g.source(e)] -= (*_lo)[e];
497 514
        } else {
498
          Value fc = -(*_excess)[_g.target(e)];
515
          Flow fc = -(*_excess)[_g.target(e)];
499 516
          _flow->set(e, fc);
500 517
          (*_excess)[_g.target(e)] = 0;
... ...
@@ -529,9 +546,9 @@
529 546
        int actlevel=(*_level)[act];
530 547
        int mlevel=_node_num;
531
        Value exc=(*_excess)[act];
548
        Flow exc=(*_excess)[act];
532 549

	
533 550
        for(OutArcIt e(_g,act);e!=INVALID; ++e) {
534 551
          Node v = _g.target(e);
535
          Value fc=(*_up)[e]-(*_flow)[e];
552
          Flow fc=(*_up)[e]-(*_flow)[e];
536 553
          if(!_tol.positive(fc)) continue;
537 554
          if((*_level)[v]<actlevel) {
... ...
@@ -557,5 +574,5 @@
557 574
        for(InArcIt e(_g,act);e!=INVALID; ++e) {
558 575
          Node v = _g.source(e);
559
          Value fc=(*_flow)[e]-(*_lo)[e];
576
          Flow fc=(*_flow)[e]-(*_lo)[e];
560 577
          if(!_tol.positive(fc)) continue;
561 578
          if((*_level)[v]<actlevel) {
... ...
@@ -633,5 +650,5 @@
633 650
    /// \pre Either \ref run() or \ref init() must be called before
634 651
    /// using this function.
635
    Value flow(const Arc& arc) const {
652
    Flow flow(const Arc& arc) const {
636 653
      return (*_flow)[arc];
637 654
    }
... ...
@@ -652,6 +669,6 @@
652 669
       Barrier is a set \e B of nodes for which
653 670

	
654
       \f[ \sum_{a\in\delta_{out}(B)} upper(a) -
655
           \sum_{a\in\delta_{in}(B)} lower(a) < \sum_{v\in B}delta(v) \f]
671
       \f[ \sum_{uv\in A: u\in B} upper(uv) -
672
           \sum_{uv\in A: v\in B} lower(uv) < \sum_{v\in B} sup(v) \f]
656 673

	
657 674
       holds. The existence of a set with this property prooves that a
... ...
@@ -716,5 +733,5 @@
716 733
      for(NodeIt n(_g);n!=INVALID;++n)
717 734
        {
718
          Value dif=-(*_delta)[n];
735
          Flow dif=-(*_supply)[n];
719 736
          for(InArcIt e(_g,n);e!=INVALID;++e) dif-=(*_flow)[e];
720 737
          for(OutArcIt e(_g,n);e!=INVALID;++e) dif+=(*_flow)[e];
... ...
@@ -731,8 +748,8 @@
731 748
    bool checkBarrier() const
732 749
    {
733
      Value delta=0;
750
      Flow delta=0;
734 751
      for(NodeIt n(_g);n!=INVALID;++n)
735 752
        if(barrier(n))
736
          delta-=(*_delta)[n];
753
          delta-=(*_supply)[n];
737 754
      for(ArcIt e(_g);e!=INVALID;++e)
738 755
        {
Ignore white space 6 line context
... ...
@@ -47,5 +47,5 @@
47 47

	
48 48
    /// \brief The type of the flow values.
49
    typedef typename CapacityMap::Value Value;
49
    typedef typename CapacityMap::Value Flow;
50 50

	
51 51
    /// \brief The type of the map that stores the flow values.
... ...
@@ -53,10 +53,10 @@
53 53
    /// The type of the map that stores the flow values.
54 54
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
55
    typedef typename Digraph::template ArcMap<Value> FlowMap;
55
    typedef typename Digraph::template ArcMap<Flow> FlowMap;
56 56

	
57 57
    /// \brief Instantiates a FlowMap.
58 58
    ///
59 59
    /// This function instantiates a \ref FlowMap.
60
    /// \param digraph The digraph, to which we would like to define
60
    /// \param digraph The digraph for which we would like to define
61 61
    /// the flow map.
62 62
    static FlowMap* createFlowMap(const Digraph& digraph) {
... ...
@@ -75,5 +75,5 @@
75 75
    ///
76 76
    /// This function instantiates an \ref Elevator.
77
    /// \param digraph The digraph, to which we would like to define
77
    /// \param digraph The digraph for which we would like to define
78 78
    /// the elevator.
79 79
    /// \param max_level The maximum level of the elevator.
... ...
@@ -85,5 +85,5 @@
85 85
    ///
86 86
    /// The tolerance used by the algorithm to handle inexact computation.
87
    typedef lemon::Tolerance<Value> Tolerance;
87
    typedef lemon::Tolerance<Flow> Tolerance;
88 88

	
89 89
  };
... ...
@@ -126,5 +126,5 @@
126 126
    typedef typename Traits::CapacityMap CapacityMap;
127 127
    ///The type of the flow values.
128
    typedef typename Traits::Value Value;
128
    typedef typename Traits::Flow Flow;
129 129

	
130 130
    ///The type of the flow map.
... ...
@@ -152,5 +152,5 @@
152 152
    bool _local_level;
153 153

	
154
    typedef typename Digraph::template NodeMap<Value> ExcessMap;
154
    typedef typename Digraph::template NodeMap<Flow> ExcessMap;
155 155
    ExcessMap* _excess;
156 156

	
... ...
@@ -471,5 +471,5 @@
471 471

	
472 472
      for (NodeIt n(_graph); n != INVALID; ++n) {
473
        Value excess = 0;
473
        Flow excess = 0;
474 474
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
475 475
          excess += (*_flow)[e];
... ...
@@ -520,5 +520,5 @@
520 520

	
521 521
      for (OutArcIt e(_graph, _source); e != INVALID; ++e) {
522
        Value rem = (*_capacity)[e] - (*_flow)[e];
522
        Flow rem = (*_capacity)[e] - (*_flow)[e];
523 523
        if (_tolerance.positive(rem)) {
524 524
          Node u = _graph.target(e);
... ...
@@ -532,5 +532,5 @@
532 532
      }
533 533
      for (InArcIt e(_graph, _source); e != INVALID; ++e) {
534
        Value rem = (*_flow)[e];
534
        Flow rem = (*_flow)[e];
535 535
        if (_tolerance.positive(rem)) {
536 536
          Node v = _graph.source(e);
... ...
@@ -565,9 +565,9 @@
565 565

	
566 566
        while (num > 0 && n != INVALID) {
567
          Value excess = (*_excess)[n];
567
          Flow excess = (*_excess)[n];
568 568
          int new_level = _level->maxLevel();
569 569

	
570 570
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
571
            Value rem = (*_capacity)[e] - (*_flow)[e];
571
            Flow rem = (*_capacity)[e] - (*_flow)[e];
572 572
            if (!_tolerance.positive(rem)) continue;
573 573
            Node v = _graph.target(e);
... ...
@@ -592,5 +592,5 @@
592 592

	
593 593
          for (InArcIt e(_graph, n); e != INVALID; ++e) {
594
            Value rem = (*_flow)[e];
594
            Flow rem = (*_flow)[e];
595 595
            if (!_tolerance.positive(rem)) continue;
596 596
            Node v = _graph.source(e);
... ...
@@ -638,9 +638,9 @@
638 638
        num = _node_num * 20;
639 639
        while (num > 0 && n != INVALID) {
640
          Value excess = (*_excess)[n];
640
          Flow excess = (*_excess)[n];
641 641
          int new_level = _level->maxLevel();
642 642

	
643 643
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
644
            Value rem = (*_capacity)[e] - (*_flow)[e];
644
            Flow rem = (*_capacity)[e] - (*_flow)[e];
645 645
            if (!_tolerance.positive(rem)) continue;
646 646
            Node v = _graph.target(e);
... ...
@@ -665,5 +665,5 @@
665 665

	
666 666
          for (InArcIt e(_graph, n); e != INVALID; ++e) {
667
            Value rem = (*_flow)[e];
667
            Flow rem = (*_flow)[e];
668 668
            if (!_tolerance.positive(rem)) continue;
669 669
            Node v = _graph.source(e);
... ...
@@ -779,10 +779,10 @@
779 779
      Node n;
780 780
      while ((n = _level->highestActive()) != INVALID) {
781
        Value excess = (*_excess)[n];
781
        Flow excess = (*_excess)[n];
782 782
        int level = _level->highestActiveLevel();
783 783
        int new_level = _level->maxLevel();
784 784

	
785 785
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
786
          Value rem = (*_capacity)[e] - (*_flow)[e];
786
          Flow rem = (*_capacity)[e] - (*_flow)[e];
787 787
          if (!_tolerance.positive(rem)) continue;
788 788
          Node v = _graph.target(e);
... ...
@@ -807,5 +807,5 @@
807 807

	
808 808
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
809
          Value rem = (*_flow)[e];
809
          Flow rem = (*_flow)[e];
810 810
          if (!_tolerance.positive(rem)) continue;
811 811
          Node v = _graph.source(e);
... ...
@@ -898,5 +898,5 @@
898 898
    /// \pre Either \ref run() or \ref init() must be called before
899 899
    /// using this function.
900
    Value flowValue() const {
900
    Flow flowValue() const {
901 901
      return (*_excess)[_target];
902 902
    }
... ...
@@ -909,5 +909,5 @@
909 909
    /// \pre Either \ref run() or \ref init() must be called before
910 910
    /// using this function.
911
    Value flow(const Arc& arc) const {
911
    Flow flow(const Arc& arc) const {
912 912
      return (*_flow)[arc];
913 913
    }
Ignore white space 6 line context
... ...
@@ -32,4 +32,5 @@
32 32
  matching_test
33 33
  min_cost_arborescence_test
34
  min_cost_flow_test
34 35
  path_test
35 36
  preflow_test
Ignore white space 6 line context
... ...
@@ -28,4 +28,5 @@
28 28
	test/matching_test \
29 29
	test/min_cost_arborescence_test \
30
	test/min_cost_flow_test \
30 31
	test/path_test \
31 32
	test/preflow_test \
... ...
@@ -73,4 +74,5 @@
73 74
test_matching_test_SOURCES = test/matching_test.cc
74 75
test_min_cost_arborescence_test_SOURCES = test/min_cost_arborescence_test.cc
76
test_min_cost_flow_test_SOURCES = test/min_cost_flow_test.cc
75 77
test_path_test_SOURCES = test/path_test.cc
76 78
test_preflow_test_SOURCES = test/preflow_test.cc
Ignore white space 6 line context
... ...
@@ -58,5 +58,5 @@
58 58
  typedef Digraph::Arc Arc;
59 59
  typedef concepts::ReadMap<Arc,VType> CapMap;
60
  typedef concepts::ReadMap<Node,VType> DeltaMap;
60
  typedef concepts::ReadMap<Node,VType> SupplyMap;
61 61
  typedef concepts::ReadWriteMap<Arc,VType> FlowMap;
62 62
  typedef concepts::WriteMap<Node,bool> BarrierMap;
... ...
@@ -69,5 +69,5 @@
69 69
  Arc a;
70 70
  CapMap lcap, ucap;
71
  DeltaMap delta;
71
  SupplyMap supply;
72 72
  FlowMap flow;
73 73
  BarrierMap bar;
... ...
@@ -75,16 +75,16 @@
75 75
  bool b;
76 76

	
77
  typedef Circulation<Digraph, CapMap, CapMap, DeltaMap>
77
  typedef Circulation<Digraph, CapMap, CapMap, SupplyMap>
78 78
            ::SetFlowMap<FlowMap>
79 79
            ::SetElevator<Elev>
80 80
            ::SetStandardElevator<LinkedElev>
81 81
            ::Create CirculationType;
82
  CirculationType circ_test(g, lcap, ucap, delta);
82
  CirculationType circ_test(g, lcap, ucap, supply);
83 83
  const CirculationType& const_circ_test = circ_test;
84 84
   
85 85
  circ_test
86
    .lowerCapMap(lcap)
87
    .upperCapMap(ucap)
88
    .deltaMap(delta)
86
    .lowerMap(lcap)
87
    .upperMap(ucap)
88
    .supplyMap(supply)
89 89
    .flowMap(flow);
90 90

	
Ignore white space 6 line context
... ...
@@ -44,4 +44,5 @@
44 44
#include <lemon/preflow.h>
45 45
#include <lemon/matching.h>
46
#include <lemon/network_simplex.h>
46 47

	
47 48
using namespace lemon;
... ...
@@ -91,4 +92,26 @@
91 92
}
92 93

	
94
template<class Value>
95
void solve_min(ArgParser &ap, std::istream &is, std::ostream &,
96
               DimacsDescriptor &desc)
97
{
98
  bool report = !ap.given("q");
99
  Digraph g;
100
  Digraph::ArcMap<Value> lower(g), cap(g), cost(g);
101
  Digraph::NodeMap<Value> sup(g);
102
  Timer ti;
103
  ti.restart();
104
  readDimacsMin(is, g, lower, cap, cost, sup, 0, desc);
105
  if (report) std::cerr << "Read the file: " << ti << '\n';
106
  ti.restart();
107
  NetworkSimplex<Digraph, Value> ns(g);
108
  ns.lowerMap(lower).capacityMap(cap).costMap(cost).supplyMap(sup);
109
  if (report) std::cerr << "Setup NetworkSimplex class: " << ti << '\n';
110
  ti.restart();
111
  ns.run();
112
  if (report) std::cerr << "Run NetworkSimplex: " << ti << '\n';
113
  if (report) std::cerr << "\nMin flow cost: " << ns.totalCost() << '\n';
114
}
115

	
93 116
void solve_mat(ArgParser &ap, std::istream &is, std::ostream &,
94 117
              DimacsDescriptor &desc)
... ...
@@ -129,6 +152,5 @@
129 152
    {
130 153
    case DimacsDescriptor::MIN:
131
      std::cerr <<
132
        "\n\n Sorry, the min. cost flow solver is not yet available.\n";
154
      solve_min<Value>(ap,is,os,desc);
133 155
      break;
134 156
    case DimacsDescriptor::MAX:
0 comments (0 inline)