private void BuildFlockGraph()
        {
            flockGraph = new FlockGraph();

            foreach (long friendUid in FriendsList)
            {
                flockGraph.AddVertex(new FlockVertex(friendUid));
            }

            foreach (KeyValuePair<long, List<long>> kvp in EdgeMap)
            {
                long source = kvp.Key;

                foreach (long target in kvp.Value)
                {
                    //Error at 20%
                    if ((flockGraph.VertexDictionary.ContainsKey(source)) &&
                        (flockGraph.VertexDictionary.ContainsKey(target)))
                        flockGraph.AddEdge(new FlockEdge(flockGraph.VertexDictionary[source],
                            flockGraph.VertexDictionary[target]));
                    else
                        Debug.WriteLine("Edge Dropped");
                }
            }
        }
        public FlockLayoutAgent(string fbToken, long userUid, List<long> friendsList, bool isTestMode)
        {
            FbToken = fbToken;
            UserUid = userUid;
            FriendsList = friendsList;
            IsTestMode = isTestMode;

            EdgeMap = new Dictionary<long, List<long>>();
            FlockPoints = new Dictionary<long, Point>();
            flockGraph = new FlockGraph();
        }
        public void BuildRandomGraph(FlockGraph Graph, int NumberOfVertexes, int NumberOfEdges)
        {
            Random r = new Random(DateTime.Now.Millisecond);

            //Build Vertexes
            for (int i = 0; i < NumberOfVertexes; i++)
            {
                FlockVertex v = new FlockVertex(i);
                Graph.AddVertex(v);
            }

            //Build Edges
            double vc = Graph.VertexCount;
            int flock1 = (int)Math.Round(vc / 3);
            int flock2 = flock1 * 2;
            int flock3 = Graph.VertexCount - 1;

            int flocks = (int)Math.Round((double)(NumberOfEdges / 3));

            FlockVertex s = Graph.Vertices.ElementAt(1);
            FlockVertex t = Graph.Vertices.ElementAt(flock2);
            Graph.AddEdge(new FlockEdge(s, t));

            s = Graph.Vertices.ElementAt(flock2);
            t = Graph.Vertices.ElementAt(flock3);
            Graph.AddEdge(new FlockEdge(s, t));

            for (int i = 0; i < flocks; i++)
            {
                FlockVertex source = Graph.Vertices.ElementAt(r.Next(1, flock1));
                FlockVertex target = Graph.Vertices.ElementAt(r.Next(1, flock1));
                Graph.AddEdge(new FlockEdge(source, target));
            }

            for (int i = 0; i < flocks; i++)
            {
                FlockVertex source = Graph.Vertices.ElementAt(r.Next(flock1, flock2));
                FlockVertex target = Graph.Vertices.ElementAt(r.Next(flock1, flock2));

                Graph.AddEdge(new FlockEdge(source, target));
            }

            for (int i = 0; i < flocks; i++)
            {
                FlockVertex source = Graph.Vertices.ElementAt(r.Next(flock2, flock3));
                FlockVertex target = Graph.Vertices.ElementAt(r.Next(flock2, flock3));

                Graph.AddEdge(new FlockEdge(source, target));
            }
        }
 /// <summary>
 /// Computes XY Layout of Graph.
 /// <remarks>
 /// Layout algorithms only support bidirected, 
 /// so class packs/unpack from undirected to directed
 /// </remarks>
 /// </summary>
 /// <param name="graph">Graph to Compute Vertex.X/Y Points</param>
 /// <returns></returns>
 public FlockLayout(FlockGraph Graph, BackgroundWorker Worker)
 {
     this.Graph = Graph;
     this.Worker = Worker;
 }
        //Done
        private FlockGraphDirected ToDirected(FlockGraph Graph)
        {
            FlockGraphDirected directed = new FlockGraphDirected();

            foreach (FlockVertex v in Graph.VertexDictionary.Values)
            {
                directed.AddVertex(v);
            }

            foreach (FlockEdge e in Graph.Edges)
            {
                directed.AddEdge(e);
            }

            return directed;
        }
 //public void GetGridLayout(FlockGraph Graph)
 //{
 //    Log.Start("GetGridLayout", string.Format(":{0}", Graph));
 //    int side;
 //    double dSide = Math.Sqrt(Graph.VertexCount);
 //    if (dSide == Math.Floor(dSide))
 //        side = Convert.ToInt32(Math.Floor(dSide));
 //    else
 //        side = Convert.ToInt32(Math.Floor(dSide)) + 1;
 //    Queue<FlockVertex> VertexQ = new Queue<FlockVertex>();
 //    for (int i = 0; i < Graph.VertexCount; i++)
 //    {
 //        VertexQ.Enqueue(Graph.Vertices.ElementAt(i));
 //    }
 //    for (int l = 0; l < side; l++)
 //    {
 //        for (int t = 0; t < side; t++)
 //        {
 //            if (VertexQ.Count == 0)
 //                return;
 //            FlockVertex v = VertexQ.Dequeue();
 //            v.GridPoint = new Point(t * 61, l * 61);
 //        }
 //    }
 //}
 //Requires Background Worker
 public void GetFlockLayout(FlockGraph Graph, BackgroundWorker Worker)
 {
     FlockLayout layout = new FlockLayout(Graph, Worker);
     layout.Run();
 }