blob: cfd0a4bbe2b3137dc5b5d2b51ce13af0c6f55476 [file] [log] [blame]
Thomas Vachuska24c849c2014-10-27 09:53:05 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2014-present Open Networking Laboratory
Thomas Vachuska24c849c2014-10-27 09:53:05 -07003 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07004 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
Thomas Vachuska24c849c2014-10-27 09:53:05 -07007 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07008 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
Thomas Vachuska24c849c2014-10-27 09:53:05 -070015 */
tome3489412014-08-29 02:30:38 -070016package org.onlab.graph;
17
tome3489412014-08-29 02:30:38 -070018import org.junit.Test;
19
Thomas Vachuska26df2f22014-11-26 13:25:22 -080020import java.text.DecimalFormat;
21import java.util.HashSet;
tome3489412014-08-29 02:30:38 -070022import java.util.Set;
23
tom144de692014-08-29 11:38:44 -070024import static com.google.common.collect.ImmutableSet.of;
tome3489412014-08-29 02:30:38 -070025import static org.junit.Assert.assertEquals;
26
27/**
28 * Test of the Dijkstra algorithm.
29 */
30public class DijkstraGraphSearchTest extends BreadthFirstSearchTest {
31
32 @Override
tom144de692014-08-29 11:38:44 -070033 protected AbstractGraphPathSearch<TestVertex, TestEdge> graphSearch() {
tome3489412014-08-29 02:30:38 -070034 return new DijkstraGraphSearch<>();
35 }
36
37 @Test
38 @Override
tom144de692014-08-29 11:38:44 -070039 public void defaultGraphTest() {
Andrey Komarov2398d962016-09-26 15:11:23 +030040 executeDefaultTest(7, 5, new TestDoubleWeight(5.0));
tome3489412014-08-29 02:30:38 -070041 }
42
43 @Test
tom144de692014-08-29 11:38:44 -070044 @Override
45 public void defaultHopCountWeight() {
Andrey Komarov2398d962016-09-26 15:11:23 +030046 weigher = null;
47 executeDefaultTest(10, 3, new ScalarWeight(3.0));
tome3489412014-08-29 02:30:38 -070048 }
49
50 @Test
51 public void noPath() {
tom0633d682014-09-10 12:10:03 -070052 graph = new AdjacencyListsGraph<>(of(A, B, C, D),
Andrey Komarov2398d962016-09-26 15:11:23 +030053 of(new TestEdge(A, B, W1),
54 new TestEdge(B, A, W1),
55 new TestEdge(C, D, W1),
56 new TestEdge(D, C, W1)));
tome3489412014-08-29 02:30:38 -070057 GraphPathSearch<TestVertex, TestEdge> gs = graphSearch();
Andrey Komarov2398d962016-09-26 15:11:23 +030058 Set<Path<TestVertex, TestEdge>> paths = gs.search(graph, A, B, weigher, 1).paths();
tome3489412014-08-29 02:30:38 -070059 printPaths(paths);
60 assertEquals("incorrect paths count", 1, paths.size());
Andrey Komarov2398d962016-09-26 15:11:23 +030061 assertEquals("incorrect path cost", new TestDoubleWeight(1.0), paths.iterator().next().cost());
tome3489412014-08-29 02:30:38 -070062
Andrey Komarov2398d962016-09-26 15:11:23 +030063 paths = gs.search(graph, A, D, weigher, 1).paths();
tome3489412014-08-29 02:30:38 -070064 printPaths(paths);
65 assertEquals("incorrect paths count", 0, paths.size());
66
Andrey Komarov2398d962016-09-26 15:11:23 +030067 paths = gs.search(graph, A, null, weigher, 1).paths();
tome3489412014-08-29 02:30:38 -070068 printPaths(paths);
69 assertEquals("incorrect paths count", 1, paths.size());
Andrey Komarov2398d962016-09-26 15:11:23 +030070 assertEquals("incorrect path cost", new TestDoubleWeight(1.0), paths.iterator().next().cost());
tome3489412014-08-29 02:30:38 -070071 }
72
73 @Test
tom144de692014-08-29 11:38:44 -070074 public void simpleMultiplePath() {
tom0633d682014-09-10 12:10:03 -070075 graph = new AdjacencyListsGraph<>(of(A, B, C, D),
Andrey Komarov2398d962016-09-26 15:11:23 +030076 of(new TestEdge(A, B, W1),
77 new TestEdge(A, C, W1),
78 new TestEdge(B, D, W1),
79 new TestEdge(C, D, W1)));
80 executeSearch(graphSearch(), graph, A, D, weigher, 2, W2);
81 executeSinglePathSearch(graphSearch(), graph, A, D, weigher, 1, W2);
tome3489412014-08-29 02:30:38 -070082 }
83
84 @Test
tom144de692014-08-29 11:38:44 -070085 public void denseMultiplePath() {
tom0633d682014-09-10 12:10:03 -070086 graph = new AdjacencyListsGraph<>(of(A, B, C, D, E, F, G),
Andrey Komarov2398d962016-09-26 15:11:23 +030087 of(new TestEdge(A, B, W1),
88 new TestEdge(A, C, W1),
89 new TestEdge(B, D, W1),
90 new TestEdge(C, D, W1),
91 new TestEdge(D, E, W1),
92 new TestEdge(D, F, W1),
93 new TestEdge(E, G, W1),
94 new TestEdge(F, G, W1),
95 new TestEdge(A, G, W4)));
96 executeSearch(graphSearch(), graph, A, G, weigher, 5, W4);
97 executeSinglePathSearch(graphSearch(), graph, A, G, weigher, 1, W4);
tome3489412014-08-29 02:30:38 -070098 }
99
100 @Test
tom144de692014-08-29 11:38:44 -0700101 public void dualEdgeMultiplePath() {
tom0633d682014-09-10 12:10:03 -0700102 graph = new AdjacencyListsGraph<>(of(A, B, C, D, E, F, G, H),
Andrey Komarov2398d962016-09-26 15:11:23 +0300103 of(new TestEdge(A, B, W1),
104 new TestEdge(A, C, W3),
105 new TestEdge(B, D, W2),
106 new TestEdge(B, C, W1),
107 new TestEdge(B, E, W4),
108 new TestEdge(C, E, W1),
109 new TestEdge(D, H, W5),
110 new TestEdge(D, E, W1),
111 new TestEdge(E, F, W1),
112 new TestEdge(F, D, W1),
113 new TestEdge(F, G, W1),
114 new TestEdge(F, H, W1),
115 new TestEdge(A, E, W3),
116 new TestEdge(B, D, W1)));
117 executeSearch(graphSearch(), graph, A, E, weigher, 3, W3);
118 executeSinglePathSearch(graphSearch(), graph, A, E, weigher, 1, W3);
tome3489412014-08-29 02:30:38 -0700119 }
120
Thomas Vachuska4d690872014-10-27 08:57:08 -0700121 @Test
122 public void negativeWeights() {
123 graph = new AdjacencyListsGraph<>(of(A, B, C, D, E, F, G),
Andrey Komarov2398d962016-09-26 15:11:23 +0300124 of(new TestEdge(A, B, W1),
125 new TestEdge(A, C, NW1),
126 new TestEdge(B, D, W1),
127 new TestEdge(D, A, NW2),
128 new TestEdge(C, D, W1),
129 new TestEdge(D, E, W1),
130 new TestEdge(D, F, W1),
131 new TestEdge(E, G, W1),
132 new TestEdge(F, G, W1),
133 new TestEdge(G, A, NW5),
134 new TestEdge(A, G, W4)));
135 executeSearch(graphSearch(), graph, A, G, weigher, 3, new TestDoubleWeight(4.0));
136 executeSinglePathSearch(graphSearch(), graph, A, G, weigher, 1, new TestDoubleWeight(4.0));
Thomas Vachuska4d690872014-10-27 08:57:08 -0700137 }
138
Thomas Vachuska26df2f22014-11-26 13:25:22 -0800139 public void disconnectedPerf() {
140 disconnected();
141 disconnected();
142 disconnected();
143 disconnected();
144 disconnected();
145 disconnected();
146 disconnected();
147 disconnected();
148 disconnected();
149 disconnected();
150 }
151
Thomas Vachuska26df2f22014-11-26 13:25:22 -0800152 public void disconnected() {
153 Set<TestVertex> vertexes = new HashSet<>();
154 for (int i = 0; i < 200; i++) {
155 vertexes.add(new TestVertex("v" + i));
156 }
157
158 graph = new AdjacencyListsGraph<>(vertexes, of());
159
160 long start = System.nanoTime();
161 for (TestVertex src : vertexes) {
Andrey Komarov2398d962016-09-26 15:11:23 +0300162 executeSearch(graphSearch(), graph, src, null, null, 0, new TestDoubleWeight(0));
Thomas Vachuska26df2f22014-11-26 13:25:22 -0800163 }
164 long end = System.nanoTime();
165 DecimalFormat fmt = new DecimalFormat("#,###");
166 System.out.println("Compute cost is " + fmt.format(end - start) + " nanos");
167 }
168
tome3489412014-08-29 02:30:38 -0700169}