[Lemon-commits] Peter Kovacs: Simplify comparisons in min mean c...
Lemon HG
hg at lemon.cs.elte.hu
Thu Nov 5 08:59:58 CET 2009
details: http://lemon.cs.elte.hu/hg/lemon/rev/11c946fa8d13
changeset: 827:11c946fa8d13
user: Peter Kovacs <kpeter [at] inf.elte.hu>
date: Tue Aug 11 22:52:35 2009 +0200
description:
Simplify comparisons in min mean cycle classes (#179) using extreme
INF values instead of bool flags.
diffstat:
lemon/hartmann_orlin.h | 40 +++++++++++++++++++++-------------------
lemon/howard.h | 15 +++++++++++----
lemon/karp.h | 34 ++++++++++++++++++----------------
3 files changed, 50 insertions(+), 39 deletions(-)
diffs (255 lines):
diff --git a/lemon/hartmann_orlin.h b/lemon/hartmann_orlin.h
--- a/lemon/hartmann_orlin.h
+++ b/lemon/hartmann_orlin.h
@@ -150,11 +150,10 @@
// Data sturcture for path data
struct PathData
{
- bool found;
LargeValue dist;
Arc pred;
- PathData(bool f = false, LargeValue d = 0, Arc p = INVALID) :
- found(f), dist(d), pred(p) {}
+ PathData(LargeValue d, Arc p = INVALID) :
+ dist(d), pred(p) {}
};
typedef typename Digraph::template NodeMap<std::vector<PathData> >
@@ -191,6 +190,9 @@
Tolerance _tolerance;
+ // Infinite constant
+ const LargeValue INF;
+
public:
/// \name Named Template Parameters
@@ -245,7 +247,10 @@
const LengthMap &length ) :
_gr(digraph), _length(length), _comp(digraph), _out_arcs(digraph),
_best_found(false), _best_length(0), _best_size(1),
- _cycle_path(NULL), _local_path(false), _data(digraph)
+ _cycle_path(NULL), _local_path(false), _data(digraph),
+ INF(std::numeric_limits<LargeValue>::has_infinity ?
+ std::numeric_limits<LargeValue>::infinity() :
+ std::numeric_limits<LargeValue>::max())
{}
/// Destructor.
@@ -472,7 +477,7 @@
return false;
}
for (int i = 0; i < n; ++i) {
- _data[(*_nodes)[i]].resize(n + 1);
+ _data[(*_nodes)[i]].resize(n + 1, PathData(INF));
}
return true;
}
@@ -482,7 +487,7 @@
// node to node v containing exactly k arcs.
void processRounds() {
Node start = (*_nodes)[0];
- _data[start][0] = PathData(true, 0);
+ _data[start][0] = PathData(0);
_process.clear();
_process.push_back(start);
@@ -517,12 +522,9 @@
e = _out_arcs[u][j];
v = _gr.target(e);
d = _data[u][k-1].dist + _length[e];
- if (!_data[v][k].found) {
- next.push_back(v);
- _data[v][k] = PathData(true, _data[u][k-1].dist + _length[e], e);
- }
- else if (_tolerance.less(d, _data[v][k].dist)) {
- _data[v][k] = PathData(true, d, e);
+ if (_tolerance.less(d, _data[v][k].dist)) {
+ if (_data[v][k].dist == INF) next.push_back(v);
+ _data[v][k] = PathData(d, e);
}
}
}
@@ -540,8 +542,8 @@
e = _out_arcs[u][j];
v = _gr.target(e);
d = _data[u][k-1].dist + _length[e];
- if (!_data[v][k].found || _tolerance.less(d, _data[v][k].dist)) {
- _data[v][k] = PathData(true, d, e);
+ if (_tolerance.less(d, _data[v][k].dist)) {
+ _data[v][k] = PathData(d, e);
}
}
}
@@ -561,7 +563,7 @@
_curr_found = false;
for (int i = 0; i < n; ++i) {
u = (*_nodes)[i];
- if (!_data[u][k].found) continue;
+ if (_data[u][k].dist == INF) continue;
for (int j = k; j >= 0; --j) {
if (level[u].first == i && level[u].second > 0) {
// A cycle is found
@@ -586,11 +588,11 @@
// Find node potentials
for (int i = 0; i < n; ++i) {
u = (*_nodes)[i];
- pi[u] = std::numeric_limits<LargeValue>::max();
+ pi[u] = INF;
for (int j = 0; j <= k; ++j) {
- d = _data[u][j].dist * _curr_size - j * _curr_length;
- if (_data[u][j].found && _tolerance.less(d, pi[u])) {
- pi[u] = d;
+ if (_data[u][j].dist < INF) {
+ d = _data[u][j].dist * _curr_size - j * _curr_length;
+ if (_tolerance.less(d, pi[u])) pi[u] = d;
}
}
}
diff --git a/lemon/howard.h b/lemon/howard.h
--- a/lemon/howard.h
+++ b/lemon/howard.h
@@ -178,6 +178,9 @@
Tolerance _tolerance;
+ // Infinite constant
+ const LargeValue INF;
+
public:
/// \name Named Template Parameters
@@ -230,9 +233,13 @@
/// \param length The lengths (costs) of the arcs.
Howard( const Digraph &digraph,
const LengthMap &length ) :
- _gr(digraph), _length(length), _cycle_path(NULL), _local_path(false),
+ _gr(digraph), _length(length), _best_found(false),
+ _best_length(0), _best_size(1), _cycle_path(NULL), _local_path(false),
_policy(digraph), _reached(digraph), _level(digraph), _dist(digraph),
- _comp(digraph), _in_arcs(digraph)
+ _comp(digraph), _in_arcs(digraph),
+ INF(std::numeric_limits<LargeValue>::has_infinity ?
+ std::numeric_limits<LargeValue>::infinity() :
+ std::numeric_limits<LargeValue>::max())
{}
/// Destructor.
@@ -307,7 +314,7 @@
if (!computeNodeDistances()) break;
}
// Update the best cycle (global minimum mean cycle)
- if ( !_best_found || (_curr_found &&
+ if ( _curr_found && (!_best_found ||
_curr_length * _best_size < _best_length * _curr_size) ) {
_best_found = true;
_best_length = _curr_length;
@@ -446,7 +453,7 @@
return false;
}
for (int i = 0; i < int(_nodes->size()); ++i) {
- _dist[(*_nodes)[i]] = std::numeric_limits<LargeValue>::max();
+ _dist[(*_nodes)[i]] = INF;
}
Node u, v;
Arc e;
diff --git a/lemon/karp.h b/lemon/karp.h
--- a/lemon/karp.h
+++ b/lemon/karp.h
@@ -148,11 +148,10 @@
// Data sturcture for path data
struct PathData
{
- bool found;
LargeValue dist;
Arc pred;
- PathData(bool f = false, LargeValue d = 0, Arc p = INVALID) :
- found(f), dist(d), pred(p) {}
+ PathData(LargeValue d, Arc p = INVALID) :
+ dist(d), pred(p) {}
};
typedef typename Digraph::template NodeMap<std::vector<PathData> >
@@ -186,6 +185,9 @@
std::vector<Node> _process;
Tolerance _tolerance;
+
+ // Infinite constant
+ const LargeValue INF;
public:
@@ -241,7 +243,10 @@
const LengthMap &length ) :
_gr(digraph), _length(length), _comp(digraph), _out_arcs(digraph),
_cycle_length(0), _cycle_size(1), _cycle_node(INVALID),
- _cycle_path(NULL), _local_path(false), _data(digraph)
+ _cycle_path(NULL), _local_path(false), _data(digraph),
+ INF(std::numeric_limits<LargeValue>::has_infinity ?
+ std::numeric_limits<LargeValue>::infinity() :
+ std::numeric_limits<LargeValue>::max())
{}
/// Destructor.
@@ -458,7 +463,7 @@
return false;
}
for (int i = 0; i < n; ++i) {
- _data[(*_nodes)[i]].resize(n + 1);
+ _data[(*_nodes)[i]].resize(n + 1, PathData(INF));
}
return true;
}
@@ -468,7 +473,7 @@
// node to node v containing exactly k arcs.
void processRounds() {
Node start = (*_nodes)[0];
- _data[start][0] = PathData(true, 0);
+ _data[start][0] = PathData(0);
_process.clear();
_process.push_back(start);
@@ -493,12 +498,9 @@
e = _out_arcs[u][j];
v = _gr.target(e);
d = _data[u][k-1].dist + _length[e];
- if (!_data[v][k].found) {
- next.push_back(v);
- _data[v][k] = PathData(true, _data[u][k-1].dist + _length[e], e);
- }
- else if (_tolerance.less(d, _data[v][k].dist)) {
- _data[v][k] = PathData(true, d, e);
+ if (_tolerance.less(d, _data[v][k].dist)) {
+ if (_data[v][k].dist == INF) next.push_back(v);
+ _data[v][k] = PathData(d, e);
}
}
}
@@ -516,8 +518,8 @@
e = _out_arcs[u][j];
v = _gr.target(e);
d = _data[u][k-1].dist + _length[e];
- if (!_data[v][k].found || _tolerance.less(d, _data[v][k].dist)) {
- _data[v][k] = PathData(true, d, e);
+ if (_tolerance.less(d, _data[v][k].dist)) {
+ _data[v][k] = PathData(d, e);
}
}
}
@@ -528,12 +530,12 @@
int n = _nodes->size();
for (int i = 0; i < n; ++i) {
Node u = (*_nodes)[i];
- if (!_data[u][n].found) continue;
+ if (_data[u][n].dist == INF) continue;
LargeValue length, max_length = 0;
int size, max_size = 1;
bool found_curr = false;
for (int k = 0; k < n; ++k) {
- if (!_data[u][k].found) continue;
+ if (_data[u][k].dist == INF) continue;
length = _data[u][n].dist - _data[u][k].dist;
size = n - k;
if (!found_curr || length * max_size > max_length * size) {
More information about the Lemon-commits
mailing list