Обсуждение: pgsql: Avoid use of float arithmetic in bipartite_match.c.

Поиск
Список
Период
Сортировка

pgsql: Avoid use of float arithmetic in bipartite_match.c.

От
Tom Lane
Дата:
Avoid use of float arithmetic in bipartite_match.c.

Since the distances used in this algorithm are small integers (not more
than the size of the U set, in fact), there is no good reason to use float
arithmetic for them.  Use short ints instead: they're smaller, faster, and
require no special portability assumptions.

Per testing by Greg Stark, which disclosed that the code got into an
infinite loop on VAX for lack of IEEE-style float infinities.  We don't
really care all that much whether Postgres can run on a VAX anymore,
but there seems sufficient reason to change this code anyway.

In passing, make a few other small adjustments to make the code match
usual Postgres coding style a bit better.

Branch
------
REL9_5_STABLE

Details
-------
http://git.postgresql.org/pg/commitdiff/4022f94c350f96fc5feff0503d3e2f2f6f9086cc

Modified Files
--------------
src/backend/lib/bipartite_match.c |   75 +++++++++++++++++++++++--------------
src/include/lib/bipartite_match.h |   16 ++++----
2 files changed, 55 insertions(+), 36 deletions(-)


Re: pgsql: Avoid use of float arithmetic in bipartite_match.c.

От
Andres Freund
Дата:
Hi,

On 2015-08-23 17:02:35 +0000, Tom Lane wrote:
> Avoid use of float arithmetic in bipartite_match.c.
>
> Since the distances used in this algorithm are small integers (not more
> than the size of the U set, in fact), there is no good reason to use float
> arithmetic for them.  Use short ints instead: they're smaller, faster, and
> require no special portability assumptions.

Yea, makes sense. Thanks.

> In passing, make a few other small adjustments to make the code match
> usual Postgres coding style a bit better.

Not sure why you replaced n by k? Anyway, it's not a complete
replacement afaics:
 /*
  * Given a bipartite graph consisting of nodes U numbered 1..nU, nodes V
  * numbered 1..nV, and an adjacency map of undirected edges in the form
- * adjacency[u] = [n, v1, v2, v3, ... vn], we wish to find a "maximum
+ * adjacency[u] = [k, v1, v2, v3, ... vk], we wish to find a "maximum
  * cardinality matching", which is defined as follows: a matching is a subset
  * of the original edges such that no node has more than one edge, and a
  * matching has maximum cardinality if there exists no other matching with a

the nodes are 1..n, so the adjacency list should be as well (or the
other way round).

Andres


Re: pgsql: Avoid use of float arithmetic in bipartite_match.c.

От
Tom Lane
Дата:
Andres Freund <andres@anarazel.de> writes:
> Not sure why you replaced n by k?

I thought it was possible to confuse it with the "n"'s used in the
previous line to denote the graph sizes.

> the nodes are 1..n, so the adjacency list should be as well (or the
> other way round).

No, I meant them to be different.  Do you think the other way is better?

            regards, tom lane


Re: pgsql: Avoid use of float arithmetic in bipartite_match.c.

От
Andres Freund
Дата:
On 2015-08-23 13:30:45 -0400, Tom Lane wrote:
> Andres Freund <andres@anarazel.de> writes:
> > Not sure why you replaced n by k?
>
> I thought it was possible to confuse it with the "n"'s used in the
> previous line to denote the graph sizes.
>
> > the nodes are 1..n, so the adjacency list should be as well (or the
> > other way round).
>
> No, I meant them to be different.  Do you think the other way is better?

Well, using the same index seemed to comfortably explain that the size
of the individual adjacency mappings depends on the number of nodes in
V. But for that to really make sense there'd need to be a different
indexes for U/V, which I now see wasn't the case case before
either. As currently used they'll be the same anyway...

- Andres