gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge various fixes
0 5 0
merge r1.1 1.1
0 files changed with 57 insertions and 27 deletions:
↑ Collapse diff ↑
Ignore white space 48 line context
1 1
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
2 2

	
3 3
IF(EXISTS ${CMAKE_SOURCE_DIR}/cmake/version.cmake)
4 4
  INCLUDE(${CMAKE_SOURCE_DIR}/cmake/version.cmake)
5 5
ELSE(EXISTS ${CMAKE_SOURCE_DIR}/cmake/version.cmake)
6 6
  SET(PROJECT_NAME "LEMON")
7 7
  SET(PROJECT_VERSION "hg-tip" CACHE STRING "LEMON version string.")
8 8
ENDIF(EXISTS ${CMAKE_SOURCE_DIR}/cmake/version.cmake)
9 9

	
10 10
PROJECT(${PROJECT_NAME})
11 11

	
12 12
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
13 13

	
14 14
INCLUDE(FindDoxygen)
15 15
INCLUDE(FindGhostscript)
16 16
FIND_PACKAGE(GLPK 4.33)
17 17
FIND_PACKAGE(CPLEX)
18 18
FIND_PACKAGE(COIN)
19 19

	
20 20
IF(MSVC)
21
  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4250 /wd4355 /wd4800 /wd4996")
21
  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4250 /wd4355 /wd4503 /wd4800 /wd4996")
22 22
# Suppressed warnings:
23 23
# C4250: 'class1' : inherits 'class2::member' via dominance
24 24
# C4355: 'this' : used in base member initializer list
25
# C4503: 'function' : decorated name length exceeded, name was truncated
25 26
# C4800: 'type' : forcing value to bool 'true' or 'false' (performance warning)
26 27
# C4996: 'function': was declared deprecated
27 28
ENDIF(MSVC)
28 29

	
29 30
INCLUDE(CheckTypeSize)
30 31
CHECK_TYPE_SIZE("long long" LEMON_LONG_LONG)
31 32

	
32 33
ENABLE_TESTING()
33 34

	
34 35
ADD_SUBDIRECTORY(lemon)
35 36
IF(${CMAKE_SOURCE_DIR} STREQUAL ${PROJECT_SOURCE_DIR})
36 37
  ADD_SUBDIRECTORY(demo)
37 38
  ADD_SUBDIRECTORY(tools)
38 39
  ADD_SUBDIRECTORY(doc)
39 40
  ADD_SUBDIRECTORY(test)
40 41
ENDIF(${CMAKE_SOURCE_DIR} STREQUAL ${PROJECT_SOURCE_DIR})
41 42

	
42 43
IF(${CMAKE_SOURCE_DIR} STREQUAL ${PROJECT_SOURCE_DIR})
43 44
  IF(WIN32)
44 45
    SET(CPACK_PACKAGE_NAME ${PROJECT_NAME})
45 46
    SET(CPACK_PACKAGE_VENDOR "EGRES")
46 47
    SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY
47 48
      "LEMON - Library for Efficient Modeling and Optimization in Networks")
48 49
    SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
Ignore white space 48 line context
1 1
EXTRA_DIST += \
2 2
	lemon/lemon.pc.in \
3
	lemon/CMakeLists.txt
3
	lemon/CMakeLists.txt \
4
	lemon/config.h.cmake
4 5

	
5 6
pkgconfig_DATA += lemon/lemon.pc
6 7

	
7 8
lib_LTLIBRARIES += lemon/libemon.la
8 9

	
9 10
lemon_libemon_la_SOURCES = \
10 11
	lemon/arg_parser.cc \
11 12
	lemon/base.cc \
12 13
	lemon/color.cc \
13 14
	lemon/lp_base.cc \
14 15
	lemon/lp_skeleton.cc \
15 16
	lemon/random.cc \
16 17
	lemon/bits/windows.cc
17 18

	
18 19
nodist_lemon_HEADERS = lemon/config.h	
19
	
20

	
20 21
lemon_libemon_la_CXXFLAGS = \
21 22
	$(AM_CXXFLAGS) \
22 23
	$(GLPK_CFLAGS) \
23 24
	$(CPLEX_CFLAGS) \
24 25
	$(SOPLEX_CXXFLAGS) \
25 26
	$(CLP_CXXFLAGS) \
26 27
	$(CBC_CXXFLAGS)
27 28

	
28 29
lemon_libemon_la_LDFLAGS = \
29 30
	$(GLPK_LIBS) \
30 31
	$(CPLEX_LIBS) \
31 32
	$(SOPLEX_LIBS) \
32 33
	$(CLP_LIBS) \
33 34
	$(CBC_LIBS)
34 35

	
35 36
if HAVE_GLPK
36 37
lemon_libemon_la_SOURCES += lemon/glpk.cc
37 38
endif
38 39

	
39 40
if HAVE_CPLEX
40 41
lemon_libemon_la_SOURCES += lemon/cplex.cc
41 42
endif
42 43

	
43 44
if HAVE_SOPLEX
Ignore white space 48 line context
... ...
@@ -50,73 +50,79 @@
50 50
      ///
51 51
      /// Default constructor.
52 52
      /// \warning The default constructor is not required to set
53 53
      /// the item to some well-defined value. So you should consider it
54 54
      /// as uninitialized.
55 55
      GraphItem() {}
56 56

	
57 57
      /// \brief Copy constructor.
58 58
      ///
59 59
      /// Copy constructor.
60 60
      GraphItem(const GraphItem &) {}
61 61

	
62 62
      /// \brief Constructor for conversion from \c INVALID.
63 63
      ///
64 64
      /// Constructor for conversion from \c INVALID.
65 65
      /// It initializes the item to be invalid.
66 66
      /// \sa Invalid for more details.
67 67
      GraphItem(Invalid) {}
68 68

	
69 69
      /// \brief Assignment operator.
70 70
      ///
71 71
      /// Assignment operator for the item.
72 72
      GraphItem& operator=(const GraphItem&) { return *this; }
73 73

	
74
      /// \brief Assignment operator for INVALID.
75
      ///
76
      /// This operator makes the item invalid.
77
      GraphItem& operator=(Invalid) { return *this; }
78

	
74 79
      /// \brief Equality operator.
75 80
      ///
76 81
      /// Equality operator.
77 82
      bool operator==(const GraphItem&) const { return false; }
78 83

	
79 84
      /// \brief Inequality operator.
80 85
      ///
81 86
      /// Inequality operator.
82 87
      bool operator!=(const GraphItem&) const { return false; }
83 88

	
84 89
      /// \brief Ordering operator.
85 90
      ///
86 91
      /// This operator defines an ordering of the items.
87 92
      /// It makes possible to use graph item types as key types in 
88 93
      /// associative containers (e.g. \c std::map).
89 94
      ///
90 95
      /// \note This operator only have to define some strict ordering of
91 96
      /// the items; this order has nothing to do with the iteration
92 97
      /// ordering of the items.
93 98
      bool operator<(const GraphItem&) const { return false; }
94 99

	
95 100
      template<typename _GraphItem>
96 101
      struct Constraints {
97 102
        void constraints() {
98 103
          _GraphItem i1;
104
          i1=INVALID;
99 105
          _GraphItem i2 = i1;
100 106
          _GraphItem i3 = INVALID;
101 107

	
102 108
          i1 = i2 = i3;
103 109

	
104 110
          bool b;
105 111
          b = (ia == ib) && (ia != ib);
106 112
          b = (ia == INVALID) && (ib != INVALID);
107 113
          b = (ia < ib);
108 114
        }
109 115

	
110 116
        const _GraphItem &ia;
111 117
        const _GraphItem &ib;
112 118
      };
113 119
    };
114 120

	
115 121
    /// \brief Base skeleton class for directed graphs.
116 122
    ///
117 123
    /// This class describes the base interface of directed graph types.
118 124
    /// All digraph %concepts have to conform to this class.
119 125
    /// It just provides types for nodes and arcs and functions 
120 126
    /// to get the source and the target nodes of arcs.
121 127
    class BaseDigraphComponent {
122 128
    public:
... ...
@@ -200,56 +206,49 @@
200 206
        /// Default constructor.
201 207
        /// \warning The default constructor is not required to set
202 208
        /// the item to some well-defined value. So you should consider it
203 209
        /// as uninitialized.
204 210
        Edge() {}
205 211

	
206 212
        /// \brief Copy constructor.
207 213
        ///
208 214
        /// Copy constructor.
209 215
        Edge(const Edge &) : Parent() {}
210 216

	
211 217
        /// \brief Constructor for conversion from \c INVALID.
212 218
        ///
213 219
        /// Constructor for conversion from \c INVALID.
214 220
        /// It initializes the item to be invalid.
215 221
        /// \sa Invalid for more details.
216 222
        Edge(Invalid) {}
217 223

	
218 224
        /// \brief Constructor for conversion from an arc.
219 225
        ///
220 226
        /// Constructor for conversion from an arc.
221 227
        /// Besides the core graph item functionality each arc should
222 228
        /// be convertible to the represented edge.
223 229
        Edge(const Arc&) {}
224

	
225
        /// \brief Assign an arc to an edge.
226
        ///
227
        /// This function assigns an arc to an edge.
228
        /// Besides the core graph item functionality each arc should
229
        /// be convertible to the represented edge.
230
        Edge& operator=(const Arc&) { return *this; }
231
      };
230
     };
232 231

	
233 232
      /// \brief Return one end node of an edge.
234 233
      ///
235 234
      /// This function returns one end node of an edge.
236 235
      Node u(const Edge&) const { return INVALID; }
237 236

	
238 237
      /// \brief Return the other end node of an edge.
239 238
      ///
240 239
      /// This function returns the other end node of an edge.
241 240
      Node v(const Edge&) const { return INVALID; }
242 241

	
243 242
      /// \brief Return a directed arc related to an edge.
244 243
      ///
245 244
      /// This function returns a directed arc from its direction and the
246 245
      /// represented edge.
247 246
      Arc direct(const Edge&, bool) const { return INVALID; }
248 247

	
249 248
      /// \brief Return a directed arc related to an edge.
250 249
      ///
251 250
      /// This function returns a directed arc from its source node and the
252 251
      /// represented edge.
253 252
      Arc direct(const Edge&, const Node&) const { return INVALID; }
254 253

	
255 254
      /// \brief Return the direction of the arc.
... ...
@@ -332,52 +331,54 @@
332 331
      /// If the digraph does not contain an arc with the given id,
333 332
      /// then the result of the function is undefined.
334 333
      Arc arcFromId(int) const { return INVALID; }
335 334

	
336 335
      /// \brief Return an integer greater or equal to the maximum
337 336
      /// node id.
338 337
      ///
339 338
      /// This function returns an integer greater or equal to the
340 339
      /// maximum node id.
341 340
      int maxNodeId() const { return -1; }
342 341

	
343 342
      /// \brief Return an integer greater or equal to the maximum
344 343
      /// arc id.
345 344
      ///
346 345
      /// This function returns an integer greater or equal to the
347 346
      /// maximum arc id.
348 347
      int maxArcId() const { return -1; }
349 348

	
350 349
      template <typename _Digraph>
351 350
      struct Constraints {
352 351

	
353 352
        void constraints() {
354 353
          checkConcept<Base, _Digraph >();
355 354
          typename _Digraph::Node node;
355
          node=INVALID;
356 356
          int nid = digraph.id(node);
357 357
          nid = digraph.id(node);
358 358
          node = digraph.nodeFromId(nid);
359 359
          typename _Digraph::Arc arc;
360
          arc=INVALID;
360 361
          int eid = digraph.id(arc);
361 362
          eid = digraph.id(arc);
362 363
          arc = digraph.arcFromId(eid);
363 364

	
364 365
          nid = digraph.maxNodeId();
365 366
          ignore_unused_variable_warning(nid);
366 367
          eid = digraph.maxArcId();
367 368
          ignore_unused_variable_warning(eid);
368 369
        }
369 370

	
370 371
        const _Digraph& digraph;
371 372
      };
372 373
    };
373 374

	
374 375
    /// \brief Skeleton class for \e idable undirected graphs.
375 376
    ///
376 377
    /// This class describes the interface of \e idable undirected
377 378
    /// graphs. It extends \ref IDableDigraphComponent with the core ID
378 379
    /// functions of undirected graphs.
379 380
    /// The ids of the items must be unique and immutable.
380 381
    /// This concept is part of the Graph concept.
381 382
    template <typename BAS = BaseGraphComponent>
382 383
    class IDableGraphComponent : public IDableDigraphComponent<BAS> {
383 384
    public:
Ignore white space 48 line context
... ...
@@ -63,48 +63,54 @@
63 63
    const GR* _graph;
64 64

	
65 65
    void initalize(const GR& graph, NodesImplBase& nodes) {
66 66
      _graph = &graph;
67 67
      _nodes = &nodes;
68 68
    }
69 69

	
70 70
  public:
71 71

	
72 72
    class Arc {
73 73
      friend class ListArcSetBase<GR>;
74 74
    protected:
75 75
      Arc(int _id) : id(_id) {}
76 76
      int id;
77 77
    public:
78 78
      Arc() {}
79 79
      Arc(Invalid) : id(-1) {}
80 80
      bool operator==(const Arc& arc) const { return id == arc.id; }
81 81
      bool operator!=(const Arc& arc) const { return id != arc.id; }
82 82
      bool operator<(const Arc& arc) const { return id < arc.id; }
83 83
    };
84 84

	
85 85
    ListArcSetBase() : first_arc(-1), first_free_arc(-1) {}
86 86

	
87
    Node addNode() {
88
      LEMON_ASSERT(false,
89
        "This graph structure does not support node insertion");
90
      return INVALID; // avoid warning
91
    }
92

	
87 93
    Arc addArc(const Node& u, const Node& v) {
88 94
      int n;
89 95
      if (first_free_arc == -1) {
90 96
        n = arcs.size();
91 97
        arcs.push_back(ArcT());
92 98
      } else {
93 99
        n = first_free_arc;
94 100
        first_free_arc = arcs[first_free_arc].next_in;
95 101
      }
96 102
      arcs[n].next_in = (*_nodes)[v].first_in;
97 103
      if ((*_nodes)[v].first_in != -1) {
98 104
        arcs[(*_nodes)[v].first_in].prev_in = n;
99 105
      }
100 106
      (*_nodes)[v].first_in = n;
101 107
      arcs[n].next_out = (*_nodes)[u].first_out;
102 108
      if ((*_nodes)[u].first_out != -1) {
103 109
        arcs[(*_nodes)[u].first_out].prev_out = n;
104 110
      }
105 111
      (*_nodes)[u].first_out = n;
106 112
      arcs[n].source = u;
107 113
      arcs[n].target = v;
108 114
      return Arc(n);
109 115
    }
110 116

	
... ...
@@ -395,48 +401,54 @@
395 401
      Edge() {}
396 402
      Edge (Invalid) { id = -1; }
397 403
      bool operator==(const Edge& arc) const {return id == arc.id;}
398 404
      bool operator!=(const Edge& arc) const {return id != arc.id;}
399 405
      bool operator<(const Edge& arc) const {return id < arc.id;}
400 406
    };
401 407

	
402 408
    class Arc {
403 409
      friend class ListEdgeSetBase;
404 410
    protected:
405 411
      Arc(int _id) : id(_id) {}
406 412
      int id;
407 413
    public:
408 414
      operator Edge() const { return edgeFromId(id / 2); }
409 415

	
410 416
      Arc() {}
411 417
      Arc(Invalid) : id(-1) {}
412 418
      bool operator==(const Arc& arc) const { return id == arc.id; }
413 419
      bool operator!=(const Arc& arc) const { return id != arc.id; }
414 420
      bool operator<(const Arc& arc) const { return id < arc.id; }
415 421
    };
416 422

	
417 423
    ListEdgeSetBase() : first_arc(-1), first_free_arc(-1) {}
418 424

	
425
    Node addNode() {
426
      LEMON_ASSERT(false,
427
        "This graph structure does not support node insertion");
428
      return INVALID; // avoid warning
429
    }
430

	
419 431
    Edge addEdge(const Node& u, const Node& v) {
420 432
      int n;
421 433

	
422 434
      if (first_free_arc == -1) {
423 435
        n = arcs.size();
424 436
        arcs.push_back(ArcT());
425 437
        arcs.push_back(ArcT());
426 438
      } else {
427 439
        n = first_free_arc;
428 440
        first_free_arc = arcs[n].next_out;
429 441
      }
430 442

	
431 443
      arcs[n].target = u;
432 444
      arcs[n | 1].target = v;
433 445

	
434 446
      arcs[n].next_out = (*_nodes)[v].first_out;
435 447
      if ((*_nodes)[v].first_out != -1) {
436 448
        arcs[(*_nodes)[v].first_out].prev_out = n;
437 449
      }
438 450
      (*_nodes)[v].first_out = n;
439 451
      arcs[n].prev_out = -1;
440 452

	
441 453
      if ((*_nodes)[u].first_out != -1) {
442 454
        arcs[(*_nodes)[u].first_out].prev_out = (n | 1);
... ...
@@ -795,48 +807,54 @@
795 807
    const GR* _graph;
796 808

	
797 809
    void initalize(const GR& graph, NodesImplBase& nodes) {
798 810
      _graph = &graph;
799 811
      _nodes = &nodes;
800 812
    }
801 813

	
802 814
  public:
803 815

	
804 816
    class Arc {
805 817
      friend class SmartArcSetBase<GR>;
806 818
    protected:
807 819
      Arc(int _id) : id(_id) {}
808 820
      int id;
809 821
    public:
810 822
      Arc() {}
811 823
      Arc(Invalid) : id(-1) {}
812 824
      bool operator==(const Arc& arc) const { return id == arc.id; }
813 825
      bool operator!=(const Arc& arc) const { return id != arc.id; }
814 826
      bool operator<(const Arc& arc) const { return id < arc.id; }
815 827
    };
816 828

	
817 829
    SmartArcSetBase() {}
818 830

	
831
    Node addNode() {
832
      LEMON_ASSERT(false,
833
        "This graph structure does not support node insertion");
834
      return INVALID; // avoid warning
835
    }
836

	
819 837
    Arc addArc(const Node& u, const Node& v) {
820 838
      int n = arcs.size();
821 839
      arcs.push_back(ArcT());
822 840
      arcs[n].next_in = (*_nodes)[v].first_in;
823 841
      (*_nodes)[v].first_in = n;
824 842
      arcs[n].next_out = (*_nodes)[u].first_out;
825 843
      (*_nodes)[u].first_out = n;
826 844
      arcs[n].source = u;
827 845
      arcs[n].target = v;
828 846
      return Arc(n);
829 847
    }
830 848

	
831 849
    void clear() {
832 850
      Node node;
833 851
      for (first(node); node != INVALID; next(node)) {
834 852
        (*_nodes)[node].first_in = -1;
835 853
        (*_nodes)[node].first_out = -1;
836 854
      }
837 855
      arcs.clear();
838 856
    }
839 857

	
840 858
    void first(Node& node) const {
841 859
      _graph->first(node);
842 860
    }
... ...
@@ -1091,48 +1109,54 @@
1091 1109
      Edge() {}
1092 1110
      Edge (Invalid) { id = -1; }
1093 1111
      bool operator==(const Edge& arc) const {return id == arc.id;}
1094 1112
      bool operator!=(const Edge& arc) const {return id != arc.id;}
1095 1113
      bool operator<(const Edge& arc) const {return id < arc.id;}
1096 1114
    };
1097 1115

	
1098 1116
    class Arc {
1099 1117
      friend class SmartEdgeSetBase;
1100 1118
    protected:
1101 1119
      Arc(int _id) : id(_id) {}
1102 1120
      int id;
1103 1121
    public:
1104 1122
      operator Edge() const { return edgeFromId(id / 2); }
1105 1123

	
1106 1124
      Arc() {}
1107 1125
      Arc(Invalid) : id(-1) {}
1108 1126
      bool operator==(const Arc& arc) const { return id == arc.id; }
1109 1127
      bool operator!=(const Arc& arc) const { return id != arc.id; }
1110 1128
      bool operator<(const Arc& arc) const { return id < arc.id; }
1111 1129
    };
1112 1130

	
1113 1131
    SmartEdgeSetBase() {}
1114 1132

	
1133
    Node addNode() {
1134
      LEMON_ASSERT(false,
1135
        "This graph structure does not support node insertion");
1136
      return INVALID; // avoid warning
1137
    }
1138

	
1115 1139
    Edge addEdge(const Node& u, const Node& v) {
1116 1140
      int n = arcs.size();
1117 1141
      arcs.push_back(ArcT());
1118 1142
      arcs.push_back(ArcT());
1119 1143

	
1120 1144
      arcs[n].target = u;
1121 1145
      arcs[n | 1].target = v;
1122 1146

	
1123 1147
      arcs[n].next_out = (*_nodes)[v].first_out;
1124 1148
      (*_nodes)[v].first_out = n;
1125 1149

	
1126 1150
      arcs[n | 1].next_out = (*_nodes)[u].first_out;
1127 1151
      (*_nodes)[u].first_out = (n | 1);
1128 1152

	
1129 1153
      return Edge(n / 2);
1130 1154
    }
1131 1155

	
1132 1156
    void clear() {
1133 1157
      Node node;
1134 1158
      for (first(node); node != INVALID; next(node)) {
1135 1159
        (*_nodes)[node].first_out = -1;
1136 1160
      }
1137 1161
      arcs.clear();
1138 1162
    }
Ignore white space 48 line context
... ...
@@ -72,84 +72,87 @@
72 72
  "11 10    20   14    0    6  -20\n"
73 73
  "12 11    30   10    0    0  -10\n"
74 74
  "\n"
75 75
  "@attributes\n"
76 76
  "source 1\n"
77 77
  "target 12\n";
78 78

	
79 79

	
80 80
enum SupplyType {
81 81
  EQ,
82 82
  GEQ,
83 83
  LEQ
84 84
};
85 85

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

	
92 92
  template <typename MCF>
93 93
  struct Constraints {
94 94
    void constraints() {
95 95
      checkConcept<concepts::Digraph, GR>();
96
      
97
      const Constraints& me = *this;
96 98

	
97
      MCF mcf(g);
99
      MCF mcf(me.g);
98 100
      const MCF& const_mcf = mcf;
99 101

	
100 102
      b = mcf.reset()
101
             .lowerMap(lower)
102
             .upperMap(upper)
103
             .costMap(cost)
104
             .supplyMap(sup)
105
             .stSupply(n, n, k)
103
             .lowerMap(me.lower)
104
             .upperMap(me.upper)
105
             .costMap(me.cost)
106
             .supplyMap(me.sup)
107
             .stSupply(me.n, me.n, me.k)
106 108
             .run();
107 109

	
108 110
      c = const_mcf.totalCost();
109 111
      x = const_mcf.template totalCost<double>();
110
      v = const_mcf.flow(a);
111
      c = const_mcf.potential(n);
112
      v = const_mcf.flow(me.a);
113
      c = const_mcf.potential(me.n);
112 114
      const_mcf.flowMap(fm);
113 115
      const_mcf.potentialMap(pm);
114 116
    }
115 117

	
116 118
    typedef typename GR::Node Node;
117 119
    typedef typename GR::Arc Arc;
118 120
    typedef concepts::ReadMap<Node, Value> NM;
119 121
    typedef concepts::ReadMap<Arc, Value> VAM;
120 122
    typedef concepts::ReadMap<Arc, Cost> CAM;
121 123
    typedef concepts::WriteMap<Arc, Value> FlowMap;
122 124
    typedef concepts::WriteMap<Node, Cost> PotMap;
125
  
126
    GR g;
127
    VAM lower;
128
    VAM upper;
129
    CAM cost;
130
    NM sup;
131
    Node n;
132
    Arc a;
133
    Value k;
123 134

	
124
    const GR &g;
125
    const VAM &lower;
126
    const VAM &upper;
127
    const CAM &cost;
128
    const NM &sup;
129
    const Node &n;
130
    const Arc &a;
131
    const Value &k;
132 135
    FlowMap fm;
133 136
    PotMap pm;
134 137
    bool b;
135 138
    double x;
136 139
    typename MCF::Value v;
137 140
    typename MCF::Cost c;
138 141
  };
139 142

	
140 143
};
141 144

	
142 145

	
143 146
// Check the feasibility of the given flow (primal soluiton)
144 147
template < typename GR, typename LM, typename UM,
145 148
           typename SM, typename FM >
146 149
bool checkFlow( const GR& gr, const LM& lower, const UM& upper,
147 150
                const SM& supply, const FM& flow,
148 151
                SupplyType type = EQ )
149 152
{
150 153
  TEMPLATE_DIGRAPH_TYPEDEFS(GR);
151 154

	
152 155
  for (ArcIt e(gr); e != INVALID; ++e) {
153 156
    if (flow[e] < lower[e] || flow[e] > upper[e]) return false;
154 157
  }
155 158

	
0 comments (0 inline)