public void TestVerifiedContraction5KeepPrevious() { var graph = new DirectedGraph <CHEdgeData>(); var witnessCalculator = new DykstraWitnessCalculator(); var preProcessor = new CHPreProcessor(graph, new EdgeDifferenceContractedSearchSpace(graph, witnessCalculator), witnessCalculator); var vertex1 = graph.AddVertex(1, 0); var vertex2 = graph.AddVertex(2, 0); var vertex3 = graph.AddVertex(3, 0); var vertex4 = graph.AddVertex(4, 0); graph.AddEdge(vertex1, vertex3, new CHEdgeData(1, true, true, true, 10)); graph.AddEdge(vertex3, vertex1, new CHEdgeData(1, false, true, true, 10)); graph.AddEdge(vertex2, vertex3, new CHEdgeData(1, true, true, true, 10)); graph.AddEdge(vertex3, vertex2, new CHEdgeData(1, false, true, true, 10)); preProcessor.Contract(3); Assert.IsTrue(graph.ContainsEdge(vertex1, vertex2, new CHEdgeData(3, true, true, 20))); Assert.IsTrue(graph.ContainsEdge(vertex2, vertex1, new CHEdgeData(3, true, true, 20))); graph.AddEdge(vertex1, vertex4, new CHEdgeData(1, true, true, true, 15)); graph.AddEdge(vertex4, vertex1, new CHEdgeData(1, false, true, true, 15)); graph.AddEdge(vertex2, vertex4, new CHEdgeData(1, true, true, true, 15)); graph.AddEdge(vertex4, vertex2, new CHEdgeData(1, false, true, true, 15)); preProcessor.Contract(4); Assert.IsTrue(graph.ContainsEdge(vertex1, vertex2, new CHEdgeData(3, true, true, 20))); Assert.IsTrue(graph.ContainsEdge(vertex2, vertex1, new CHEdgeData(3, true, true, 20))); }
/// <summary> /// Code for when solve is clicked /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void uxSolve_Click(object sender, EventArgs e) { _graph = new DirectedGraph <Cell, int>(); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { for (int k = 0; k < 9; k++) { if (!_lookup[i, j].Equals(_lookup[i, k]) && !_graph.ContainsEdge(_lookup[i, j], _lookup[i, k])) { _graph.AddEdge(_lookup[i, j], _lookup[i, k], 0); if (_lookup[i, k].Value != -1) { _lookup[i, j].RemoveMove(_lookup[i, k].Value); } } if (!_lookup[i, j].Equals(_lookup[k, j]) && !_graph.ContainsEdge(_lookup[i, j], _lookup[k, j])) { _graph.AddEdge(_lookup[i, j], _lookup[k, j], 0); if (_lookup[k, j].Value != -1) { _lookup[i, j].RemoveMove(_lookup[k, j].Value); } } for (int l = 0; l < 9; l++) { if ((i / 3) == (k / 3) && (j / 3) == (l / 3)) { if (!_lookup[i, j].Equals(_lookup[k, l]) && !_graph.ContainsEdge(_lookup[i, j], _lookup[k, l])) { _graph.AddEdge(_lookup[i, j], _lookup[k, l], 0); if (_lookup[k, l].Value != -1) { _lookup[i, j].RemoveMove(_lookup[k, l].Value); } } } } } } } if (!SolveSudoku(EmptyCell(), null)) { MessageBox.Show("There is no solution to this puzzle"); } for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { uxGrid.Rows[i].Cells[j].Value = _lookup[i, j].Value; } } }
public void TestContainsEdgeToNonExistingVertex() { const int Vertex1 = 0; const int Vertex2 = 1; var sut = new DirectedGraph <int>(); Check.ThatCode(() => sut.ContainsEdge(Vertex1, Vertex2)).Throws <ArgumentException>(); sut.AddVertex(Vertex1); Check.ThatCode(() => sut.ContainsEdge(Vertex1, Vertex2)).Throws <ArgumentException>(); Check.ThatCode(() => sut.ContainsEdge(Vertex2, Vertex1)).Throws <ArgumentException>(); }
public void TestEdgeAdd() { var graph = new DirectedGraph <string>(); var v1 = "One"; var v2 = "Two"; var actual1 = graph.ContainsEdge(v1, v2); Assert.AreEqual(false, actual1); graph.AddEdge(v1, v2); var actual2 = graph.ContainsEdge(v1, v2); Assert.AreEqual(true, actual2); }
public void TestDFindOneEdge() { DirectedGraph <int, string> g = new DirectedGraph <int, string>(); g.AddEdge(1, 2, "three"); Assert.That(g.ContainsEdge(1, 2), Is.True); }
public void TestAddContainsEdge() { const int Vertex1 = 0; const int Vertex2 = 1; var sut = new DirectedGraph <int>(); sut.AddVertex(Vertex1); sut.AddVertex(Vertex2); Check.That(sut.ContainsEdge(Vertex1, Vertex2)).IsFalse(); Check.That(sut.AddEdge(Vertex1, Vertex2)).IsTrue(); Check.That(sut.ContainsEdge(Vertex1, Vertex2)).IsTrue(); }
public void CommandifiedGraphAddRemoveVertexWithUndoTest() { Guid sessionId = Guid.NewGuid(); CQManager.ActivateCommandQueueStack(sessionId); DirectedGraph <int, DirectedEdge <int> > graph = new DirectedGraph <int, DirectedEdge <int> >(true); graph.Add(42); Assert.IsTrue(graph.Contains(42)); CQManager.UndoLastCommand(); Assert.IsFalse(graph.Contains(42)); Assert.AreEqual(0, graph.VertexCount); graph.Add(42); graph.Add(13); graph.Add(10); Assert.IsTrue(graph.Contains(42)); Assert.IsTrue(graph.Contains(13)); Assert.IsTrue(graph.Contains(10)); graph.Add(new DirectedEdge <int>(42, 13)); // 42 -> 13 graph.Add(new DirectedEdge <int>(42, 10)); // 42 -> 10 Assert.AreEqual(2, graph.EdgeCount); Assert.IsTrue(graph.ContainsEdge(42, 13)); Assert.IsTrue(graph.ContainsEdge(42, 10)); graph.Remove(42); Assert.IsFalse(graph.Contains(42)); Assert.AreEqual(0, graph.EdgeCount); Assert.AreEqual(2, graph.VertexCount); // undo removal of 42. This should re-add 42, but also re-add the edges CQManager.UndoLastCommand(); Assert.AreEqual(2, graph.EdgeCount); Assert.IsTrue(graph.ContainsEdge(42, 13)); Assert.IsTrue(graph.ContainsEdge(42, 10)); Assert.IsTrue(graph.Contains(42)); CQManager.ActivateCommandQueueStack(Guid.Empty); }
public void RandomTransitiveClosureAndCompositionTest() { for (int i = 0; i < RandomTests; i++) { DirectedGraph <int, DirectedEdge <int> > graph = GenerateRandomIntegerDirectedGraph(MaxDirectedGraphSize); DirectedGraph <int, DirectedEdge <int> > composed = DirectedGraph <int, DirectedEdge <int> > .Compose(graph, graph, (a, b) => new DirectedEdge <int>(a, b)); DirectedGraph <int, DirectedEdge <int> > closure = graph.TransitiveClosure(); foreach (Edge <int> edge in composed.Edges) { Assert.IsTrue(closure.ContainsEdge(edge.StartVertex, edge.EndVertex), "Failure on run " + i.ToString() + " based on seed " + _seed.ToString() + "."); } } }
public void TransitiveClosureCyclicTest() { DirectedGraph <int, DirectedEdge <int> > g = new DirectedGraph <int, DirectedEdge <int> >((a, b) => new DirectedEdge <int>(a, b)); g.Add(new DirectedEdge <int>(1, 2)); g.Add(new DirectedEdge <int>(2, 3)); g.Add(new DirectedEdge <int>(3, 1)); DirectedGraph <int, DirectedEdge <int> > h = g.TransitiveClosure(); Assert.AreEqual(3, h.VertexCount); Assert.AreEqual(9, h.EdgeCount); Assert.IsTrue(h.ContainsEdge(1, 2)); Assert.IsTrue(h.ContainsEdge(2, 3)); Assert.IsTrue(h.ContainsEdge(3, 1)); Assert.IsTrue(h.ContainsEdge(1, 3)); Assert.IsTrue(h.ContainsEdge(1, 1)); Assert.IsTrue(h.ContainsEdge(2, 1)); Assert.IsTrue(h.ContainsEdge(2, 2)); Assert.IsTrue(h.ContainsEdge(3, 2)); Assert.IsTrue(h.ContainsEdge(3, 3)); }
public void TransitiveClosureCyclicTest() { var g = new DirectedGraph <int, DirectedEdge <int> >((a, b) => new DirectedEdge <int>(a, b), isCommandified: false, isSynchronized: true); g.Add(new DirectedEdge <int>(1, 2)); g.Add(new DirectedEdge <int>(2, 3)); g.Add(new DirectedEdge <int>(3, 1)); DirectedGraph <int, DirectedEdge <int> > h = g.TransitiveClosure(); Assert.AreEqual(3, h.VertexCount); Assert.AreEqual(9, h.EdgeCount); Assert.IsTrue(h.ContainsEdge(1, 2)); Assert.IsTrue(h.ContainsEdge(2, 3)); Assert.IsTrue(h.ContainsEdge(3, 1)); Assert.IsTrue(h.ContainsEdge(1, 3)); Assert.IsTrue(h.ContainsEdge(1, 1)); Assert.IsTrue(h.ContainsEdge(2, 1)); Assert.IsTrue(h.ContainsEdge(2, 2)); Assert.IsTrue(h.ContainsEdge(3, 2)); Assert.IsTrue(h.ContainsEdge(3, 3)); }
/// <summary> /// Generates a random integer graph of maxSize size. Size here denotes the amount of edges, nodes may be up to /// twice that amount. /// </summary> /// <param name="maxSize">The maximum amount of edges the graph contains.</param> /// <returns>The randomly generated graph.</returns> private DirectedGraph <int, DirectedEdge <int> > GenerateRandomIntegerDirectedGraph(int maxSize) { int size = _random.Next(maxSize); // create an integer graph and set the edge producer func DirectedGraph <int, DirectedEdge <int> > graph = new DirectedGraph <int, DirectedEdge <int> >((a, b) => new DirectedEdge <int>(a, b)); for (int i = 0; i < size;) { int startNode = _random.Next(maxSize); int endNode = _random.Next(maxSize); if (!graph.ContainsEdge(startNode, endNode)) { graph.Add(startNode); graph.Add(endNode); graph.Add(new DirectedEdge <int>(startNode, endNode)); i++; } } return(graph); }
public void TransitiveClosureBasicTest() { // create an integer graph and set the edge producer func DirectedGraph <int, DirectedEdge <int> > g = new DirectedGraph <int, DirectedEdge <int> >((a, b) => new DirectedEdge <int>(a, b)); DirectedEdge <int> toAdd = new DirectedEdge <int>(1, 2); g.Add(toAdd); Assert.IsTrue(g.Contains(toAdd)); g.Add(new DirectedEdge <int>(2, 3)); g.Add(new DirectedEdge <int>(3, 4)); DirectedGraph <int, DirectedEdge <int> > h = g.TransitiveClosure(); Assert.IsTrue(h.VertexCount == 4); Assert.IsTrue(h.EdgeCount == 6); Assert.IsTrue(h.ContainsEdge(1, 2)); Assert.IsTrue(h.ContainsEdge(2, 3)); Assert.IsTrue(h.ContainsEdge(3, 4)); Assert.IsTrue(h.ContainsEdge(1, 3)); Assert.IsTrue(h.ContainsEdge(1, 4)); Assert.IsTrue(h.ContainsEdge(2, 4)); }
public void CommandifiedGraphAddRemoveGraphAndEdgesWithUndoTest() { Guid sessionId = Guid.NewGuid(); CQManager.ActivateCommandQueueStack(sessionId); DirectedGraph <int, DirectedEdge <int> > graph = new DirectedGraph <int, DirectedEdge <int> >(true); graph.Add(42); graph.Add(13); graph.Add(10); graph.Add(new DirectedEdge <int>(42, 13)); // 42 -> 13 graph.Add(new DirectedEdge <int>(42, 10)); // 42 -> 10 Assert.IsTrue(graph.Contains(42)); Assert.IsTrue(graph.Contains(13)); Assert.IsTrue(graph.Contains(10)); Assert.AreEqual(2, graph.EdgeCount); Assert.IsTrue(graph.ContainsEdge(42, 13)); Assert.IsTrue(graph.ContainsEdge(42, 10)); // create graph to add to this graph. Doesn't have to be a commandified graph, as we're not rolling back the actions on that graph. DirectedGraph <int, DirectedEdge <int> > graphToAdd = new DirectedGraph <int, DirectedEdge <int> >(); graphToAdd.Add(1); graphToAdd.Add(2); graphToAdd.Add(3); graphToAdd.Add(new DirectedEdge <int>(1, 2)); // 1 -> 2 graphToAdd.Add(new DirectedEdge <int>(1, 3)); // 1 -> 3 graphToAdd.Add(new DirectedEdge <int>(2, 3)); // 2 -> 3 Assert.AreEqual(3, graphToAdd.VertexCount); Assert.AreEqual(3, graphToAdd.EdgeCount); // add this graph to the main graph. This is an undoable action. graph.Add(graphToAdd); Assert.AreEqual(6, graph.VertexCount); Assert.AreEqual(5, graph.EdgeCount); Assert.IsTrue(graph.Contains(1)); Assert.IsTrue(graph.Contains(2)); Assert.IsTrue(graph.Contains(3)); Assert.IsTrue(graph.ContainsEdge(1, 2)); Assert.IsTrue(graph.ContainsEdge(1, 3)); Assert.IsTrue(graph.ContainsEdge(2, 3)); // undo add CQManager.UndoLastCommand(); Assert.AreEqual(3, graph.VertexCount); Assert.AreEqual(2, graph.EdgeCount); Assert.IsFalse(graph.Contains(1)); Assert.IsFalse(graph.Contains(2)); Assert.IsFalse(graph.Contains(3)); Assert.IsFalse(graph.ContainsEdge(1, 2)); Assert.IsFalse(graph.ContainsEdge(1, 3)); Assert.IsFalse(graph.ContainsEdge(2, 3)); // redo CQManager.RedoLastCommand(); Assert.AreEqual(6, graph.VertexCount); Assert.AreEqual(5, graph.EdgeCount); Assert.IsTrue(graph.Contains(1)); Assert.IsTrue(graph.Contains(2)); Assert.IsTrue(graph.Contains(3)); Assert.IsTrue(graph.ContainsEdge(1, 2)); Assert.IsTrue(graph.ContainsEdge(1, 3)); Assert.IsTrue(graph.ContainsEdge(2, 3)); // remove the graph we added graph.Remove(graphToAdd); Assert.AreEqual(3, graph.VertexCount); Assert.AreEqual(2, graph.EdgeCount); Assert.IsFalse(graph.Contains(1)); Assert.IsFalse(graph.Contains(2)); Assert.IsFalse(graph.Contains(3)); Assert.IsFalse(graph.ContainsEdge(1, 2)); Assert.IsFalse(graph.ContainsEdge(1, 3)); Assert.IsFalse(graph.ContainsEdge(2, 3)); CQManager.UndoLastCommand(); Assert.AreEqual(6, graph.VertexCount); Assert.AreEqual(5, graph.EdgeCount); Assert.IsTrue(graph.Contains(1)); Assert.IsTrue(graph.Contains(2)); Assert.IsTrue(graph.Contains(3)); Assert.IsTrue(graph.ContainsEdge(1, 2)); Assert.IsTrue(graph.ContainsEdge(1, 3)); Assert.IsTrue(graph.ContainsEdge(2, 3)); DirectedEdge <int> newEdge = new DirectedEdge <int>(42, 1); // 42 -> 1 graph.Add(newEdge); Assert.AreEqual(6, graph.EdgeCount); Assert.IsTrue(graph.ContainsEdge(42, 1)); Assert.IsFalse(graph.ContainsEdge(1, 42)); CQManager.UndoLastCommand(); Assert.AreEqual(5, graph.EdgeCount); Assert.IsFalse(graph.ContainsEdge(42, 1)); CQManager.RedoLastCommand(); Assert.AreEqual(6, graph.EdgeCount); Assert.IsTrue(graph.ContainsEdge(42, 1)); graph.Remove(newEdge); Assert.AreEqual(5, graph.EdgeCount); Assert.IsFalse(graph.ContainsEdge(42, 1)); CQManager.UndoLastCommand(); Assert.AreEqual(6, graph.EdgeCount); Assert.IsTrue(graph.ContainsEdge(42, 1)); graph.Disconnect(42, 1, false); Assert.AreEqual(5, graph.EdgeCount); Assert.IsFalse(graph.ContainsEdge(42, 1)); CQManager.UndoLastCommand(); Assert.AreEqual(6, graph.EdgeCount); Assert.IsTrue(graph.ContainsEdge(42, 1)); CQManager.ActivateCommandQueueStack(Guid.Empty); }
public void CommandifiedGraphAddRemoveVertexWithUndoTest() { Guid sessionId = Guid.NewGuid(); CQManager.ActivateCommandQueueStack(sessionId); DirectedGraph<int, DirectedEdge<int>> graph = new DirectedGraph<int, DirectedEdge<int>>(true); graph.Add(42); Assert.IsTrue(graph.Contains(42)); CQManager.UndoLastCommand(); Assert.IsFalse(graph.Contains(42)); Assert.AreEqual(0, graph.VertexCount); graph.Add(42); graph.Add(13); graph.Add(10); Assert.IsTrue(graph.Contains(42)); Assert.IsTrue(graph.Contains(13)); Assert.IsTrue(graph.Contains(10)); graph.Add(new DirectedEdge<int>(42, 13)); // 42 -> 13 graph.Add(new DirectedEdge<int>(42, 10)); // 42 -> 10 Assert.AreEqual(2, graph.EdgeCount); Assert.IsTrue(graph.ContainsEdge(42, 13)); Assert.IsTrue(graph.ContainsEdge(42, 10)); graph.Remove(42); Assert.IsFalse(graph.Contains(42)); Assert.AreEqual(0, graph.EdgeCount); Assert.AreEqual(2, graph.VertexCount); // undo removal of 42. This should re-add 42, but also re-add the edges CQManager.UndoLastCommand(); Assert.AreEqual(2, graph.EdgeCount); Assert.IsTrue(graph.ContainsEdge(42, 13)); Assert.IsTrue(graph.ContainsEdge(42, 10)); Assert.IsTrue(graph.Contains(42)); CQManager.ActivateCommandQueueStack(Guid.Empty); }
public void CommandifiedGraphAddRemoveGraphAndEdgesWithUndoTest() { Guid sessionId = Guid.NewGuid(); CQManager.ActivateCommandQueueStack(sessionId); DirectedGraph<int, DirectedEdge<int>> graph = new DirectedGraph<int, DirectedEdge<int>>(true); graph.Add(42); graph.Add(13); graph.Add(10); graph.Add(new DirectedEdge<int>(42, 13)); // 42 -> 13 graph.Add(new DirectedEdge<int>(42, 10)); // 42 -> 10 Assert.IsTrue(graph.Contains(42)); Assert.IsTrue(graph.Contains(13)); Assert.IsTrue(graph.Contains(10)); Assert.AreEqual(2, graph.EdgeCount); Assert.IsTrue(graph.ContainsEdge(42, 13)); Assert.IsTrue(graph.ContainsEdge(42, 10)); // create graph to add to this graph. Doesn't have to be a commandified graph, as we're not rolling back the actions on that graph. DirectedGraph<int, DirectedEdge<int>> graphToAdd = new DirectedGraph<int, DirectedEdge<int>>(); graphToAdd.Add(1); graphToAdd.Add(2); graphToAdd.Add(3); graphToAdd.Add(new DirectedEdge<int>(1, 2)); // 1 -> 2 graphToAdd.Add(new DirectedEdge<int>(1, 3)); // 1 -> 3 graphToAdd.Add(new DirectedEdge<int>(2, 3)); // 2 -> 3 Assert.AreEqual(3, graphToAdd.VertexCount); Assert.AreEqual(3, graphToAdd.EdgeCount); // add this graph to the main graph. This is an undoable action. graph.Add(graphToAdd); Assert.AreEqual(6, graph.VertexCount); Assert.AreEqual(5, graph.EdgeCount); Assert.IsTrue(graph.Contains(1)); Assert.IsTrue(graph.Contains(2)); Assert.IsTrue(graph.Contains(3)); Assert.IsTrue(graph.ContainsEdge(1, 2)); Assert.IsTrue(graph.ContainsEdge(1, 3)); Assert.IsTrue(graph.ContainsEdge(2, 3)); // undo add CQManager.UndoLastCommand(); Assert.AreEqual(3, graph.VertexCount); Assert.AreEqual(2, graph.EdgeCount); Assert.IsFalse(graph.Contains(1)); Assert.IsFalse(graph.Contains(2)); Assert.IsFalse(graph.Contains(3)); Assert.IsFalse(graph.ContainsEdge(1, 2)); Assert.IsFalse(graph.ContainsEdge(1, 3)); Assert.IsFalse(graph.ContainsEdge(2, 3)); // redo CQManager.RedoLastCommand(); Assert.AreEqual(6, graph.VertexCount); Assert.AreEqual(5, graph.EdgeCount); Assert.IsTrue(graph.Contains(1)); Assert.IsTrue(graph.Contains(2)); Assert.IsTrue(graph.Contains(3)); Assert.IsTrue(graph.ContainsEdge(1, 2)); Assert.IsTrue(graph.ContainsEdge(1, 3)); Assert.IsTrue(graph.ContainsEdge(2, 3)); // remove the graph we added graph.Remove(graphToAdd); Assert.AreEqual(3, graph.VertexCount); Assert.AreEqual(2, graph.EdgeCount); Assert.IsFalse(graph.Contains(1)); Assert.IsFalse(graph.Contains(2)); Assert.IsFalse(graph.Contains(3)); Assert.IsFalse(graph.ContainsEdge(1, 2)); Assert.IsFalse(graph.ContainsEdge(1, 3)); Assert.IsFalse(graph.ContainsEdge(2, 3)); CQManager.UndoLastCommand(); Assert.AreEqual(6, graph.VertexCount); Assert.AreEqual(5, graph.EdgeCount); Assert.IsTrue(graph.Contains(1)); Assert.IsTrue(graph.Contains(2)); Assert.IsTrue(graph.Contains(3)); Assert.IsTrue(graph.ContainsEdge(1, 2)); Assert.IsTrue(graph.ContainsEdge(1, 3)); Assert.IsTrue(graph.ContainsEdge(2, 3)); DirectedEdge<int> newEdge = new DirectedEdge<int>(42, 1); // 42 -> 1 graph.Add(newEdge); Assert.AreEqual(6, graph.EdgeCount); Assert.IsTrue(graph.ContainsEdge(42, 1)); Assert.IsFalse(graph.ContainsEdge(1, 42)); CQManager.UndoLastCommand(); Assert.AreEqual(5, graph.EdgeCount); Assert.IsFalse(graph.ContainsEdge(42, 1)); CQManager.RedoLastCommand(); Assert.AreEqual(6, graph.EdgeCount); Assert.IsTrue(graph.ContainsEdge(42, 1)); graph.Remove(newEdge); Assert.AreEqual(5, graph.EdgeCount); Assert.IsFalse(graph.ContainsEdge(42, 1)); CQManager.UndoLastCommand(); Assert.AreEqual(6, graph.EdgeCount); Assert.IsTrue(graph.ContainsEdge(42, 1)); graph.Disconnect(42, 1, false); Assert.AreEqual(5, graph.EdgeCount); Assert.IsFalse(graph.ContainsEdge(42, 1)); CQManager.UndoLastCommand(); Assert.AreEqual(6, graph.EdgeCount); Assert.IsTrue(graph.ContainsEdge(42, 1)); CQManager.ActivateCommandQueueStack(Guid.Empty); }
public bool ContainsEdge(Region nodeFrom, Region nodeTo) { return(graph.ContainsEdge(nodeTo, nodeFrom)); }
public void TestVerifiedContraction6DuplicateForward() { var graph = new DirectedGraph<CHEdgeData>(); var witnessCalculator = new DykstraWitnessCalculator(); var preProcessor = new CHPreprocessor(graph, new EdgeDifferenceContractedSearchSpace(graph, witnessCalculator), witnessCalculator); var vertex1 = graph.AddVertex(1, 0); var vertex2 = graph.AddVertex(2, 0); var vertex3 = graph.AddVertex(3, 0); var vertex4 = graph.AddVertex(4, 0); graph.AddEdge(vertex1, vertex3, new CHEdgeData(1, true, false, true, 10)); graph.AddEdge(vertex3, vertex1, new CHEdgeData(1, false, true, false, 10)); graph.AddEdge(vertex2, vertex3, new CHEdgeData(1, true, true, false, 10)); graph.AddEdge(vertex3, vertex2, new CHEdgeData(1, false, false, true, 10)); graph.AddEdge(vertex1, vertex4, new CHEdgeData(1, true, true, false, 15)); graph.AddEdge(vertex4, vertex1, new CHEdgeData(1, false, false, true, 15)); graph.AddEdge(vertex2, vertex4, new CHEdgeData(1, true, false, true, 15)); graph.AddEdge(vertex4, vertex2, new CHEdgeData(1, false, true, false, 15)); preProcessor.Contract(3); Assert.IsTrue(graph.ContainsEdge(vertex1, vertex2, new CHEdgeData(3, false, true, 20))); Assert.IsTrue(graph.ContainsEdge(vertex2, vertex1, new CHEdgeData(3, true, false, 20))); preProcessor.Contract(4); Assert.IsTrue(graph.ContainsEdge(vertex1, vertex2, new CHEdgeData(4, true, false, 30))); Assert.IsTrue(graph.ContainsEdge(vertex2, vertex1, new CHEdgeData(4, false, true, 30))); Assert.IsTrue(graph.ContainsEdge(vertex1, vertex2, new CHEdgeData(3, false, true, 20))); Assert.IsTrue(graph.ContainsEdge(vertex2, vertex1, new CHEdgeData(3, true, false, 20))); }
public void TestVerifiedContraction4ReplacePrevious() { var graph = new DirectedGraph<CHEdgeData>(); var vertex1 = graph.AddVertex(1, 0); var vertex2 = graph.AddVertex(2, 0); var vertex3 = graph.AddVertex(3, 0); var vertex4 = graph.AddVertex(4, 0); graph.AddEdge(vertex1, vertex4, new CHEdgeData(1, true, true, true, 15)); graph.AddEdge(vertex4, vertex1, new CHEdgeData(1, false, true, true, 15)); graph.AddEdge(vertex2, vertex4, new CHEdgeData(1, true, true, true, 15)); graph.AddEdge(vertex4, vertex2, new CHEdgeData(1, false, true, true, 15)); var witnessCalculator = new DykstraWitnessCalculator(); var preProcessor = new CHPreprocessor(graph, new EdgeDifferenceContractedSearchSpace(graph, witnessCalculator), witnessCalculator); preProcessor.Contract(4); Assert.IsTrue(graph.ContainsEdge(vertex1, vertex2, new CHEdgeData(4, true, true, 30))); Assert.IsTrue(graph.ContainsEdge(vertex2, vertex1, new CHEdgeData(4, true, true, 30))); // add edges later to prevent witnesses from being found! graph.AddEdge(vertex1, vertex3, new CHEdgeData(1, true, true, true, 10)); graph.AddEdge(vertex3, vertex1, new CHEdgeData(1, false, true, true, 10)); graph.AddEdge(vertex2, vertex3, new CHEdgeData(1, true, true, true, 10)); graph.AddEdge(vertex3, vertex2, new CHEdgeData(1, false, true, true, 10)); preProcessor.Contract(3); Assert.IsTrue(graph.ContainsEdge(vertex1, vertex2, new CHEdgeData(3, true, true, 20))); Assert.IsTrue(graph.ContainsEdge(vertex2, vertex1, new CHEdgeData(3, true, true, 20))); }