Hi,
I highly appreciated the last contributions (thanks guys!) but I also
agree on this point, so let's start from the end.
I think that, no matter what underlying structure we come up with, the
user should be able to specify e.g. a weighted edge with something like
public class MyEdge implements Edge, Weighted<Double> { ... }
and be able to immediately use it as an input for all the algorithms,
without extra steps required. So the average user is happy, while
"graph geeks" can dig into advanced capabilities and forge their
personalized weights :)
I hope we all agree on this as a first step. Complexity comes after.
I'll take my time as well to re-think.
I did think and code a bit more. First of all please take a look at the
updated code: Weighted<W> is an interface (weight W can be any type) and
all the algorithms require edges to implement Weighted<Double> for now
-- we did not break it that much ;)
About the "HasProperty-vs-Property" question (as in Comparable vs
Comparator, MonoidElement vs Monoid, etc) I would go for the second one
only. That is, external classes handle all operations on weights.
Downside: the # of method parameters would increase linearly with the
number of properties, but I can live with that (how many properties
would weights have anyway?). On the other hand we have a neat interface
for each property/class (Zero, Semigroup, Monoid, Ordering or
Comparator, etc) and one clean, generic implementation for each
algorithm. Dijkstra's signature becomes something like:
public static <V extends Vertex, W, WE extends WeightedEdge<W>, G
extends DirectedGraph<V, WE>> WeightedPath<V, WE, W> findShortestPath( G
graph, V source, V target, Monoid<W> weightMonoid, Comparator<W>
weightComparator )
Scary uh? But wait, default implementations for Double, Integer, etc.
are way easier. E.g. Dijkstra's shortcut for Double:
public static <V extends Vertex, WE extends WeightedEdge<Double>, G
extends DirectedGraph<V, WE>> WeightedPath<V, WE, Double>
findShortestPath( G graph, V source, V target )
{
return findShortestPath(graph, source, target, new DoubleMonoid(),
new DoubleComparator());
}
where DoubleMonoid and DoubleComparator are part of the library.
If you guys are fine with this, I'm ready to try and patch [graph] with
a Christmas gift :)
Claudio
--
Claudio Squarcella
PhD student at Roma Tre University
E-mail address: squar...@dia.uniroma3.it
Phone: +39-06-57333215
Fax: +39-06-57333612
http://www.dia.uniroma3.it/~squarcel
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org