1
Vote

Edge equality backwards?

description

I am using an UndirectedGraph with a default TEdge of UndirectedEdge. I set AllowParallelEdges to false. However, I was surprised to find that I could still create an edge between two existing verticies that already had an edge between them as long as I created the edge in the opposite direction as before. This seemed wrong to me since this is an undirected graph so direction shouldn't matter. I then looked at your source to see what the default edge equality was done. I was surprised to see this:
        /// <summary>
        /// Returns the most efficient comporer for the particular type of TEdge.
        /// If TEdge implements IUndirectedEdge, then only the (source,target) pair
        /// has to be compared; if not, (source, target) and (target, source) have to be compared.
        /// </summary>
        /// <typeparam name="TVertex">type of the vertices</typeparam>
        /// <typeparam name="TEdge">type of the edges</typeparam>
        /// <returns></returns>
        public static EdgeEqualityComparer<TVertex, TEdge> GetUndirectedVertexEquality<TVertex, TEdge>()
            where TEdge : IEdge<TVertex>
        {
            if (typeof(IUndirectedEdge<TVertex>).IsAssignableFrom(typeof(TEdge)))
                return new EdgeEqualityComparer<TVertex, TEdge>(SortedVertexEquality<TVertex, TEdge>);
            else
                return new EdgeEqualityComparer<TVertex, TEdge>(UndirectedVertexEquality<TVertex, TEdge>);
        }
Isn't that backwards? If an edge is IUndirectedEdge, then we should use the UndirectedVertexEquality NOT the SortedVertexEquality? If I manually set the equality to UndirectedVertexEquality, then I get the behavior I expected.

comments