You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by si...@apache.org on 2012/03/07 23:40:03 UTC

svn commit: r1298180 - in /commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph: ./ spanning/

Author: simonetripodi
Date: Wed Mar  7 22:40:02 2012
New Revision: 1298180

URL: http://svn.apache.org/viewvc?rev=1298180&view=rev
Log:
updated spanning tree algorithms API according to new Mapper to retrieve weights of graph edges

Added:
    commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningWeightedEdgeMapperBuilder.java   (with props)
    commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/SpanningWeightedEdgeMapperBuilder.java   (with props)
Modified:
    commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/CommonsGraph.java
    commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningTreeAlgorithmSelector.java
    commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningTreeSourceSelector.java
    commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/SuperVertex.java

Modified: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/CommonsGraph.java
URL: http://svn.apache.org/viewvc/commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/CommonsGraph.java?rev=1298180&r1=1298179&r2=1298180&view=diff
==============================================================================
--- commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/CommonsGraph.java (original)
+++ commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/CommonsGraph.java Wed Mar  7 22:40:02 2012
@@ -45,7 +45,8 @@ import org.apache.commons.graph.scc.Defa
 import org.apache.commons.graph.scc.SccAlgorithmSelector;
 import org.apache.commons.graph.shortestpath.DefaultWeightedEdgesSelector;
 import org.apache.commons.graph.shortestpath.PathWeightedEdgesBuilder;
-import org.apache.commons.graph.spanning.DefaultSpanningTreeSourceSelector;
+import org.apache.commons.graph.spanning.DefaultSpanningWeightedEdgeMapperBuilder;
+import org.apache.commons.graph.spanning.SpanningWeightedEdgeMapperBuilder;
 import org.apache.commons.graph.visit.DefaultVisitSourceSelector;
 import org.apache.commons.graph.visit.VisitSourceSelector;
 
@@ -88,10 +89,10 @@ public final class CommonsGraph<V, E, G 
      * @param graph
      * @return
      */
-    public static <V, WE, W, G extends Graph<V, WE>> SpanningTreeSourceSelector<V, W, WE, G> minimumSpanningTree( G graph )
+    public static <V, WE, G extends Graph<V, WE>> SpanningWeightedEdgeMapperBuilder<V, WE, G> minimumSpanningTree( G graph )
     {
         graph = checkNotNull( graph, "Minimum spanning tree can not be calculated on null graph" );
-        return new DefaultSpanningTreeSourceSelector<V, W, WE, G>( graph );
+        return new DefaultSpanningWeightedEdgeMapperBuilder<V, WE, G>( graph );
     }
 
     /**

Modified: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningTreeAlgorithmSelector.java
URL: http://svn.apache.org/viewvc/commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningTreeAlgorithmSelector.java?rev=1298180&r1=1298179&r2=1298180&view=diff
==============================================================================
--- commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningTreeAlgorithmSelector.java (original)
+++ commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningTreeAlgorithmSelector.java Wed Mar  7 22:40:02 2012
@@ -31,6 +31,7 @@ import java.util.PriorityQueue;
 import java.util.Set;
 
 import org.apache.commons.graph.Graph;
+import org.apache.commons.graph.Mapper;
 import org.apache.commons.graph.SpanningTree;
 import org.apache.commons.graph.VertexPair;
 import org.apache.commons.graph.collections.DisjointSet;
@@ -51,6 +52,8 @@ final class DefaultSpanningTreeAlgorithm
     /** The graph. */
     private final G graph;
 
+    private final Mapper<WE, W> weightedEdges;
+
     /** The start {@link Vertex}. */
     private final V source;
 
@@ -61,9 +64,10 @@ final class DefaultSpanningTreeAlgorithm
      * @param graph the {@link Graph} to be used.
      * @param source the start {@link Vertex}.
      */
-    public DefaultSpanningTreeAlgorithmSelector( final G graph, final V source )
+    public DefaultSpanningTreeAlgorithmSelector( final G graph, Mapper<WE, W> weightedEdges, final V source )
     {
         this.graph = graph;
+        this.weightedEdges = weightedEdges;
         this.source = source;
     }
 
@@ -87,20 +91,16 @@ final class DefaultSpanningTreeAlgorithm
 
         checkNotNull( weightOperations, "The Boruvka algorithm cannot be calculated with null weight operations" );
 
-        final MutableSpanningTree<V, WE, W> spanningTree =
-            new MutableSpanningTree<V, WE, W>( weightOperations );
+        final MutableSpanningTree<V, WE, W> spanningTree = new MutableSpanningTree<V, WE, W>( weightOperations );
 
-        final Set<SuperVertex<V, W, WE, G, WO>> components =
-            new HashSet<SuperVertex<V, W, WE, G, WO>>( graph.getOrder() );
+        final Set<SuperVertex<V, W, WE, G>> components = new HashSet<SuperVertex<V, W, WE, G>>( graph.getOrder() );
 
-        final Map<V, SuperVertex<V, W, WE, G, WO>> mapping =
-            new HashMap<V, SuperVertex<V, W, WE, G, WO>>( graph.getOrder() );
+        final Map<V, SuperVertex<V, W, WE, G>> mapping = new HashMap<V, SuperVertex<V, W, WE, G>>( graph.getOrder() );
 
         for ( V v : graph.getVertices() )
         {
             // create a super vertex for each vertex
-            final SuperVertex<V, W, WE, G, WO> sv =
-                new SuperVertex<V, W, WE, G, WO>( v, graph, weightOperations );
+            final SuperVertex<V, W, WE, G> sv = new SuperVertex<V, W, WE, G>( v, graph, new WeightedEdgesComparator<W, WE>( weightOperations, weightedEdges ) );
 
             components.add( sv );
 
@@ -114,7 +114,7 @@ final class DefaultSpanningTreeAlgorithm
         while ( components.size() > 1 )
         {
             final List<WE> edges = new LinkedList<WE>();
-            for ( SuperVertex<V, W, WE, G, WO> sv : components )
+            for ( SuperVertex<V, W, WE, G> sv : components )
             {
                 // get the minimum edge for each component to any other component
                 final WE edge = sv.getMinimumWeightEdge();
@@ -135,8 +135,8 @@ final class DefaultSpanningTreeAlgorithm
                 final V tail = pair.getTail();
 
                 // find the super vertices corresponding to this edge
-                final SuperVertex<V, W, WE, G, WO> headSv = mapping.get( head );
-                final SuperVertex<V, W, WE, G, WO> tailSv = mapping.get( tail );
+                final SuperVertex<V, W, WE, G> headSv = mapping.get( head );
+                final SuperVertex<V, W, WE, G> tailSv = mapping.get( tail );
 
                 // merge them, if they are not the same
                 if ( headSv != tailSv )
@@ -173,7 +173,7 @@ final class DefaultSpanningTreeAlgorithm
         final Set<V> settledNodes = new HashSet<V>();
 
         final PriorityQueue<WE> orderedEdges =
-            new PriorityQueue<WE>( graph.getSize(), new WeightedEdgesComparator<W, WE>( weightOperations ) );
+            new PriorityQueue<WE>( graph.getSize(), new WeightedEdgesComparator<W, WE>( weightOperations, weightedEdges ) );
 
         for ( WE edge : graph.getEdges() )
         {
@@ -217,7 +217,7 @@ final class DefaultSpanningTreeAlgorithm
     {
         checkNotNull( weightOperations, "The Prim algorithm cannot be calculated with null weight operations" );
 
-        final ShortestEdges<V, WE, W> shortestEdges = new ShortestEdges<V, WE, W>( graph, source, weightOperations );
+        final ShortestEdges<V, WE, W> shortestEdges = new ShortestEdges<V, WE, W>( graph, source, weightOperations, weightedEdges );
 
         final PriorityQueue<V> unsettledNodes = new PriorityQueue<V>( graph.getOrder(), shortestEdges );
         unsettledNodes.add( source );
@@ -236,7 +236,7 @@ final class DefaultSpanningTreeAlgorithm
                 // if the edge has not been already visited and its weight is
                 // less then the current Vertex weight
                 boolean weightLessThanCurrent = !shortestEdges.hasWeight( v ) ||
-                        weightOperations.compare( edge.getWeight(), shortestEdges.getWeight( v ) ) < 0;
+                        weightOperations.compare( weightedEdges.map( edge ), shortestEdges.getWeight( v ) ) < 0;
                 if ( settledEdges.add( edge ) && weightLessThanCurrent )
                 {
                     if ( !unsettledNodes.contains( v ) )

Modified: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningTreeSourceSelector.java
URL: http://svn.apache.org/viewvc/commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningTreeSourceSelector.java?rev=1298180&r1=1298179&r2=1298180&view=diff
==============================================================================
--- commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningTreeSourceSelector.java (original)
+++ commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningTreeSourceSelector.java Wed Mar  7 22:40:02 2012
@@ -30,6 +30,7 @@ import java.util.Iterator;
 import java.util.List;
 
 import org.apache.commons.graph.Graph;
+import org.apache.commons.graph.Mapper;
 import org.apache.commons.graph.SpanningTree;
 import org.apache.commons.graph.VertexPair;
 import org.apache.commons.graph.model.MutableSpanningTree;
@@ -44,15 +45,18 @@ import org.apache.commons.graph.weight.O
  * @param <WE> the Graph weighted edges type
  * @param <G> the input Graph type
  */
-public final class DefaultSpanningTreeSourceSelector<V, W, WE, G extends Graph<V, WE>>
+final class DefaultSpanningTreeSourceSelector<V, W, WE, G extends Graph<V, WE>>
     implements SpanningTreeSourceSelector<V, W, WE, G>
 {
 
     private final G graph;
 
-    public DefaultSpanningTreeSourceSelector( G graph )
+    private final Mapper<WE, W> weightedEdges;
+
+    public DefaultSpanningTreeSourceSelector( G graph, Mapper<WE, W> weightedEdges )
     {
         this.graph = graph;
+        this.weightedEdges = weightedEdges;
     }
 
     /**
@@ -71,7 +75,7 @@ public final class DefaultSpanningTreeSo
     {
         source = checkNotNull( source, "Spanning tree cannot be calculated without expressing the source vertex" );
         checkState( graph.containsVertex( source ), "Vertex %s does not exist in the Graph", source );
-        return new DefaultSpanningTreeAlgorithmSelector<V, W, WE, G>( graph, source );
+        return new DefaultSpanningTreeAlgorithmSelector<V, W, WE, G>( graph, weightedEdges, source );
     }
 
     /**
@@ -91,9 +95,9 @@ public final class DefaultSpanningTreeSo
             sortedEdge.add( we );
         }
 
-        sort( sortedEdge, reverseOrder( new WeightedEdgesComparator<W, WE>( weightOperations ) ) );
+        sort( sortedEdge, reverseOrder( new WeightedEdgesComparator<W, WE>( weightOperations, weightedEdges ) ) );
 
-        WeightedGraph<V, WE, W> tmpGraph = new ReverseDeleteGraph<V, WE, W>( graph, sortedEdge, visitedEdge );
+        Graph<V, WE> tmpGraph = new ReverseDeleteGraph<V, WE>( graph, sortedEdge, visitedEdge );
 
         for ( Iterator<WE> iterator = sortedEdge.iterator(); iterator.hasNext(); )
         {
@@ -104,7 +108,11 @@ public final class DefaultSpanningTreeSo
 
             try
             {
-                findShortestPath( tmpGraph ).from( vertices.getHead() ).to( vertices.getTail() ).applyingDijkstra( weightOperations );
+                findShortestPath( tmpGraph )
+                    .whereEdgesHaveWeights( weightedEdges )
+                    .from( vertices.getHead() )
+                    .to( vertices.getTail() )
+                    .applyingDijkstra( weightOperations );
             }
             catch ( PathNotFoundException ex )
             {

Added: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningWeightedEdgeMapperBuilder.java
URL: http://svn.apache.org/viewvc/commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningWeightedEdgeMapperBuilder.java?rev=1298180&view=auto
==============================================================================
--- commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningWeightedEdgeMapperBuilder.java (added)
+++ commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningWeightedEdgeMapperBuilder.java Wed Mar  7 22:40:02 2012
@@ -0,0 +1,44 @@
+package org.apache.commons.graph.spanning;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import static org.apache.commons.graph.utils.Assertions.checkNotNull;
+
+import org.apache.commons.graph.Graph;
+import org.apache.commons.graph.Mapper;
+
+public final class DefaultSpanningWeightedEdgeMapperBuilder<V, WE, G extends Graph<V, WE>>
+    implements SpanningWeightedEdgeMapperBuilder<V, WE, G>
+{
+
+    private final G graph;
+
+    public DefaultSpanningWeightedEdgeMapperBuilder( G graph )
+    {
+        this.graph = graph;
+    }
+
+    public <W> SpanningTreeSourceSelector<V, W, WE, G> whereEdgesHaveWeights( Mapper<WE, W> weightedEdges )
+    {
+        weightedEdges = checkNotNull( weightedEdges, "Function to calculate edges weight can not be null." );
+        return new DefaultSpanningTreeSourceSelector<V, W, WE, G>( graph, weightedEdges );
+    }
+
+}

Propchange: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningWeightedEdgeMapperBuilder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningWeightedEdgeMapperBuilder.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/DefaultSpanningWeightedEdgeMapperBuilder.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/SpanningWeightedEdgeMapperBuilder.java
URL: http://svn.apache.org/viewvc/commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/SpanningWeightedEdgeMapperBuilder.java?rev=1298180&view=auto
==============================================================================
--- commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/SpanningWeightedEdgeMapperBuilder.java (added)
+++ commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/SpanningWeightedEdgeMapperBuilder.java Wed Mar  7 22:40:02 2012
@@ -0,0 +1,30 @@
+package org.apache.commons.graph.spanning;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.commons.graph.Graph;
+import org.apache.commons.graph.Mapper;
+
+public interface SpanningWeightedEdgeMapperBuilder<V, WE, G extends Graph<V, WE>>
+{
+
+    <W> SpanningTreeSourceSelector<V, W, WE, G> whereEdgesHaveWeights( Mapper<WE, W> weightedEdges );
+
+}

Propchange: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/SpanningWeightedEdgeMapperBuilder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/SpanningWeightedEdgeMapperBuilder.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/SpanningWeightedEdgeMapperBuilder.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/SuperVertex.java
URL: http://svn.apache.org/viewvc/commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/SuperVertex.java?rev=1298180&r1=1298179&r2=1298180&view=diff
==============================================================================
--- commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/SuperVertex.java (original)
+++ commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/spanning/SuperVertex.java Wed Mar  7 22:40:02 2012
@@ -19,7 +19,6 @@ package org.apache.commons.graph.spannin
  * under the License.
  */
 
-import java.util.Comparator;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
@@ -38,7 +37,7 @@ import org.apache.commons.graph.VertexPa
  * @param <G>  the input Graph type
  * @param <WC> the weight operations
  */
-class SuperVertex<V, W, WE, G extends Graph<V, WE>, WC extends Comparator<W>>
+class SuperVertex<V, W, WE, G extends Graph<V, WE>>
     implements Iterable<V> {
 
     /** The reference to the graph. */
@@ -58,13 +57,13 @@ class SuperVertex<V, W, WE, G extends Gr
      * @param graph the underlying graph
      * @param weightComparator the comparator used to sort the weighted edges
      */
-    public SuperVertex( final V source, final G graph, final WC weightComparator ) {
+    public SuperVertex( final V source, final G graph, final WeightedEdgesComparator<W, WE> weightComparator ) {
         this.graph = graph;
 
         vertices = new HashSet<V>();
         vertices.add( source );
 
-        orderedEdges = new TreeSet<WE>( new WeightedEdgesComparator<W, WE>( weightComparator ) );
+        orderedEdges = new TreeSet<WE>( weightComparator );
 
         // add all edges for this vertex to the sorted set
         for ( final V w : graph.getConnectedVertices( source )) {
@@ -85,7 +84,7 @@ class SuperVertex<V, W, WE, G extends Gr
      *
      * @param other the {@link SuperVertex} to be merged into this
      */
-    public void merge( final SuperVertex<V, W, WE, G, WC> other ) {
+    public void merge( final SuperVertex<V, W, WE, G> other ) {
         for ( final V v : other.vertices ) {
             vertices.add(v);
         }