0
3
0
| ... | ... |
@@ -65,6 +65,6 @@ |
| 65 | 65 |
typedef SM SupplyMap; |
| 66 | 66 |
|
| 67 |
/// \brief The type of the flow values. |
|
| 68 |
typedef typename SupplyMap::Value Flow; |
|
| 67 |
/// \brief The type of the flow and supply values. |
|
| 68 |
typedef typename SupplyMap::Value Value; |
|
| 69 | 69 |
|
| 70 | 70 |
/// \brief The type of the map that stores the flow values. |
| ... | ... |
@@ -73,5 +73,5 @@ |
| 73 | 73 |
/// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" |
| 74 | 74 |
/// concept. |
| 75 |
typedef typename Digraph::template ArcMap< |
|
| 75 |
typedef typename Digraph::template ArcMap<Value> FlowMap; |
|
| 76 | 76 |
|
| 77 | 77 |
/// \brief Instantiates a FlowMap. |
| ... | ... |
@@ -105,5 +105,5 @@ |
| 105 | 105 |
/// |
| 106 | 106 |
/// The tolerance used by the algorithm to handle inexact computation. |
| 107 |
typedef lemon::Tolerance< |
|
| 107 |
typedef lemon::Tolerance<Value> Tolerance; |
|
| 108 | 108 |
|
| 109 | 109 |
}; |
| ... | ... |
@@ -188,6 +188,6 @@ |
| 188 | 188 |
///The type of the digraph the algorithm runs on. |
| 189 | 189 |
typedef typename Traits::Digraph Digraph; |
| 190 |
///The type of the flow values. |
|
| 191 |
typedef typename Traits::Flow Flow; |
|
| 190 |
///The type of the flow and supply values. |
|
| 191 |
typedef typename Traits::Value Value; |
|
| 192 | 192 |
|
| 193 | 193 |
///The type of the lower bound map. |
| ... | ... |
@@ -222,5 +222,5 @@ |
| 222 | 222 |
bool _local_level; |
| 223 | 223 |
|
| 224 |
typedef typename Digraph::template NodeMap< |
|
| 224 |
typedef typename Digraph::template NodeMap<Value> ExcessMap; |
|
| 225 | 225 |
ExcessMap* _excess; |
| 226 | 226 |
|
| ... | ... |
@@ -531,5 +531,5 @@ |
| 531 | 531 |
(*_excess)[_g.source(e)] -= (*_lo)[e]; |
| 532 | 532 |
} else {
|
| 533 |
|
|
| 533 |
Value fc = -(*_excess)[_g.target(e)]; |
|
| 534 | 534 |
_flow->set(e, fc); |
| 535 | 535 |
(*_excess)[_g.target(e)] = 0; |
| ... | ... |
@@ -564,9 +564,9 @@ |
| 564 | 564 |
int actlevel=(*_level)[act]; |
| 565 | 565 |
int mlevel=_node_num; |
| 566 |
|
|
| 566 |
Value exc=(*_excess)[act]; |
|
| 567 | 567 |
|
| 568 | 568 |
for(OutArcIt e(_g,act);e!=INVALID; ++e) {
|
| 569 | 569 |
Node v = _g.target(e); |
| 570 |
|
|
| 570 |
Value fc=(*_up)[e]-(*_flow)[e]; |
|
| 571 | 571 |
if(!_tol.positive(fc)) continue; |
| 572 | 572 |
if((*_level)[v]<actlevel) {
|
| ... | ... |
@@ -592,5 +592,5 @@ |
| 592 | 592 |
for(InArcIt e(_g,act);e!=INVALID; ++e) {
|
| 593 | 593 |
Node v = _g.source(e); |
| 594 |
|
|
| 594 |
Value fc=(*_flow)[e]-(*_lo)[e]; |
|
| 595 | 595 |
if(!_tol.positive(fc)) continue; |
| 596 | 596 |
if((*_level)[v]<actlevel) {
|
| ... | ... |
@@ -662,11 +662,11 @@ |
| 662 | 662 |
///@{
|
| 663 | 663 |
|
| 664 |
/// \brief Returns the flow on the given arc. |
|
| 664 |
/// \brief Returns the flow value on the given arc. |
|
| 665 | 665 |
/// |
| 666 |
/// Returns the flow on the given arc. |
|
| 666 |
/// Returns the flow value on the given arc. |
|
| 667 | 667 |
/// |
| 668 | 668 |
/// \pre Either \ref run() or \ref init() must be called before |
| 669 | 669 |
/// using this function. |
| 670 |
|
|
| 670 |
Value flow(const Arc& arc) const {
|
|
| 671 | 671 |
return (*_flow)[arc]; |
| 672 | 672 |
} |
| ... | ... |
@@ -751,5 +751,5 @@ |
| 751 | 751 |
for(NodeIt n(_g);n!=INVALID;++n) |
| 752 | 752 |
{
|
| 753 |
|
|
| 753 |
Value dif=-(*_supply)[n]; |
|
| 754 | 754 |
for(InArcIt e(_g,n);e!=INVALID;++e) dif-=(*_flow)[e]; |
| 755 | 755 |
for(OutArcIt e(_g,n);e!=INVALID;++e) dif+=(*_flow)[e]; |
| ... | ... |
@@ -766,8 +766,8 @@ |
| 766 | 766 |
bool checkBarrier() const |
| 767 | 767 |
{
|
| 768 |
Flow delta=0; |
|
| 769 |
Flow inf_cap = std::numeric_limits<Flow>::has_infinity ? |
|
| 770 |
std::numeric_limits<Flow>::infinity() : |
|
| 771 |
std::numeric_limits<Flow>::max(); |
|
| 768 |
Value delta=0; |
|
| 769 |
Value inf_cap = std::numeric_limits<Value>::has_infinity ? |
|
| 770 |
std::numeric_limits<Value>::infinity() : |
|
| 771 |
std::numeric_limits<Value>::max(); |
|
| 772 | 772 |
for(NodeIt n(_g);n!=INVALID;++n) |
| 773 | 773 |
if(barrier(n)) |
| ... | ... |
@@ -57,8 +57,8 @@ |
| 57 | 57 |
/// |
| 58 | 58 |
/// \tparam GR The digraph type the algorithm runs on. |
| 59 |
/// \tparam |
|
| 59 |
/// \tparam V The value type used for flow amounts, capacity bounds |
|
| 60 | 60 |
/// and supply values in the algorithm. By default it is \c int. |
| 61 | 61 |
/// \tparam C The value type used for costs and potentials in the |
| 62 |
/// algorithm. By default it is the same as \c |
|
| 62 |
/// algorithm. By default it is the same as \c V. |
|
| 63 | 63 |
/// |
| 64 | 64 |
/// \warning Both value types must be signed and all input data must |
| ... | ... |
@@ -68,5 +68,5 @@ |
| 68 | 68 |
/// implementations, from which the most efficient one is used |
| 69 | 69 |
/// by default. For more information see \ref PivotRule. |
| 70 |
template <typename GR, typename |
|
| 70 |
template <typename GR, typename V = int, typename C = V> |
|
| 71 | 71 |
class NetworkSimplex |
| 72 | 72 |
{
|
| ... | ... |
@@ -74,15 +74,15 @@ |
| 74 | 74 |
|
| 75 | 75 |
/// The flow type of the algorithm |
| 76 |
typedef |
|
| 76 |
typedef V Value; |
|
| 77 | 77 |
/// The cost type of the algorithm |
| 78 | 78 |
typedef C Cost; |
| 79 | 79 |
#ifdef DOXYGEN |
| 80 | 80 |
/// The type of the flow map |
| 81 |
typedef GR::ArcMap< |
|
| 81 |
typedef GR::ArcMap<Value> FlowMap; |
|
| 82 | 82 |
/// The type of the potential map |
| 83 | 83 |
typedef GR::NodeMap<Cost> PotentialMap; |
| 84 | 84 |
#else |
| 85 | 85 |
/// The type of the flow map |
| 86 |
typedef typename GR::template ArcMap< |
|
| 86 |
typedef typename GR::template ArcMap<Value> FlowMap; |
|
| 87 | 87 |
/// The type of the potential map |
| 88 | 88 |
typedef typename GR::template NodeMap<Cost> PotentialMap; |
| ... | ... |
@@ -207,7 +207,7 @@ |
| 207 | 207 |
TEMPLATE_DIGRAPH_TYPEDEFS(GR); |
| 208 | 208 |
|
| 209 |
typedef typename GR::template ArcMap< |
|
| 209 |
typedef typename GR::template ArcMap<Value> ValueArcMap; |
|
| 210 | 210 |
typedef typename GR::template ArcMap<Cost> CostArcMap; |
| 211 |
typedef typename GR::template NodeMap< |
|
| 211 |
typedef typename GR::template NodeMap<Value> ValueNodeMap; |
|
| 212 | 212 |
|
| 213 | 213 |
typedef std::vector<Arc> ArcVector; |
| ... | ... |
@@ -215,5 +215,5 @@ |
| 215 | 215 |
typedef std::vector<int> IntVector; |
| 216 | 216 |
typedef std::vector<bool> BoolVector; |
| 217 |
typedef std::vector< |
|
| 217 |
typedef std::vector<Value> FlowVector; |
|
| 218 | 218 |
typedef std::vector<Cost> CostVector; |
| 219 | 219 |
|
| ... | ... |
@@ -233,14 +233,14 @@ |
| 233 | 233 |
|
| 234 | 234 |
// Parameters of the problem |
| 235 |
FlowArcMap *_plower; |
|
| 236 |
FlowArcMap *_pupper; |
|
| 235 |
ValueArcMap *_plower; |
|
| 236 |
ValueArcMap *_pupper; |
|
| 237 | 237 |
CostArcMap *_pcost; |
| 238 |
|
|
| 238 |
ValueNodeMap *_psupply; |
|
| 239 | 239 |
bool _pstsup; |
| 240 | 240 |
Node _psource, _ptarget; |
| 241 |
|
|
| 241 |
Value _pstflow; |
|
| 242 | 242 |
SupplyType _stype; |
| 243 | 243 |
|
| 244 |
|
|
| 244 |
Value _sum_supply; |
|
| 245 | 245 |
|
| 246 | 246 |
// Result maps |
| ... | ... |
@@ -279,5 +279,5 @@ |
| 279 | 279 |
int first, second, right, last; |
| 280 | 280 |
int stem, par_stem, new_stem; |
| 281 |
|
|
| 281 |
Value delta; |
|
| 282 | 282 |
|
| 283 | 283 |
public: |
| ... | ... |
@@ -286,7 +286,7 @@ |
| 286 | 286 |
/// |
| 287 | 287 |
/// Constant for infinite upper bounds (capacities). |
| 288 |
/// It is \c std::numeric_limits<Flow>::infinity() if available, |
|
| 289 |
/// \c std::numeric_limits<Flow>::max() otherwise. |
|
| 290 |
|
|
| 288 |
/// It is \c std::numeric_limits<Value>::infinity() if available, |
|
| 289 |
/// \c std::numeric_limits<Value>::max() otherwise. |
|
| 290 |
const Value INF; |
|
| 291 | 291 |
|
| 292 | 292 |
private: |
| ... | ... |
@@ -696,10 +696,10 @@ |
| 696 | 696 |
_local_flow(false), _local_potential(false), |
| 697 | 697 |
_node_id(graph), |
| 698 |
INF(std::numeric_limits<Flow>::has_infinity ? |
|
| 699 |
std::numeric_limits<Flow>::infinity() : |
|
| 700 |
|
|
| 698 |
INF(std::numeric_limits<Value>::has_infinity ? |
|
| 699 |
std::numeric_limits<Value>::infinity() : |
|
| 700 |
std::numeric_limits<Value>::max()) |
|
| 701 | 701 |
{
|
| 702 | 702 |
// Check the value types |
| 703 |
LEMON_ASSERT(std::numeric_limits< |
|
| 703 |
LEMON_ASSERT(std::numeric_limits<Value>::is_signed, |
|
| 704 | 704 |
"The flow type of NetworkSimplex must be signed"); |
| 705 | 705 |
LEMON_ASSERT(std::numeric_limits<Cost>::is_signed, |
| ... | ... |
@@ -726,5 +726,5 @@ |
| 726 | 726 |
/// |
| 727 | 727 |
/// \param map An arc map storing the lower bounds. |
| 728 |
/// Its \c Value type must be convertible to the \c |
|
| 728 |
/// Its \c Value type must be convertible to the \c Value type |
|
| 729 | 729 |
/// of the algorithm. |
| 730 | 730 |
/// |
| ... | ... |
@@ -733,5 +733,5 @@ |
| 733 | 733 |
NetworkSimplex& lowerMap(const LowerMap& map) {
|
| 734 | 734 |
delete _plower; |
| 735 |
_plower = new |
|
| 735 |
_plower = new ValueArcMap(_graph); |
|
| 736 | 736 |
for (ArcIt a(_graph); a != INVALID; ++a) {
|
| 737 | 737 |
(*_plower)[a] = map[a]; |
| ... | ... |
@@ -748,5 +748,5 @@ |
| 748 | 748 |
/// |
| 749 | 749 |
/// \param map An arc map storing the upper bounds. |
| 750 |
/// Its \c Value type must be convertible to the \c |
|
| 750 |
/// Its \c Value type must be convertible to the \c Value type |
|
| 751 | 751 |
/// of the algorithm. |
| 752 | 752 |
/// |
| ... | ... |
@@ -755,5 +755,5 @@ |
| 755 | 755 |
NetworkSimplex& upperMap(const UpperMap& map) {
|
| 756 | 756 |
delete _pupper; |
| 757 |
_pupper = new |
|
| 757 |
_pupper = new ValueArcMap(_graph); |
|
| 758 | 758 |
for (ArcIt a(_graph); a != INVALID; ++a) {
|
| 759 | 759 |
(*_pupper)[a] = map[a]; |
| ... | ... |
@@ -791,5 +791,5 @@ |
| 791 | 791 |
/// |
| 792 | 792 |
/// \param map A node map storing the supply values. |
| 793 |
/// Its \c Value type must be convertible to the \c |
|
| 793 |
/// Its \c Value type must be convertible to the \c Value type |
|
| 794 | 794 |
/// of the algorithm. |
| 795 | 795 |
/// |
| ... | ... |
@@ -799,5 +799,5 @@ |
| 799 | 799 |
delete _psupply; |
| 800 | 800 |
_pstsup = false; |
| 801 |
_psupply = new |
|
| 801 |
_psupply = new ValueNodeMap(_graph); |
|
| 802 | 802 |
for (NodeIt n(_graph); n != INVALID; ++n) {
|
| 803 | 803 |
(*_psupply)[n] = map[n]; |
| ... | ... |
@@ -824,5 +824,5 @@ |
| 824 | 824 |
/// |
| 825 | 825 |
/// \return <tt>(*this)</tt> |
| 826 |
NetworkSimplex& stSupply(const Node& s, const Node& t, |
|
| 826 |
NetworkSimplex& stSupply(const Node& s, const Node& t, Value k) {
|
|
| 827 | 827 |
delete _psupply; |
| 828 | 828 |
_psupply = NULL; |
| ... | ... |
@@ -1026,5 +1026,5 @@ |
| 1026 | 1026 |
/// |
| 1027 | 1027 |
/// \pre \ref run() must be called before using this function. |
| 1028 |
|
|
| 1028 |
Value flow(const Arc& a) const {
|
|
| 1029 | 1029 |
return (*_flow_map)[a]; |
| 1030 | 1030 |
} |
| ... | ... |
@@ -1205,5 +1205,5 @@ |
| 1205 | 1205 |
if (_plower) {
|
| 1206 | 1206 |
for (int i = 0; i != _arc_num; ++i) {
|
| 1207 |
|
|
| 1207 |
Value c = (*_plower)[_arc_ref[i]]; |
|
| 1208 | 1208 |
if (c > 0) {
|
| 1209 | 1209 |
if (_cap[i] < INF) _cap[i] -= c; |
| ... | ... |
@@ -1276,5 +1276,5 @@ |
| 1276 | 1276 |
delta = _cap[in_arc]; |
| 1277 | 1277 |
int result = 0; |
| 1278 |
|
|
| 1278 |
Value d; |
|
| 1279 | 1279 |
int e; |
| 1280 | 1280 |
|
| ... | ... |
@@ -1316,5 +1316,5 @@ |
| 1316 | 1316 |
// Augment along the cycle |
| 1317 | 1317 |
if (delta > 0) {
|
| 1318 |
|
|
| 1318 |
Value val = _state[in_arc] * delta; |
|
| 1319 | 1319 |
_flow[in_arc] += val; |
| 1320 | 1320 |
for (int u = _source[in_arc]; u != join; u = _parent[u]) {
|
| ... | ... |
@@ -47,5 +47,5 @@ |
| 47 | 47 |
|
| 48 | 48 |
/// \brief The type of the flow values. |
| 49 |
typedef typename CapacityMap::Value |
|
| 49 |
typedef typename CapacityMap::Value Value; |
|
| 50 | 50 |
|
| 51 | 51 |
/// \brief The type of the map that stores the flow values. |
| ... | ... |
@@ -53,5 +53,5 @@ |
| 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< |
|
| 55 |
typedef typename Digraph::template ArcMap<Value> FlowMap; |
|
| 56 | 56 |
|
| 57 | 57 |
/// \brief Instantiates a FlowMap. |
| ... | ... |
@@ -85,5 +85,5 @@ |
| 85 | 85 |
/// |
| 86 | 86 |
/// The tolerance used by the algorithm to handle inexact computation. |
| 87 |
typedef lemon::Tolerance< |
|
| 87 |
typedef lemon::Tolerance<Value> 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:: |
|
| 128 |
typedef typename Traits::Value Value; |
|
| 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< |
|
| 154 |
typedef typename Digraph::template NodeMap<Value> ExcessMap; |
|
| 155 | 155 |
ExcessMap* _excess; |
| 156 | 156 |
|
| ... | ... |
@@ -471,5 +471,5 @@ |
| 471 | 471 |
|
| 472 | 472 |
for (NodeIt n(_graph); n != INVALID; ++n) {
|
| 473 |
|
|
| 473 |
Value 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 |
|
|
| 522 |
Value 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 |
|
|
| 534 |
Value 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 |
|
|
| 567 |
Value excess = (*_excess)[n]; |
|
| 568 | 568 |
int new_level = _level->maxLevel(); |
| 569 | 569 |
|
| 570 | 570 |
for (OutArcIt e(_graph, n); e != INVALID; ++e) {
|
| 571 |
|
|
| 571 |
Value 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 |
|
|
| 594 |
Value 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 |
|
|
| 640 |
Value excess = (*_excess)[n]; |
|
| 641 | 641 |
int new_level = _level->maxLevel(); |
| 642 | 642 |
|
| 643 | 643 |
for (OutArcIt e(_graph, n); e != INVALID; ++e) {
|
| 644 |
|
|
| 644 |
Value 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 |
|
|
| 667 |
Value 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 |
|
|
| 781 |
Value 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 |
|
|
| 786 |
Value 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 |
|
|
| 809 |
Value rem = (*_flow)[e]; |
|
| 810 | 810 |
if (!_tolerance.positive(rem)) continue; |
| 811 | 811 |
Node v = _graph.source(e); |
| ... | ... |
@@ -898,16 +898,16 @@ |
| 898 | 898 |
/// \pre Either \ref run() or \ref init() must be called before |
| 899 | 899 |
/// using this function. |
| 900 |
|
|
| 900 |
Value flowValue() const {
|
|
| 901 | 901 |
return (*_excess)[_target]; |
| 902 | 902 |
} |
| 903 | 903 |
|
| 904 |
/// \brief Returns the flow on the given arc. |
|
| 904 |
/// \brief Returns the flow value on the given arc. |
|
| 905 | 905 |
/// |
| 906 |
/// Returns the flow on the given arc. This method can |
|
| 906 |
/// Returns the flow value on the given arc. This method can |
|
| 907 | 907 |
/// be called after the second phase of the algorithm. |
| 908 | 908 |
/// |
| 909 | 909 |
/// \pre Either \ref run() or \ref init() must be called before |
| 910 | 910 |
/// using this function. |
| 911 |
|
|
| 911 |
Value flow(const Arc& arc) const {
|
|
| 912 | 912 |
return (*_flow)[arc]; |
| 913 | 913 |
} |
0 comments (0 inline)