public GWEdge <NodeData, EdgeData, GraphData> CreateEdge(GWNode <NodeData, EdgeData, GraphData> foot, GWNode <NodeData, EdgeData, GraphData> head) { var newEdge = new GWEdge <NodeData, EdgeData, GraphData>(foot, head); foot.AddOutEdge(newEdge); head.AddInEdge(newEdge); edges.Add(newEdge); return(newEdge); }
internal void AddInEdge(GWEdge <NodeData, EdgeData, GraphData> edge) { switch (Graph.GraphStyle) { case GraphStyle.Directed: inEdges.Add(edge); parents.Add(edge.Foot); break; case GraphStyle.Undirected: edges.Add(edge); neighbours.Add(edge.Foot); break; default: break; } }
internal void AddOutEdge(GWEdge <NodeData, EdgeData, GraphData> edge) { switch (Graph.GraphStyle) { case GraphStyle.Directed: outEdges.AddLast(edge); children.Add(edge.Head); break; case GraphStyle.Undirected: edges.Add(edge); neighbours.Add(edge.Head); break; default: break; } }
public GWGraph <SGLNodeData, SGLEdgeData, SGLGraphData> CreateGraph(ErdösGraphCreationParameter parameter) { GWGraph <SGLNodeData, SGLEdgeData, SGLGraphData> graph = new GWGraph <SGLNodeData, SGLEdgeData, SGLGraphData>(); graph.Data = new SGLGraphData(); graph.Data.NumberCategories = parameter.NumberCategories; for (int i = 0; i < parameter.NumberNodes; i++) { graph.CreateNode(); } //put each node in category s.t. no empty categories bool hasEmptyCategory = true; while (hasEmptyCategory) { List <int> categoriesUsed = new List <int>(); for (int i = 0; i < parameter.NumberCategories; i++) { categoriesUsed.Add(i); } foreach (var node in graph.Nodes) { node.Data = new SGLNodeData(); //put node in random category var category = random.Next(parameter.NumberCategories); node.Data.Category = category; categoriesUsed.Remove(category); } if (categoriesUsed.Count == 0) { hasEmptyCategory = false; } } var nodes = graph.Nodes.ToList(); //connect nodes for (int i = 1; i < nodes.Count; i++) { GWNode <SGLNodeData, SGLEdgeData, SGLGraphData> currentNode = nodes[i]; //create edge to previous nodes with defined probabilty for (int j = 0; j < i; j++) { if (currentNode.Data.Category == nodes[j].Data.Category) { double probabilty = random.NextDouble(); if (probabilty <= parameter.IntraConnectivityDegree) { GWEdge <SGLNodeData, SGLEdgeData, SGLGraphData> edge = graph.CreateEdge(currentNode, nodes[j]); edge.Data = new SGLEdgeData(); edge.Data.Type = EdgeType.Intra; } } //nodes are in different category else if (currentNode.Data.Category != nodes[j].Data.Category) { double probabilty = random.NextDouble(); if (probabilty <= parameter.InterConnectivityDegree) { GWEdge <SGLNodeData, SGLEdgeData, SGLGraphData> edge = graph.CreateEdge(currentNode, nodes[j]); edge.Data = new SGLEdgeData(); edge.Data.Type = EdgeType.Inter; } } } } return(graph); }