Пример #1
0
        public void BidirectionalBFSTest_GermanyGraph()
        {
            var g = InitGermanyGraph();

            var Frankfurt = g.Vertices.Single(v => v.UUID.Equals("1"));
            var Muenchen  = g.Vertices.Single(v => v.UUID.Equals("10"));
            var Kassel    = g.Vertices.Single(v => v.UUID.Equals("8"));

            var path = BidirectionalBFS.Search(g, Frankfurt, Muenchen);

            Assert.AreEqual(3, path.Count);
            Assert.AreEqual(Frankfurt, path[0]);
            Assert.AreEqual(Kassel, path[1]);
            Assert.AreEqual(Muenchen, path[2]);
        }
Пример #2
0
        public void BidirectionalBFSTest_GermanyGraph_Matching()
        {
            var g = InitGermanyGraph();

            var Frankfurt = g.Vertices.Single(v => v.UUID.Equals("1"));
            var Muenchen  = g.Vertices.Single(v => v.UUID.Equals("10"));
            var Wuerzburg = g.Vertices.Single(v => v.UUID.Equals("3"));
            var Nuernberg = g.Vertices.Single(v => v.UUID.Equals("7"));

            // search for path that doesnt contain Kassel
            var path = BidirectionalBFS.Search(g, Frankfurt, Muenchen, (v => !v["name"].Equals("Kassel")));

            // Frankfurt -> Wuerzburg -> Nuernberg -> Muenchen
            Assert.AreEqual(4, path.Count);
            Assert.AreEqual(Frankfurt, path[0]);
            Assert.AreEqual(Wuerzburg, path[1]);
            Assert.AreEqual(Nuernberg, path[2]);
            Assert.AreEqual(Muenchen, path[3]);
        }
Пример #3
0
        public void BidirectionalBFSTest_Barabasi_100_Vertices()
        {
            var g = InitGraph(BARABASI_N_100);

            Assert.IsNotNull(g, "loading graph failed");

            var n0  = g.Vertices.Single(v => v.UUID.Equals("n0"));
            var n1  = g.Vertices.Single(v => v.UUID.Equals("n1"));
            var n10 = g.Vertices.Single(v => v.UUID.Equals("n10"));
            var n99 = g.Vertices.Single(v => v.UUID.Equals("n99"));

            Assert.IsNotNull(n0, "source node was null");
            Assert.IsNotNull(n99, "target node was null");

            var path = BidirectionalBFS.Search(g, n0, n99);

            // n0 -> n1 -> n10 -> n99
            Assert.AreEqual(4, path.Count);
            Assert.AreEqual(n0, path[0]);
            Assert.AreEqual(n1, path[1]);
            Assert.AreEqual(n10, path[2]);
            Assert.AreEqual(n99, path[3]);
        }
Пример #4
0
        public override FuncParameter ExecFunc(IAttributeDefinition myAttributeDefinition,
                                               Object myCallingObject,
                                               IVertex myStartVertex,
                                               IGraphDB myGraphDB,
                                               SecurityToken mySecurityToken,
                                               Int64 myTransactionToken,
                                               params FuncParameter[] myParams)
        {
            #region initialize data

            var graph = myGraphDB;


            // The edge we starting of (e.g. Friends)
            var typeAttribute = myAttributeDefinition;

            if (myStartVertex == null)
            {
                throw new InvalidFunctionParameterException("StartVertex", "Vertex that represents the start vertex", "null");
            }

            //set the start node
            var startNode = myStartVertex;

            if ((myParams[0].Value as IEnumerable <IVertex>) == null)
            {
                throw new InvalidFunctionParameterException("TargetVertex", "Set of vertices that represents the target vertices", "null");
            }

            //set the target node
            var targetNode = (myParams[0].Value as IEnumerable <IVertex>).First();


            //set the maximum depth
            UInt64 maxDepth = Convert.ToUInt64(myParams[1].Value);

            //set the maximum path length
            UInt64 maxPathLength = Convert.ToUInt64(myParams[2].Value);

            //mark if only the shortest path should be searched
            bool onlyShortestPath = Convert.ToBoolean(myParams[3].Value);

            //mark if all paths should be searched
            bool allPaths = Convert.ToBoolean(myParams[4].Value);

            if (!onlyShortestPath && !allPaths)
            {
                allPaths = true;
            }

            bool useBidirectionalBFS = false;

            if (myParams.GetLength(0) == 6)
            {
                //mark if the BidirectionalBFS should be used
                useBidirectionalBFS = Convert.ToBoolean(myParams[5].Value);
            }

            var vertexType = myGraphDB.GetVertexType <IVertexType>(mySecurityToken,
                                                                   myTransactionToken,
                                                                   new RequestGetVertexType(startNode.VertexTypeID),
                                                                   (stats, type) => type);

            if (vertexType == null)
            {
                throw new InvalidFunctionParameterException("StartVertexType",
                                                            "VertexType that represents the start vertex type not found",
                                                            startNode.VertexTypeID);
            }
            #endregion

            #region check correctness of parameters

            //check if values are correct
            if (maxDepth < 1)
            {
                throw new InvalidFunctionParameterException("maxDepth", ">= 1", maxDepth.ToString());
            }

            if (maxPathLength < 2)
            {
                throw new InvalidFunctionParameterException("maxPathLength", ">= 2", maxPathLength.ToString());
            }

            #endregion

            #region call graph function

            HashSet <List <Tuple <long, long> > > paths = null;

            //call BFS find methods
            if (useBidirectionalBFS)
            {
                paths = new BidirectionalBFS().Find(typeAttribute,
                                                    vertexType,
                                                    startNode,
                                                    targetNode,
                                                    onlyShortestPath,
                                                    allPaths,
                                                    maxDepth, maxPathLength);
            }
            else
            {
                paths = new BFS().Find(typeAttribute,
                                       vertexType,
                                       startNode,
                                       targetNode,
                                       onlyShortestPath,
                                       allPaths,
                                       maxDepth,
                                       maxPathLength);
            }

            #endregion

            #region create output

            if (paths != null)
            {
                #region create outputted views

                List <List <Tuple <long, long> > .Enumerator> enumerators = new List <List <Tuple <long, long> > .Enumerator>();

                foreach (var path in paths)
                {
                    enumerators.Add(path.GetEnumerator());
                }

                var view = GenerateVertexView(enumerators);

                #endregion

                return(new FuncParameter(view));
            }
            else
            {
                return(new FuncParameter(new VertexView(null, null)));
            }

            #endregion
        }