///<summary> /// Random graph generator for sparse graphs. ///</summary> private void GenerateSparseGraph(IGraph graph) { graph.Clear(); IMapper <IPortOwner, int> index = new DictionaryMapper <IPortOwner, int>(); int n = NodeCount; int m = Math.Min(GetMaxEdges(), EdgeCount); INode[] nodes = new INode[n]; for (int i = 0; i < n; i++) { nodes[i] = CreateNode(graph); index[nodes[i]] = i; } RandomSupport.Permutate(random, nodes); int count = m; while (count > 0) { int vi = random.Next(n); INode v = nodes[vi]; INode w = nodes[random.Next(n)]; if (graph.GetEdge(v, w) != null || (v == w && (!AllowSelfLoops || !AllowCycles))) { continue; } graph.CreateEdge(v, w); count--; } if (!AllowCycles) { foreach (IEdge edge in graph.Edges) { IPort sourcePort = edge.SourcePort; IPort targetPort = edge.TargetPort; if (index[sourcePort.Owner] > index[targetPort.Owner]) { graph.SetEdgePorts(edge, targetPort, sourcePort); } } } }
///<summary> /// Random graph generator for dense graphs. ///</summary> private void GenerateDenseGraph(IGraph graph) { graph.Clear(); INode[] nodes = new INode[NodeCount]; for (int i = 0; i < NodeCount; i++) { nodes[i] = CreateNode(graph); } RandomSupport.Permutate(random, nodes); int m = Math.Min(GetMaxEdges(), EdgeCount); int n = NodeCount; int adder = (AllowSelfLoops && AllowCycles) ? 0 : 1; bool[] edgeWanted = RandomSupport.GetBoolArray(random, GetMaxEdges(), m); for (int i = 0, k = 0; i < n; i++) { for (int j = i + adder; j < n; j++, k++) { if (edgeWanted[k]) { if (AllowCycles && random.NextDouble() > 0.5f) { graph.CreateEdge(nodes[j], nodes[i]); } else { graph.CreateEdge(nodes[i], nodes[j]); } } } } }