Esempio n. 1
0
        public void EdgesAreUnique()
        {
            var graph = new DirectedLabeledGraph <int, char>(1)
                        .Connect(1, 'a', 2)
                        .Connect(1, 'a', 2);

            Assert.AreEqual(1, graph.Edges.Count());
        }
Esempio n. 2
0
 /// <summary>
 /// A helper method to create solution instantiation graphs with the correct equality comparers.
 /// </summary>
 /// <param name="edges"></param>
 /// <returns></returns>
 public static SolutionInstantiationGraph Create(
     params Tuple <ElementInstantiation, ModelEntity.Connector, ElementInstantiation>[] edges)
 {
     return(new SolutionInstantiationGraph(null, DirectedLabeledGraph.Create(
                                               EqualityComparer <ElementInstantiation> .Default,
                                               EqualityComparer <ModelEntity.Connector> .Default,
                                               edges)));
 }
Esempio n. 3
0
        public void AddMultipleOutgoingEdges()
        {
            var graph = new DirectedLabeledGraph <int, char>(1)
                        .Connect(1, 'a', 2)
                        .Connect(1, 'b', 3);

            Assert.AreEqual(3, graph.NodeLabels.Count());
            Assert.IsTrue(graph.Edges.Any(e => e.Item1 == 1 && e.Item2 == 'a' && e.Item3 == 2));
            Assert.IsTrue(graph.Edges.Any(e => e.Item1 == 1 && e.Item2 == 'b' && e.Item3 == 3));
        }
Esempio n. 4
0
        public void CreaeInReversedOrder()
        {
            var graph = new DirectedLabeledGraph <int, char>(1)
                        .Connect(2, 'b', 3)
                        .Connect(1, 'a', 2);

            Assert.AreEqual(3, graph.NodeLabels.Count());
            Assert.IsTrue(graph.Edges.Any(e => e.Item1 == 1 && e.Item2 == 'a' && e.Item3 == 2));
            Assert.IsTrue(graph.Edges.Any(e => e.Item1 == 2 && e.Item2 == 'b' && e.Item3 == 3));
        }
Esempio n. 5
0
 private static DirectedLabeledGraph <ElementInstantiation, ModelEntity.Connector> Merge(
     DirectedLabeledGraph <ModelEntity.Element, ModelEntity.Connector> problemSpace,
     DirectedLabeledGraph <ModelEntity.Element, ModelEntity.Connector> solution)
 {
     return(problemSpace.MapNodeLabels <ElementInstantiation>(problemItem =>
     {
         var instance = solution.NodeLabels.FirstOption(solutionItem => solutionItem.EaObject.ClassifierID == problemItem.Id);
         return new ElementInstantiation(problemItem, instance);
     }));
 }
Esempio n. 6
0
        public void AddConnectionToEmptyGraph()
        {
            var connected = new DirectedLabeledGraph <int, string>(1)
                            .Connect(1, "1to2", 2);

            Assert.IsTrue(connected.NodeLabels.Any(l => l == 1));
            Assert.IsTrue(connected.NodeLabels.Any(l => l == 2));
            Assert.AreEqual(2, connected.NodeLabels.Count());
            Assert.IsTrue(connected.Edges.Any(e => e.Item1 == 1 && e.Item2 == "1to2" && e.Item3 == 2));
            Assert.IsFalse(connected.Edges.Any(e => e.Item1 == 2 && e.Item2 == "1to2" && e.Item3 == 1));
        }
Esempio n. 7
0
        public void DetectLeafs()
        {
            var graph = new DirectedLabeledGraph <int, char>(1)
                        .Connect(1, 'a', 2)
                        .Connect(2, 'b', 3)
                        .Connect(1, 'c', 4);

            Assert.IsFalse(graph.IsLeaf(1));
            Assert.IsFalse(graph.IsLeaf(2));
            Assert.IsTrue(graph.IsLeaf(3));
            Assert.IsTrue(graph.IsLeaf(4));
        }
Esempio n. 8
0
        public void AddCycle()
        {
            var cycle = new DirectedLabeledGraph <int, string>(1)
                        .Connect(1, "1to2", 2)
                        .Connect(2, "2to1", 1);

            Assert.IsTrue(cycle.NodeLabels.Any(l => l == 1));
            Assert.IsTrue(cycle.NodeLabels.Any(l => l == 2));
            Assert.AreEqual(2, cycle.NodeLabels.Count());
            Assert.IsTrue(cycle.Edges.Any(e => e.Item1 == 1 && e.Item2 == "1to2" && e.Item3 == 2));
            Assert.IsTrue(cycle.Edges.Any(e => e.Item1 == 2 && e.Item2 == "2to1" && e.Item3 == 1));
        }
        public void OnceFilter()
        {
            var graph = DirectedLabeledGraph.Create(
                Tuple.Create("1", "a", "2"),
                Tuple.Create("2", "a", "1")
                );

            var expected = LabeledTree.Node("1",
                                            LabeledTree.Edge("a", LabeledTree.Node <string, string>("2")));

            var filter = DirectedLabeledGraph.TraverseEdgeOnlyOnce(EqualityComparer <string> .Default);

            AssertEqual(expected, graph.ToTree(filter));
        }
        public void TransformSimpleGraphToTree()
        {
            var graph = DirectedLabeledGraph.Create(
                Tuple.Create(1, "a", 2),
                Tuple.Create(1, "b", 3),
                Tuple.Create(2, "c", 3)
                );

            var expected = LabeledTree.Node(1,
                                            LabeledTree.Edge("a", LabeledTree.Node(2,
                                                                                   LabeledTree.Edge("c", LabeledTree.Node <int, string>(3)))),
                                            LabeledTree.Edge("b", LabeledTree.Node <int, string>(3)));

            AssertEqual(expected, graph.ToTree());
        }
Esempio n. 11
0
        public void MapNodesInSimpleGraph()
        {
            var graph = new DirectedLabeledGraph <int, char>(1)
                        .Connect(1, 'a', 2)
                        .Connect(2, 'b', 3);

            var calls = 0;

            var mappedGraph = graph.MapNodeLabels((int n) => {
                calls++;
                return(n.ToString());
            });

            Assert.AreEqual(3, calls);
            Assert.IsTrue(mappedGraph.Edges.Any(e => e.Item1 == "1" && e.Item2 == 'a' && e.Item3 == "2"));
            Assert.IsTrue(mappedGraph.Edges.Any(e => e.Item1 == "2" && e.Item2 == 'b' && e.Item3 == "3"));
        }
Esempio n. 12
0
        public void DontFollowCycles()
        {
            var graph = new DirectedLabeledGraph <int, char>(1)
                        .Connect(1, 'a', 2)
                        .Connect(2, 'b', 3);

            var edgeOrder = new List <char>();

            graph.TraverseEdgesBF((source, edge, target) =>
            {
                edgeOrder.Add(edge);
            });

            Assert.AreEqual(2, edgeOrder.Count());
            Assert.IsTrue(edgeOrder.IndexOf('a') >= 0);
            Assert.IsTrue(edgeOrder.IndexOf('b') > edgeOrder.IndexOf('a'));
        }
        public EntityModified Execute(SolutionEntity solutionEntity)
        {
            Repo.SaveAllDiagrams();

            var modified =
                from currentDiagram in GetCurrentDiagramContaining(solutionEntity)
                from solution in SolutionInstantiationGraph.Create(Repo, solutionEntity)
                let solutionTree = solution.Graph.ToTree(DirectedLabeledGraph.TraverseEdgeOnlyOnce <ModelEntity.Connector>())
                                   let preMarkedSolutionTree = SelectRootWithAlternatives(solutionTree)
                                                               from markedSolutionTree in Selector.GetSelectedDependencies(preMarkedSolutionTree)
                                                               let markedSolution = solution.WithSelection(markedSolutionTree.NodeLabels)
                                                                                    let targetPackage = Repo.FindPackageContaining(solutionEntity)
                                                                                                        let instantiatedSolution                                              = markedSolution.InstantiateSelectedItems(targetPackage)
                                                                                                                                                     let _1                   = instantiatedSolution.InstantiateMissingSolutionConnectors()
                                                                                                                                                                       let _2 = instantiatedSolution.CreateDiagramElements(currentDiagram)
                                                                                                                                                                                select EntityModified.Modified;

            return(modified.GetOrElse(EntityModified.NotModified));
        }
Esempio n. 14
0
        public void TraverseSimpleGraph()
        {
            var graph = new DirectedLabeledGraph <int, char>(1)
                        .Connect(1, 'a', 2)
                        .Connect(2, 'b', 4)
                        .Connect(1, 'c', 3)
                        .Connect(3, 'd', 4);

            var edgeOrder = new List <char>();

            graph.TraverseEdgesBF((source, edge, target) =>
            {
                edgeOrder.Add(edge);
            });

            Assert.IsTrue(edgeOrder.IndexOf('a') >= 0);
            Assert.IsTrue(edgeOrder.IndexOf('c') >= 0);
            Assert.IsTrue(edgeOrder.IndexOf('b') > edgeOrder.IndexOf('a'));
            Assert.IsTrue(edgeOrder.IndexOf('d') > edgeOrder.IndexOf('c'));
        }
Esempio n. 15
0
        /// <summary>
        /// Adds diagram objects for every solution item in the graph to <c>diagram</c>.
        /// </summary>
        /// <param name="diagramRepo"></param>
        /// <param name="diagram"></param>
        /// <param name="problemSpace"></param>
        /// <returns></returns>
        public Unit CreateDiagramElements(ModelEntity.Diagram diagram)
        {
            var tree       = Graph.ToTree(DirectedLabeledGraph.TraverseEdgeOnlyOnce <ModelEntity.Connector>());
            var rootObject = diagram.GetObject(tree.Label.Instance.Value).Value;
            var vNull      = Convert.ToInt32(
                rootObject.EaObject.left - ((tree.Leafs() - 1) / 2d) * 120);
            var width  = rootObject.EaObject.right - rootObject.EaObject.left;
            var hNull  = rootObject.EaObject.top;
            var height = rootObject.EaObject.top - rootObject.EaObject.bottom;

            if (vNull < 10)
            {
                vNull = 10;
            }

            Graph.TraverseEdgesBF((from, via, to) =>
            {
                var objectData = from childInstance in to.Instance
                                 where !diagram.GetObject(childInstance).IsDefined
                                 from parentInstance in @from.Instance
                                 from parentObject in diagram.GetObject(parentInstance)
                                 select Tuple.Create(parentObject, childInstance);

                objectData.ForEach((parentObject, childInstance) =>
                {
                    var lhl     = tree.LeftHandLeafs(to);
                    var l       = tree.Leafs(to);
                    var level   = tree.Level(to);
                    var vOffset = Convert.ToInt32(
                        vNull + (lhl + (l - 1) / 2d) * 120);
                    var hOffset = hNull - (150 * level);

                    diagram.AddObject(childInstance.Id,
                                      left: vOffset, right: vOffset + width,
                                      top: hOffset, bottom: hOffset - height);
                });
            });
            Repo.Reload(diagram);

            return(Unit.Instance);
        }
Esempio n. 16
0
        private static DirectedLabeledGraph <ModelEntity.Element, ModelEntity.Connector> Create(
            ModelEntityRepository repo,
            ModelEntity.Element source,
            DirectedLabeledGraph <ModelEntity.Element, ModelEntity.Connector> dependencyGraph,
            Func <ModelEntity.Element, ModelEntity.Connector, ModelEntity.Element, bool> edgeFilter)
        {
            var targets = from connector in source.Connectors
                          from target in connector.OppositeEnd(source, repo.GetElement)
                          where edgeFilter(source, connector, target)
                          select Tuple.Create(source, connector, target);

            return(targets.Aggregate(dependencyGraph, (graph, edge) =>
            {
                var connected = graph.Connect(edge.Item1, edge.Item2, edge.Item3);
                if (graph.NodeLabels.Any(nl => nl.Guid == edge.Item3.Guid))
                {
                    return connected;
                }
                else
                {
                    return Create(repo, edge.Item3, connected, edgeFilter);
                }
            }));
        }
Esempio n. 17
0
 private SolutionInstantiationGraph(ModelEntityRepository repo, DirectedLabeledGraph <ElementInstantiation, ModelEntity.Connector> graph)
 {
     Repo  = repo;
     Graph = graph;
 }