Author: britter Date: Mon Jan 20 17:54:40 2014 New Revision: 1559792 URL: http://svn.apache.org/r1559792 Log: SANDBOX-349: Verify Prim's and Kruskal's algorithms correctness - applying Rogério Theodoro de Brito's first three patches
Modified: commons/sandbox/graph/trunk/src/test/java/org/apache/commons/graph/spanning/KruskalTestCase.java Modified: commons/sandbox/graph/trunk/src/test/java/org/apache/commons/graph/spanning/KruskalTestCase.java URL: http://svn.apache.org/viewvc/commons/sandbox/graph/trunk/src/test/java/org/apache/commons/graph/spanning/KruskalTestCase.java?rev=1559792&r1=1559791&r2=1559792&view=diff ============================================================================== --- commons/sandbox/graph/trunk/src/test/java/org/apache/commons/graph/spanning/KruskalTestCase.java (original) +++ commons/sandbox/graph/trunk/src/test/java/org/apache/commons/graph/spanning/KruskalTestCase.java Mon Jan 20 17:54:40 2014 @@ -226,4 +226,154 @@ public final class KruskalTestCase assertEquals( expected, actual ); } + /** + * Test the the minimum spanning tree on a path graph with 4 vertices + * and unit weights. + */ + @Test + public void testP4UniformWeightsMinimumSpanningTree() + { + UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>> input + = new UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>>(); + + BaseLabeledVertex a = new BaseLabeledVertex( "A" ); + BaseLabeledVertex b = new BaseLabeledVertex( "B" ); + BaseLabeledVertex c = new BaseLabeledVertex( "C" ); + BaseLabeledVertex d = new BaseLabeledVertex( "D" ); + + + input.addVertex( a ); + input.addVertex( b ); + input.addVertex( c ); + input.addVertex( d ); + + input.addEdge( a, new BaseLabeledWeightedEdge<Double>( "a <-> b", 1D ), b ); + input.addEdge( b, new BaseLabeledWeightedEdge<Double>( "b <-> c", 1D ), c ); + input.addEdge( c, new BaseLabeledWeightedEdge<Double>( "c <-> d", 1D ), d ); + + + // Expected + MutableSpanningTree<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>, Double> expected = + new MutableSpanningTree<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>, Double>( new DoubleWeightBaseOperations(), new BaseWeightedEdge<Double>() ); + + for ( BaseLabeledVertex vertex : input.getVertices() ) + { + expected.addVertex( vertex ); + } + expected.addEdge( a, new BaseLabeledWeightedEdge<Double>( "a <-> b", 1D ), b ); + expected.addEdge( b, new BaseLabeledWeightedEdge<Double>( "b <-> c", 1D ), c ); + expected.addEdge( c, new BaseLabeledWeightedEdge<Double>( "c <-> d", 1D ), d ); + + + // Actual + SpanningTree<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>, Double> actual = + minimumSpanningTree( input ) + .whereEdgesHaveWeights( new BaseWeightedEdge<Double>() ) + .fromArbitrarySource() + .applyingKruskalAlgorithm( new DoubleWeightBaseOperations() ); + + // assert! + assertEquals( expected, actual ); + } + + /** + * Test the algorithm with a disconnected graph on 4 vertices. In this + * case, we expect the Minimum spanning "tree" to actually be a minimum + * spanning forest with 2 components. + */ + @Test + public void testDisconnectedMinimumSpanningTree() + { + UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>> input + = new UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>>(); + + BaseLabeledVertex a = new BaseLabeledVertex( "A" ); + BaseLabeledVertex b = new BaseLabeledVertex( "B" ); + BaseLabeledVertex c = new BaseLabeledVertex( "C" ); + BaseLabeledVertex d = new BaseLabeledVertex( "D" ); + + + input.addVertex( a ); + input.addVertex( b ); + input.addVertex( c ); + input.addVertex( d ); + + input.addEdge( a, new BaseLabeledWeightedEdge<Double>( "a <-> b", 4D ), b ); + input.addEdge( c, new BaseLabeledWeightedEdge<Double>( "c <-> d", 2D ), d ); + + + // Expected + MutableSpanningTree<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>, Double> expected = + new MutableSpanningTree<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>, Double>( new DoubleWeightBaseOperations(), new BaseWeightedEdge<Double>() ); + + for ( BaseLabeledVertex vertex : input.getVertices() ) + { + expected.addVertex( vertex ); + } + expected.addEdge( a, new BaseLabeledWeightedEdge<Double>( "a <-> b", 4D ), b ); + expected.addEdge( c, new BaseLabeledWeightedEdge<Double>( "c <-> d", 2D ), d ); + + + // Actual + SpanningTree<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>, Double> actual = + minimumSpanningTree( input ) + .whereEdgesHaveWeights( new BaseWeightedEdge<Double>() ) + .fromArbitrarySource() + .applyingKruskalAlgorithm( new DoubleWeightBaseOperations() ); + + // assert! + assertEquals( expected, actual ); + } + + /** + * Test the the minimum spanning tree on a path graph with 4 vertices + * and non-uniform weights. + */ + @Test + public void testP4NonUniformWeightsMinimumSpanningTree() + { + UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>> input + = new UndirectedMutableGraph<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>>(); + + BaseLabeledVertex a = new BaseLabeledVertex( "A" ); + BaseLabeledVertex b = new BaseLabeledVertex( "B" ); + BaseLabeledVertex c = new BaseLabeledVertex( "C" ); + BaseLabeledVertex d = new BaseLabeledVertex( "D" ); + + + input.addVertex( a ); + input.addVertex( b ); + input.addVertex( c ); + input.addVertex( d ); + + input.addEdge( a, new BaseLabeledWeightedEdge<Double>( "a <-> b", 4D ), b ); + input.addEdge( b, new BaseLabeledWeightedEdge<Double>( "b <-> c", 3D ), c ); + input.addEdge( c, new BaseLabeledWeightedEdge<Double>( "c <-> d", 2D ), d ); + + + // Expected + MutableSpanningTree<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>, Double> expected = + new MutableSpanningTree<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>, Double>( new DoubleWeightBaseOperations(), new BaseWeightedEdge<Double>() ); + + for ( BaseLabeledVertex vertex : input.getVertices() ) + { + expected.addVertex( vertex ); + } + expected.addEdge( a, new BaseLabeledWeightedEdge<Double>( "a <-> b", 4D ), b ); + expected.addEdge( b, new BaseLabeledWeightedEdge<Double>( "b <-> c", 3D ), c ); + expected.addEdge( c, new BaseLabeledWeightedEdge<Double>( "c <-> d", 2D ), d ); + + + // Actual + SpanningTree<BaseLabeledVertex, BaseLabeledWeightedEdge<Double>, Double> actual = + minimumSpanningTree( input ) + .whereEdgesHaveWeights( new BaseWeightedEdge<Double>() ) + .fromArbitrarySource() + .applyingKruskalAlgorithm( new DoubleWeightBaseOperations() ); + + // assert! + assertEquals( expected, actual ); + } + + }